Skip to content

华为昇腾 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.5B1.5BAtlas 300I Duo1 卡
DeepSeek-R1-Distill-Qwen-7B7BAtlas 300I Duo / 800I A21 卡
DeepSeek-R1-Distill-Qwen-32B32BAtlas 800I A22 卡(W8A8)
DeepSeek-R1-Distill-Llama-70B70BAtlas 800I A24 卡
DeepSeek-R1 / V3(671B MoE)671BAtlas 800I A2 × 多节点16 卡起

1.3 核心软件栈版本对应关系

MindIE 版本CANN 版本驱动版本适配硬件
MindIE 2.3.0CANN 8.3.RC223.0.0+Atlas 800I A2 / 300I Duo
MindIE 2.2.RC1CANN 8.3.RC223.0.0+Atlas 800I A2 / 300I Duo
MindIE 2.1.RC2CANN 8.2.RC123.0.0Atlas 800I A2 / 300I Duo
MindIE 2.0.RC2CANN 8.1.RC123.0.0Atlas 800I A2 / 300I Duo
MindIE 1.0.0CANN 8.0.RC323.0.rc2Atlas 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 board

2.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 info

2.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.py

4.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.5B

4.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.sh

6.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 cpu

6.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.json

7.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最大序列长度(输入+输出),按需调整
npuMemSizeNPU 显存限制,-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:$PATH

8.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 2

9.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 512

9.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 中配置如下:

  1. 进入 设置 → 模型供应商 → OpenAI-API-compatible

  2. 填写配置:

    • 模型类型:LLM
    • 模型名称DeepSeek-R1-Distill-Qwen-32B-W8A8(与 config.json 中 modelName 一致)
    • API Base URLhttp://192.168.1.100:1025/v1
    • API Key:随意填写(MindIE 默认不校验)
  3. 配置 Embedding 模型(需额外部署 BGE 系列):

    • 拉取昇腾 TEI 镜像:mis-tei:6.0.RC3-910-aarch64
    • 启动 bge-m3 服务(端口 8002)
    • 启动 bge-reranker-large 服务(端口 8001)

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:main

10.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 1025

11.2 显存不足(OOM)

  • 减少 maxBatchSizemaxPrefillBatchSize
  • 降低 maxSeqLen(如从 8192 改为 4096)
  • 使用 W8A8 量化版本替代 BF16 原始权重
  • 增加卡数(调整 npuDeviceIdsworldSize

11.3 推理速度慢

bash
# 启用图模式加速
export ATB_USE_TILING_COPY_STREAM=1

# 检查 HCCL 通信是否正常(多卡场景)
hccn_tool -i 0 -link -g

11.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 显存有占用(推理中)

参考资料

褚成志 · 简历中心