跳到主要内容

Qwen-3本地部署与调用详解(下)

课程说明:

  体验课时间有限,若想深度学习大模型技术,欢迎大家报名由我主讲的《2025大模型Agent智能体开发实战》(5月班)

d0c81dfe43a1becced8c07db33c3a787_

《2025大模型Agent智能体开发实战》(5月班) 为【100+小时】体系大课,总共20大模块精讲精析,零基础直达大模型企业级应用!

img

同时,5月班重磅新增DeepSeek+Agents SDK+谷歌ADK+MCP技术应用与智能体开发相关实战内容,并计划新增Qwen-3模型实战教学:

34533e2c95414b3dc5ab1131d9d1e38

部分项目成果演示

from IPython.display import Video
  • MateGen项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/4.MateGen%20Pro%20%E9%A1%B9%E7%9B%AE%E5%8A%9F%E8%83%BD%E6%BC%94%E7%A4%BA.mp4", width=800, height=400)
  • 智能客服项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/%E6%99%BA%E8%83%BD%E5%AE%A2%E6%9C%8D%E6%A1%88%E4%BE%8B%E6%BC%94%E7%A4%BA.mp4", width=800, height=400)
  • Dify项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/2f1b47f42c65fd59e8d3a83e6cb9f13b_raw.mp4", width=800, height=400)
  • LangChain&LangGraph搭建Multi-Agnet
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/%E5%8F%AF%E8%A7%86%E5%8C%96%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90Multi-Agent%E6%95%88%E6%9E%9C%E6%BC%94%E7%A4%BA%E6%95%88%E6%9E%9C.mp4", width=800, height=400)

此外,若是对大模型底层原理感兴趣,也欢迎报名由我和菜菜老师共同主讲的《2025大模型原理与实战课程》(5月班)

da5d51c998df07d747cd223c1ed25f7

两门大模型课程5月班目前上新特惠中,立减2000起,合购还有更多优惠哦~详细信息扫码添加助教,回复“大模型”,即可领取课程大纲&查看课程详情👇

e70ad1fd8c8b3c68b97536d74a1fc6e

Qwen-3本地部署与调用详解(下)

3. ollama API本地调用Qwen3

  在部署完ollama之后,即可借助ollama API(也就是OpenAI风格API)在代码环境中调用模型。

  • 导入OpenAI库及实例化OpenAI客户端
from openai import OpenAI

client = OpenAI(
base_url='http://192.168.110.131:11434/v1/',
api_key='ollama', # 必须传递该参数
)

prompt = "在单词\"strawberry\"中,总共有几个R?"
messages = [
{"role": "user", "content": prompt}
]
  • 创建消息并获得回复
response = client.chat.completions.create(
messages=messages,
model='qwen3:14b',
)

print(response.choices[0].message.content)

  因为Qwen3刚刚发布,所以Ollama目前还不支持在API调用时通过enable_thinking参数禁用思考过程,这里有一种策略是先用/no_think 提示不要进入思考过程。如下所示:

prompt = "/no_think 在单词\"strawberry\"中,总共有几个R?"
messages = [
{"role": "user", "content": prompt}
]


response = client.chat.completions.create(
messages=messages,
model='qwen3:14b',
)

print(response.choices[0].message.content)

  而此时显存占用约22G左右(14B Q4量化模型):

