8. MacaRT-vLLM-metax

8.1. MacaRT-vLLM-metax介绍

vLLM-metax是专为曦云系列GPU打造的vLLM框架后端插件,用于使vLLM推理框架能够在沐曦GPU上高效运行。当前兼容vLLM v0.11.0版本。

8.1.1. 分支说明

已发布vLLM-metax版本与MXMACA版本的映射关系,参见表 8.1

表 8.1 vLLM-metax、vLLM官方、PyTorch的版本映射关系

vLLM-metax

vLLM

PyTorch

v0.10.2

v0.10.2

2.6

v0.11.0

v0.11.0

2.6

8.2. MacaRT-vLLM-metax功能与局限性

MacaRT-vLLM-metax兼容适配了vLLM v0.11.0版本,包含了以下功能和特性,以及局限性:

功能和特性:

  • 兼容vLLM v0.11.0支持的所有模型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系统版本,后续完善支持其他系统

8.3. MacaRT-vLLM-metax使用流程

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

8.3.1. 环境准备

使用MacaRT-vLLM-metax进行推理需要准备好环境。目前提供两种方式:镜像和wheel包。 如果您想开发、调试或测试 vLLM-metax 的最新功能,可以从源码构建 vLLM-metax 并将其安装到 Docker 环境中。 vLLM-metax源码构建请参考:MacaRT-vLLM-metax源码构建

8.3.1.1. 使用vLLM镜像

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

8.3.1.2. 安装wheel包

操作步骤

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

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

  3. pip安装以下wheel包:

    • vllm_metax-0.11.0+xxx.whl

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

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

    • mcoplib-0.1.0-+macaxxx-cp310-cp310_${OS_Version}.whl

    • vllm-0.11.0-cp310-xxx_${OS_Version}.whl

  4. vLLM-metax、vLLM、mcoplib安装后需要手动执行 mcoplib_init 命令。

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

8.3.1.3. 源代码构建教程

MetaX开发社区中获取vLLM镜像并启动,参见《曦云® 系列通用GPU用户指南》中“容器相关场景支持”章节。

8.3.1.4. 设置环境变量

# setup MACA path
export MACA_PATH="/opt/maca"

# cu-bridge
export CUCC_PATH="${MACA_PATH}/tools/cu-bridge"
export CUDA_PATH=/root/cu-bridge/CUDA_DIR
export CUCC_CMAKE_ENTRY=2

# update PATH
export PATH=${MACA_PATH}/mxgpu_llvm/bin:${MACA_PATH}/bin:${CUCC_PATH}/tools:${CUCC_PATH}/bin:${PATH}
export LD_LIBRARY_PATH=${MACA_PATH}/lib:${MACA_PATH}/ompi/lib:${MACA_PATH}/mxgpu_llvm/lib:${LD_LIBRARY_PATH}

export VLLM_INSTALL_PUNICA_KERNELS=1

8.3.1.5. 构建vLLM

克隆vLLM项目:

git clone  --depth 1 --branch v0.11.0 https://github.com/vllm-project/vllm
cd vllm

构建官方版本vLLM:

python use_existing_torch.py
pip install -r requirements/build.txt
VLLM_TARGET_DEVICE=empty pip install -v . --no-build-isolation

8.3.1.6. 构建vLLM-metax

安装所需组件:

python use_existing_metax.py
pip install -r requirements/build.txt

安装vLLM:

pip install . -v --no-build-isolation

如果想要开发vLLM,请以可编辑模式安装:

pip install -e . -v --no-build-isolation

(可选)构建可移植的wheel包:

python -m build -w -n
pip install dist/*.whl

8.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)


def main():
   # Create an LLM.
   llm = LLM(model="facebook/opt-125m")
   # 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.
   print("\nGenerated Outputs:\n" + "-" * 60)
   for output in outputs:
      prompt = output.prompt
      generated_text = output.outputs[0].text
      print(f"Prompt:    {prompt!r}")
      print(f"Output:    {generated_text!r}")
      print("-" * 60)


if __name__ == "__main__":
   main()

其中主要配置为:

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

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

8.3.3. 吞吐测试

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

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

python -m vllm.entrypoints.cli.main bench throughput --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:

vllm bench throughput --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)。

8.3.4. Server服务

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

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