1. 概述
本文将介绍在信创环境下,Qwen 大模型如何部署。
2. 环境准备
硬件要求:
配置项 | 配置要求 |
---|---|
NPU | 支持昇腾 910b3、910b4 |
服务器 | Atlas 800 和 Atlas 300I Duo |
显存 | 单卡显存需达到 64GB |
软件要求:
配置项 | 配置要求 |
---|---|
操作系统 | 宿主机要求为 openEuler 22.03 LTS(aarch64) |
mindie 容器内部为 Ubuntu 22.04.4 LTS | |
Python | 宿主机要求 Python v3.8 及以上,推荐 3.9 |
mindie 容器内部为 Python v3.11.10 | |
NPU 驱动 | 版本为 24.1.rc3 |
Docker | 版本为 26.1.3,且容器引擎必须为 1.11.2 版本及以上 |
模型文件要求:
在部署 Qwen 模型时,模型文件需满足以下特定要求,以确保模型能在华为昇腾硬件平台上正常运行:
Qwen 微调后的权重文件必须为全精度,支持的数据类型为 fp16 或 fp32,并且文件类型仅支持 safetensor 格式。在模型导出过程中,请勿使用量化操作,量化会降低模型精度,影响推理结果的准确性。
如果使用 llama-factory 工具对模型进行微调,需要按照官方文档的要求配置 yaml 文件。
如果使用 Atlas 300I Duo 服务器进行模型部署,模型的 torch dtype 只能设置为 float16,不支持 bfloat16。
3. 部署步骤
3.1 下载 mindie 镜像
1)进入 mindie 镜像仓库 ,填写表单申请下载权限,审批通过后根据官方网站提供的配套版本选择合适的 mindie 镜像下载。
2)以 root 登录服务器,并输入以下指令获取对华为镜像仓库的访问权限,执行此命令后,系统将提示你输入密码。
# -u 后面跟着的是用户名,请更换为用户自己在镜像仓库的身份标识
docker login -u cn - south - 1@1BWORLDNQR92OPTMVF02 swr.cn - south - 1.myhuaweicloud.com
3)获得镜像仓库的访问权限后,即可下载 mindie 镜像。
# 需根据用户要下载的镜像的实际地址和版本修改命令
docker pull swr.cn - south - 1.myhuaweicloud.com/ascendhub/mindie:1.0.RC3 - 800I - A2 - arm64
4)输入命令,检查镜像下载结果
# 如果下载成功,你将看到包含镜像名称、标签(版本号)、镜像 ID、创建时间及镜像大小等相关信息的输出结果
# 仔细核对版本号是否与你预期下载的一致,若一致则表示镜像已成功下载到本地
docker images | grep mindie
3.2 模型下载
1)创建目录 /home/qwen2_5_sft_0929
mkdir -p /home/qwen2_5_sft_0929
2)使用 wget 命令将模型文件下载到指定目录
wget -P /home/qwen2_5_sft_0929 <模型下载地址>
3)解压模型文件
# qwen_sft_0929.tar.gz为压缩包名,用户需根据实际更改
tar -xvzf /home/qwen2_5_sft_0929/qwen_sft_0929.tar.gz -C /home/qwen2_5_sft_0929
3.3 创建并运行容器
注:910 系列芯片都不支持容器共享。使用的时候,一张卡只能挂载到一个容器。
docker run -it -d \
# 使用宿主机网络栈,使容器直接使用宿主机网络配置
--net=host \
# 设置容器的共享内存大小为 1GB,满足某些应用程序对共享内存的需求
--shm-size=1g \
# 为容器命名为 mindie-container,便于后续管理和识别
--name mindie-container \
# 映射昇腾 NPU 相关管理设备到容器内
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
# 映射NPU卡到容器内,让容器可使用 NPU 进行计算,要与 npu-smi 中的卡序号对应,相应卡槽没有卡的要删掉
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
# 只读挂载宿主机的昇腾驱动目录到容器内
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
# 只读挂载宿主机的 sbin 目录到容器内
-v /usr/local/sbin:/usr/local/sbin:ro \
# 只读挂载宿主机指定目录到容器的 /workspace/weights 目录
-v /home/qwen2_5_sft_0929/qwen2_5_sft_0929:/workspace/weights:ro \
# 使用指定的华为云 SWR 镜像
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.RC3-800I-A2-arm64 \
# 在容器内启动 bash 终端,方便用户进行交互操作
bash
3.4 启动 mindie 服务
1)进入 3.3 节创建的 mindie-container 容器
# 进入 mindie-container 容器
docker exec -it mindie-container bash
2)进入 mindie 服务的启动路径
# 执行此命令进入到 mindie 服务的启动路径
cd $MIES_INSTALL_PATH
3)启动服务
# 执行此命令启动 mindie 服务,并将标准输出和错误输出重定向到 output.log 文件
# 同时使用 nohup 让服务在后台持续运行
nohup ./bin/mindieservice_daemon > output.log 2>&1 &
4)确认启动成功
# 执行此命令实时查看服务启动日志
# 若日志中出现 "Daemon start success!",说明服务启动成功
tail -f output.log
4. Qwen 调用接口示例
4.1 接口概览
请求地址:http://127.0.0.1:1025/v1/chat/completions
请求方式:POST
4.2 接口示例
qwen 接口示例如下:
curl -X POST "http://127.0.0.1:1025/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2_5_sft_0929",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "what is your name"}
],
"temperature": 1,
"top_p": 0.95,
"top_k": 20,
"max_tokens": 4096,
"stream": false
}'
参数说明:
参数 | 说明 |
---|---|
model | 模型名称(如示例中的 qwen2_5_sft_0929 ) |
messages | 对话历史记录,需包含 role 和 content |
temperature | 调节模型输出结果的随机性,值越大随机性越强,0为固定输出 |
top_p | 从生成结果中按输出的概率选择输出结果 |
top_k | 从生成结果中选择候选输出的数量(仅保留概率最高的前 k 个词) |
max_tokens | 生成输出 token 的最大长度,单位为个 |
stream | 是否流式输出(true/false) |