1. 概述
本文将介绍在信创环境下,帆软大模型如何部署。
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 上传模型文件到服务器
1)创建目录 /home/qwen2_5_sft_0929
mkdir -p /home/qwen2_5_sft_0929
2)使用 wget 命令将模型文件下载到指定目录
wget -P /home/qwen2_5_sft_0929 https://fanruan-ai.oss-cn-hangzhou.aliyuncs.com/models/qwen_sft_0929.tar.gz
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.2 下载 mindie 镜像
1)进入 mindie 镜像仓库 ,填写表单申请下载权限,审批通过后根据官方网站提供的配套版本选择合适的 mindie 镜像下载。
2)以 root 登录服务器,并输入以下指令获取对华为镜像仓库的访问权限,执行此命令后,系统将提示你输入密码。
# -u 后面跟着的是用户名,请更换为用户自己在镜像仓库的身份标识
docker login -u cn-south-1@HST3U2XUK6QKAW74O1E6 swr.cn-south-1.myhuaweicloud.com
3)输入密码。
**************
4)获得镜像仓库的访问权限后,即可下载 mindie 镜像。输入官网提供下载命令(以下为示例,用户自行调整):
docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.RC2-8001-A2-py311-openeuler24.03-lts
首次拉取镜像时,会显示一下类似输出,可以依据此确认拉取进度和结果。
1.0.0-800I-A2-py311-openeuler24.03-lts: Pulling from ascendhub/mindie
fb3a8b863e2c: Pull complete
dd84546eb578: Pull complete
b60eb5574f0d: Pull complete
715a2e7d9bd5: Pull complete
ce26f5abe8f7: Pull complete
886002f8aa60: Pull complete
Digest: sha256:42e7aa006b1d22f6e38ec7bd8d2e272200b7e556beb9a65379a694880c060a93
Status: Downloaded newer image for swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.0-800I
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.0-800I-A2-py311-openeuler24.03-lts
3.3 创建并运行容器
注:910 系列芯片都不支持容器共享。使用的时候,一张卡只能挂载到一个容器。
docker run -it -d --net=host --shm-size=4g \
--name mindie-container \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--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 \
-v /usr/local/sbin:/usr/local/sbin:ro \
-v /home/qwen/:/data/models/:ro \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts \
bash
参数说明:
--net=host:使用主机网络,使容器与主机共享网络命名空间。
--shm-size=4g:设置容器的共享内存大小为 4GB。
--name mindie-container:指定容器名称为 mindie-container。
--device:映射设备到容器,确保容器能访问昇腾相关硬件设备。
-v:挂载主机目录到容器,实现数据共享。
3.4 启动 mindie 服务
1)进入创建的 mindie-container 容器
# 进入 mindie-container 容器
docker exec -it mindie-container bash
2)升级 transformers 版本至 V4.45.2
pip install --upgrade transformers==4.45.2
3)修改配置文件
i. 进入配置文件目录
cd $MIES_INSTALL_PATH
ii. 使用 vim 编辑器打开配置文件
vim conf/config.json
iii. 修改以下关键参数(其他参数见官网)
修改参数 | 参数说明 |
---|---|
"httpsEnabled" : false, | 是否启用 HTTPS |
"npudeviceIds" : [[0,1,2,3,4,5,6,7]], | 指定使用的 NPU 设备的 ID 列表 |
"modelName" : "qwen2_5_sft_0929", | 模型名称 |
"modelWeightPath" : "/data/models/qwen2_5_sft_0929/", | 模型权重文件路径 |
"worldSize":8 | 与使用的 NPU 数量一致,即 npudevicelds 列表的长度 |
"maxSeqLen":16384 | 最大序列长度 |
4)调试模式设置(可选)
若要进行调试,可将日志级别设置为调试模式。
export MINDIE_LOG_LEVEL=debug
5)启动服务
./bin/mindieservice_daemon
4. Qwen 调用接口示例
4.1 发送测试请求
注:请求中的 IP 和端口(127.0.0.1:1025)需根据 config.json 中的自定义设定进行调整。
curl -X POST 127.0.0.1:1025/v1/chat/completions \
-d '{
"messages": [
{"role": "system", "content": "you are a helpful assistant."},
{"role": "user", "content": "新中国成立于什么时候"}
],
"max_tokens": 256,
"stream": false,
"do_sample": true,
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20,
"model": "qwen2_5_sft_0929"
}'
参数说明:
参数 | 说明 |
---|---|
model | 模型名称(如示例中的 qwen2_5_sft_0929 ) |
messages | 对话历史记录,需包含 role 和 content |
temperature | 调节模型输出结果的随机性,值越大随机性越强,0为固定输出 |
top_p | 从生成结果中按输出的概率选择输出结果 |
top_k | 从生成结果中选择候选输出的数量(仅保留概率最高的前 k 个词) |
max_tokens | 生成输出 token 的最大长度,单位为个 |
stream | 是否流式输出(true/false) |
4.2 响应结果示例
正常情况下收到的响应:
{"id":"endpoint_common_1","object":"chat.completion","created":1749990910,"model":"qwen2_5_sft_0929", ...略}