四、Qwen3模型接入vLLM与推理流程

  接下来继续介绍Qwen3-14B模型借助vLLM进行推理的完整流程。相比ollama,vLLM更加适合企业级高并发应用场景,但对应的,显存占用也会更高,vLLM项目主页:https://github.com/vllm-project/vllm`Vllm` 底层是基于Pytorch 构建,其Gtihub 开源地址为:https://github.com/vllm-project/vllm

  从各种基准测试数据来看,同等配置下,使用 vLLM 框架与 Transformer 等传统推理库相比,其吞吐量可以提高一个数量级,这归功于以下几个特性:

  • 高级 GPU 优化:利用 CUDAPyTorch 最大限度地提高 GPU 利用率,从而实现更快的推理速度。Ollama其实是对CPU-GPU的混合应用,但vllm是针对纯GPU的优化。
  • 高级内存管理:通过PagedAttention算法实现对 KV cache的高效管理,减少内存浪费,从而优化大模型的运行效率。
  • 批处理功能:支持连续批处理和异步处理,从而提高多个并发请求的吞吐量。
  • 安全特性:内置 API 密钥支持和适当的请求验证,不像其他完全跳过身份验证的框架。
  • 易用性vLLMHuggingFace 模型无缝集成,支持多种流行的大型语言模型,并兼容 OpenAIAPI 服务器。

4.1 vLLM安装与启动

  使用vllm框架部署Qwen3模型,同样需要先安装Python运行环境,这里我们可以复用之前安装的Anaconda环境,具体执行命令如下:

FENCE0

  注意:vllm官方要求的是Python 3.9 ~ Python 3.12 之间的版本,所以如果Anaconda环境版本不在此范围内,请务必重新创建符合要求的Anaconda环境。

  然后,安装vLLM框架,具体执行命令如下:

FENCE0

  此时耐心等待安装完成即可。待安装完成后,可以使用pip show vllm 命令查看vllm 框架的安装信息,可以明确看到当前安装的vllm 版本号。如下图所示:

  目前vLLM已支持Qwen3模型调用,可以在模型支持列表中查看模型关键字:https://docs.vllm.ai/en/latest/models/supported_models.html

  接下来即可按照如下流程进行调用。

4.2 OpenAI风格API响应模式

  需要注意的是,随着模型上下文越长,所需要占用的显存也越大。根据测试,14B模型在32K上下文时,运行需要约30G显存。实际运行命令类似如下形式:

FENCE0

  启动vLLM时候需要谨慎的设置最大上下文和对应的运行GPU数量。

  • 单GPU运行命令

FENCE0

  • 双GPU运行命令

FENCE1

  启动成功后,即可在Jupyter中进行调用。

  • 导入OpenAI库并实例化OpenAI客户端
from openai import OpenAI

openai_api_key = "EMPTY"
openai_api_base = "http://192.168.110.131:8000/v1"

client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
  • 创建消息获得回复
prompt = "在单词\"strawberry\"中,总共有几个R?"
messages = [
{"role": "user", "content": prompt}
]
response = client.chat.completions.create(
model="Qwen3:8B",
messages=messages,
)

print(response.choices[0].message.content)
5429b86d22f29729ef960ff48e115fe

五、基于llama.cpp的QwQ模型CPU推理

  Qwen3系列模型目前也是可以使用llama.cpp进行纯CPU推理或者CPU+GPU混合推理的。接下来介绍如何使用llama.cpp调用模型权重进行推理和对话。

1. llama.cpp下载与编译

  由于llama.cpp是个C语言项目,因此实际调用过程需要先构建项目,然后设置参数进行编译,然后最终创建可执行文件(类似于脚本),再运行本地大模型。借助llama.cpp可以实现纯CPU推理、纯GPU推理和CPU+GPU混合推理。

  • 依赖下载

    apt-get update
    apt-get install build-essential cmake curl libcurl4-openssl-dev -y

  这条命令安装了一些常用的构建和开发工具,具体的每个部分的含义如下:

  • build-essential:安装一组构建必需的工具和库,包括:

    • 编译器(如 GCC)
    • make 工具
    • 其他一些常见的构建工具,确保你的系统能进行编译。
  • cmake:安装 CMake 工具,它是一个跨平台的构建系统,允许你管理项目的编译过程。

  • curl:安装 cURL 工具,它是一个命令行工具,用于通过 URL 发送和接收数据。它在很多开发场景中都很有用,尤其是与网络交互时。

  • libcurl4-openssl-dev:安装 libcurl 库的开发版本。它是 cURL 的一个库文件,允许你在编程中通过 cURL 发送 HTTP 请求。libcurl4-openssl-dev 是与 OpenSSL 配合使用的版本,提供了 SSL/TLS 加密支持,用于安全的 HTTP 请求。

  • llama.cpp源码下载

  若是AutoDL服务器,可以先开启学术加速:

FENCE0

  如果是其他服务器或者本地服务器,则可以直接进行源码下载:

git clone https://github.com/ggerganov/llama.cpp

  也可以直接在课件网盘中找到代码文件,直接上传服务器并解压缩:

image-20250429200007375 5429b86d22f29729ef960ff48e115fe

  准备好后,即可在服务器中看到llama.cpp项目文件夹:

  接下来,即可开始进行项目构建与编译。

  • 项目构建与编译

    cmake llama.cpp -B llama.cpp/build \
    -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
  • cmake:运行 CMake 工具,用于配置和生成构建文件。

  • llama.cpp:指定项目的源代码所在的目录。在这个例子中,llama.cpp 是项目的根目录。

  • -B llama.cpp/build:指定生成构建文件的目录。-B 参数表示构建目录llama.cpp/build 是生成的构建目录。这是 CMake 将生成的文件存放的地方(例如 Makefile 或 Ninja 构建文件)。

  • 同时还指定了一些编译选项:

  • 禁用共享库-DBUILD_SHARED_LIBS=OFF),生成 静态库

  • 启用 CUDA 支持-DGGML_CUDA=ON),以便在有 GPU 的情况下使用 GPU 加速。

  • 启用 CURL 库支持-DLLAMA_CURL=ON),以便支持网络请求。

  然后需要进一步进行编译:

cmake --build llama.cpp/build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split
  • --build llama.cpp/build:告诉 CMake 使用 llama.cpp/build 目录中的构建文件来执行构建过程。这个目录是在之前运行 cmake llama.cpp -B llama.cpp/build 命令时生成的,包含了所有构建所需的文件(例如 Makefile 或 Ninja 构建文件)。
  • --config Release:指定构建的配置为 Release 配置。
    • Release 配置通常意味着启用更多的 优化,生成的程序运行速度较快,适合发布。
    • 在 CMake 中,通常有两种常见的构建配置:
      • Debug:用于调试版本,包含调试信息且没有做过多优化。
      • Release:优化后的发布版本,去除调试信息,运行时性能更高。
  • -j:表示并行构建,允许 CMake 使用多个 CPU 核心来加速构建过程。
    • 如果没有指定数字,CMake 会使用默认的并行级别,通常是可用的所有 CPU 核心。你也可以指定并行的作业数,例如 -j 8 表示使用 8 个并行作业进行编译。
  • --clean-first:表示在构建之前先清理掉之前的构建结果。这可以确保每次构建时都是从一个干净的状态开始,避免由于缓存或中间文件引起的编译错误。
    • 如果你之前运行过构建并且有问题,或者希望重新构建而不使用任何缓存文件,这个选项非常有用。
  • --target:指定构建的目标(target)。通常,一个项目会定义多个目标(比如库、可执行文件等),通过这个参数可以告诉 CMake 只编译特定的目标。
    • llama-quantize:可能是与模型量化相关的目标。量化(quantization)是将模型的精度从浮点数降低到整数,从而减少内存占用和提高推理速度。
    • llama-cli:可能是一个命令行工具,用于运行模型或与用户交互。
    • llama-gguf-split:可能是一个用于拆分模型文件的目标,通常用于将一个大模型文件拆分成多个小文件,方便存储和加载。
  • 复制可执行文件

    cp llama.cpp/build/bin/llama-* llama.cpp

    所有生成的可执行文件 从构建目录 llama.cpp/build/bin/ 复制到项目的根目录 llama.cpp 下。这样可以更方便地在项目根目录下执行这些可执行文件,而无需每次都进入构建目录。

  在准备完成后,接下来即可进行调用和推理测试了。

