学习进度 · 登录后可记录
📚 课程信息
- 模型:Qwen3-8B(通义千问3代 8B 参数版本)
- 部署工具:vLLM
- 硬件平台:昇腾 NPU
- 服务端口:8016
- 下载源:AtomGit(华为云镜像)
- 注意:本教程适配 Notebook 云平台环境
本教程的目标是让你掌握 Qwen3-8B 大模型的端到端部署能力——从模型获取、服务启动,到 API 调用跑通。
但这不仅仅是一个"跑通代码"的教程。我会从第一性原理出发,让你理解:
真正的模型部署,本质上是解决三个问题:

vLLM 的核心创新是 PagedAttention——它借鉴了操作系统的虚拟内存管理思想:

理解模型的参数规模,对于后续选择硬件、配置参数至关重要:


📖 图文说明
为什么第一步要安装 atomgit?
很多开发者习惯用
huggingface-cli或直接git clone下载模型,但在中国大陆,这些方式往往速度很慢甚至无法访问。atomgit 的优势:
- ✅ 华为云镜像,国内访问速度 10MB/s+
- ✅ 模型文件结构规范
- ✅ 原子化下载支持,断点续传
- ✅ 与 HuggingFace 生态兼容
💻 Notebook 实操
# 阶段一:安装 atomgit 客户端
# ================================================================
# atomgit 是华为云提供的模型下载工具,下载速度比 HuggingFace 快很多
!pip install -U atomgit -i https://mirrors.huaweicloud.com/repository/pypi/simple
print("✅ atomgit 安装完成")📖 图文说明
为什么要重启内核?
安装新的 Python 包后,必须重启 Jupyter Notebook 的内核才能加载新包。
如果不重启,可能会遇到
ModuleNotFoundError: No module named 'atomgit'错误。原理:
- Jupyter Notebook 的内核是一个长期运行的 Python 进程
- 新的包安装在文件系统中,但内核的内存空间还没有加载新包
- 重启内核 = 重新启动 Python 进程 = 加载最新的包
💻 Notebook 实操
# 阶段二:重启 Jupyter Notebook 内核
# ================================================================
# ⚠️ 执行此命令后,Notebook 会自动重启
# 重启后需要重新执行前面的安装命令
get_ipython().kernel.do_shutdown(restart=True)📖 图文说明
下载命令详解:
snapshot_download("hf_mirrors/Qwen/Qwen3-8B", local_dir='/opt/atomgit/Qwen3-8B')
hf_mirrors/Qwen/Qwen3-8B是模型在 AtomGit 上的路径
hf_mirrors= HuggingFace 镜像Qwen= 阿里云团队Qwen3-8B= 模型名称local_dir='/opt/atomgit/Qwen3-8B'指定了模型的本地保存位置
- 使用绝对路径,确保后续访问稳定
💻 Notebook 实操
# 阶段三:下载 Qwen3-8B 模型
# ================================================================
from atomgit_hub import snapshot_download
# 定义模型路径
MODEL_PATH = '/opt/atomgit/Qwen3-8B'
# 开始下载
print("=" * 60)
print("📥 正在下载 Qwen3-8B 模型...")
print(f" 路径: {MODEL_PATH}")
print(" 预计大小: ~16GB")
print(" 请耐心等待,不要中断下载...")
print("=" * 60)
snapshot_download(
"hf_mirrors/Qwen/Qwen3-8B",
local_dir=MODEL_PATH
)
print("\n✅ 模型下载完成!")⚠️ 注意事项
1. 首次下载需要约 16GB 带宽,请确保网络稳定
2. 如果下载中断,重复执行会自动断点续传
3. 不要手动中断下载,否则可能导致文件损坏📖 图文说明
下载完成后,检查一下模型文件的结构。Qwen3-8B 的模型文件通常包含:
config.json- 模型配置文件
- 定义了模型的超参数(层数、隐藏维度、头数等)
model.safetensors- 模型权重(分片存储)
tokenizer.json/tokenizer_config.json- 分词器
generation_config.json- 生成配置
💻 Notebook 实操
# 验证模型文件
# ================================================================
import os
model_path = '/opt/atomgit/Qwen3-8B'
print("📁 模型目录内容:")
print("=" * 60)
for item in sorted(os.listdir(model_path)):
item_path = os.path.join(model_path, item)
if os.path.isfile(item_path):
size_mb = os.path.getsize(item_path) / (1024 * 1024)
print(f" 📄 {item} ({size_mb:.1f} MB)")
else:
print(f" 📂 {item}/")
print("=" * 60)
# 验证关键文件
required_files = ['config.json', 'tokenizer.json']
all_ok = True
for f in required_files:
full_path = os.path.join(model_path, f)
status = "✅" if os.path.exists(full_path) else "❌"
if not os.path.exists(full_path):
all_ok = False
print(f"{status} {f}")
if all_ok:
print("\n✅ 模型文件验证通过!可以开始部署了。")
else:
print("\n❌ 模型文件验证失败,请重新下载。")📖 图文说明
为什么要用 vllm serve?
vLLM 是一个高性能的大模型推理框架,它:
- 内置了 FastAPI 兼容的 API 服务器
- 自动管理显存和 KV Cache
- 支持 OpenAI 兼容的 API 格式
端口说明:
- 我们使用 8016 端口
- 如果需要部署多个模型,可以修改端口(如 8017、8018)
💻 Notebook 实操
# 阶段四:启动 vLLM 服务
# ================================================================
# ⚠️ 注意:此命令会阻塞当前 cell,请在新窗口执行后续验证
!vllm serve /opt/atomgit/Qwen3-8B \
--served-model-name Qwen3-8B \
--host 0.0.0.0 \
--port 8016 \
--tensor-parallel-size 1 \
--dtype bfloat16 \
--compilation-config '{"custom_ops":["none", "+rms_norm", "+rotary_embedding"]}' \
--max-num-seqs 4 \
--max-model-len 32768 \
--gpu-memory-utilization 0.8⚠️ 重要提醒:服务会阻塞 Kernel

