# 大模型推理
***大模型推理提供多种方案,MindFormers/MindIE,请根据具体需求选择。***
---
***随着千亿级参数大模型 DeepSeek R1 的突破性发展,其创新的架构与海量参数规模对分布式推理提出了更高要求。***
***为应对算力挑战、提升推理效率,华为昇腾 MindIE 推理引擎率先推出 DeepSeek R1 多机分布式推理解决方案,通过动态并行调度、显存优化及昇腾芯片级加速技术,显著降低端到端推理时延,支撑超大规模模型的高效部署。***
***特开设专题,将深入剖析 MindIE 多机推理 DeepSeek R1 模型的关键技术路径,结合实测性能数据与场景化案例,为行业提供大模型分布式推理的昇腾实践范本。***
## vllm
### 获取运行环境
```shell
## 获取镜像
wget http://39.171.244.84:30011/vllm/vllm-ascend-v0.7.3rc1.tar.gz
docker load -i vllm-ascend-v0.7.3rc1.tar.gz
## 查看镜像ID
docker images ##找到IMAGE ID,例:3378ec1ab3d2
## 启动容器
docker run -itd --name=vllm_test --net=host \
--shm-size 500g \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--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 /home/models:/home/models \
3378ec1ab3d2
## 查看容器ID
docker ps ##找到CONTAINER ID,例:087600cb50fa
## 进入容器
docker exec -it 087600cb50fa bash
```
* 启动容器:`--device`参数可以继续添加挂载卡,例:`--device=/dev/davinci2`来添加第三张卡
### 起服务
```
vllm serve Qwen2_5-VL-7B-Instruct \
--dtype bfloat16 \
--max_model_len 32768 \
--max-num-batched-tokens 32768 \
--gpu-memory-utilization 0.95 \
--tensor-parallel-size 2
```
[参数说明](https://docs.vllm.ai/en/latest/serving/engine_args.html)
**注:qwen2.5-vl-7b-ins默认上下文为128000,不手动设置max_model_len会导致oom**
回显如下表示服务部署成功

#### 请求
```shell
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen2.5-VL-7B-Instruct",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": [
{"type": "image_url", "image_url": {"url": "https://modelscope.oss-cn-beijing.aliyuncs.com/resource/qwen.png"}},
{"type": "text", "text": "What is the text in the illustrate?"}
]}
]
}'
```

#### benchmark
```shell
python3 vllm/benchmarks/benchmark_serving.py --backend vllm --model Qwen2_5-VL-7B-Instruct --dataset ShareGPT_V3_unfiltered_cleaned_split.json --profile
```
* --dataset ShareGPT_V3_unfiltered_cleaned_split.json:这个参数指定了用于测试的数据集
* --profile:启用性能分析。意味着在运行测试时会收集性能相关的数据,如内存使用情况以及处理请求所需的时间。
## MindIE
MindIE(Mind Inference Engine,昇腾推理引擎)是昇腾针对AI全场景业务的推理加速套件。通过分层开放AI能力,支撑用户多样化的AI业务需求,使能百模千态,释放昇腾硬件设备算力。MindIE提供了基于多种AI场景下的推理解决方案,具有强大的性能、健全的生态,帮助用户快速开展业务迁移、业务定制。
查看MindIE模型支持列表:
[MindIE支持模型列表](https://www.hiascend.com/document/detail/zh/mindie/10RC3/whatismindie/mindie_what_0003.html)
### 1.环境准备
建议使用最新tag的镜像:[镜像获取](http://39.171.244.84:30011/image.txt)
安装MindIE使用镜像配套脚本:
* [脚本获取](http://39.171.244.84:30011/package_dependencies/script/mindie_new.sh)
* `chmod +x mindie_new.sh`使脚本可执行
* `bash mindie_new.sh`一键安装
### 2.修改配置
修改模型配置,在Huggingface模型权重的`config.json`文件中进行修改(参考中数据类型`"float16"/"bfloat16"`)

修改MindIE-service配置,MindIE工作目录位于 `/home/ma-user/Ascend/mindie/latest/mindie-service` 下。 想要启动服务,需要修改配置文件。
> 进入MindIE的配置文件`vim conf/config.json`
>
>
>
>* 修改`httpsEnabled`参数,建议修改为false;如果配置为true,即开启https服务,要把服务器证书、CA证书、和服务器私钥等认证需要的文件,[放置在对应的目录](https://www.hiascend.com/document/detail/zh/mindie/10RC3/mindieservice/servicedev/mindie_service0164.html)。
>* `npuDeviceIds`:启用几卡推理,8卡则修改为`[[0,1,2,3,4,5,6,7]]`
>* `modelName`:模型名称
>* `modelWeightPath`:模型权重所在路径
>* `worldSize`:加载卡的数量,指定8卡推理则修改为`8`
>* [配置参数说明](https://www.hiascend.com/document/detail/zh/mindie/10RC3/mindieservice/servicedev/mindie_service0285.html)
### 3.启动MindIE
在MindIE工作目录下启动服务:`.bin/mindieservice_daemon`
回显`Daemon start success!`则说明启动成功
### 4.http请求测试
```shell
curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{
"inputs": "大模型",
"parameters": {
"best_of": 1,
"decoder_input_details": false,
"details": false,
"do_sample": true,
"max_new_tokens": 500,
"repetition_penalty": 1.03,
"return_full_text": true,
"seed": null,
"stop": [
"photographer"
],
"temperature": 0.5,
"top_k": 10,
"top_n_tokens": 5,
"top_p": 0.95,
"truncate": null,
"typical_p": 0.95,
"watermark": true
},
"stream": false}' http://127.0.0.1:1025/
```
### 5.Gradio内网穿透
* 首先确保启动MindIE服务
* 执行[Gradio_chat脚本文件](https://gitee.com/csw-assdasd8sa8d7as78/aicc_-docs/blob/master/source/part3/Gradio_Chat.py),会返回一个公共链接

* 网页输入返回的公共链接,即可打开Gradio界面
### 6.性能精度测试
#### (1)数据集获取
[GSM8K](https://github.com/openai/grade-school-math/blob/master/grade_school_math/data/test.jsonl) /
[CEval](https://huggingface.co/datasets/ceval/ceval-exam/resolve/main/ceval-exam.zip) /
[MMLU](https://people.eecs.berkeley.edu/~hendrycks/data.tar) /
[BoolQ](https://github.com/svinkapeppa/boolq/blob/master/dev.jsonl) /
[HumanEval](https://github.com/openai/human-eval/blob/master/data/HumanEval.jsonl.gz)
* 支持精度测试的数据集: GSM8K、CEval和MMLU
#### (2)依赖包安装
```shell
pip install jsonlines pyarrow prettytable
```
#### (3)性能测试
```shell
benchmark \
--DatasetPath "/{数据集路径}/GSM8K" \
--DatasetType "gsm8k" \
--ModelName "Qwen1.5-7B" \
--ModelPath "/{权重路径}/Qwen1.5-7B" \
--TestType client \
--Concurrency 100 \
--Http http://127.0.0.1:1025 \
--MaxOutputLen 512
```
* `--DatasetType 数据集类型,枚举值:ceval、gsm8k、boolq、humaneval和mmlu。`
* `--Concurrency 并发数,限制同时发起的连接数`
>性能测试结果主要关注FirstTokenTime、DecodeTime等token生成时延的指标和lpct(latency per compelete token,prefill阶段平均每个token时延)、Throughput等测试吞吐量的指标。
>* `FirstTokenTime:首个token时延`
>* `DecodeTime:Decode阶段时延`
>* `Icpt:首token总时延/输入总token数。单位(ms)`
>* `Throughput:整体测试过程的每秒请求数,吞吐量指标。单位(req/s)`
#### (4)精度测试
```shell
benchmark \
--DatasetPath "/{数据集路径}/GSM8K" \
--DatasetType "gsm8k" \
--ModelName "Qwen1.5-7B" \
--ModelPath "/{权重路径}/Qwen1.5-7B" \
--TestType client \
--Concurrency 100 \
--Http http://127.0.0.1:1025 \
--MaxOutputLen 512 \
--TestAccuracy True
```
* `--TestAccuracy True 参数是开启精度测试的开关`
* `返回的accuracy字段为精度测试结果`
#### (5)参数说明
* [输入参数说明](https://www.hiascend.com/document/detail/zh/mindie/10RC3/mindieservice/servicedev/mindie_service0153.html)
* [输出参数说明](https://www.hiascend.com/document/detail/zh/mindie/10RC3/mindieservice/servicedev/mindie_service0154.html)
### 6.停止服务
查看与mindieservice相关的进程列表`ps -ef | grep mindieservice`查询`mindieservice_daemon`主进程ID

执行`kill {主进程ID}`即可停止服务
参考文档链接:
[参考文档](https://www.hiascend.com/document/detail/zh/mindie/10RC3/whatismindie/mindie_what_0001.html)
[FAQ](https://www.hiascend.com/document/detail/zh/mindie/10RC3/mindieservice/servicedev/mindie_service0288.html)
## MindFormers
MindSpore Transformers(MindFormers)套件的目标是构建一个大模型训练、微调、评估、推理、部署的全流程开发套件,该套件基于MindSpore内置的并行技术和组件化设计,提供业内主流的Transformer类预训练模型和SOTA下游任务应用,涵盖丰富的并行特性。期望帮助用户轻松的实现大模型训练和创新研发。
[支持模型列表](https://gitee.com/mindspore/mindformers/tree/r1.3.0/#%E6%94%AF%E6%8C%81%E6%A8%A1%E5%9E%8B)
### 1.基础准备
* 建议使用最新tag的镜像:[镜像获取](http://39.171.244.84:30011/image.txt)
* 版本匹配关系:[MindFormers r1.2.0](https://gitee.com/mindspore/mindformers/tree/r1.2.0/#%E7%89%88%E6%9C%AC%E5%8C%B9%E9%85%8D%E5%85%B3%E7%B3%BB)
* 模型:Qwen1.5-7B:[Base权重](https://hf-mirror.com/Qwen/Qwen1.5-7B/tree/main)(建议训练、微调使用) / [Chat权重](https://hf-mirror.com/Qwen/Qwen1.5-7B-Chat/tree/main)(建议推理使用)
* 数据集获取:预训练-[Wikitext-103](https://dagshub.com/DagsHub/WIkiText-103/raw/4d6345fe26a2fe22da78c46de68be83e2bf9b3b7/dataset/tokens/wiki.train.tokens) / 微调-[alpaca](https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json)
### 2.套件安装
* [安装脚本获取](http://39.171.244.84:30011/package_dependencies/script/mindformers.sh)
* `chmod +x mindie_new.sh`使脚本可执行
* `bash mindie_new.sh`一键安装
### 3.权重转换
#### 3.2 权重转换
**注**: 请安装`convert_weight.py`依赖包。
```shell
pip install torch transformers>=4.37.2 transformers_stream_generator einops accelerate
```
##### 3.2.1 torch权重转mindspore权重
将huggingface的权重转换为完整的ckpt权重。
```shell
python research/qwen1_5/convert_weight.py \
--torch_ckpt_dir /{权重文件路径}/Qwen1.5-7B \
--mindspore_ckpt_path /{权重转换输出路径}/qwen1.5_7b.ckpt
```
* `torch_ckpt_dir`:预训练权重文件所在的目录, 此参数必须
* `mindspore_ckpt_path`:转换后的输出文件存放路径
> 如遇报错:`ImportError: {报错文件路径}: cannot allocate memory in static TLS block`,使用LD_PRELOAD环境变量指定对报错的单个或多个库文件进行优先加载:执行`Export LD_PRELOAD=$LD_PRELOAD:{报错文件路径}`
[报错详情参考](https://blog.csdn.net/qq_52169118/article/details/139521009)
##### 3.2.2 mindspore权重转torch权重
在生成mindspore权重之后如需使用torch运行,可根据如下命令转换:
```shell
python research/qwen1_5/convert_reversed.py \
--mindspore_ckpt_path /{mindspore权重路径}/qwen1.5_7b.ckpt \
--torch_ckpt_path /{权重转换输出路径}/your.bin
```
* `mindspore_ckpt_path`:待转换的mindspore权重路径
* `torch_ckpt_path`:转换后的输出文件存放路径
### 4.推理
注意事项:
Atlas 800T A2上运行时需要设置如下环境变量,否则推理结果会出现精度问题。
```shell
export MS_GE_TRAIN=0
export MS_ENABLE_GE=1
export MS_ENABLE_REF_MODE=1
```
#### 4.1 单卡推理
```shell
python research/qwen1_5/run_qwen15.py \
--config predict_qwen1_5_7b.yaml \
--load_checkpoint /{mindspore权重路径}/qwen1.5_7b.ckpt \
--vocab_file /{权重文件路径}/Qwen1.5-7B/vocab.json \
--merges_file /{权重文件路径}/Qwen1.5-7B/merges.txt \
--run_mode predict \
--use_parallel False \ 是否开启并行
--auto_trans_ckpt False \
--predict_data '帮助我制定一份去上海的旅游攻略' #推理内容
推理命令中参数会覆盖yaml文件中的相同参数
```
#### 4.2 多轮对话单卡推理
`run_qwen1_5_chat.py` 基于`model.generate()`实现,支持交互式多轮对话,支持加载lora权重、权重转换、多卡推理,暂不支持 batch 推理。
在`predict_qwen1_5_7b_chat.yaml`配置词表文件`vocab.json`和`merges.txt`的路径
```shell
python research/qwen1_5/run_qwen1_5_chat.py \
--config predict_qwen1_5_7b_chat.yaml \
--load_checkpoint /{mindspore权重路径}/qwen1_5_7b_chat.ckpt \
--enable_history True \
--use_parallel False \
--auto_trans_ckpt False \
--run_demo True \
--device_id 0
```
* `--enable_history`: 是否将历史对话带入后面的输入。在交互式模式下(且启动时指定了--enable_history=True),可以用 /clear 清除前面的对话历史,开始新一轮会话
* `--run_demo`: 启动时是否自动运行预设的若干个问题(用于演示/试验目的)
* `--predict_data`: 提交给模型进行推理的问题(run_qwen1_5_chat.py会将历史对话和问题按照chatml格式组装后提交给模型进行推理),可以给出多个问题。不给出此参数时,`run_qwen1_5_chat.py`按交互模式运行