当前位置: 首页 > article >正文

华为昇腾部署 DeepSeek-R1 (671B) 大模型实战指南

概述

本指南详细讲解如何在华为昇腾Atlas 800I A2服务器集群上部署DeepSeek-R1 671B大模型,涵盖从环境准备到服务化部署的全流程。通过本教程,您将掌握:

  • 模型权重转换与量化方法
  • 昇腾专用镜像的使用技巧
  • 多机分布式推理配置
  • 生产级服务化部署方案

一、部署前准备

1.1 硬件要求

部署类型服务器配置显存要求
BF16推理4台Atlas 800I A28*64GB
W8A8量化推理2台Atlas 800I A28*64GB

1.2 软件环境

# 关键组件版本
MindIE 2.0.T3
CANN 8.0.T63
PTA 6.0.T700
HDK 24.1.0
组件版本
MindIE2.0.T3
CANN8.0.T63
PTA6.0.T700
MindStudioMsit: br_noncom_MindStudio_8.0.0_POC_20251231分支
HDK24.1.0

二、模型权重处理

2.1 权重下载

# 官方权重库
wget https://huggingface.co/deepseek-ai/DeepSeek-R1
wget https://huggingface.co/deepseek-ai/DeepSeek-R1-Zero

国内可以通过魔搭社区快速下载

  • DeepSeek-R1
  • DeepSeek-R1-Zero

modelscope 魔搭社区模型下载指南

2.2 格式转换

GPU侧转换:

git clone https://github.com/deepseek-ai/DeepSeek-V3.git
cd DeepSeek-V3/inference/
python fp8_cast_bf16.py \
  --input-fp8-hf-path ./DeepSeek-R1 \
  --output-bf16-hf-path ./deepseek-R1-bf16

NPU侧转换:

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 ./DeepSeek-R1 \
  --output-bf16-hf-path ./deepseek-R1-bf16

💡 转换后权重约1.3TB,确保存储空间充足


三、昇腾镜像配置

3.1 镜像获取

  1. 访问昇腾镜像仓库
  2. 下载:mindie_2.0.T3-800I-A2-py311-openeuler24.03-lts-aarch64.tar.gz​
  3. 加载镜像:
docker load -i mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts-aarch64

3.2 容器启动

1. 准备模型

目前提供的MindIE镜像预置了DeepSeek-R1模型推理脚本,无需再下载模型代码,也无需参考目录结构。(可跳过至获取模型权重)

  • 下载对应模型代码,可以使用:
git clone https://gitee.com/ascend/ModelZoo-PyTorch.git

目录结构应为如下:

├── DeepSeek-R1
│   ├── README.md
  • 获取模型权重

    • 本地已有模型权重 从您信任的来源自行获取权重后,放置在从上述下载的模型代码的主目录下,放置后的目录结构应为如下:

      ├── DeepSeek-R1
      │   ├── README.md
      │   └── 权重文件1
      │   .   
      │   .
      │   └── 权重文件n
      
    • 本地没有模型权重 我们提供模型权重下载脚本,支持HuggingFace,ModelScope以及Modelers来源的模型下载,用法如下
      注意:以下引用的atb_models​路径在DeepSeek-V2​路径下

      1. 确认atb_models/build/weights_url.yaml​文件中对应repo_id,当前已默认配置模型官方认可的下载地址,如您有其他信任来源的repo_id,可自行修改,默认配置如下:
      HuggingFace: deepseek-ai/DeepSeek-R1
      ModelScope: deepseek-ai/DeepSeek-R1
      Modelers: None
      
      1. 执行下载脚本atb_models/build/download_weights.py​:
      参数名含义
      hub可选,str类型参数,hub来源,支持HuggingFace, ModelScope, Modelers
      repo_id可选,str类型参数,仓库ID,默认从weight_url.yaml中读取
      target_dir可选,str类型参数,默认放置在atb_models同级目录下
  • 修改模型文件夹属组为1001,执行权限为750,执行:

