AES200物理机部署DeepSeek-R1模型
华为官方官宣自己的NPU支持DeepSeek-R1模型部署,华为的大模型推理部署依托于其大模型推理引擎:MindIE,但是根据MindIE的文档,其只支持以下硬件:
表1 MindIE支持的硬件列表
类型 | 配置参考 |
---|---|
服务器 | Atlas 800I A2 推理产品 |
Atlas 200T A2 Box16 异构子框 | |
推理卡 | Atlas 300I Duo 推理卡+Atlas 800 推理服务器(型号:3000) |
而且根据华为官方发布的支持DeepSeek的docker 镜像,也需要以下硬件配置:
硬件要求
部署DeepSeek-V3模型用BF16权重进行推理至少需要4台Atlas 800I A2(864G)服务器,用W8A8量化权重进行推理则至少需要2台Atlas 800I A2 (864G)
今天我们就尝试一下,凌华智能科技有限公司发布的基于华为Ascend310P处理芯片的AES200边缘推理服务器能不能拉动DeepSeek这两大车! 开搞!!
1. 安装MindIE推理引擎
虽然根据MindIE的文档,MindIE只支持Atlas 300I Duo推理卡以上的设备,但是由于AES200采用的Ascend310P处理芯片是和Atlas 300I Duo卡采用的芯片是同一系列的芯片,按理来说MindIE也是应该能跑起来的,我们不防试试,走起!
注意:本次安装为了简单方便,我们的安装用户和运行用户都采用root账号!!!
1.1 安装方案
此次我们采用如下图所示的物理机部署方案,完成MindIE开发环境的安装。
1.2 准备AES200环境
这次我们在AES200上安装OpenEuler 22.03的系统版本,固件和驱动的版本如下:
软件名称 | 分类 | 发布日期 | 说明 |
---|---|---|---|
Ascend-hdk-310p-npu-firmware-soc_7.3.0.1.231.run | NPU | 2024/07/19 | Atlas 200I SOC A1产品固件包(run格式) |
Ascend-hdk-310p-npu-driver-soc-oe2203_24.1.rc2_linux-aarch64.run | NPU | 2024/07/19 | Atlas 200I SOC A1产品ARM架构支持OpenEuler 22.03驱动包(run格式) |
+--------------------------------------------------------------------------------------------------------+
| npu-smi 24.1.rc2 Version: 24.1.rc2 |
+-------------------------------+-----------------+------------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) |
| Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) |
+===============================+=================+======================================================+
| 0 310P1 | OK | NA 27 0 / 0 |
| 0 0 | NA | 80 NA / 43173 |
+===============================+=================+======================================================+
1.3 安装开发环境
MindIE与CANN版本必须配套使用,其版本配套关系如下表所示。
MindIE版本 | 配套CANN版本 |
---|---|
1.0.0 | 8.0.0 |
软件安装前,请下载下表MindIE依赖的软件包,各软件包版本号需要保持一致。
依赖 | 软件包 | 软件说明 |
---|---|---|
CANN | Ascend-cann-toolkit*_{version}_linux-{arch}*.run | 开发套件包。 |
Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run | 二进制算子包。 | |
Ascend-cann-nnal*_{version}_linux-{arch}*.run | 加速库软件包。 | |
ATB Models | Ascend-mindie-atb-models_{version}_linux-{arch}py*xxxtorchx.x.x*-{abi}.tar.gz | 模型库安装包。使用MindIE Service和MindIE LLM组件时,需要安装。 |
Ascend Extension for PyTorch | torch_npu-{torch_version}.post{post_id}-cpxxx-cpxxx-manylinux_{arch}.whl | torch_npu插件whl包。 |
apex-{apex_version}_ascend-cpxxx-cpxxx-{arch}.whl | Apex模块的whl包。 | 请参见《Ascend Extension for PyTorch 配置与安装》中的“(可选)安装APEX模块”章节,根据Python3.10版本自行编译。 |
torch-{torch_version}+cpu-cpxxx-cpxxx-linux_{arch}.whl | PyTorch框架whl包。说明当前只支持1.11.0和2.1.0版本。 | 请从《Ascend Extension for PyTorch 配置与安装》中的“安装PyTorch框架”章节获取。 |
1.3.1 安装依赖
根据MindIE的文档,MindIE依赖下表中的软件包
软件 | 版本要求 |
---|---|
glibc | >=2.34,(openEuler22.03系统中glibc版本满足要求)。 |
gcc、g++ | >=11.4.0,(OpenEuler22.03系统找那个gcc,g++不满足要求),可以通过conda环境安装,或者编译安装,我这里采用Conda虚拟一个环境进行安装。 |
Python | 3.10*.x*、3.11.x,OpenEuler22.03默认带的python版本为3.9,我们这里用Conda来创建一个虚拟环境来满足对Python版本的要求。建议执行命令pip3 install --upgrade pip进行升级(pip版本需 ≤ 24.0),避免因pip版本过低导致安装失败。 |
gevent | 22.10.2 |
python-rapidjson | >=1.6 |
geventhttpclient | 2.0.11 |
urllib3 | 2.1.0 |
greenlet | 3.0.3 |
zope.event | 5.0 |
zope.interface | 6.1 |
prettytable | 3.5.0 |
jsonschema | 4.21.1 |
jsonlines | 4.0.0 |
thefuzz | 0.22.1 |
pyarrow | >=15.0.0 |
pydantic | 2.6.3 |
sacrebleu | 2.4.2 |
rouge_score | 0.1.2 |
pillow | 10.3.0 |
requests | 2.31.0 |
matplotlib | >=1.3.0 |
text_generation | 0.7.0 |
numpy | 1.26.3 |
pandas | 2.1.4 |
transformers | >=4.30.2,请用户根据模型选择对应版本。 |
tritonclient[all] | - |
colossalai | 0.4.0 |
安装Miniconda
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
$ ./Miniconda3-latest-Linux-aarch64.sh #安装时选择缺失配置安装就行
创建虚拟环境
$ conda create -n mindie python=3.10
$ conda activate mindie
$ pip3 install --upgrade pip==24
$ conda install -c conda-forge gcc=11.4.0 gxx=11.4.0
$ gcc --version #检查gcc版本
$ pip3 --version #检查pip3版本呢
安装依赖pip包
将以下内容添加安装文件requirements.txt中,样例如下所示。
gevent==22.10.2
python-rapidjson>=1.6
geventhttpclient==2.0.11
urllib3>=2.1.0
greenlet==3.0.3
zope.event==5.0
zope.interface==6.1
prettytable~=3.5.0
jsonschema~=4.21.1
jsonlines~=4.0.0
thefuzz~=0.22.1
pyarrow~=15.0.0
pydantic~=2.6.3
sacrebleu~=2.4.2
rouge_score~=0.1.2
pillow~=10.3.0
requests~=2.31.0
matplotlib>=1.3.0
text_generation~=0.7.0
numpy~=1.26.3
pandas~=2.1.4
transformers>=4.30.2
tritonclient[all]
colossalai==0.4.0
在创建的mindie虚拟环境中执行以下命令进行安装
$ pip3 install -r requirements.txt
1.3.2 安装CANN
详细过程,请参照华为的《CANN 软件安装指南》中的“安装CANN软件包”章节,依据设备情况及操作系统支持情况,安装CANN开发套件包Ascend-cann-toolkit*_{version}_linux-{arch}*.run。
安装CANN依赖
在创建的conda 虚拟环境mindie下安装CANN依赖包
$ pip3 install attrs cython numpy==1.24.0 decorator sympy cffi pyyaml pathlib2 psutil protobuf==3.20 scipy requests absl-py cloudpickle ml-dtypes tornado
安装toolkit
$ ./Ascend-cann-toolkit_8.0.0_linux-aarch64.run --install --install-for-all
# 环境变量设置
$ source /usr/local/Ascend/ascend-toolkit/set_env.sh
根据安装成功后的提示,添加source /usr/local/Ascend/ascend-toolkit/set_env.sh
到/root/.bashrc中, 设置永久环境变量
安装二进制算子包
详细过程,请参照华为的《CANN 软件安装指南》中的“安装CANN软件包”章节,依据设备情况及操作系统支持情况,安装CANN二进制算子包Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run。
$ ./Ascend-cann-kernels-310p_8.0.0_linux-aarch64.run --install --install-for-all
安装加速库
NNAL软件包中提供了面向大模型领域的ATB(Ascend Transformer Boost)加速库,实现了基于Transformer结构的神经网络推理加速引擎库,提供昇腾亲和的融合算子、通信算子、内存优化等,作为算子的公共底座提升了大模型推理性能。
$ ./Ascend-cann-nnal_8.0.0_linux-aarch64.run --install --install-for-all
# 环境变量设置
$ source /usr/local/Ascend/nnal/atb/set_env.sh
将source /usr/local/Ascend/nnal/atb/set_env.sh
添加到/root/.bashrc文件中的最后一行, 设置永久环境变量
1.3.3 安装Pytorch
- 请参见《Ascend Extension for PyTorch 配置与安装》中的“安装PyTorch框架”章节安装PyTorch框架。
- 请参见《Ascend Extension for PyTorch 配置与安装》中的“安装torch_npu插件”章节安装torch_npu插件。
MindIE中各组件依赖PyTorch框架和torch_npu插件,依赖情况如下表所示,请用户依据实际使用需求安装。
组件名称 | 是否需要安装PyTorch框架 | 是否需要安装torch_npu插件 |
---|---|---|
MindIE Torch | 必装 | 可选 |
MindIE Service | 必装 | 必装 |
MindIE LLM | 必装 | 必装 |
MindIE SD | 必装 | 必装 |
安装pytorch
# 下载软件包
$ wget https://download.pytorch.org/whl/cpu/torch-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
# 安装命令
$ pip3 install torch-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
安装pytorch扩展
# 下载插件包
$ wget https://gitee.com/ascend/pytorch/releases/download/v6.0.0-pytorch2.1.0/torch_npu-2.1.0.post10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
# 安装命令
$ pip3 install torch_npu-2.1.0.post10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
执行如下命令,若返回True 则说明安装成功。
python3 -c "import torch;import torch_npu;print(torch_npu.npu.is_available())"
1.3.4 安装ATB Models
详细过程,请参照华为的《MindIE安装指南》中的“安装ATB Models”章节。
ATB Models软件包是集成到了华为提供的MindIE推理镜像包里面,需要下载推理镜像包,运行docker启动镜像后,从/opt/package目录提取对应版本的ATB Models包。注意包有两类接包:abi0,abi1,请在你的mindie虚拟环境中使用以下指令查看abi是0还是1
python -c "import torch; print(torch.compiled_with_cxx11_abi())"
若输出结果为True表示abi1,False表示abi0,根据输出结果选择对应的abi包
$ mkdir /usr/local/Ascend/llm_model
$ tar -xzf Ascend-mindie-atb-models_1.0.0_linux-aarch64_py310_torch2.1.0-abi0.tar.gz -C /usr/local/Ascend/llm_model
# 环境变量设置
$ source /usr/local/Ascend/llm_model/set_env.sh
将source /usr/local/Ascend/llm_model/set_env.sh
添加到/root/.bashrc文件中的最后一行, 设置永久环境变量
安装atb-llm
$ pip3 install /usr/local/Ascend/llm_model/atb_llm-0.0.1-py3-none-any.whl
1.4 安装MindIE
1.4.1 准备安装包
MindIE软件包
名称 | 软件包 | 说明 |
---|---|---|
MindIE软件包 | Ascend-mindie*_{version}_linux-{arch}*.run | 推理引擎软件包,主要用于用户开发基于MindIE的应用。 |
执行安装前请确保安装环境满足硬件环境,支持的操作系统要求,并已参照安装驱动和固件和安装开发环境章节完成开发环境的安装。执行MindIE软件包的安装,会依次安装MindIE RT、MindIE Torch、MindIE Service、MindIE LLM和MindIE SD各组件,组件包的路径在MindIE的子路径下。
1.4.2 安装步骤
执行安装程序
$ ./Ascend-mindie_1.0.0_linux-aarch64.run --install
# 环境变量设置
$ source /usr/local/Ascend/mindie/set_env.sh
将source /usr/local/Ascend/mindie/set_env.sh
添加到/root/.bashrc文件中的最后一行, 设置永久环境变量
1.5 配置MindIE Server
详细配置项介绍,请参照华为的《MindIE安装指南》中的“配置MindIE Server”章节的单机推理。
MindIE Server 对于Python的环境要求为Python3.10. 或者Python3.11. 此处以我的虚拟环境中Python3.10.16为例,如果环境中的Python3.10.16不是默认版本,需要参考如下方法添加环境变量到/root/.bashrc文件中(Python路径根据实际路径进行修改)。
conda activate mindie #默认激活虚拟环境
export export LD_LIBRARY_PATH=${HOME}/miniconda3/envs/mindie/lib:${HOME}/miniconda3/envs/mindie/lib/python3.10:$LD_LIBRARY_PATH
在此,我只是添加了Python的环境变量,并没有更改MindIE Server的配置项文件:config.json。这个文件可以根据不同的模型修改,我们放在模型部署时修改此文件。
2 部署DeepSeek模型
由于AES200的资源有限,肯定是不可能推理满血的DeepSeek模型的,我们采用一个蒸馏过的模型: DeepSeek-R1-Distill-Qwen-7B测试一下。
2.1 下载模型
由于模型是从huggingface官网下载,我们需要安装官方的下载工具huggingface_hub,这样更快的下载模型,注意:这里可能需要科学上网
$ pip3 install -U huggingface_hub
下载模型文件
$ huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Llama-8B --local-dir /home/data/datasets/DeepSeek-R1-Distill-Llama-8B
修改模型权重config.json中torch_dtype
字段为float16
修改文件的属性:
$ chmod 750 /home/data/datasets/DeepSeek-R1-Distill-Llama-8B/config.json
2.2 服务化推理
打开配置文件
$ vim /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
更改配置文件
{
...
"ServerConfig" :
{
...
"port" : 1040, #自定义
"managementPort" : 1041, #自定义
"metricsPort" : 1042, #自定义
...
"httpsEnabled" : false, #测试阶段可以用开启https
...
},
"BackendConfig": {
...
"npuDeviceIds" : [[0]], #因为AES200只有一个NPU
...
"ModelDeployConfig":
{
"truncation" : false,
"ModelConfig" : [
{
...
"modelName" : "qwen",
"modelWeightPath" : "/home/data/datasets/DeepSeek-R1-Distill-Llama-8B",
"worldSize" : 1, #这里的数字应和NPU的数量对应,我的测试结果结果是:如果不设置成1,执行报错。
...
}
]
},
}
}
拉起服务化
cd /usr/local/Ascend/mindie/latest/mindie-service/bin
./mindieservice_daemon
当出现Daemon start success!
, 表示成功拉起服务
2025-02-09 14:27:32,109 [INFO] standard_model.py:155 - >>>rank:0 done ibis manager to device
2025-02-09 14:27:32,117 [INFO] npu_compile.py:20 - 310P,some op does not support
2025-02-09 14:27:32,118 [INFO] standard_model.py:172 - >>>rank:0: return initialize success result: {'status': 'ok', 'npuBlockNum': '2602', 'cpuBlockNum': '731', 'maxPositionEmbeddings': '131072'}
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Daemon start success!
2.3 推理请求
当服务化推理成功后,我们就可以通过curl发送推理求来测试是否可以正常推理。
开启一个新的终端, 并运行一下命令
time curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{
"model": "llama",
"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:1040/v1/chat/completions #其中127.0.0.1以实际ip地址为准
大致的结果如下,但是感觉结果没有输出全,估计是curl请求的问题,待确认:
{"id":"endpoint_common_2","object":"chat.completion","created":1739086214,"model":"llama","choices":[{"index":0,"message":{"role":"assistant","content":"<think>\n好,我现在要帮用户制定一个三天的长沙游攻略,用户想去橘子洲头、岳麓山和博物馆。首先,我得了解这几个景点的地理位置和大致门票情况。\n\n橘子洲头在长沙市中心附近,应该不需要太多时间,可以安排第一天去那里,然后顺便看看周边的商业街,比如IFS城花园,这样比较充实。第二天可以考虑岳麓山,那里距离市区有点远,可能需要半程停车,然后坐公交或者打车前往山内景点。第三天可以集中在博物馆,比如湖南地方法院旧址和文化宫,这些都是比较著名的地方,而且都靠近市中心,方便安排。\n\n交通方面,长沙的公共交通很发达,但有些景点离市区较远的话可能需要自驾或包车。我得提醒用户注意这一点。另外,每个景点的开放时间也要确认,如果有特殊展览的话会不会影响行程。\n\n住宿的话,如果是短期旅行,可以推荐一些经济型酒店或民宿,特别是如果预算有限的话,还可以给出一些选择建议。不过,也有可能用户希望更高档,所以我就简单提一下选项吧。\n\n餐饮部分,每个地方都有一些特色美食,比如湘菜火锅、烧烤等,要让用户知道能吃到当地特色,这样他们会更满意行程。此外,还应告知他们安全带好风衣,因为四季变换时节气变化较大,不同季节防护措施不同。\n\n最后,把这些内容整合成一份清晰的攻略,让每一天都有明确的活动安排,并且尽量紧凑时间,以满足三天之内尽可能多地点游玩。\n</think>\n\n好的!以下是一个详细的大纲,将帮助你规划三日之旅:\n\n---\n\n### **第一 天:橘子洲头与城市体验**\n**上午:橘子洲头(Yueh-Lung Mountain)**\n1. **门票价格**:约60-80元 \n2. **游览路线**:\n - 从入口进入后,可骑电车环岛观光,或步行登山至望云楼(免费)。\n","tool_calls":null},"finish_reason":"length"}],"usage":{"prompt_tokens":39,"completion_tokens":512,"total_tokens":551},"prefill_time":140,"decode_time_arr":[97,103,97,96,96,95,98,96,95,95,102,100,96,96,96,96,95,96,98,95,97,95,97,95,95,96,95,99,97,96,95,96,97,96,97,98,100,101,100,100,100,100,102,100,101,100,101,100,101,101,100,100,99,99,101,95,97,97,95,96,95,96,95,95,96,98,97,97,95,95,96,95,95,96,97,95,95,95,96,95,96,96,102,96,97,97,96,95,98,99,95,99,104,96,95,95,95,98,95,95,96,96,95,95,96,96,95,95,96,96,95,99,95,95,95,97,95,97,96,96,97,95,96,95,95,96,96,95,95,95,95,103,95,96,97,95,97,96,96,95,96,97,97,96,95,97,95,95,95,96,95,97,97,99,97,96,96,96,95,95,100,99,96,95,95,95,95,95,95,96,113,96,96,96,104,95,96,95,97,96,95,96,95,95,95,95,96,96,95,95,104,96,98,95,95,95,96,95,95,95,103,95,95,96,95,96,96,96,96,97,95,95,97,97,95,97,96,98,96,95,95,97,98,95,96,97,96,95,95,97,96,95,95,95,96,95,95,95,95,103,102,96,96,102,97,95,96,95,96,107,95,95,95,99,99,108,99,100,101,103,102,100,100,102,100,102,100,100,102,102,100,100,101,99,101,100,102,100,102,100,95,97,95,95,96,95,96,95,95,95,97,95,96,97,96,100,95,95,97,96,95,96,95,95,95,97,95,95,103,95,96,96,100,97,95,95,97,95,95,95,95,95,102,96,95,95,95,103,96,96,95,103,100,95,95,95,96,95,96,96,95,96,95,96,95,98,96,96,97,96,96,96,96,103,95,95,95,96,95,95,95,96,96,96,96,97,96,95,96,95,96,97,96,95,97,95,95,96,96,97,97,96,96,98,97,96,96,96,95,95,95,97,95,96,98,96,95,95,96,95,96,95,95,107,98,95,95,95,95,95,106,95,97,106,96,96,96,96,96,96,95,97,96,95,95,98,95,95,95,96,95,103,95,96,96,96,96,95,95,96,96,97,95,95,95,95,96,96,95,103,95,96,96,96,95,103,97,96,96,95,96,95,96,96,96,95,95,98,103,96,96,97,96,98,96,96,95,95,95,95,95,95,103,96,95,95,103,96,98,96,95,100,102,95,103,96,95,95,95,95,95,95,95,95,96,96,96,96,97,96,96]}
real 0m49.998s
user 0m0.011s
sys 0m0.017s
性能方面:
第一次开启新话题比较慢,要思考1分钟多钟,后续基于此话题在继续问问题会快一些,总体而言,也就是AES200也能跑大模型,只是速度方面稍慢,华为的库支持还需要完善!