2.借助llama.cpp运行Qwen3模型

  • 纯CPU推理流程【1token/s】

  首先是纯CPU推理测试。此时系统只调用内存+CPU进行计算,此时不会用到GPU。

  此时模型运行门槛很低,但运行速度非常慢,只有不到1tokens/s。具体推理代码实现流程如下:

FENCE0

  其中命令行核心参数说明:

  • --threads:CPU 核心数;
  • --ctx-size:输出的上下文长度;
  • --n-gpu-layers :需要卸载到 GPU 的层数,设置为0时代表完全使用CPU进行推理;
  • --temp:模型温度参数;
  • -no-cnv:不进行多轮对话;
  • --cache-type-k:K 缓存量化为 4bit;
  • --seed:随机数种子;

  实际运行效果如下所示:

  • CPU+GPU混合推理

  接下来进一步尝试CPU+GPU混合推理,我们只需要合理的设置--n-gpu-layers参数,即可灵活的将模型的部分层加载到GPU上进行运行。并且无需手动设置,llama.cpp会自动识别当前GPU数量以及可以分配的显存,自动将模型权重加载到各个不同的GPU上。例如,我们这里考虑将30层加载到GPU上,运行效果如下所示:

FENCE0

  此时显存占用不到10G:

  推理速度略微有所提升,能达到接近2tokens/s

  • 纯GPU推理

  最后,我们更进一步,尝试把全部的模型权重都放在GPU上进行推理。

FENCE0

  此时GPU占用约11G:

  推理速度则能达到14tokens/s。

六、Qwen3 接入OpenWeb-UI

1.Open-WebUI部署流程

  首先需要安装Open-WebUI,官网地址如下:https://github.com/open-webui/open-webui

  我们可以直接使用pip命令快速完成安装:

FENCE0

  可以直接使用在GitHub项目主页上直接下载完整代码包,并上传至服务器解压缩运行:

  此外,也可以在课件网盘中领取完整代码包,并上传至服务器解压缩运行:

image-20250429200151840 5429b86d22f29729ef960ff48e115fe

  在确保ollama正常运行的情况下,进行后续操作。

2. Open-WebUI启动与对话流程

  在准备好了Open-WebUI和一系列模型权重后,接下来我们尝试启动Open-WebUI,并借助本地模型进行问答。

  首先需要设置离线环境,避免Open-WebUI启动时自动进行模型下载:

FENCE0

  然后启动Open-WebUI

FENCE1

  需要注意的是,如果启动的时候仍然报错显示无法下载模型,是Open-WebUI试图从huggingface上下载embedding模型,之后我们会手动将其切换为本地运行的Embedding模型。

  然后在本地浏览器输入地址:8080端口即可访问:

若使用AutoDL,则需要使用SSH隧道工具进行地址代理

更多AutoDL相关操作详见公开课:《AutoDL快速入门与GPU租赁使用指南》|https://www.bilibili.com/video/BV1bxB7YYEST/

  然后首次使用前,需要创建管理员账号:

  然后点击登录即可。需要注意的是,此时Open-WebUI会自动检测后台是否启动了ollama服务,并列举当前可用的模型。稍等片刻,即可进入到如下页面:

  接下来即可进入到对话页面:

  对话效果如下所示:

3. 本地知识库检索

4. 代码解释器

5. 调用外部工具

  Qwen3全系列支持Function calling,因此我们可以基于此完成Open-WebUI的外部工具调用工作。

  • Open-WebUI工具调用功能实现

  然后编写天气查询函数:

FENCE0

  并将函数进行写入:

  完成后即可看到新的工具:

  在对话时可以开启天气查询函数:

  至此,我们就详细介绍了QwQ模型的各类本地部署与调用方法。