chown -R 1001:1001 /path-to-weights/DeepSeek-R1
chmod -R 750 /path-to-weights/DeepSeek-R1
2. 启动容器
  • 执行以下启动命令(参考):
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:1.0.0-XXX-800I-A2-arm64-py3.11(根据加载的镜像名称修改) \
   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

纯模型测试

前置准备
  • 修改权重目录下config.json文件
将 model_type 更改为 deepseekv2 (全小写且无空格)

注意:在本仓实现中,DeepSeek-R1目前沿用DeepSeek-V2代码框架

  • 检查机器网络情况
# 检查物理链接
for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done 
# 检查链接情况
for i in {0..7}; do hccn_tool -i $i -link -g ; done
# 检查网络健康情况
for i in {0..7}; do hccn_tool -i $i -net_health -g ; done
# 查看侦测ip的配置是否正确
for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done
# 查看网关是否配置正确
for i in {0..7}; do hccn_tool -i $i -gateway -g ; done
# 检查NPU底层tls校验行为一致性,建议全0
for i in {0..7}; do hccn_tool -i $i -tls -g ; done | grep switch
# NPU底层tls校验行为置0操作
for i in {0..7};do hccn_tool -i $i -tls -s enable 0;done
  • 获取每张卡的ip地址
for i in {0..7};do hccn_tool -i $i -ip -g; done
  • 参考如下格式,配置rank_table_file.json
{
   "server_count": "...", # 总节点数
   # server_list中第一个server为主节点
   "server_list": [
      {
         "device": [
            {
               "device_id": "...", # 当前卡的本机编号,取值范围[0, 本机卡数)
               "device_ip": "...", # 当前卡的ip地址,可通过hccn_tool命令获取
               "rank_id": "..." # 当前卡的全局编号,取值范围[0, 总卡数)
            },
            ...
         ],
         "server_id": "...", # 当前节点的ip地址
         "container_ip": "..." # 容器ip地址(服务化部署时需要),若无特殊配置,则与server_id相同
      },
      ...
   ],
   "status": "completed",
   "version": "1.0"
}
精度测试
  • 进入modeltest路径
cd /usr/local/Ascend/llm_model/tests/modeltest/
  • 运行测试脚本
# 需在所有机器上同时执行
bash run.sh pa_bf16 [dataset] ([shots]) [batch_size] [model_name] ([is_chat_model]) [weight_dir] [rank_table_file] [world_size] [node_num] [rank_id_start] [master_address]

Example: 在DeepSeek-R1跑CEVAl数据集主节点的命令

bash run.sh pa_bf16 full_CEval 5 16 deepseekv2 /path/to/weights/DeepSeek-R1 /path/to/xxx/ranktable.json 32 4 0 {主节点IP}
# 0 代表从0号卡开始推理,之后的机器依次从8,16,24。

参数说明:

  1. ​dataset​可选full_BoolQ、full_CEval等,部分数据集需要设置shots​
  2. ​model_name​为deepseekv2​
  3. ​weight_dir​为模型权重路径
  4. ​rank_table_file​为“前置准备”中配置的rank_table_file.json​路径
  5. ​world_size​为总卡数
  6. ​node_num​为当前节点编号,即rank_table_file.json​的server_list​中顺序确定
  7. ​rank_id_start​为当前节点起始卡号,即rank_table_file.json​中当前节点第一张卡的rank_id​
  8. ​master_address​为主节点ip地址,即rank_table_file.json​的server_list​中第一个节点的ip
性能测试
  • 进入modeltest路径
cd /usr/local/Ascend/llm_model/tests/modeltest/
  • 运行测试脚本
# 需在所有机器上同时执行
bash run.sh pa_bf16 performance [case_pair] [batch_size] [model_name] ([is_chat_model]) [weight_dir] [rank_table_file] [world_size] [node_num] [rank_id_start] [master_address]

参数含义同“精度测试”

Example: 在DeepSeek-R1跑性能测试主节点的命令

