DeepSeek-V3
Usage
We do not advise you to use base language models for text generation. Instead, you can apply post-training, e.g., SFT, RLHF, continued pretraining, etc., on this model.
权重
权重下载
权重转换(Convert FP8 weights to BF16)
- GPU侧权重转换
git clone https://github.com/deepseek-ai/DeepSeek-V3.git
cd DeepSeek-V3/inferece/
python fp8_cast_bf16.py --input-fp8-hf-path /path/to/DeepSeek-V3 --output-bf16-hf-path /path/to/DeepSeek-V3-bf16
- NPU侧权重转换 目前npu转换脚本不会自动复制tokenizer等文件
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 /path/to/DeepSeek-V3 --output-bf16-hf-path /path/to/DeepSeek-V3-bf16
注意:
/path/to/DeepSeek-V3
表示DeepSeek-V3原始权重路径,/path/to/DeepSeek-V3-bf16
表示权重转换后的新权重路径- 由于模型权重较大,请确保您的磁盘有足够的空间放下所有权重,例如DeepSeek-V3在转换前权重约为640G左右,在转换后权重约为1.3T左右
- 推理作业时,也请确保您的设备有足够的空间加载模型权重,并为推理计算预留空间
量化权重生成
详情请参考 DeepSeek模型量化方法介绍
目前支持:
- 生成模型w8a16量化权重,使用histogram量化方式,在CPU上进行运算
- 生成模型w8a8混合量化权重,使用histogram量化方式 (MLA:w8a8量化,MOE:w8a8 dynamic pertoken量化)
注意:DeepSeek-R1模型权重较大,量化权重生成时间较久,请耐心等待;具体时间与校准数据集大小成正比,10条数据大概需花费3小时。
加载镜像
前往昇腾社区/开发资源下载适配DeepSeek-V3的镜像包:mindie:1.0.T71-800I-A2-py311-ubuntu22.04-arm64
注意:量化需要使用mindie:2.0.T3版本,镜像制作中,敬请期待
完成之后,请使用docker images
命令确认查找具体镜像名称与标签。
docker load -i mindie:1.0.T71-800I-A2-py311-ubuntu22.04-arm64(下载的镜像名称与标签)
硬件要求
部署DeepSeek-V3模型用BF16权重进行推理至少需要4台Atlas 800I A2(8*64G)服务器,用W8A8量化权重进行推理则至少需要2台Atlas 800I A2 (8*64G)
容器启动
1. 准备模型
目前提供的MindIE镜像预置了DeepSeek-V3模型推理脚本,无需再下载模型代码,也无需参考目录结构。(可跳过至获取模型权重)
- 下载对应模型代码,可以使用:
git clone https://gitee.com/ascend/ModelZoo-PyTorch.git
目录结构应为如下:
├── DeepSeek-V3
│ ├── README.md
获取模型权重
本地已有模型权重 从您信任的来源自行获取权重后,放置在从上述下载的模型代码的主目录下,放置后的目录结构应为如下:
├── DeepSeek-V3 │ ├── README.md │ └── 权重文件1 │ . │ . │ └── 权重文件n
本地没有模型权重 我们提供模型权重下载脚本,支持HuggingFace,ModelScope以及Modelers来源的模型下载,用法如下
- 确认
atb_models/build/weights_url.yaml
文件中对应repo_id,当前已默认配置模型官方认可的下载地址,如您有其他信任来源的repo_id,可自行修改,默认配置如下:
HuggingFace: deepseek-ai/DeepSeek-V3 ModelScope: deepseek-ai/DeepSeek-V3 Modelers: None
- 执行下载脚本
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-V3
chmod -R 750 /path-to-weights/DeepSeek-V3
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-V3目前沿用DeepSeekV2代码框架
- 检查机器网络情况
# 检查物理链接
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-V3跑CEVAl数据集主节点的命令
bash run.sh pa_bf16 full_CEval 5 16 deepseekv2 /path/to/weights/DeepSeek-V3 /path/to/xxx/ranktable.json 32 4 0 {主节点IP}
# 0 代表从0号卡开始推理,之后的机器依次从8,16,24。
参数说明:
dataset
可选full_BoolQ、full_CEval等,部分数据集需要设置shots
model_name
为deepseekv2
weight_dir
为模型权重路径rank_table_file
为“前置准备”中配置的rank_table_file.json
路径world_size
为总卡数node_num
为当前节点编号,即rank_table_file.json
的server_list
中顺序确定rank_id_start
为当前节点起始卡号,即rank_table_file.json
中当前节点第一张卡的rank_id
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-V3跑性能测试主节点的命令
bash run.sh pa_bf16 performance [[256,256]] 16 deepseekv2 /path/to/weights/DeepSeek-V3 /path/to/xxx/ranktable.json 32 4 0 {主节点IP}
# 0 代表从0号卡开始推理,之后的机器依次从8,16,24。
服务化测试
配置服务化环境变量
变量含义: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路径
export HCCL_DETERMINISTIC=true
修改服务化参数
cd /usr/local/Ascend/mindie/latest/mindie-service/
vim conf/config.json
修改以下参数
"httpsEnabled" : false,
...
"multiNodesInferEnabled" : true, # 开启多机推理
...
# 若不需要安全认证,则将以下两个参数设为false
"interCommTLSEnabled" : false,
"interNodeTLSEnabled" : false,
...
"modelName" : "DeepSeek-V3" # 不影响服务化拉起
"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" : "DeepSeek-V3",
"modelWeightPath" : "/home/data/dsv3_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 NPU_MEMORY_FRACTION=0.95
# 拉起服务化
cd /usr/local/Ascend/mindie/latest/mindie-service/
./bin/mindieservice_daemon
执行命令后,首先会打印本次启动所用的所有参数,然后直到出现以下输出:
Daemon start success!
则认为服务成功启动。
来到客户端
进入相同容器,向服务端发送请求。
更多信息可参考官网信息:MindIE Service
常见问题
服务化常见问题
- 若出现out of memory报错,可适当调高NPU_MEMORY_FRACTION环境变量(默认值为0.8),适当调低服务化配置文件config.json中maxSeqLen、maxInputTokenLen、maxPrefillBatchSize、maxPrefillTokens、maxBatchSize等参数
export NPU_MEMORY_FRACTION=0.96
- 若出现hccl通信超时报错,可配置以下环境变量
export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=0
权重路径权限问题
注意保证权重路径是可用的,执行以下命令修改权限,注意是整个父级目录的权限:
chown -R HwHiAiUser:HwHiAiUser /path-to-weights
chmod -R 750 /path-to-weights