Appearance
华为昇腾NPU部署DeepSeek-R1
一、环境准备
1.1 创建虚拟环境
- 创建虚拟环境
bash
conda create --name py311 python=3.11
conda init
source ~/.bashrc
conda activate py3111.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.txt1.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-bf161.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(下载的镜像名称与标签)该镜像已经搭载了相关组件:
| 组件 | 版本 |
|---|---|
| MindIE | 2.0.T3 |
| CANN | 8.0.T63 |
| PTA | 6.0.T700 |
| MindStudio | Msit: br_noncom_MindStudio_8.0.0_POC_20251231分支 |
| HDK | 24.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- 启动服务
- 配置服务化环境变量 变量含义:expandable_segments-使能内存池扩展段功能,即虚拟内存特性。更多详情请查看昇腾环境变量参考
bashexport PYTORCH_NPU_ALLOC_CONF=expandable_segments:True- 服务化需要rank_table_file.json中配置container_ip字段 所有机器的配置应该保持一致,除了环境变量的MIES_CONTAINER_IP为本机ip地址
bashexport MIES_CONTAINER_IP=容器ip地址 export RANKTABLEFILE=rank_table_file.json路径- 修改参数
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,
...
}
]
},
...
}
}- 运行
bash
# 以下命令需在所有机器上同时执行
# 解决权重加载过慢问题
export OMP_NUM_THREADS=1
# 设置显存比
export NPU_MEMORY_FRACTION=0.95
# 拉起服务化
cd /usr/local/Ascend/mindie/latest/mindie-service/
./bin/mindieservice_daemon