bash run.sh pa_bf16 performance [[256,256]] 16 deepseekv2 /path/to/weights/DeepSeek-R1 /path/to/xxx/ranktable.json 32 4 0 {主节点IP}
# 0 代表从0号卡开始推理,之后的机器依次从8,16,24。

四、分布式推理配置

4.1 网络检查

# 检查NPU卡状态
for i in {0..7}; do
  hccn_tool -i $i -link -g
  hccn_tool -i $i -net_health -g
done

4.2 Rank Table配置示例

{
  "server_count": "4",
  "server_list": [
    {
      "device": [
        {"device_id":0, "device_ip":"192.168.1.101", "rank_id":0},
        ... // 其他7张卡配置
      ],
      "server_id":"192.168.1.100",
      "container_ip":"192.168.1.100"
    },
    ... // 其他3个节点
  ]
}

五、服务化部署

配置服务化环境变量

变量含义:expandable_segments-使能内存池扩展段功能,即虚拟内存特性。更多详情请查看昇腾环境变量参考

export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

服务化需要rank_table_file.json​中配置container_ip​字段 所有机器的配置应该保持一致,除了环境变量的MIES_CONTAINER_IP为本机ip地址。

export MIES_CONTAINER_IP=容器ip地址
export RANKTABLEFILE=rank_table_file.json路径

修改服务化参数

cd /usr/local/Ascend/mindie/latest/mindie-service/
vim conf/config.json

修改以下参数

"httpsEnabled" : false,
...
"multiNodesInferEnabled" : true, # 开启多机推理
...
# 若不需要安全认证,则将以下两个参数设为false
"interCommTLSEnabled" : false,
"interNodeTLSEnabled" : false,
...
"modelName" : "DeepSeek-R1" # 不影响服务化拉起
"modelWeightPath" : "权重路径",

Example:仅供参考,不保证性能

{
    "Version" : "1.0.0",
    "LogConfig" :
    {
        "logLevel" : "Info",
        "logFileSize" : 20,
        "logFileNum" : 20,
        "logPath" : "logs/mindie-server.log"
    },

    "ServerConfig" :
    {
        "ipAddress" : "改成主节点IP",
        "managementIpAddress" : "改成主节点IP",
        "port" : 1025,
        "managementPort" : 1026,
        "metricsPort" : 1027,
        "allowAllZeroIpListening" : false,
        "maxLinkNum" : 1000, //如果是4机,建议300
        "httpsEnabled" : false,
        "fullTextEnabled" : false,
        "tlsCaPath" : "security/ca/",
        "tlsCaFile" : ["ca.pem"],
        "tlsCert" : "security/certs/server.pem",
        "tlsPk" : "security/keys/server.key.pem",
        "tlsPkPwd" : "security/pass/key_pwd.txt",
        "tlsCrlPath" : "security/certs/",
        "tlsCrlFiles" : ["server_crl.pem"],
        "managementTlsCaFile" : ["management_ca.pem"],
        "managementTlsCert" : "security/certs/management/server.pem",
        "managementTlsPk" : "security/keys/management/server.key.pem",
        "managementTlsPkPwd" : "security/pass/management/key_pwd.txt",
        "managementTlsCrlPath" : "security/management/certs/",
        "managementTlsCrlFiles" : ["server_crl.pem"],
        "kmcKsfMaster" : "tools/pmt/master/ksfa",
        "kmcKsfStandby" : "tools/pmt/standby/ksfb",
        "inferMode" : "standard",
        "interCommTLSEnabled" : false,
        "interCommPort" : 1121,
        "interCommTlsCaPath" : "security/grpc/ca/",
        "interCommTlsCaFiles" : ["ca.pem"],
        "interCommTlsCert" : "security/grpc/certs/server.pem",
        "interCommPk" : "security/grpc/keys/server.key.pem",
        "interCommPkPwd" : "security/grpc/pass/key_pwd.txt",
        "interCommTlsCrlPath" : "security/grpc/certs/",
        "interCommTlsCrlFiles" : ["server_crl.pem"],
        "openAiSupport" : "vllm"
    },

    "BackendConfig" : {
        "backendName" : "mindieservice_llm_engine",
        "modelInstanceNumber" : 1,
        "npuDeviceIds" : [[0,1,2,3,4,5,6,7]],
        "tokenizerProcessNumber" : 8,
        "multiNodesInferEnabled" : true,
        "multiNodesInferPort" : 1120,
        "interNodeTLSEnabled" : false,
        "interNodeTlsCaPath" : "security/grpc/ca/",
        "interNodeTlsCaFiles" : ["ca.pem"],
        "interNodeTlsCert" : "security/grpc/certs/server.pem",
        "interNodeTlsPk" : "security/grpc/keys/server.key.pem",
        "interNodeTlsPkPwd" : "security/grpc/pass/mindie_server_key_pwd.txt",
        "interNodeTlsCrlPath" : "security/grpc/certs/",
        "interNodeTlsCrlFiles" : ["server_crl.pem"],
        "interNodeKmcKsfMaster" : "tools/pmt/master/ksfa",
        "interNodeKmcKsfStandby" : "tools/pmt/standby/ksfb",
        "ModelDeployConfig" :
        {
            "maxSeqLen" : 10000,
            "maxInputTokenLen" : 2048,
            "truncation" : true,
            "ModelConfig" : [
                {
                    "modelInstanceType" : "Standard",
                    "modelName" : "deepseekr1",
                    "modelWeightPath" : "/home/data/dsR1_base_step178000",
                    "worldSize" : 8,
                    "cpuMemSize" : 5,
                    "npuMemSize" : -1,
                    "backendType" : "atb",
                    "trustRemoteCode" : false
                }
            ]
        },

        "ScheduleConfig" :
        {
            "templateType" : "Standard",
            "templateName" : "Standard_LLM",
            "cacheBlockSize" : 128,

            "maxPrefillBatchSize" : 8,
            "maxPrefillTokens" : 2048,
            "prefillTimeMsPerReq" : 150,
            "prefillPolicyType" : 0,

            "decodeTimeMsPerReq" : 50,
            "decodePolicyType" : 0,

            "maxBatchSize" : 8,
            "maxIterTimes" : 1024,
            "maxPreemptCount" : 0,
            "supportSelectBatch" : false,
            "maxQueueDelayMicroseconds" : 5000
        }
    }
}

