推理服务

TUILI 是运行于墨芯计算卡上的类 vLLM 推理引擎,提供与 OpenAI 接口兼容的 API,支持高效部署大语言模型推理服务。

前提条件

准备环境

  1. 生成 CDI 规范文件。

    注意

    SOLA Toolkit 版本变更后,必须执行以下命令生成新的 CDI 规范文件。

    sudo moffett-ctk cdi generate --driver-root / --output=/etc/cdi/moffett.yaml
    
  2. 获取模型。

    moffetthub-cli list # 查看支持的模型及对应的推理策略
    moffetthub-cli download <model_name> [--strategy <value>] [--output-dir <output_dir>] # 下载模型
    
    <model_name>

    模型名称。

    --strategy

    模型推理策略。默认下载该模型支持的全部策略文件集。

    --output-dir

    模型存储路径,默认为 home 目录下的 .moffetthub_cache,例如:/home/moffett/.moffetthub_cache

  3. 获取推理服务镜像。

    docker pull moffett/tuili:v0.17.3
    

部署推理服务

  1. 启动并进入名为 tuili-test 的容器(以墨芯的 home 目录(/home/moffett)为例)。

    # 启动容器
    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
    

    须知

    后续操作均在容器中进行。

  2. 设置 CPU 上执行任务的线程数。

    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。

    cd /home/moffett/workspace/repos/llama_backend/
    bash build.sh
    
  4. 设置推理策略及使用的模型。

    vim /home/moffett/workspace/repos/server_config.yaml
    
    # 示例
    serving:
     strategy: pd_auto
     model: /home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
     # draft_model: ''
    
    strategy

    推理策略,如下表所示。策略优先级从上到下依次降低,推荐使用 auto 根据优先级自动选择策略。

    推理策略

    说明

    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 路径,即:容器内挂载的模型路径 + <model_name>,例如:/home/moffett/workspace/moffetthub_cache/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

    draft_model(可选)

    draft model 路径,仅支持 speculative_cpu 策略下使用,格式同 model

  5. 启动推理服务。

    cd /home/moffett/workspace/repos
    export PYTHONPATH=$PYTHONPATH:.                 # 将当前路径添加到 PYTHONPATH
    python examples/server.py > stdout.log 2>&1 &   # 启动推理服务
    tail -f stdout.log                              # 查看服务日志
    

注意

修改 server_config.yaml 中的模型及策略后,需重启推理服务,再进行推理测试。

测试推理服务

推理服务测试包括单并发测试和并发测试。测试过程中,可通过 tail -f stdout.log 命令查看服务日志;可执行 mx-smi list 命令查看运行的进程,如果未发现相关进程,请参见“启动推理服务”步骤重启服务。

注意

  • 使用 DeepSeek-R1-Distill-Qwen-32B 模型推理需占用 16 个 Device。

  • 使用 Llama-3-70B 模型推理需占用 32 个 Device,仅支持在部署了 8 张 S40 系列计算卡的服务器上运行。

参数选项

--tokenizer

模型的 tokenizer,可使用该模型任意策略的路径,例如:deepseek-ai/DeepSeek-R1-Distill-Qwen-32B 可使用 <model_path>/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/prefill<model_path>/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/decode

--n_requests

并发数量,最大不超过 8。

单并发测试

python3 tests/one_serving_benchmark.py --tokenizer <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/

多并发测试

python3 tests/multi_serving_benchmark.py --tokenizer <tokenizer> --n_requests <num>

# 示例
# 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. 查询并结束运行中的推理服务相关进程。

    mx-smi list 
    sudo pkill python    # 结束推理服务相关进程
    sudo kill -9 <PID>   # 结束其他进程
    
  2. 停用并删除推理服务的容器。

    docker ps -a | grep <tuili-name>
    docker stop <tuili-name> && docker rm <tuili-name>