# 推理服务
`TUILI` 是运行于墨芯计算卡上的类 vLLM 推理引擎,提供与 OpenAI 接口兼容的 API,支持高效部署大语言模型推理服务。
## 前提条件
- 安装 Python ≥ 3.7。
- 安装 SOLA Toolkit,具体请参见 [SOLA Toolkit 安装指南](../installation/sola-toolkit-installation-guide.md)。
- 安装 MOFFETT Container Toolkit 且开启 CDI,具体请参见 [MOFFETT Container Toolkit 用户手册](../AI-Native/mct.md)。
- 安装 MoffettHub CLI 工具,具体请参见 MoffettHub CLI。
## 准备环境
1. 生成 CDI 规范文件。
```{admonition} 注意
:class: caution
SOLA Toolkit 版本变更后,必须执行以下命令生成新的 CDI 规范文件。
```
````{tabs}
```{tab} SOLA 驱动安装在主机上
```Bash
sudo moffett-ctk cdi generate --driver-root / --output=/etc/cdi/moffett.yaml
```
```{tab} SOLA 驱动通过 SPU Operator 容器镜像安装
```Bash
sudo moffett-ctk cdi generate --driver-root /run/moffett/driver --output=/etc/cdi/moffett.yaml
```
````
2. 获取模型。
```bash
moffetthub-cli list # 查看支持的模型及对应的推理策略
moffetthub-cli download [--strategy ] [--output-dir ] # 下载模型
```
: 模型名称。
--strategy
: 模型推理策略。默认下载该模型支持的全部策略文件集。
--output-dir
: 模型存储路径,默认为 home 目录下的 `.moffetthub_cache`,例如:`/home/moffett/.moffetthub_cache`。
3. 获取推理服务镜像。
````{tabs}
```{tab} 在线拉取
```Bash
docker pull moffett/tuili:v0.17.3
```
```{tab} 离线导入
```Bash
wget https://moffett-release.tos-cn-guangzhou.volces.com/macs/macs-v1.10/tuili/tuili-v0.17.3.tar
docker load -i tuili-v0.17.3.tar
```
````
## 部署推理服务
1. 启动并进入名为 `tuili-test` 的容器(以墨芯的 home 目录(`/home/moffett`)为例)。
```bash
# 启动容器
docker run -itd \
--device moffett.ai/spu=all \
--net=host \
--name tuili-test \
-v /home/moffett/.moffetthub_cache:/home/moffett/workspace/moffetthub_cache \
moffett/tuili:v0.17.3
# 进入容器
docker exec -it tuili-test /bin/bash
```
```{admonition} 须知
:class: note
后续操作均在容器中进行。
```
2. 设置 CPU 上执行任务的线程数。
```bash
lscpu # 查看 CPU 的数量,例如 CPU(s): 112
vim /home/moffett/workspace/repos/llama_backend/python/legacy/mf_spu_backend.cc # 修改 params.cpuparams.n_threads 为 CPU(s) 的数量,例如:112。
```
3. 编译 backend。
```bash
cd /home/moffett/workspace/repos/llama_backend/
bash build.sh
```
4. 设置推理策略及使用的模型。
```bash
vim /home/moffett/workspace/repos/server_config.yaml
```
```yaml
# 示例
serving:
strategy: pd_auto
model: /home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
# draft_model: ''
```
strategy
: 推理策略,如下表所示。策略优先级从上到下依次降低,推荐使用 `auto` 根据优先级自动选择策略。
::: nested-table
| 推理策略 | 说明 |
| --------------- | ----------------------------------------------------------------------------------------------------------------------- |
| auto | 按照优先级从高到低的顺序自动选择以下策略。 |
| pd_separate | Prefill 阶段使用 PP(Pipeline Parallelism,流水线并行)模式,Decode 阶段使用 TP(Tensor Parallelism,张量并行)模式。 |
| pd_auto | 自动管理 Decode 和 Prefill 阶段的调度。 |
| decode | Prefill 和 Decode 阶段使用同一套静态模型。
该策略不支持 DeepSeek-R1-Distill-Qwen-32B、Llama-3-70B 模型的并发测试。 |
| pd_separate_cpu | Prefill 阶段在 SPU 上使用 PP 模式运行,Decode 阶段在 CPU 上运行。 |
| speculative_cpu | 投机方案,在 SPU 上运行 target model,在 CPU 上运行 draft model。
该策略不支持并发测试。 |
:::
model
: target model 路径,即:容器内挂载的模型路径 + ,例如:`/home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B`。
draft_model(可选)
: draft model 路径,仅支持 `speculative_cpu` 策略下使用,格式同 `model` 。
5. 启动推理服务。
```bash
cd /home/moffett/workspace/repos
export PYTHONPATH=$PYTHONPATH:. # 将当前路径添加到 PYTHONPATH
python examples/server.py > stdout.log 2>&1 & # 启动推理服务
tail -f stdout.log # 查看服务日志
```
```{admonition} 注意
:class: caution
修改 `server_config.yaml` 中的模型及策略后,需重启推理服务,再进行推理测试。
```
## 测试推理服务
推理服务测试包括单并发测试和并发测试。测试过程中,可通过 `tail -f stdout.log` 命令查看服务日志;可执行 `mx-smi list` 命令查看运行的进程,如果未发现相关进程,请参见“启动推理服务”步骤重启服务。
```{admonition} 注意
:class: caution
- 使用 DeepSeek-R1-Distill-Qwen-32B 模型推理需占用 16 个 Device。
- 使用 Llama-3-70B 模型推理需占用 32 个 Device,仅支持在部署了 8 张 S40 系列计算卡的服务器上运行。
```
### 参数选项
--tokenizer
: 模型的 tokenizer,可使用该模型任意策略的路径,例如:deepseek-ai/DeepSeek-R1-Distill-Qwen-32B 可使用 `/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/prefill` 或 `/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/decode`。
--n_requests
: 并发数量,最大不超过 8。
### 单并发测试
```bash
python3 tests/one_serving_benchmark.py --tokenizer
# 示例
# DeepSeek-R1-Distill-Qwen-1.5B 支持的 strategy:auto or pd_auto
python3 tests/one_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B/pd_auto/
# DeepSeek-R1-Distill-Qwen-32B 支持的 strategy:auto, pd_separate, pd_separate_cpu,decode, speculative_cpu
python3 tests/one_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/prefill/
# Qwen1.5-7B-Chat 支持的 strategy:auto, pd_auto
python3 tests/one_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/Qwen/Qwen1.5-7B-Chat/pd_auto/
# Llama-3-70B 支持的 strategy:auto, pd_separate, pd_separate_cpu,decode
python3 tests/one_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/deepseek-ai/meta-llama/Llama-3-70B/prefill/
```
### 多并发测试
```bash
python3 tests/multi_serving_benchmark.py --tokenizer --n_requests
# 示例
# DeepSeek-R1-Distill-Qwen-1.5B 支持的 strategy:auto or pd_auto
python3 tests/multi_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B/pd_auto/ --n_requests 8
# DeepSeek-R1-Distill-Qwen-32B 支持的 strategy:auto, pd_separate, or pd_separate_cpu
python3 tests/multi_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/prefill/ --n_requests 8
# Qwen1.5-7B-Chat 支持的 strategy:auto, pd_auto
python3 tests/multi_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/Qwen/Qwen1.5-7B-Chat/pd_auto/ --n_requests 8
# Llama-3-70B 支持的 strategy:auto, pd_separate, or pd_separate_cpu
python3 tests/multi_serving_benchmark.py --tokenizer /home/moffett/workspace/moffetthub_cache/deepseek-ai/meta-llama/Llama-3-70B/prefill/ --n_requests 8
```
## 结束推理服务
推理服务使用完成后,需在主机上结束相关进程,避免持续占用设备资源影响其他操作(如升级 SOLA Toolkit 版本)。步骤如下:
1. 查询并结束运行中的推理服务相关进程。
```bash
mx-smi list
sudo pkill python # 结束推理服务相关进程
sudo kill -9 # 结束其他进程
```
2. 停用并删除推理服务的容器。
```bash
docker ps -a | grep
docker stop && docker rm
```