昇腾部署deepseek教程
DeepSeek 简介
DeepSeek-R1 是一款参数规模达671B的大型语言模型,在近期破圈并广为人知,其满血版部署对硬件要求极高
昇腾 910B NPU 凭借64GB 显存/卡的遥遥领先特性,结合华为自研的MindIE框架,可支持多机多卡分布式推理
昇腾910B部署DeepSeek-R1
本章基于昇腾社区官方文档、知乎技术文章及开发者实践经验,系统梳理从环境准备到服务化测试的全流程,助力高效部署
软硬件要求
硬件配置
基础配置:
- bf16:至少4台Atlas 800I A2(8*64G)服务器,每台配置8张昇腾910B卡(共32卡,显存总量≥2TB)
- W8A8量化:若使用W8A8量化权重,可缩减至2台服务器
以下是华为官方给出的其他版本模型的部署资源最低要求及推理性能,供参考
昇腾一体机推荐配置
:DeepSeek V3/R1及蒸馏模型推理服务部署推荐配置
模型名称 | 参数 | 产品 | 配置 | 系统吞吐 (Token/s) | 多用户并发数 (路) |
---|---|---|---|---|---|
DeepSeek V3 | 671B | Atlas 800I A2 | 1024GB | 1911 | 192 |
DeepSeek R1 | 671B | Atlas 800I A2 | 1024GB | 1911 | 192 |
DeepSeek-R1 Distill-Llama-70B | 70B | Atlas 800I A2 | 512GB | 3300 | 165 |
DeepSeek-R1 Distill-Qwen-32B | 32B | Atlas 800I A2 | 256GB | 4940 | 247 |
DeepSeek-R1 Distill-Qwen-14B | 14B | Atlas 800I A2 | 256GB | 7500 | 300 |
DeepSeek-R1 Distill-Qwen-14B | 14B | Atlas 300I Duo | 1*Duo 96GB PCIE | 730 | 80 |
DeepSeek-R1 Distill-Llama-8B | 8B | Atlas 300I Duo | 1*Duo 96GB PCIE | 956 | 115 |
DeepSeek-R1 Distill-Qwen-7B | 7B | Atlas 300I Duo | 1*Duo 96GB PCIE | 956 | 115 |
DeepSeek-R1 Distill-Qwen-1.5B | 1.5B | Atlas 300V | 1*300V 24GB PCIE | 432 | 16 |
- 数据截止至 2025.02.13
网络要求:多机间需高速RDMA网络互联,使用hccn_tool工具检查网卡健康状态。开放端口1025-1030,建议关闭防火墙或配置白名单
服务器:最好在操作前reboot一下服务器,关闭无关进程(如 k8s),避免内存泄漏
软件依赖
组件 | 版本要求 | 备注 |
---|---|---|
MindIE | ≥2.0.T3 | 一定要到官网上去下载镜像 |
CANN | ≥8.0.T63 | / |
昇腾驱动 | ≥24.1.rc2 | 所有节点执行npu-smi info确认驱动版本一致,这个很重要,新驱动能避免大量问题。 |
操作系统 | openeuler24.03 | 一定要换成欧拉的(官方提供的镜像好像就是) |
Python 环境 | 3.11(镜像预置) | |
MindStudio | Msit: br_noncom_MindStudio_8.0.0_POC_20251231分支 | |
HDK | 24.1.0 |
权重处理与转换
权重下载
注意可以直接下载开源的bf16模型
魔塔 deepseek-r1 bf16、hg deepseek-r1 bf16、hg unsloth deepseek-r1 bf16
魔塔_deepseek-ai-r1-w8a8-mindie:deepseek-ai-r1-w8a8-mindie是deepseek-r1 bf16量化出来的版本,理论上直接下载这个模型就不需要自己做量化了
官方渠道:
HuggingFace 下载原始 FP8 权重(约 640GB)
DeepSeek-R1:https://huggingface.co/deepseek-ai/DeepSeek-R1/tree/main
DeepSeek-R1-Zero:https://huggingface.co/deepseek-ai/DeepSeek-R1-Zero/tree/main
魔塔社区:国内推荐使用,峰值速度达80M/s,全部下载完也就一小时左右,速度非常可观
详细可参阅文档:下载的时候需要导入一个白名单,否则自定义位置报错
1
2
3
4
5
6
7
8from openmind_hub import snapshot_download
snapshot_download(
repo_id="State_Cloud/DeepSeek-R1-origin",
local_dir="xxx",
cache_dir="xxx",
local_dir_use_symlinks=False,
)
示例:DeepSeek-R1-bf16下载脚本示例(都需要依赖python,确保磁盘足够大,文件大约占1.4T):
1 | # 创建模型存放路径和缓存路径 |
官方渠道:
1
2
3
4
5
6
7
8
9
10#安装依赖
pip install -U huggingface_hub
# 设置环境变量(当前命令行有效)
export HF_ENDPOINT=https://hf-mirror.com
# 缓存目录
export HF_HOME=/home/huggingface/huggingface_cache
# 开始下载
huggingface-cli download --resume-download unsloth/DeepSeek-R1-bf16 --local-dir /home/huggingface/pretrained_model/DeepSeek-R1-BF16魔塔社区(推荐):
1
2
3
4
5#安装依赖
pip install modelscope
# 开始下载
modelscope download --model unsloth/DeepSeek-R1-BF16 --local_dir /home/huggingface/pretrained_model/DeepSeek-R1-BF16
权重转换(FP8转BF16)
如果下载的是BF16的,可以直接跳过这一步
R1 模型发布的权重是 FP8 的,总体规模在 671B,但是华为昇腾卡不支持 FP8,只支持 BF16,因此还需转回到 BF16 类型
GPU 侧转换(需支持 FP8 的 NVIDIA 设备):
DeepSeek官方没有针对DeepSeek-R1提供新的权重转换脚本,所以复用DeepSeek-V3的权重转换脚本,执行下面的命令
1
2
3git clone https://github.com/deepseek-ai/DeepSeek-V3.git
cd DeepSeek-V3/inference/
python fp8_cast_bf16.py --input-fp8-hf-path /path/to/DeepSeek-R1 --output-bf16-hf-path /path/to/deepseek-R1-bf16NPU 侧转换:
目前npu转换脚本不会自动复制tokenizer等文件,需手动操作
/path/to/DeepSeek-R1 表示DeepSeek-R1原始权重路径,/path/to/deepseek-R1-bf16 表示权重转换后的新权重路径
1
2
3git 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-R1 --output-bf16-hf-path /path/to/deepseek-R1-bf16
由于模型权重较大,请确保您的磁盘有足够的空间放下所有权重,例如DeepSeek-R1在转换前权重约为640G左右,在转换后权重约为1.3T左右
推理作业时,也请确保您的设备有足够的空间加载模型权重,并为推理计算预留空间
量化权重(非必需)
如果你的机器资源充足,这部分不用看,直接往下
如果你想部署量化的版本,可以参考官方文档。DeepSeek-R1模型权重较大,量化权重生成时间较久,请耐心等待;具体时间与校准数据集大小成正比,10条数据大概需花费3小时
目前支持:
- 生成模型w8a16量化权重,使用histogram量化方式,在CPU上进行运算
- 生成模型w8a8混合量化权重,使用histogram量化方式 (MLA: w8a8量化,MOE: w8a8 dynamic pertoken量化)
容器准备
昇腾官方出了可以直接部署的镜像,可前往昇腾社区/开发资源下载适配。但需要申请,通过后才能下载
DeepSeek-R1的镜像包名称:mindie_2.0.T3-800I-A2-py311-openeuler24.03-lts-aarch64.tar.gz
镜像加载后的名称:mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts-aarch64
注意:量化需要使用mindie:2.0.T3版本
镜像拉取:
1 | docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts |
完成之后,请使用docker images命令确认查找具体镜像名称与标签
容器启动
(待确认
)目前提供的MindIE镜像预置了DeepSeek-R1模型推理脚本,无需再下载模型代码,也无需参考目录结构。(可跳过至获取模型权重)
下载模型启动代码
1 | git clone https://gitee.com/ascend/ModelZoo-PyTorch.git |
目录结构( ModelZoo-PyTorch-master\MindIE\LLM\DeepSeek )应为如下:
1 | ├── DeepSeek-R1 |
将第上面下载好的模型权重放置在从上述下载的模型代码的主目录下,放置后的目录结构应为如下:
1 | ├── DeepSeek-R1 |
修改权重目录下config.json文件,将 model_type更改为deepseekv2(全小写且无空格)
注意:不要问为什么是deepseekv2,照着做就可以了😜
权限配置
修改模型文件夹属组为1001,执行权限为750,执行:
1 | chown -R 1001:1001 /path/to/DeepSeek-R1 |
启动容器
把下载好模型权重的位置,挂载到容器中,可以放到workspace目录下,这样后面部署的时候,就可以使用了
其它的挂载盘都是常规的驱动或者工具,照做即可,其中—name 容器名,-v 挂载下载好的模型
1 | docker run -itd --privileged --name=deepseek-r1 --net=host \ |
多台服务器部署,每台服务器下载同样的模型权重,位置可以不同,但是都需要执行上述启动容器的命令,把挂载盘换一下
容器操作
接下来的操作都默认在容器中
进入容器
假设上述容器名字为deepseek-r1,执行:
1 | docker exec -it deepseek-r1 bash |
容器检查
用hccn_tool检查网络状态【重要!!重要!!重要!!】
1 | # 检查物理链接 |
如果有问题,可以先排查下本机是否正常,一般容器内有问题应该是有些目录没有挂载好,可以问一下chatgpt或者deepseek
配置多机多卡文件
文件名称:rank_table_file.json
文件路径:放在与上文模型代码目录相同的位置,没有的话就自己创建一个
首先使用下面这个命令,把每张卡的ip地址记录下来
1 | for i in {0..7};do hccn_tool -i $i -ip -g; done |
每台机器都执行一次,如果是4台启动的话,就执行4次,但确定一台作为主节点
输出结果参数介绍:
- server_count:一共使用几台服务器,即节点数。server_list中第一个server为主节点
- device_id:当前卡的本机编号,取值范围[0, 本机卡数)
- device_ip:当前卡的ip地址,可通过hccn_tool命令获取
- rank_id:当前卡的全局编号,取值范围[0, 总卡数)
- server_id:当前节点的ip地址
- container_ip:容器ip地址(服务化部署时需要),若无特殊配置,则与server_id相同
查看服务器的ip地址
1 | hostname -I |
查看docker容器的ip地址
1 | docker inspect 容器id | grep "IPAddress" |
如果返回为空,可能是使用和宿主机一样的网络,查看容器的网络模式
1 | docker inspect 容器id | grep -i '"NetworkMode"' |
如果返回为 “NetworkMode”: “host”, 则说明容器使用的是 host 网络,它没有自己的 IP,而是直接用宿主机 IP
下面是四个节点的rank_table_file.json
配置文件,对着填好ip地址即可
1 | { |
不要忘了设置rank_table_file.json
文件的权限
1 | chmod 640 rank_table_file.json |
配置好之后,后续的MindIE推理框架也会参考这个进行启动,不需要再额外设置
配置通信环境变量(WORLD_SIZE指的是显卡数量,注意是显卡的数量,不是机器的数量)
1 | export ATB_LLM_HCCL_ENABLE=1 |
精度测试
在镜像里的文件目录中找到/usr/local/Ascend/atb-models/tests/modeltest/run.sh
在所有机器上同时执行测试命令(参数含义参考上文):
1 | 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] |
性能测试
在跟上面相同目录下运行命令:
1 | bash run.sh pa_bf16 performance [[256,256]] 16 deepseekv2 /path/to/weights/DeepSeek-R1 /path/to/xxx/ranktable.json 16 2 0 {主节点IP} |
跑完会生成一个csv文件,里面保存了本次测试的指标
模型推理
容器环境变量配置
每个容器都要执行以下命令:
1 | export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True |
注意,上述的路径是指容器内的路径,并且每台机器的ip都要对应正确
修改推理参数配置
文件名称:config.json
文件路径:/usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
注意,这个配置文件跟5.2中的config.json名称一致,但位置不一样,修改的含义也不一样,不要混淆
同样也是在容器中,每台机器都要做一样的配置,下面是官方给的配置,建议上下文长度参数设置为32k,当前 4 台机都可以正常部署起来
1 | { |
开启多机推理,要设置ipAddress为主节点IP并调整显存参数:
1 | { |
启动推理服务
执行下面命令:
1 | cd /usr/local/Ascend/mindie/latest/mindie-servicenohup ./bin/mindieservice_daemon > /workspace/output.log 2>&1 & |
执行命令后,首先会打印本次启动所用的所有参数,然后直到出现以下输出,就表示服务启动成功啦
1 | Daemon start success! |
最后再用curl测试一下服务响应(如果命令执行不了,尝试把结尾的\去掉,整理成一行运行)):
1 | curl -X POST http://{ip}:{port}/v1/chat/completions \ |
以上能看到输出,就算是部署成功了(完结撒花🎉🎉🎉)
实际示例(仅供参考,以上面那个或官网为准):
1 | curl http://192.168.xx.xx:xx/v1/chat/completions -H "Content-Type: application/json" -d '{ |
常见问题与解决方案
加载tokenizer失败
解决方式:检查tokenizer.json 文件是否和官网一致,并且检查一下权限,是否能正常读取
out of memory报错
解决方式:适当调高NPU_MEMORY_FRACTION环境变量(默认值为0.8),适当调低服务化配置文件config.json中maxSeqLen、maxInputTokenLen、maxPrefillBatchSize、maxPrefillTokens、maxBatchSize等参数
1
export NPU_MEMORY_FRACTION=0.96
hccl通信超时报错
解决方式:配置以下环境变量
1
2export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=0AttributeError:’IbisTokenizer’ object has no atrribute ‘cache_path’
解决方式:
Step1: 进入环境终端后执行
1
pip show mies_tokenizer
默认出现类似如下结果,重点查看Location
1
2
3
4
5
6
7
8
9
10Name: mies_tokenizer
Version: 0.0.1
Summary: ibis tokenizer
Home-page:
Author:
Author-email:
License:
Location: /usr/local/python3.10.13/lib/python3.10/site-packages
Requires:
Required-by:Step2: 打开Location路径下的./mies_tokenizer/tokenizer.py文件
1
vim /usr/local/python3.10.13/lib/python3.10/site-packages/mies_tokenizer/tokenizer.py
Step3: 对以下两个函数代码进行修改
1
2
3
4
5
6
7
8def __del__(self):
- dir_path = file_utils.standardize_path(self.cache_path)
+ cache_path = getattr(self, 'cache_path', None)
+ if cache_path is None:
+ return
+ dir_path = file_utils.standardize_path(cache_path)
file_utils.check_path_permission(dir_path)
all_request = os.listdir(dir_path)以及
1
2
3
4
5
6
7
8def _get_cache_base_path(child_dir_name):
dir_path = os.getenv("LOCAL_CACHE_DIR", None)
if dir_path is None:
dir_path = os.path.expanduser("~/mindie/cache")
- if not os.path.exists(dir_path):
- os.makedirs(dir_path)
+ os.makedirs(dir_path, exist_ok=True)
os.chmod(dir_path, 0o750)UnicodeEncodeError: ‘ascii’ codec can’t encode character \uff5c in position 301:ordinal not in range(128)
解决方式:这是因为由于系统在写入或打印日志ASCII编码deepseek的词表失败,导致报错,不影响服务化正常运行。如果需要规避,需要/usr/local/Ascend/atb-models/atb_llm/runner/model_runner.py的第145行注释掉:
1
print_log(rank, logger.info, f'init tokenizer done: {self.tokenizer}')
报错“cannot import name ‘shard_checkpoint’ from ‘transforms.modeling_utils’ ”
解决方式:原因是开发者在量化的时候把transformers更新到了4.48.2,但是transformers从4.47.0版本就把transforms.modeling_utils里面的shard_checkpoint去掉了。所有需要把transformers版本更新到MindIE镜像里面自带的版本,也就是4.44.0
模型加载过程很慢
解决方式:执行如下命令
1
export OMP_NUM_THREADS=1
模型效果不对,返回结果中没有 /think 字段
解决方式:使用openai的接口推理
出现算子的Aicore或者aivec报错
解决方式:查看plog(也就是/root/ascend/log/debug),可以看到大概率是OOM导致的,看看是不是卡的显存被占用了或者是显存分配、seqlen参数配置不合理
多请求并发,偶现“failed to get engine response”
解决方案:重计算的bug,需要设置
maxSeqLen=maxPrefillTokens
进行规避,在下个MindIE版本会正式解决,预计 2 月 28 日左右发版
总结
昇腾 910B 结合 MindIE 框架为 DeepSeek-R1 提供了强大的推理支持
部署过程中需重点关注权重转换一致性、多机通信配置及显存优化策略
随着 MindIE 版本迭代,未来在模型加载速度和算子兼容性上将有进一步提升
昇腾910B部署DeepSeek-V3
软硬件要求
其他要求同DeepSeek-R1
- 部署DeepSeek-V3模型用BF16权重进行推理至少需要4台Atlas 800I A2(8*64G)服务器
- 用W8A8量化权重进行推理则至少需要2台Atlas 800I A2 (8*64G)
权重处理与转换
权重下载
示例:DeepSeek-V3-bf16下载脚本示例(都需要依赖python,确保磁盘足够大,文件大约占1.4T):
1 | # 创建模型存放路径和缓存路径 |
官方渠道:
1
2
3
4
5
6
7
8
9
10#安装依赖
pip install -U huggingface_hub
# 设置环境变量(当前命令行有效)
export HF_ENDPOINT=https://hf-mirror.com
# 缓存目录
export HF_HOME=/home/huggingface/huggingface_cache
# 开始下载
huggingface-cli download --resume-download unsloth/DeepSeek-V3-bf16 --local-dir /home/huggingface/pretrained_model/DeepSeek-V3-BF16魔塔社区(推荐):
1
2
3
4
5#安装依赖
pip install modelscope
# 开始下载
modelscope download --model unsloth/DeepSeek-V3-BF16 --local_dir /home/huggingface/pretrained_model/DeepSeek-V3-BF16
权重转换(FP8转BF16)
GPU侧权重转换
1
2
3git 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-bf16NPU侧权重转换 目前npu转换脚本不会自动复制tokenizer等文件
1
2
3git 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.4T左右
- 推理作业时,也请确保您的设备有足够的空间加载模型权重,并为推理计算预留空间
量化权重(非必需)
详情请参考 DeepSeek模型量化方法介绍
目前支持:
- 生成模型w8a16量化权重,使用histogram量化方式,在CPU上进行运算
- 生成模型w8a8混合量化权重,使用histogram量化方式 (MLA:w8a8量化,MOE:w8a8 dynamic pertoken量化)
注意:DeepSeek-R1模型权重较大,量化权重生成时间较久,请耐心等待;具体时间与校准数据集大小成正比,10条数据大概需花费3小时
容器准备
前往昇腾社区/开发资源下载适配
DeepSeek-V3的镜像包:mindie_2.0.T3-800I-A2-py311-openeuler24.03-lts-aarch64.tar.gz 镜像加载后的名称:mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts-aarch64
注意:量化需要使用mindie:2.0.T3版本
完成之后,请使用docker images
命令确认查找具体镜像名称与标签
1 | docker load -i mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts-aarch64(下载的镜像名称与标签) |
各组件版本配套如下:
组件 | 版本 |
---|---|
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 |
容器启动
准备模型
目前提供的MindIE镜像预置了DeepSeek-V3模型推理脚本,无需再下载模型代码,也无需参考目录结构。(可跳过至获取模型权重)
- 下载对应模型代码,可以使用:
1 | git clone https://gitee.com/ascend/ModelZoo-PyTorch.git |
目录结构应为如下:
1 | ├── DeepSeek-V3 |
获取模型权重
本地已有模型权重从您信任的来源自行获取权重后,放置在从上述下载的模型代码的主目录下,放置后的目录结构应为如下:
1
2
3
4
5
6├── DeepSeek-V3
│ ├── README.md
│ └── 权重文件1
│ .
│ .
│ └── 权重文件n本地没有模型权重我们提供模型权重下载脚本,支持HuggingFace,ModelScope以及Modelers来源的模型下载,用法如下
注意:以下引用的
atb_models
路径在DeepSeek-V2
路径下确认
atb_models/build/weights_url.yaml
文件中对应repo_id,当前已默认配置模型官方认可的下载地址,如您有其他信任来源的repo_id,可自行修改,默认配置如下:1
2
3HuggingFace: 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,执行:
1
2chown -R 1001:1001 /path-to-weights/DeepSeek-V3
chmod -R 750 /path-to-weights/DeepSeek-V3
启动容器
执行以下启动命令(参考):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21docker 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开启通信环境变量
1
2
3
4
5export 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代码框架
检查机器网络情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 检查物理链接
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地址
```cmd
for i in {0..7};do hccn_tool -i $i -ip -g; done参考如下格式,配置
rank_table_file.json
,建议参考DeepSeek-R1示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21{
"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路径
1
cd /usr/local/Ascend/llm_model/tests/modeltest/
运行测试脚本,参数说明如下:
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
1
2# 需在所有机器上同时执行
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数据集主节点的命令
1
2bash 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性能测试
进入modeltest路径
1
cd /usr/local/Ascend/llm_model/tests/modeltest/
运行测试脚本
1
2# 需在所有机器上同时执行
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跑性能测试主节点的命令
1
2bash 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-使能内存池扩展段功能,即虚拟内存特性。更多详情请查看昇腾环境变量参考
1 | export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True |
服务化需要rank_table_file.json
中配置container_ip
字段 所有机器的配置应该保持一致,除了环境变量的MIES_CONTAINER_IP为本机ip地址
1 | export MIES_CONTAINER_IP=容器ip地址 |
修改服务化参数
1 | cd /usr/local/Ascend/mindie/latest/mindie-service/ |
修改以下参数
1 | "httpsEnabled" : false, |
Example:仅供参考,不保证性能
1 | { |
拉起服务化
1 | # 以下命令需在所有机器上同时执行 |
执行命令后,首先会打印本次启动所用的所有参数,然后直到出现以下输出:
1 | Daemon start success! |
则认为服务成功启动
来到客户端
进入相同容器,向服务端发送请求
更多信息可参考官网信息:MindIE Service
常见问题
若出现out of memory报错,可适当调高NPU_MEMORY_FRACTION环境变量(默认值为0.8),适当调低服务化配置文件config.json中maxSeqLen、maxInputTokenLen、maxPrefillBatchSize、maxPrefillTokens、maxBatchSize等参数
1
export NPU_MEMORY_FRACTION=0.96
若出现hccl通信超时报错,可配置以下环境变量
1
2export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=0若出现AttributeError:’IbisTokenizer’ object has no atrribute ‘cache_path’ Step1: 进入环境终端后执行
1
pip show mies_tokenizer
Step1: 默认出现类似如下结果,重点查看
Location
1
2
3
4
5
6
7
8
9
10Name: mies_tokenizer
Version: 0.0.1
Summary: ibis tokenizer
Home-page:
Author:
Author-email:
License:
Location: /usr/local/python3.10.13/lib/python3.10/site-packages
Requires:
Required-by:Step2: 打开
Location
路径下的./mies_tokenizer/tokenizer.py文件1
vim /usr/local/python3.10.13/lib/python3.10/site-packages/mies_tokenizer/tokenizer.py
Step3: 对以下两个函数代码进行修改
1
2
3
4
5
6
7
8def __del__(self):
- dir_path = file_utils.standardize_path(self.cache_path)
+ cache_path = getattr(self, 'cache_path', None)
+ if cache_path is None:
+ return
+ dir_path = file_utils.standardize_path(cache_path)
file_utils.check_path_permission(dir_path)
all_request = os.listdir(dir_path)以及
1
2
3
4
5
6
7
8def _get_cache_base_path(child_dir_name):
dir_path = os.getenv("LOCAL_CACHE_DIR", None)
if dir_path is None:
dir_path = os.path.expanduser("~/mindie/cache")
- if not os.path.exists(dir_path):
- os.makedirs(dir_path)
+ os.makedirs(dir_path, exist_ok=True)
os.chmod(dir_path, 0o750)若出现
UnicodeEncodeError: 'ascii' codec can't encode character \uff5c in position 301:ordinal not in range(128)
这是因为由于系统在写入或打印日志ASCII编码deepseek的词表失败,导致报错,不影响服务化正常运行
如果需要规避,需要/usr/local/Ascend/atb-models/atb_llm/runner/model_runner.py的第145行注释掉:print_log(rank, logger.info, f’init tokenizer done: {self.tokenizer}’)
注意保证权重路径是可用的,执行以下命令修改权限,注意是整个父级目录的权限:
1
2chown -R HwHiAiUser:HwHiAiUser /path-to-weights
chmod -R 750 /path-to-weights