| 参数 | 值 | 说明 |
|---|---|---|
--served-model-name | Qwen3-8B | API 调用时的模型标识名 |
--host | 0.0.0.0 | 监听所有网络接口 |
--port | 8016 | 服务端口 |
--tensor-parallel-size | 1 | 张量并行数,1=单卡 |
--dtype | bfloat16 | 数据精度,BF16 是昇腾优化的格式 |
--compilation-config | 见命令 | 动态编译配置,逐步优化推理性能 |
--max-num-seqs | 4 | 最大并发序列数 |
--max-model-len | 32768 | 最大上下文长度(32K tokens) |
--gpu-memory-utilization | 0.8 | 显存使用比例 80% |
--compilation-config 详解这个参数控制 vLLM 的动态编译优化策略:
{"custom_ops":["none", "+rms_norm", "+rotary_embedding"]}含义:
"none" - 第一阶段不使用任何自定义算子"+rms_norm" - 第二阶段启用 RMSNorm 算子融合"+rotary_embedding" - 第三阶段启用 Rotary Embedding 算子融合
--dtype 参数选择| 数据类型 | 说明 | 适用场景 |
|---|---|---|
bfloat16 | 昇腾优化的 BF16 格式 | 昇腾 NPU 推荐 |
float16 | 标准 FP16 | NVIDIA GPU |
float32 | 全精度 | 需要高精度的场景 |
--gpu-memory-utilization 选择| 显存大小 | 推荐值 | 说明 |
|---|---|---|
| 24GB | 0.7 | 保守配置,留更多显存给 KV Cache |
| 40GB | 0.85 | 平衡配置 |
| 80GB | 0.9 | 激进配置,最大化利用显存 |
📖 图文说明
当服务启动时,会看到一系列日志。关键节点:
INFO: Started server process
vLLM 初始化中
INFO: Loading model weights...
加载模型权重到显存,可能需要 2-5 分钟
INFO: Uvicorn running on http://0.0.0.0:8016
服务启动成功!
📖 图文说明
现在服务已经启动,我们需要另起一个窗口来验证。
推荐方式:
- 新建一个 ipynb 文件
- 或者打开终端执行
然后运行下面的验证命令
💻 Notebook 实操(新窗口)
# 阶段五:API 验证(在新窗口执行)
# ================================================================
!curl -X POST http://localhost:8016/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "Qwen3-8B", "messages": [{"role": "user", "content": "1+1=?"}]}'⚠️ 注意事项
1. 必须在新窗口执行,不能在服务启动的同一个 ipynb 里执行
2. 如果没有响应,检查服务是否启动成功
3. 确保端口 8016 没有被占用📖 图文说明
除了 curl,还可以用 Python 的 requests 库来请求,更易解析响应结果:
💻 Notebook 实操(新窗口)
# 使用 Python 请求 API
# ================================================================
import requests
response = requests.post(
"http://localhost:8016/v1/chat/completions",
headers={"Content-Type": "application/json"},
json={
"model": "Qwen3-8B",
"messages": [
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "1+1=?"}
]
}
)
result = response.json()
print("📤 模型回复:", result['choices'][0]['message']['content'])
print("📊 Token 统计:", result['usage'])vLLM 提供 OpenAI 兼容的 API,可以直接替换 OpenAI 的接口地址:
# 与 OpenAI API 完全兼容的接口格式
import openai
client = openai.OpenAI(
base_url="http://localhost:8016/v1",
api_key="EMPTY" # vLLM 不需要 API Key
)
response = client.chat.completions.create(
model="Qwen3-8B",
messages=[
{"role": "user", "content": "用 Python 写一个快速排序"}
]
)
print(response.choices[0].message.content)📖 图文说明
图文说明 如果一切正常,你会收到类似这样的响应: id: chatcmpl-xxx object: chat.completion model: Qwen3-8B choices[0].message.role: assistant choices[0].message.content: 1+1=2 usage.prompt_tokens: 10 usage.completion_tokens: 5 usage.total_tokens: 15
这与 OpenAI ChatGPT 的 API 格式完全兼容!
📖 图文说明
原因:atomgit 下载速度很慢
解决方案:
- 确认华为云镜像可用
- 检查网络连接
- 等待高峰期过去
📖 图文说明
原因:No space left on device
解决方案:
- 清理临时文件:
!rm -rf /tmp/*- 检查磁盘空间:
!df -h
📖 图文说明
原因:CUDA out of memory
解决方案(按优先级):
- 降低 gpu-memory-utilization:
--gpu-memory-utilization 0.6- 减少并发数:
--max-num-seqs 2- 减少上下文长度:
--max-model-len 16384
📖 图文说明
原因:Address already in use
解决方案:
- 查看占用进程:
!lsof -i :8016- 杀掉进程:
!kill -9 <PID>- 或使用其他端口:
--port 8017
📖 图文说明
原因:ModuleNotFoundError: No module named 'atomgit'
解决方案:
- 重新执行 pip install
- 重启 Jupyter 内核:
get_ipython().kernel.do_shutdown(restart=True)
📖 图文说明
原因:curl 请求没有响应
检查清单:
- 服务是否在运行?查看上一个 cell 的日志
- 端口是否正确?默认 8016
- 是否在新窗口执行验证?(不是在服务 cell 下方执行)
| 场景 | gpu-memory-utilization | max-num-seqs | max-model-len |
|---|---|---|---|
| 低配机器 (24GB) | 0.7 | 2 | 16384 |
| 标准配置 (40GB) | 0.85 | 4 | 32768 |
| 高配机器 (80GB) | 0.9 | 8 | 65536 |
✅ 理解了 Qwen3-8B 的参数规模和显存需求
✅ 掌握了 AtomGit 模型下载工具的使用
✅ 学会了 vLLM 服务的部署和配置
✅ 了解了 OpenAI 兼容 API 的调用方式
✅ 掌握了常见问题的排查和解决思路
📚 参考资料
- vLLM 官方文档:https://docs.vllm.ai/
- AtomGit 模型市场:https://ai.atomgit.com
登录后即可查看完整教程内容、运行代码和参
与学习互动
还没有账号?