7. MacaRT-vLLM

7.1. MacaRT-vLLM介绍

MacaRT-vLLM是在曦云系列GPU上适配官方vLLM的推理工具,基于MXMACA后端对vLLM方法进行了兼容适配和Kernel优化。 使用MacaRT-vLLM在曦云系列GPU上进行大模型推理,其方法和功能与官方vLLM兼容。当前兼容版本为vLLM-0.8.2。

vLLM版本与PyTorch版本的兼容适配关系,参见表 7.1

表 7.1 vLLM 与 PyTorch 的版本兼容关系

vLLM

PyTorch

0.6.2

2.1

0.6.6

2.1

0.7.2

2.4

0.8.2

2.4

7.2. MacaRT-vLLM功能与局限性

MacaRT-vLLM兼容适配了vLLM-0.8.2,包含了以下功能和特性,以及局限性:

功能和特性:

  • 兼容vLLM-0.8.2支持的所有模型BFLOAT16推理和部分模型FLOAT16推理,支持官方多模态模型

  • 兼容原生LLM、Engine、Kernel的API接口

  • 兼容原生server和OpenAI server接口

  • 支持Lora特性

  • 支持GPTQ和AWQ量化方式

  • 支持ray和mp方式启动单机多卡推理;设置 --distributed-executor-backend 可以指定不同后端进行多卡推理,默认使用ray

  • 支持prefix_cache方式

  • 支持 enforce_eager=False 方式。需通过显式配置,默认为 True。另外,需要额外设置MACA环境变量来获取加速效果: export MACA_GRAPH_LAUNCH_MODE=1

局限性:

  • 不支持FP8类型KV Cache和相关FP8模型

  • 包含Ubuntu 20、Ubuntu 22、kylin2309a系统版本,后续完善支持其他系统

7.3. MacaRT-vLLM使用流程

本章节介绍MacaRT-vLLM的使用步骤,主要分为离线推理、吞吐测试和Sever服务。

7.3.1. 环境准备

使用MacaRT-vLLM进行推理需要准备好环境。目前提供两种方式:镜像和wheel包。

7.3.1.1. 使用vLLM镜像

从发布的软件包中获取vLLM镜像并启动,参见《曦云® 系列通用GPU用户指南》中“容器相关场景支持”章节。

7.3.1.2. 安装wheel包

操作步骤

  1. 预先安装沐曦平台的torch、flash attn、xformer(可选)环境。

  2. 获取MacaRT-vLLM压缩包 maca-vllm-py310-xxx-${OS_Version}.tar.xz 并解压。

  3. pip安装以下wheel包:

    • vllm-0.8.2+xxx.whl

    • flash_attn+xxx.whl (适配vLLM新加速whl包)

    • ray-2.43.0-cp310-cp310_${OS_Version}.whl

除了上述wheel包,其他依赖环境可以通过外部镜像源进行安装。安装过程中有其他依赖,需要提前配置好Python的pip源。

7.3.1.3. 配置环境变量

export MACA_PATH=your_maca_path
export PATH=${MACA_PATH}/bin:${MACA_PATH}/mxgpu_llvm/bin:${PATH}
export LD_LIBRARY_PATH=${MACA_PATH}/lib:${MACA_PATH}/ompi/lib:${MACA_PATH}/mxgpu_llvm/lib:${LD_LIBRARY_PATH}

7.3.2. 离线推理

离线推理代码示例如下:

from vllm import LLM, SamplingParams
# Sample prompts.
prompts = [
   "Hello, my name is",
   "The president of the United States is",
   "The capital of France is",
   "The future of AI is",
]
# Create a sampling params object.
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
# Create an LLM.
llm = LLM(model="facebook/opt-125m", tensor_parallel_size=1, dtype="float16", max_model_len=2048)
# Generate texts from the prompts. The output is a list of RequestOutput objects
# that contain the prompt, generated text, and other information.
outputs = llm.generate(prompts, sampling_params)
# Print the outputs.
for output in outputs:
   prompt = output.prompt
   generated_text = output.outputs[0].text
   print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

其中主要配置为:

  • LLM初始化类:指定模型路径(可配置为本地路径,如果不是本地路径,会根据网络下载外网模型)、tensor切分数量、模型数据类型(可不配置,如果没指定,将通过model config读取)、模型最大处理长度(可不配置,如果没设置,将从model config读取)

  • SamplingParams:设置采样算法方式。参数配置可参照官方vLLM-0.8.2版本进行配置。

7.3.3. 吞吐测试

吞吐测试代码可参考官方vLLm-0.8.2 benchmark_throughput.py

吞吐测试代码的运行方式示例1:

python benchmark_throughput.py --model XXX --tensor-parallel-size 1 --num-prompts 8 --trust-remote-code --input-len 1024 --output-len 512

模型为XXX,tensor并行为1,8条请求数量,信任模型路径的tokenizer方式,每条输入长度为1024个token,输出为512个token。

吞吐测试代码的运行方式示例2:

python benchmark_throughput.py --model XXX --tensor-parallel-size 1 --num-prompts 8 --trust-remote-code --dataset XXX.json

模型为XXX,tensor并行为1,8条请求数量,信任模型路径的tokenizer方式,通过从dataset选取语料进行真实模拟。 json格式可参考ShareGPT_V3_unfiltered_cleaned_split.json

运行程序后,结果打印如下:

Throughout: XXX request/s, XXXX token/s

打印结果指示每秒能接受多少请求,以及每秒处理的token数量(包括输入token)。

7.3.4. Server服务

Server请求服务参数设置可参考官方vLLM-0.8.2版本:

API server参数配置可参考api_server.py

OpenAI server参数配置可参考api_server.py

参考示例如下:

python -m vllm.entrypoints.api_server --model XXX #普通server方式
python -m vllm.entrypoints.openai.api_server --model XXX --host localhost --chat-template XXX.jinja ## openai 方式的请求
vllm server --model XXX