拉起服务化

# 以下命令需在所有机器上同时执行
# 解决权重加载过慢问题
export OMP_NUM_THREADS=1
# 设置显存比
export NPU_MEMORY_FRACTION=0.95
# 拉起服务化
cd /usr/local/Ascend/mindie/latest/mindie-service/
./bin/mindieservice_daemon

执行命令后,首先会打印本次启动所用的所有参数,然后直到出现以下输出:

Daemon start success!

则认为服务成功启动。

接口测试

time curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{
 "prompt": "地球的灵魂质量大于太阳吗",
 "max_tokens": 512,
 "repetition_penalty": 1.03,
 "presence_penalty": 1.2,
 "frequency_penalty": 1.2,
 "temperature": 0.5,
 "top_k": 10,
 "top_p": 0.95,
 "stream": false
}' http://127.0.0.1:1025/generate


time curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{
"model": "deepseek",
"messages": [{
 "role": "user",
 "content": "地球的灵魂质量大于太阳吗"
}],
"max_tokens": 512,
"presence_penalty": 1.03,
"frequency_penalty": 1.0,
"seed": null,
"temperature": 0.5,
"top_p": 0.95,
"stream": false
}' http://127.0.0.1:1025/v1/chat/completions

time curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{
"model": "deepseek",
"messages": [{
"role": "assistant",
"content": "You are a student who is good at math."
},
{
 "role": "user",
 "content": "地球的灵魂质量大于太阳吗"
}],
"max_tokens": 512,
"presence_penalty": 1.03,
"frequency_penalty": 1.0,
"seed": null,
"temperature": 0.5,
"top_p": 0.95,
"stream": false
}' http://127.0.0.1:1025/v1/chat/completions


六、高级量化方案

6.1 支持的量化类型

