华为昇腾 Atlas 部署 DeepSeek 详细方案
基于华为昇腾官方 MindIE 推理引擎,覆盖单机单卡/多卡及多机多卡场景。 参考来源:昇腾社区官方文档、hiascend.com 技术干货(2025)
一、方案概述
1.1 技术路线
华为昇腾部署 DeepSeek 的官方推荐路线:
DeepSeek 原始权重(HuggingFace/ModelScope)
↓
MsModelSlim 权重量化(W8A8 / W4A16)
↓
MindIE LLM 推理引擎(ATB 后端)
↓
MindIE Service 服务化(OpenAI 兼容接口)
↓
上层应用(Dify / OpenWebUI / 自研系统)1.2 支持的模型规格
| 模型 | 参数量 | 推荐硬件 | 最低卡数 |
|---|---|---|---|
| DeepSeek-R1-Distill-Qwen-1.5B | 1.5B | Atlas 300I Duo | 1 卡 |
| DeepSeek-R1-Distill-Qwen-7B | 7B | Atlas 300I Duo / 800I A2 | 1 卡 |
| DeepSeek-R1-Distill-Qwen-32B | 32B | Atlas 800I A2 | 2 卡(W8A8) |
| DeepSeek-R1-Distill-Llama-70B | 70B | Atlas 800I A2 | 4 卡 |
| DeepSeek-R1 / V3(671B MoE) | 671B | Atlas 800I A2 × 多节点 | 16 卡起 |
1.3 核心软件栈版本对应关系
| MindIE 版本 | CANN 版本 | 驱动版本 | 适配硬件 |
|---|---|---|---|
| MindIE 2.3.0 | CANN 8.3.RC2 | 23.0.0+ | Atlas 800I A2 / 300I Duo |
| MindIE 2.2.RC1 | CANN 8.3.RC2 | 23.0.0+ | Atlas 800I A2 / 300I Duo |
| MindIE 2.1.RC2 | CANN 8.2.RC1 | 23.0.0 | Atlas 800I A2 / 300I Duo |
| MindIE 2.0.RC2 | CANN 8.1.RC1 | 23.0.0 | Atlas 800I A2 / 300I Duo |
| MindIE 1.0.0 | CANN 8.0.RC3 | 23.0.rc2 | Atlas 800 9000 / 800I A2 |
注意:Atlas 800 9000 使用昇腾 910(非 910B),不支持 BF16,需将 config.json 中
torch_dtype改为float16。
二、环境准备
2.1 硬件检查
bash
# 查看 NPU 卡信息
npu-smi info
# 查看驱动版本
cat /usr/local/Ascend/driver/version.info
# 查看卡数及健康状态
npu-smi info -t board2.2 驱动与固件安装/升级
从昇腾社区(https://www.hiascend.com/hardware/firmware-drivers)下载对应版本:
bash
# 赋予执行权限
chmod +x Ascend-hdk-910b-npu-driver_23.0.0_linux-aarch64.run
chmod +x Ascend-hdk-910b-npu-firmware_7.3.0.1.231_linux-aarch64.run
# 安装驱动(需 root)
./Ascend-hdk-910b-npu-driver_23.0.0_linux-aarch64.run --full --force
# 安装固件
./Ascend-hdk-910b-npu-firmware_7.3.0.1.231_linux-aarch64.run --full --force
# 重启生效
reboot
# 重启后验证
npu-smi info2.3 安装 Docker
bash
# Ubuntu
apt-get update && apt-get install -y docker.io
systemctl enable docker && systemctl start docker
# 配置镜像加速(可选)
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": []
}
EOF
systemctl restart docker三、获取 MindIE 镜像
3.1 登录昇腾镜像仓库
访问 https://www.hiascend.com/developer/ascendhub,注册并申请 MindIE 镜像权限。
bash
# 登录昇腾镜像仓库
docker login swr.cn-south-1.myhuaweicloud.com
# 根据硬件型号拉取对应镜像
# Atlas 800I A2(910B 芯片,aarch64)
docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.2.RC1-800I-A2-aarch64
# Atlas 300I Duo(310P 芯片,x86_64)
docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.2.RC1-300I-Duo-x86_64镜像版本以昇腾社区最新发布为准,一切以官方为主。
四、模型权重下载
4.1 从 ModelScope 魔搭社区下载(推荐,国内速度快)
bash
pip3 install modelscope -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
# 编写下载脚本
cat > download_model.py <<'EOF'
from modelscope import snapshot_download
# 下载 DeepSeek-R1-Distill-Qwen-32B(约 65GB)
model_dir = snapshot_download(
'deepseek-ai/DeepSeek-R1-Distill-Qwen-32B',
cache_dir='/data/models'
)
print(f"模型下载至: {model_dir}")
EOF
python3 download_model.py4.2 从昇腾 Modelers 平台下载(已适配昇腾的权重)
bash
# 安装 git-lfs
apt update && apt install -y git-lfs
git lfs install
# 克隆模型(以 1.5B 蒸馏版为例)
git clone https://modelers.cn/State_Cloud/DeepSeek-R1-Distill-Qwen-1.5B.git \
/data/models/DeepSeek-R1-Distill-Qwen-1.5B4.3 目录结构确认
bash
ls /data/models/DeepSeek-R1-Distill-Qwen-32B/
# 应包含:config.json tokenizer.json model-*.safetensors generation_config.json五、启动 MindIE 容器
5.1 单机多卡容器启动脚本
bash
cat > start_mindie.sh <<'EOF'
#!/bin/bash
IMAGE="swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.2.RC1-800I-A2-aarch64"
MODEL_DIR="/data/models"
CONTAINER_NAME="mindie_deepseek"
docker run -itd \
--name ${CONTAINER_NAME} \
--ipc=host \
--net=host \
--privileged \
--shm-size=500g \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
-v /usr/local/sbin/:/usr/local/sbin/ \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /var/log/npu/slog/:/var/log/npu/slog \
-v /var/log/npu/profiling/:/var/log/npu/profiling \
-v /var/log/npu/dump/:/var/log/npu/dump \
-v /var/log/npu/:/usr/slog \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /etc/hccn.conf:/etc/hccn.conf \
-v ${MODEL_DIR}:${MODEL_DIR} \
${IMAGE} \
/bin/bash
echo "容器启动完成,进入容器:"
echo "docker exec -it ${CONTAINER_NAME} bash"
EOF
chmod +x start_mindie.sh
bash start_mindie.sh说明:如只使用部分卡(如第 6、7 卡),只挂载对应的
/dev/davinci6、/dev/davinci7即可,无需挂载全部 8 张。
六、权重量化(W8A8)
32B 及以上模型建议量化后部署,可显著降低显存占用并提升推理吞吐。
6.1 获取量化工具 MsModelSlim
bash
# 在容器外操作,克隆 msit 工具仓
git clone https://gitee.com/ascend/msit.git /data/msit
# 进入容器
docker exec -it mindie_deepseek bash
# 安装量化工具
cd /data/msit/msmodelslim
bash install.sh6.2 执行 W8A8 量化
bash
# 进入 Qwen 示例目录(DeepSeek-R1-Distill-Qwen 系列使用此脚本)
cd /data/msit/msmodelslim/example/Qwen
# NPU 量化(需要足够显存,建议 8 卡容器)
python3 quant_qwen.py \
--model_path /data/models/DeepSeek-R1-Distill-Qwen-32B \
--save_directory /data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8 \
--calib_file ../common/boolq.jsonl \
--w_bit 8 \
--a_bit 8 \
--device_type npu
# 若显存不足,改用 CPU 量化(速度较慢,约 1~2 小时)
python3 quant_qwen.py \
--model_path /data/models/DeepSeek-R1-Distill-Qwen-32B \
--save_directory /data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8 \
--calib_file ../common/boolq.jsonl \
--w_bit 8 \
--a_bit 8 \
--device_type cpu6.3 Atlas 800 9000 特殊处理(910 芯片不支持 BF16)
bash
# 量化完成后,修改 config.json 中的数据类型
sed -i 's/"torch_dtype": "bfloat16"/"torch_dtype": "float16"/' \
/data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8/config.json七、配置 MindIE Service
7.1 配置文件位置
bash
# 进入容器后
cd /usr/local/Ascend/mindie/latest/mindie-service
vim conf/config.json7.2 单机双卡配置示例(DeepSeek-R1-Distill-Qwen-32B-W8A8)
json
{
"Version": "1.0.0",
"LogConfig": {
"logLevel": "Info",
"logFileSize": 20,
"logFileNum": 20,
"logPath": "logs/mindie-server.log"
},
"ServerConfig": {
"ipAddress": "192.168.1.100",
"managementIpAddress": "127.0.0.2",
"port": 1025,
"managementPort": 1026,
"metricsPort": 1027,
"allowAllZeroIpListening": false,
"maxLinkNum": 1000,
"httpsEnabled": false,
"openAiSupport": "vllm"
},
"BackendConfig": {
"backendName": "mindieservice_llm_engine",
"modelInstanceNumber": 1,
"npuDeviceIds": [[6, 7]],
"tokenizerProcessNumber": 8,
"multiNodesInferEnabled": false,
"ModelDeployConfig": {
"maxSeqLen": 8192,
"maxInputTokenLen": 4096,
"truncation": true,
"ModelConfig": [
{
"modelInstanceType": "Standard",
"modelName": "DeepSeek-R1-Distill-Qwen-32B-W8A8",
"modelWeightPath": "/data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8/",
"worldSize": 2,
"cpuMemSize": 5,
"npuMemSize": -1,
"backendType": "atb",
"trustRemoteCode": false
}
]
},
"ScheduleConfig": {
"templateType": "Standard",
"templateName": "Standard_LLM",
"cacheBlockSize": 128,
"maxPrefillBatchSize": 50,
"maxPrefillTokens": 8192,
"prefillTimeMsPerReq": 150,
"prefillPolicyType": 0,
"decodeTimeMsPerReq": 50,
"decodePolicyType": 0,
"maxBatchSize": 200,
"maxIterTimes": 4096,
"maxPreemptCount": 0,
"supportSelectBatch": false,
"maxQueueDelayMicroseconds": 5000
}
}
}关键参数说明:
| 参数 | 说明 |
|---|---|
ipAddress | 本机 IP,供外部访问 |
npuDeviceIds | 使用的 NPU 卡编号,[[0,1]] 表示单实例用 0、1 两卡 |
worldSize | 张量并行数,等于使用的卡数 |
modelName | 模型名称,需与调用时的 model 字段一致 |
modelWeightPath | 权重目录绝对路径,末尾加 / |
maxSeqLen | 最大序列长度(输入+输出),按需调整 |
npuMemSize | NPU 显存限制,-1 表示自动分配 |
httpsEnabled | 内网部署建议关闭,生产环境建议开启 |
7.3 多机多卡配置(DeepSeek-R1 671B,双机 16 卡)
在每台节点上修改 config.json,增加多节点通信配置:
json
{
"BackendConfig": {
"npuDeviceIds": [[0,1,2,3,4,5,6,7]],
"multiNodesInferEnabled": true,
"multiNodesInferPort": 1120,
"interNodeTLSEnabled": false,
"ModelDeployConfig": {
"ModelConfig": [
{
"modelName": "DeepSeek-R1",
"modelWeightPath": "/data/models/DeepSeek-R1/",
"worldSize": 16,
"backendType": "atb"
}
]
}
}
}多机部署还需配置 HCCN(高速互联网络):
bash
# 查看 HCCN 配置
cat /etc/hccn.conf
# 确认节点间 RDMA 网络连通性
hccn_tool -i 0 -link -g八、初始化环境变量并启动服务
8.1 初始化环境变量
bash
# 进入容器后,每次启动前执行
source /usr/local/Ascend/mindie/set_env.sh
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
source /usr/local/Ascend/llm_model/set_env.sh
# 开启日志输出到标准输出(调试用)
export MINDIE_LLM_LOG_TO_STDOUT=1
export MINDIE_LOG_TO_STDOUT=1
# Python 路径(容器内已内置 Python 3.11)
export PATH=/usr/local/python3.11.10/bin:$PATH8.2 设置权重目录权限
bash
chmod -R 750 /data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8/8.3 启动 MindIE 服务
bash
cd /usr/local/Ascend/mindie/latest/mindie-service
# 前台启动(调试)
./bin/mindieservice_daemon
# 后台启动
nohup ./bin/mindieservice_daemon > /var/log/mindie/mindie.log 2>&1 &
# 启动成功标志
# 日志输出:Daemon start success!8.4 验证服务状态
bash
# 查看 NPU 使用情况
npu-smi info
# 测试推理接口(OpenAI 兼容格式)
curl -X POST http://192.168.1.100:1025/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-R1-Distill-Qwen-32B-W8A8",
"messages": [
{"role": "user", "content": "请介绍一下华为昇腾的技术优势"}
],
"max_tokens": 512,
"stream": false
}'
# 也支持 TGI 格式接口
curl -X POST http://192.168.1.100:1025/generate \
-H "Content-Type: application/json" \
-d '{
"inputs": "华为昇腾的技术优势是什么?",
"parameters": {
"max_new_tokens": 256,
"temperature": 0.7,
"top_p": 0.95
}
}'九、性能与精度测试
9.1 性能测试(纯模型)
bash
cd /usr/local/Ascend/llm_model/tests/modeltests
# 格式:bash run.sh pa_[数据类型] performance $ALL_IN_OUT_SETS $BS [模型名] [权重路径] [卡数]
bash run.sh pa_bf16 performance [[256,256]] 1 deepseek \
/data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8 29.2 服务化性能测试(benchmark 工具)
bash
# 另开 session,设置环境变量
export PATH=/usr/local/python3.11.10/bin:$PATH
export MINDIE_LOG_TO_STDOUT="benchmark:1; client:1"
# 下载测试数据集
mkdir -p /data/datasets/gsm8k
wget -O /data/datasets/gsm8k/test.jsonl \
https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/gsm8k/test.jsonl
# 执行并发性能测试
benchmark \
--DatasetPath "/data/datasets/gsm8k/test.jsonl" \
--DatasetType "gsm8k" \
--ModelName "DeepSeek-R1-Distill-Qwen-32B-W8A8" \
--ModelPath "/data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8" \
--TestType client \
--Http http://127.0.0.1:1025 \
--ManagementHttp http://127.0.0.2:1026 \
--Concurrency 100 \
--TaskKind stream \
--Tokenizer True \
--MaxOutputLen 5129.3 精度测试
bash
# 精度测试需关闭随机性
export LCCL_DETERMINISTIC=1
export HCCL_DETERMINISTIC=true
export ATB_MATMUL_SHUFFLE_K_ENABLE=0
benchmark \
--DatasetPath "/data/datasets/gsm8k/test.jsonl" \
--DatasetType "gsm8k" \
--ModelName "DeepSeek-R1-Distill-Qwen-32B-W8A8" \
--ModelPath "/data/models/DeepSeek-R1-Distill-Qwen-32B-W8A8" \
--TestType client \
--Http http://127.0.0.1:1025 \
--ManagementHttp http://127.0.0.2:1026 \
--Concurrency 1 \
--TaskKind stream \
--Tokenizer True \
--MaxOutputLen 512 \
--TestAccuracy True十、对接上层应用
10.1 对接 Dify 知识库平台
MindIE Service 兼容 OpenAI API 格式,在 Dify 中配置如下:
进入 设置 → 模型供应商 → OpenAI-API-compatible
填写配置:
- 模型类型:LLM
- 模型名称:
DeepSeek-R1-Distill-Qwen-32B-W8A8(与 config.json 中 modelName 一致) - API Base URL:
http://192.168.1.100:1025/v1 - API Key:随意填写(MindIE 默认不校验)
配置 Embedding 模型(需额外部署 BGE 系列):
- 拉取昇腾 TEI 镜像:
mis-tei:6.0.RC3-910-aarch64 - 启动 bge-m3 服务(端口 8002)
- 启动 bge-reranker-large 服务(端口 8001)
- 拉取昇腾 TEI 镜像:
10.2 对接 OpenWebUI
bash
docker run -d \
--name openwebui \
-p 3000:8080 \
-e OPENAI_API_BASE_URL=http://192.168.1.100:1025/v1 \
-e OPENAI_API_KEY=dummy \
ghcr.io/open-webui/open-webui:main10.3 Python SDK 调用示例
python
from openai import OpenAI
client = OpenAI(
base_url="http://192.168.1.100:1025/v1",
api_key="dummy"
)
response = client.chat.completions.create(
model="DeepSeek-R1-Distill-Qwen-32B-W8A8",
messages=[
{"role": "user", "content": "用 Python 实现快速排序"}
],
max_tokens=1024,
stream=False
)
print(response.choices[0].message.content)十一、常见问题排查
11.1 服务启动失败
bash
# 查看详细日志
tail -f /usr/local/Ascend/mindie/latest/mindie-service/logs/mindie-server.log
# 检查 NPU 状态
npu-smi info
# 检查端口占用
ss -tlnp | grep 102511.2 显存不足(OOM)
- 减少
maxBatchSize和maxPrefillBatchSize - 降低
maxSeqLen(如从 8192 改为 4096) - 使用 W8A8 量化版本替代 BF16 原始权重
- 增加卡数(调整
npuDeviceIds和worldSize)
11.3 推理速度慢
bash
# 启用图模式加速
export ATB_USE_TILING_COPY_STREAM=1
# 检查 HCCL 通信是否正常(多卡场景)
hccn_tool -i 0 -link -g11.4 Atlas 800 9000 BF16 报错
bash
# 修改模型 config.json
python3 -c "
import json
with open('/data/models/your-model/config.json', 'r') as f:
cfg = json.load(f)
cfg['torch_dtype'] = 'float16'
with open('/data/models/your-model/config.json', 'w') as f:
json.dump(cfg, f, indent=2)
print('已修改为 float16')
"十二、部署检查清单
部署完成后逐项确认:
- [ ] 驱动/固件版本与 CANN 版本匹配
- [ ] 容器挂载了所有必要的 NPU 设备文件
- [ ] 模型权重目录权限为 750
- [ ] config.json 中
ipAddress为本机实际 IP - [ ]
worldSize等于npuDeviceIds中的卡数 - [ ] 服务日志输出
Daemon start success! - [ ] curl 测试返回正常 JSON 响应
- [ ] npu-smi 显示 NPU 显存有占用(推理中)
参考资料
- 昇腾社区官方文档:https://www.hiascend.com/document
- MindIE 安装指南:https://www.hiascend.com/document/detail/zh/mindie
- 昇腾镜像仓库:https://www.hiascend.com/developer/ascendhub
- 昇腾技术干货(DeepSeek 部署实践):https://www.hiascend.com/developer/techArticles/20250203-5
- MsModelSlim 量化工具:https://gitee.com/ascend/msit