Skip to content

华为昇腾NPU部署DeepSeek-R1

一、环境准备

1.1 创建虚拟环境

  • 创建虚拟环境
bash
conda create --name py311 python=3.11
conda init
source ~/.bashrc
conda activate py311

1.2 安装依赖

  • clone项目
bash
# 下载V3模型工程,需要使用V3模型工程中inference推理文件夹中的脚本来完成R1模型的调用(因为R1模型没有单独的脚本,它们的调用方式相同)
git clone https://github.com/deepseek-ai/DeepSeek-V3.git

# 进入inference推理文件夹,安装依赖
cd DeepSeek-V3/inference
pip install -r requirements.txt

1.3 下载模型权重

可以HuggingFace或者ModelScope下载,国内推荐ModelScope。R1模型权重下载地址:https://www.modelscope.cn/models/deepseek-ai/DeepSeek-R1

  • 安装ModelScope,如果已经安装则可以忽略
bash
pip install modelscope
  • 下载模型权重
bash
# 创建models/deepseek-ai/DeepSeek-R1目录
mkdir -p ./models/deepseek-ai/DeepSeek-R1

# 下载模型权重,下载时间会很长,可以使用会话持久命令保持下载进程,比如nohup,screen等
modelscope download --model deepseek-ai/DeepSeek-R1 --local_dir ./models/deepseek-ai/DeepSeek-R1
  • NPU侧权重转换, 目前npu转换脚本不会自动复制tokenizer等文件
bash
git clone https://gitee.com/ascend/ModelZoo-PyTorch.git
cd ModelZoo-PyTorch\MindIE\LLM\DeepSeek\DeepSeek-V2\NPU_inference
python fp8_cast_bf16.py --input-fp8-hf-path ./models/deepseek-ai/DeepSeek-R1 --output-bf16-hf-path ./models/deepseek-ai/DeepSeek-R1-bf16

1.4 硬件要求

部署DeepSeek-R1模型用BF16权重进行推理至少需要4台Atlas 800I A2(864G)服务器,用W8A8量化权重进行推理则至少需要2台Atlas 800I A2 (864G)

二、量化权重

如需量化,请参考量化权重

目前支持:

  • 生成模型w8a16量化权重,使用histogram量化方式,在CPU上进行运算
  • 生成模型w8a8混合量化权重,使用histogram量化方式 (MLA:w8a8量化,MOE:w8a8 dynamic pertoken量化)

注意:DeepSeek-R1模型权重较大,量化权重生成时间较久,请耐心等待;具体时间与校准数据集大小成正比,10条数据大概需花费3小时。

三、部署

3.1 使用镜像部署

前往昇腾社区/开发资源下载镜像 比如2.0.T3.1-800I-A2-py311-openeuler24.03-lts, 注意:量化需要使用mindie:2.0.T3版本,下载完成后执行load载入镜像

bash
docker load -i 2.0.T3.1-800I-A2-py311-openeuler24.03-lts(下载的镜像名称与标签)

该镜像已经搭载了相关组件:

组件版本
MindIE2.0.T3
CANN8.0.T63
PTA6.0.T700
MindStudioMsit: br_noncom_MindStudio_8.0.0_POC_20251231分支
HDK24.1.0
  • 启动容器
bash
docker run -itd --privileged  --name=容器名称 --net=host \
   --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/hisi_hdc \
   --device /dev/devmm_svm \
   -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
   -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
   -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
   -v /usr/local/sbin:/usr/local/sbin \
   -v /etc/hccn.conf:/etc/hccn.conf \
   -v /权重路径:/权重路径 \
   mindie:2.0.T3.1-800I-A2-py311-openeuler24.03-lts(根据加载的镜像名称修改) \
   bash
  • 开启通信环境变量
bash
export ATB_LLM_HCCL_ENABLE=1
export ATB_LLM_COMM_BACKEND="hccl"
export HCCL_CONNECT_TIMEOUT=7200
export WORLD_SIZE=32
export HCCL_EXEC_TIMEOUT=0
  • 启动服务
    1. 配置服务化环境变量 变量含义:expandable_segments-使能内存池扩展段功能,即虚拟内存特性。更多详情请查看昇腾环境变量参考
    bash
    export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
    1. 服务化需要rank_table_file.json中配置container_ip字段 所有机器的配置应该保持一致,除了环境变量的MIES_CONTAINER_IP为本机ip地址
    bash
    export MIES_CONTAINER_IP=容器ip地址
    export RANKTABLEFILE=rank_table_file.json路径
    1. 修改参数
    bash
    cd /usr/local/Ascend/mindie/latest/mindie-service/
    vim conf/config.json
    修改相关参数:
json
{
...
  "ServerConfig" : {
    ...
    "port" : 1025, #自定义
    "managementPort" : 1026, #自定义
    "metricsPort" : 1027, #自定义
    ...
    "httpsEnabled" : false,
    ...
    "interCommTLSEnabled": false, # 若不需要安全认证,则设置为false
    ...
  },

  "BackendConfig": {
    ...
    "npuDeviceIds" : [[0,1,2,3,4,5,6,7]],
    "multiNodesInferEnabled": true, # 开启多机推理
    "interNodeTLSEnabled": false, # 若不需要安全认证,则设置为false
    ...
    "ModelDeployConfig": {
      "ModelConfig" : [
      {
      ...
      "modelName" : "llama",
      "modelWeightPath" : "/data/models/DeepSeek-R1-Distill-Llama-70B",
      "worldSize" : 8,
      ...
      }
      ]
    },
    ...
  }
}
  1. 运行
bash
# 以下命令需在所有机器上同时执行
# 解决权重加载过慢问题
export OMP_NUM_THREADS=1
# 设置显存比
export NPU_MEMORY_FRACTION=0.95
# 拉起服务化
cd /usr/local/Ascend/mindie/latest/mindie-service/
./bin/mindieservice_daemon

文献

官方文档