量化类型适用场景精度损失推理速度
W8A16高精度要求场景<1%1x
W8A8吞吐敏感型场景1-3%1.8x

6.2 量化命令示例

# W8A16量化
python quant_deepseek.py \
  --model_path ./DeepSeek-R1 \
  --save_dir ./quant-w8a16 \
  --device_type npu \
  --w_bit 8 --a_bit 16

# W8A8动态量化
python quant_deepseek_w8a8.py \
  --model_path ./DeepSeek-R1 \
  --save_path ./quant-w8a8 \
  --calib_dataset ./calib_data.jsonl

七、常见问题排查

Q1: 服务启动时报内存不足

解决方案:

export NPU_MEMORY_FRACTION=0.96  # 提升显存利用率
调整config.json中的maxBatchSize=4

Q2: 出现HCLL通信超时

export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=0

Q3: Tokenizer加载异常

检查权重目录权限:

chown -R 1001:1001 /model_weights
chmod -R 750 /model_weights

通过本指南,您已完成在华为昇腾平台上对DeepSeek-R1 671B大模型的完整部署。建议生产环境部署时结合Prometheus监控系统,实时关注NPU显存利用率和吞吐量指标。

八、资源链接

  1. 昇腾模型库
  2. MindIE官方文档
  3. MindIE Service开发指南
  4. DeepSeek-R1模型卡片
  5. DeepSeek模型量化方法介绍
  6. 昇腾镜像仓库
  7. 量化技术白皮书
  8. Ascend/ModelZoo-PyTorch
  9. 环境变量配置
  10. DeepSeek 系列模型官方教程
模型名称安装教程
DeepSeek V3DeepSeek-V3-模型库-ModelZoo-昇腾社区
DeepSeek R1DeepSeek-R1-模型库-ModelZoo-昇腾社区
DeepSeek-R1-Distill-Qwen-1.5BDeepSeek-R1-Distill-Qwen-1.5B-模型库-ModelZoo-昇腾社区
DeepSeek-R1-Distill-Qwen-7BDeepSeek-R1-Distill-Qwen-7B-模型库-ModelZoo-昇腾社区
DeepSeek-R1-Distill-Llama-8BDeepSeek-R1-Distill-Llama-8B-模型库-ModelZoo-昇腾社区
DeepSeek-R1-Distill-Qwen-14BDeepSeek-R1-Distill-Qwen-14B-模型库-ModelZoo-昇腾社区
DeepSeek-R1-Distill-Qwen-32BDeepSeek-R1-Distill-Qwen-32B-模型库-ModelZoo-昇腾社区
DeepSeek-R1-Distill-Llama-70BDeepSeek-R1-Distill-Llama-70B-模型库-ModelZoo-昇腾社区
Janus-Pro-7BJanus-Pro-模型库-ModelZoo-昇腾社区

http://www.kler.cn/a/545820.html

相关文章:

  • ES的典型架构图及其核心组件
  • 网络安全之攻防笔记--web安全攻防
  • 基于Python、使用`pandas`库和`Brightway2`库实现根据Excel表格某一列内容与数据库进行匹配
  • 【Uniapp】关于实现下拉刷新的三种方式
  • 中国通信企业协会 通信网络安全服务能力评定 证书使用说明
  • 从零开始学Python爬虫:(一)爬虫前言
  • 微信小程序请求大模型监听数据块onChunkReceived方法把数据解析成json
  • 网络安全架构师怎么考 网络安全 架构
  • 如何解决ChatGPT API响应慢的问题
  • Git 建立远端仓库并push
  • Node.js入门篇
  • docker-compose.yml 详细教学
  • 爬虫学习第五篇环境的准备工作
  • LeetCode数学相关算法题(1)【C语言版】
  • deepseek-r1落地指南(搭建web-ui | 搭建本地代码编辑器)
  • MySQL 安装配置(完整教程)
  • DeepSeek教unity------UI框架
  • C++ 学习之旅:基础语法学习
  • npm 私服使用介绍
  • HCIA项目实践--RIP的拓展配置