跳到内容

CPU

vLLM 是一个 Python 库,支持以下 CPU 变体。选择您的 CPU 类型以查看特定供应商的说明。

vLLM 在 x86 CPU 平台上支持基本的模型推理和推理服务,支持 FP32、FP16 和 BF16 数据类型。

vLLM 在 Arm CPU 平台上提供基本的模型推理和推理服务,支持 NEON,数据类型为 FP32、FP16 和 BF16。

vLLM 对 Apple Silicon 的 macOS 提供实验性支持。目前,用户必须从源代码构建才能在 macOS 上原生运行。

目前 macOS 的 CPU 实现支持 FP32 和 FP16 数据类型。

vLLM 对 IBM Z 平台上的 s390x 架构提供实验性支持。目前,用户必须从源代码构建才能在 IBM Z 平台上原生运行。

目前,s390x 架构的 CPU 实现仅支持 FP32 数据类型。

技术讨论

主要讨论发生在 vLLM Slack#sig-cpu 频道。

当就 CPU 后端打开 GitHub issue 时,请在标题中添加 [CPU Backend],它将被标记为 cpu 以便引起更多关注。

要求

  • Python: 3.10 -- 3.13
  • 操作系统:Linux
  • CPU 标志:avx512f(推荐),avx512_bf16(可选),avx512_vnni(可选)

提示

使用 lscpu 检查 CPU 标志。

  • 操作系统:Linux
  • 编译器:gcc/g++ >= 12.3.0(可选,推荐)
  • 指令集架构 (ISA):需要 NEON 支持
  • 操作系统:macOS Sonoma 或更高版本
  • SDK:XCode 15.4 或更高版本,并附带 Command Line Tools
  • 编译器:Apple Clang >= 15.0.0
  • 操作系统:Linux
  • SDK:gcc/g++ >= 12.3.0 或更高版本,并附带 Command Line Tools
  • 指令集架构 (ISA):需要 VXE 支持。支持 Z14 及以上版本。
  • 构建安装 Python 包:pyarrowtorchtorchvision

使用 Python 进行设置

创建新的 Python 环境

建议使用 uv,一个非常快速的 Python 环境管理器,来创建和管理 Python 环境。请按照 文档 安装 uv。安装 uv 后,您可以使用以下命令创建新的 Python 环境。

uv venv --python 3.12 --seed
source .venv/bin/activate

预构建的 Wheels

在指定索引 URL 时,请确保使用 cpu 变体子目录。例如,夜间构建索引是:https://wheels.vllm.ai/nightly/cpu/

自 0.13.0 版本起,vLLM 提供了 x86 CPU(带 AVX512)的预构建轮子。安装发布轮子

export VLLM_VERSION=$(curl -s https://api.github.com/repos/vllm-project/vllm/releases/latest | jq -r .tag_name | sed 's/^v//')

# use uv
uv pip install https://github.com/vllm-project/vllm/releases/download/v${VLLM_VERSION}/vllm-${VLLM_VERSION}+cpu-cp38-abi3-manylinux_2_35_x86_64.whl --torch-backend cpu
pip
# use pip
pip install https://github.com/vllm-project/vllm/releases/download/v${VLLM_VERSION}/vllm-${VLLM_VERSION}+cpu-cp38-abi3-manylinux_2_35_x86_64.whl --extra-index-url https://download.pytorch.org/whl/cpu

设置 LD_PRELOAD

在使用通过轮子安装的 vLLM CPU 之前,请确保已安装 TCMalloc 和 Intel OpenMP 并已添加到 LD_PRELOAD

# install TCMalloc, Intel OpenMP is installed with vLLM CPU
sudo apt-get install -y --no-install-recommends libtcmalloc-minimal4

# manually find the path
sudo find / -iname *libtcmalloc_minimal.so.4
sudo find / -iname *libiomp5.so
TC_PATH=...
IOMP_PATH=...

# add them to LD_PRELOAD
export LD_PRELOAD="$TC_PATH:$IOMP_PATH:$LD_PRELOAD"

安装最新代码

安装从最新主分支构建的轮子

uv pip install vllm --extra-index-url https://wheels.vllm.ai/nightly/cpu --index-strategy first-index --torch-backend cpu

安装特定修订版

如果您想访问之前提交的轮子(例如,为了二分查找行为更改、性能回归),您可以在 URL 中指定提交哈希。

export VLLM_COMMIT=730bd35378bf2a5b56b6d3a45be28b3092d26519 # use full commit hash from the main branch
uv pip install vllm --extra-index-url https://wheels.vllm.ai/${VLLM_COMMIT}/cpu --index-strategy first-index --torch-backend cpu

自 0.11.2 版本起,vLLM 提供了 Arm CPU 的预构建轮子。这些轮子包含预编译的 C++ 二进制文件。

export VLLM_VERSION=$(curl -s https://api.github.com/repos/vllm-project/vllm/releases/latest | jq -r .tag_name | sed 's/^v//')
uv pip install https://github.com/vllm-project/vllm/releases/download/v${VLLM_VERSION}/vllm-${VLLM_VERSION}+cpu-cp38-abi3-manylinux_2_35_aarch64.whl
pip
pip install https://github.com/vllm-project/vllm/releases/download/v${VLLM_VERSION}/vllm-${VLLM_VERSION}+cpu-cp38-abi3-manylinux_2_35_aarch64.whl

设置 LD_PRELOAD

在使用通过轮子安装的 vLLM CPU 之前,请确保已安装 TCMalloc 并已添加到 LD_PRELOAD

# install TCMalloc
sudo apt-get install -y --no-install-recommends libtcmalloc-minimal4

# manually find the path
sudo find / -iname *libtcmalloc_minimal.so.4
TC_PATH=...

# add them to LD_PRELOAD
export LD_PRELOAD="$TC_PATH:$LD_PRELOAD"

uv 方法适用于 vLLM v0.6.6 及更高版本。uv 的一个独特之处在于,--extra-index-url 中的包比默认索引具有 更高的优先级。如果最新公共版本是 v0.6.6.post1uv 的行为允许通过指定 --extra-index-url 来安装 v0.6.6.post1 之前的提交。相比之下,pip 会合并来自 --extra-index-url 和默认索引的包,仅选择最新版本,这使得安装发布版本之前的开发版本变得困难。

安装最新代码

LLM 推理是一个快速发展的领域,最新代码可能包含尚未发布的错误修复、性能改进和新功能。为了让用户无需等待下一个版本即可尝试最新代码,vLLM 为 v0.11.2 之后的每个提交都提供了可用的预构建 Arm CPU 轮子,位于 https://wheels.vllm.ai/nightly。对于原生 CPU 轮子,应使用此索引。

  • https://wheels.vllm.ai/nightly/cpu/vllm

要从夜间索引安装,请运行

uv pip install vllm --extra-index-url https://wheels.vllm.ai/nightly/cpu --index-strategy first-index

pip(有一个注意事项)

使用 pip 从夜间索引安装是不受支持的,因为 pip 会合并来自 --extra-index-url 和默认索引的包,仅选择最新版本,这使得安装发布版本之前的开发版本变得困难。相比之下,uv 使额外的索引比默认索引具有 更高的优先级

如果您坚持使用 pip,您必须指定轮子文件的完整 URL(链接地址)(可从 https://wheels.vllm.ai/nightly/cpu/vllm 获取)。

pip install https://wheels.vllm.ai/4fa7ce46f31cbd97b4651694caf9991cc395a259/vllm-0.13.0rc2.dev104%2Bg4fa7ce46f.cpu-cp38-abi3-manylinux_2_35_aarch64.whl # current nightly build (the filename will change!)

安装特定修订版

如果您想访问之前提交的轮子(例如,为了二分查找行为更改、性能回归),您可以在 URL 中指定提交哈希。

export VLLM_COMMIT=730bd35378bf2a5b56b6d3a45be28b3092d26519 # use full commit hash from the main branch
uv pip install vllm --extra-index-url https://wheels.vllm.ai/${VLLM_COMMIT}/cpu --index-strategy first-index

目前没有预构建的 Apple silicon CPU 轮子。

目前没有预构建的 IBM Z CPU 轮子。

从源代码构建 Wheel

通过纯 Python 构建(无需编译)进行设置

请参考 GPU 上的纯 Python 构建 的说明,并将构建命令替换为。

VLLM_USE_PRECOMPILED=1 VLLM_PRECOMPILED_WHEEL_VARIANT=cpu VLLM_TARGET_DEVICE=cpu uv pip install --editable .

完整构建(需要编译)

安装推荐的编译器。我们建议使用 gcc/g++ >= 12.3.0 作为默认编译器,以避免潜在问题。例如,在 Ubuntu 22.4 上,您可以运行。

sudo apt-get update -y
sudo apt-get install -y gcc-12 g++-12 libnuma-dev
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 10 --slave /usr/bin/g++ g++ /usr/bin/g++-12

建议使用 uv,一个非常快速的 Python 环境管理器,来创建和管理 Python 环境。请按照 文档 安装 uv。安装 uv 后,您可以使用以下命令创建新的 Python 环境。

uv venv --python 3.12 --seed
source .venv/bin/activate

克隆 vLLM 项目

git clone https://github.com/vllm-project/vllm.git vllm_source
cd vllm_source

安装所需的依赖项

uv pip install -r requirements/cpu-build.txt --torch-backend cpu
uv pip install -r requirements/cpu.txt --torch-backend cpu
pip
pip install --upgrade pip
pip install -v -r requirements/cpu-build.txt --extra-index-url https://download.pytorch.org/whl/cpu
pip install -v -r requirements/cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu

构建和安装 vLLM

VLLM_TARGET_DEVICE=cpu uv pip install . --no-build-isolation

如果您想开发 vLLM,请改为以可编辑模式安装。

VLLM_TARGET_DEVICE=cpu uv pip install -e . --no-build-isolation

可选地,构建一个便携式轮子,然后可以在其他地方安装。

VLLM_TARGET_DEVICE=cpu uv build --wheel
uv pip install dist/*.whl
pip
VLLM_TARGET_DEVICE=cpu python -m build --wheel --no-isolation
pip install dist/*.whl

设置 LD_PRELOAD

在使用通过轮子安装的 vLLM CPU 之前,请确保已安装 TCMalloc 和 Intel OpenMP 并已添加到 LD_PRELOAD

# install TCMalloc, Intel OpenMP is installed with vLLM CPU
sudo apt-get install -y --no-install-recommends libtcmalloc-minimal4

# manually find the path
sudo find / -iname *libtcmalloc_minimal.so.4
sudo find / -iname *libiomp5.so
TC_PATH=...
IOMP_PATH=...

# add them to LD_PRELOAD
export LD_PRELOAD="$TC_PATH:$IOMP_PATH:$LD_PRELOAD"

故障排除

  • NumPy ≥2.0 错误:使用 pip install "numpy<2.0" 降级。
  • CMake 拾取 CUDA:添加 CMAKE_DISABLE_FIND_PACKAGE_CUDA=ON 以在 CPU 构建期间阻止 CUDA 检测,即使 CUDA 已安装。
  • AMD 需要至少第四代处理器(Zen 4/Genoa)或更高版本才能支持 AVX512 以在 CPU 上运行 vLLM。
  • 如果您收到类似 Could not find a version that satisfies the requirement torch==X.Y.Z+cpu+cpu 的错误,请考虑更新 pyproject.toml 以帮助 pip 解析依赖项。
    pyproject.toml
    [build-system]
    requires = [
      "cmake>=3.26.1",
      ...
      "torch==X.Y.Z+cpu"   # <-------
    ]
    

首先,安装推荐的编译器。我们建议使用 gcc/g++ >= 12.3.0 作为默认编译器,以避免潜在问题。例如,在 Ubuntu 22.4 上,您可以运行。

sudo apt-get update  -y
sudo apt-get install -y --no-install-recommends ccache git curl wget ca-certificates gcc-12 g++-12 libtcmalloc-minimal4 libnuma-dev ffmpeg libsm6 libxext6 libgl1 jq lsof
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 10 --slave /usr/bin/g++ g++ /usr/bin/g++-12

其次,克隆 vLLM 项目

git clone https://github.com/vllm-project/vllm.git vllm_source
cd vllm_source

第三,安装必需的依赖项

uv pip install -r requirements/cpu-build.txt --torch-backend cpu
uv pip install -r requirements/cpu.txt --torch-backend cpu
pip
pip install --upgrade pip
pip install -v -r requirements/cpu-build.txt --extra-index-url https://download.pytorch.org/whl/cpu
pip install -v -r requirements/cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu

最后,构建并安装 vLLM

VLLM_TARGET_DEVICE=cpu uv pip install . --no-build-isolation

如果您想开发 vLLM,请改为以可编辑模式安装。

VLLM_TARGET_DEVICE=cpu uv pip install -e . --no-build-isolation

已在 AWS Graviton3 实例上进行了兼容性测试。

设置 LD_PRELOAD

在使用通过轮子安装的 vLLM CPU 之前,请确保已安装 TCMalloc 并已添加到 LD_PRELOAD

# install TCMalloc
sudo apt-get install -y --no-install-recommends libtcmalloc-minimal4

# manually find the path
sudo find / -iname *libtcmalloc_minimal.so.4
TC_PATH=...

# add them to LD_PRELOAD
export LD_PRELOAD="$TC_PATH:$LD_PRELOAD"

安装 XCode 和 Command Line Tools(包含 Apple Clang)后,执行以下命令从源代码构建和安装 vLLM。

git clone https://github.com/vllm-project/vllm.git
cd vllm
uv pip install -r requirements/cpu.txt --index-strategy unsafe-best-match
uv pip install -e .

提示

需要 --index-strategy unsafe-best-match 标志来解析多个包索引(PyTorch CPU 索引和 PyPI)之间的依赖项。没有此标志,您可能会遇到 typing-extensions 版本冲突。

“unsafe”一词指的是包解析策略,而不是安全性。默认情况下,uv 仅在找到包的第一个索引中进行搜索,以防止依赖项混淆攻击。此标志允许 uv 搜索所有配置的索引以找到最佳兼容版本。由于 PyTorch 和 PyPI 都是受信任的包源,使用此策略对 vLLM 安装是安全且合适的。

注意

在 macOS 上,VLLM_TARGET_DEVICE 会自动设置为 cpu,这是目前唯一支持的设备。

故障排除

如果构建因无法找到标准 C++ 头文件等错误而失败,请尝试删除并重新安装您的 Command Line Tools for Xcode

[...] fatal error: 'map' file not found
        1 | #include <map>
            |          ^~~~~
    1 error generated.
    [2/8] Building CXX object CMakeFiles/_C.dir/csrc/cpu/pos_encoding.cpp.o

[...] fatal error: 'cstddef' file not found
        10 | #include <cstddef>
            |          ^~~~~~~~~
    1 error generated.

如果构建因 C++11/C++17 兼容性错误而失败,问题在于构建系统默认使用较旧的 C++ 标准。

[...] error: 'constexpr' is not a type
[...] error: expected ';' before 'constexpr'
[...] error: 'constexpr' does not name a type

解决方案:您的编译器可能正在使用较旧的 C++ 标准。编辑 cmake/cpu_extension.cmake,在 set(CMAKE_CXX_STANDARD_REQUIRED ON) 之前添加 set(CMAKE_CXX_STANDARD 17)

检查编译器的 C++ 标准支持

clang++ -std=c++17 -pedantic -dM -E -x c++ /dev/null | grep __cplusplus
在 Apple Clang 16 上,您应该看到:#define __cplusplus 201703L

在构建 vLLM 之前,请从包管理器安装以下包。例如,在 RHEL 9.4 上。

dnf install -y \
    which procps findutils tar vim git gcc g++ make patch make cython zlib-devel \
    libjpeg-turbo-devel libtiff-devel libpng-devel libwebp-devel freetype-devel harfbuzz-devel \
    openssl-devel openblas openblas-devel wget autoconf automake libtool cmake numactl-devel

安装 rust>=1.80,这是安装 outlines-coreuvloop Python 包所需的。

curl https://sh.rustup.rs -sSf | sh -s -- -y && \
    . "$HOME/.cargo/env"

执行以下命令从源代码构建和安装 vLLM。

提示

在构建 vLLM 之前,请从源代码构建以下依赖项:torchvisionpyarrow

    sed -i '/^torch/d' requirements/build.txt    # remove torch from requirements/build.txt since we use nightly builds
    uv pip install -v \
        --torch-backend auto \
        -r requirements/build.txt \
        -r requirements/cpu.txt \
    VLLM_TARGET_DEVICE=cpu python setup.py bdist_wheel && \
        uv pip install dist/*.whl
pip
    sed -i '/^torch/d' requirements/build.txt    # remove torch from requirements/build.txt since we use nightly builds
    pip install -v \
        --extra-index-url https://download.pytorch.org/whl/nightly/cpu \
        -r requirements/build.txt \
        -r requirements/cpu.txt \
    VLLM_TARGET_DEVICE=cpu python setup.py bdist_wheel && \
        pip install dist/*.whl

使用 Docker 进行设置

预构建的镜像

https://gallery.ecr.aws/q9t5s3a7/vllm-cpu-release-repo

警告

如果在没有 avx512favx512_bf16avx512_vnni 支持的机器上部署预构建的镜像,可能会引发 Illegal instruction 错误。建议使用适当的构建参数(例如 --build-arg VLLM_CPU_DISABLE_AVX512=true--build-arg VLLM_CPU_AVX512BF16=false--build-arg VLLM_CPU_AVX512VNNI=false)为这些机器构建镜像,以禁用不支持的功能。请注意,没有 avx512f,将使用 AVX2,并且不推荐使用此版本,因为它只提供基本功能支持。

有关使用官方 Docker 镜像的说明,请参阅 使用 Docker

自 0.12.0 版本起,vLLM 的稳定 Docker 镜像已为 Arm 预构建。可用的镜像标签在此处:https://gallery.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo

export VLLM_VERSION=$(curl -s https://api.github.com/repos/vllm-project/vllm/releases/latest | jq -r .tag_name | sed 's/^v//')
docker pull public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:v${VLLM_VERSION}

您也可以使用 Docker 镜像访问最新代码。这些镜像不适用于生产环境,仅供 CI 和测试使用。它们将在几天后过期。

最新代码可能包含 bug 且可能不稳定。请谨慎使用。

export VLLM_COMMIT=6299628d326f429eba78736acb44e76749b281f5 # use full commit hash from the main branch
docker pull public.ecr.aws/q9t5s3a7/vllm-ci-postmerge-repo:${VLLM_COMMIT}-arm64-cpu

目前没有预构建的 Arm silicon CPU 镜像。

目前没有预构建的 IBM Z CPU 镜像。

从源代码构建镜像

docker build -f docker/Dockerfile.cpu \
        --build-arg VLLM_CPU_AVX512BF16=false (default)|true \
        --build-arg VLLM_CPU_AVX512VNNI=false (default)|true \
        --build-arg VLLM_CPU_AMXBF16=false|true (default) \
        --build-arg VLLM_CPU_DISABLE_AVX512=false (default)|true \ 
        --tag vllm-cpu-env \
        --target vllm-openai .

# Launching OpenAI server
docker run --rm \
            --security-opt seccomp=unconfined \
            --cap-add SYS_NICE \
            --shm-size=4g \
            -p 8000:8000 \
            -e VLLM_CPU_KVCACHE_SPACE=<KV cache space> \
            vllm-cpu-env \
            meta-llama/Llama-3.2-1B-Instruct \
            --dtype=bfloat16 \
            other vLLM OpenAI server arguments
docker build -f docker/Dockerfile.cpu \
        --tag vllm-cpu-env .

# Launching OpenAI server
docker run --rm \
            --privileged=true \
            --shm-size=4g \
            -p 8000:8000 \
            -e VLLM_CPU_KVCACHE_SPACE=<KV cache space> \
            -e VLLM_CPU_OMP_THREADS_BIND=<CPU cores for inference> \
            vllm-cpu-env \
            --model=meta-llama/Llama-3.2-1B-Instruct \
            --dtype=bfloat16 \
            other vLLM OpenAI server arguments

提示

--privileged=true 的替代方案是 --cap-add SYS_NICE --security-opt seccomp=unconfined

docker build -f docker/Dockerfile.cpu \
        --tag vllm-cpu-env .

# Launching OpenAI server
docker run --rm \
            --privileged=true \
            --shm-size=4g \
            -p 8000:8000 \
            -e VLLM_CPU_KVCACHE_SPACE=<KV cache space> \
            -e VLLM_CPU_OMP_THREADS_BIND=<CPU cores for inference> \
            vllm-cpu-env \
            --model=meta-llama/Llama-3.2-1B-Instruct \
            --dtype=bfloat16 \
            other vLLM OpenAI server arguments

提示

--privileged=true 的替代方案是 --cap-add SYS_NICE --security-opt seccomp=unconfined

docker build -f docker/Dockerfile.s390x \
    --tag vllm-cpu-env .

# Launch OpenAI server
docker run --rm \
    --privileged true \
    --shm-size 4g \
    -p 8000:8000 \
    -e VLLM_CPU_KVCACHE_SPACE=<KV cache space> \
    -e VLLM_CPU_OMP_THREADS_BIND=<CPU cores for inference> \
    vllm-cpu-env \
    --model meta-llama/Llama-3.2-1B-Instruct \
    --dtype float \
    other vLLM OpenAI server arguments

提示

--privileged true 的替代方案是 --cap-add SYS_NICE --security-opt seccomp=unconfined

  • VLLM_CPU_KVCACHE_SPACE:指定 KV 缓存大小(例如,VLLM_CPU_KVCACHE_SPACE=40 表示 40 GiB 的 KV 缓存空间),更大的设置将允许 vLLM 并行运行更多请求。此参数应根据用户的硬件配置和内存管理模式进行设置。默认值为 0
  • VLLM_CPU_OMP_THREADS_BIND:指定分配给 OpenMP 线程的 CPU 核心,可设置为 CPU ID 列表、auto(默认)或 nobind(禁用绑定到单个 CPU 核心并继承用户定义的 OpenMP 变量)。例如,VLLM_CPU_OMP_THREADS_BIND=0-31 表示将有 32 个 OpenMP 线程绑定到 0-31 的 CPU 核心上。VLLM_CPU_OMP_THREADS_BIND=0-31|32-63 表示将有 2 个张量并行进程,rank0 的 32 个 OpenMP 线程绑定到 0-31 的 CPU 核心上,rank1 的 OpenMP 线程绑定到 32-63 的 CPU 核心上。设置为 auto 时,每个 rank 的 OpenMP 线程分别绑定到每个 NUMA 节点上的 CPU 核心。如果设置为 nobind,OpenMP 线程数由标准 OMP_NUM_THREADS 环境变量确定。
  • VLLM_CPU_NUM_OF_RESERVED_CPU:指定每个 rank 的 OpenMP 线程未使用的 CPU 核心数量。该变量仅在 VLLM_CPU_OMP_THREADS_BIND 设置为 auto 时生效。默认值为 None。如果未设置值且使用 auto 线程绑定,则 world_size == 1 时不保留 CPU,world_size > 1 时每个 rank 保留 1 个 CPU。
  • CPU_VISIBLE_MEMORY_NODES:指定 vLLM CPU 工作进程可见的 NUMA 内存节点,类似于 CUDA_VISIBLE_DEVICES。该变量仅在 VLLM_CPU_OMP_THREADS_BIND 设置为 auto 时生效。该变量为自动线程绑定功能提供了更多控制,例如掩码节点和更改节点绑定顺序。
  • VLLM_CPU_SGL_KERNEL(仅限 x86,实验性):是否使用针对线性层和 MoE 层的批处理优化内核,特别是针对在线服务等低延迟需求。这些内核需要 AMX 指令集、BFloat16 权重类型以及可被 32 整除的权重形状。默认为 0(False)。

常见问题

应使用哪种 dtype

  • 目前,vLLM CPU 将模型默认设置作为 dtype。但是,由于 PyTorch CPU 对 float16 的支持不稳定,建议在出现任何性能或准确性问题时,显式设置 dtype=bfloat16

如何在 CPU 上启动 vLLM 服务?

  • 在使用在线服务时,建议为服务框架预留 1-2 个 CPU 核心,以避免 CPU 过度订阅。例如,在具有 32 个物理 CPU 核心的平台上,为框架预留 CPU 31,并使用 CPU 0-30 进行推理线程。
export VLLM_CPU_KVCACHE_SPACE=40
export VLLM_CPU_OMP_THREADS_BIND=0-30
vllm serve facebook/opt-125m --dtype=bfloat16

或使用默认的自动线程绑定

export VLLM_CPU_KVCACHE_SPACE=40
export VLLM_CPU_NUM_OF_RESERVED_CPU=1
vllm serve facebook/opt-125m --dtype=bfloat16

注意,建议在 world_size == 1 时手动为 vLLM 前端进程预留 1 个 CPU。

CPU 上支持哪些模型?

有关在 CPU 平台上验证过的模型的完整且最新的列表,请参阅官方文档:CPU 上支持的模型

如何查找支持的 CPU 模型的基准配置示例?

对于 CPU 上支持的模型 中列出的任何模型,vLLM 基准测试套件的 CPU 测试用例中提供了优化的运行时配置,这些配置定义在 cpu test cases 中。有关这些优化配置如何确定的详细信息,请参阅:performance-benchmark-details。要使用这些优化设置对支持的模型进行基准测试,请按照 手动运行 vLLM 基准测试套件 中的步骤进行操作,并在 CPU 环境中运行基准测试套件。

以下是使用优化配置对所有 CPU 支持的模型进行基准测试的示例命令。

ON_CPU=1 bash .buildkite/performance-benchmarks/scripts/run-performance-benchmarks.sh

基准测试结果将保存在 ./benchmark/results/ 中。在该目录中,生成的 .commands 文件包含基准测试的所有示例命令。

我们建议将张量并行大小配置为匹配您系统上的 NUMA 节点数量。请注意,当前版本不支持张量并行大小=6。要确定可用的 NUMA 节点数量,请使用以下命令。

lscpu | grep "NUMA node(s):" | awk '{print $3}'

作为性能参考,用户也可以查阅 vLLM 性能仪表板,该仪表板发布了使用相同基准测试套件生成的默认模型 CPU 结果。

如何决定 VLLM_CPU_OMP_THREADS_BIND

  • 在大多数情况下,推荐使用默认的 auto 线程绑定。理想情况下,每个 OpenMP 线程将分别绑定到一个专用的物理核心,每个 rank 的线程将分别绑定到同一个 NUMA 节点,并且在 world_size > 1 时,每个 rank 将保留 1 个 CPU 用于其他 vLLM 组件。如果您遇到任何性能问题或意外的绑定行为,请尝试按以下方式绑定线程。

  • 在启用了超线程的平台上,具有 16 个逻辑 CPU 核心 / 8 个物理 CPU 核心

命令
$ lscpu -e # check the mapping between logical CPU cores and physical CPU cores

# The "CPU" column means the logical CPU core IDs, and the "CORE" column means the physical core IDs. On this platform, two logical cores are sharing one physical core.
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ      MHZ
0    0      0    0 0:0:0:0          yes 2401.0000 800.0000  800.000
1    0      0    1 1:1:1:0          yes 2401.0000 800.0000  800.000
2    0      0    2 2:2:2:0          yes 2401.0000 800.0000  800.000
3    0      0    3 3:3:3:0          yes 2401.0000 800.0000  800.000
4    0      0    4 4:4:4:0          yes 2401.0000 800.0000  800.000
5    0      0    5 5:5:5:0          yes 2401.0000 800.0000  800.000
6    0      0    6 6:6:6:0          yes 2401.0000 800.0000  800.000
7    0      0    7 7:7:7:0          yes 2401.0000 800.0000  800.000
8    0      0    0 0:0:0:0          yes 2401.0000 800.0000  800.000
9    0      0    1 1:1:1:0          yes 2401.0000 800.0000  800.000
10   0      0    2 2:2:2:0          yes 2401.0000 800.0000  800.000
11   0      0    3 3:3:3:0          yes 2401.0000 800.0000  800.000
12   0      0    4 4:4:4:0          yes 2401.0000 800.0000  800.000
13   0      0    5 5:5:5:0          yes 2401.0000 800.0000  800.000
14   0      0    6 6:6:6:0          yes 2401.0000 800.0000  800.000
15   0      0    7 7:7:7:0          yes 2401.0000 800.0000  800.000

# On this platform, it is recommended to only bind openMP threads on logical CPU cores 0-7 or 8-15
$ export VLLM_CPU_OMP_THREADS_BIND=0-7
$ python examples/offline_inference/basic/basic.py
  • 当在具有 NUMA 的多插槽机器上部署 vLLM CPU 后端并启用张量并行或流水线并行时,每个 NUMA 节点都被视为一个 TP/PP rank。因此,请注意将单个 rank 的 CPU 核心设置在同一个 NUMA 节点上,以避免跨 NUMA 节点内存访问。

如何决定 VLLM_CPU_KVCACHE_SPACE

默认值为 4GB。更大的空间可以支持更多的并发请求和更长的上下文长度。然而,用户应该注意每个 NUMA 节点的内存容量。每个 TP rank 的内存使用量是 权重分片大小VLLM_CPU_KVCACHE_SPACE 的总和,如果它超过了单个 NUMA 节点的容量,TP 工作进程将因内存不足而以 exitcode 9 退出。

如何对 vLLM CPU 进行性能调优?

首先,请确保线程绑定和 KV 缓存空间已正确设置并生效。您可以通过运行 vLLM 基准测试并在 htop 中观察 CPU 核心使用情况来检查线程绑定。

使用 32 的倍数作为 --block-size,默认为 128。

推理批次大小是影响性能的重要参数。较大的批次通常提供更高的吞吐量,较小的批次提供较低的延迟。调整最大批次大小,从默认值开始,以平衡吞吐量和延迟,是提高 vLLM CPU 在特定平台上性能的有效方法。vLLM 中有两个重要的相关参数。

  • --max-num-batched-tokens,定义单个批次中 token 的数量限制,对第一个 token 的性能影响更大。默认值设置为。
    • 离线推理:4096 * world_size
    • 在线服务:2048 * world_size
  • --max-num-seqs,定义单个批次中序列的数量限制,对输出 token 的性能影响更大。
    • 离线推理:256 * world_size
    • 在线服务:128 * world_size

vLLM CPU 支持数据并行 (DP)、张量并行 (TP) 和流水线并行 (PP) 来利用多个 CPU 插槽和内存节点。有关调整 DP、TP 和 PP 的更多详细信息,请参阅 优化和调优。对于 vLLM CPU,如果 CPU 插槽和内存节点足够,建议同时使用 DP、TP 和 PP。

vLLM CPU 支持哪些量化配置?

  • vLLM CPU 支持以下量化:
    • AWQ(仅限 x86)
    • GPTQ(仅限 x86)
    • 压缩张量 INT8 W8A8(x86,s390x)

为什么在 Docker 中运行时会看到 get_mempolicy: Operation not permitted 错误?

在某些容器环境(如 Docker)中,vLLM 使用的 NUMA 相关系统调用(例如 get_mempolicymigrate_pages)在运行时默认的 seccomp/capabilities 设置中被阻止/拒绝。这可能导致警告,如 get_mempolicy: Operation not permitted。功能不受影响,但 NUMA 内存绑定/迁移优化可能无法生效,性能可能会次优。

要在 Docker 中以最小权限启用这些优化,您可以遵循以下提示。

docker run ... --cap-add SYS_NICE --security-opt seccomp=unconfined  ...

# 1) `--cap-add SYS_NICE` is to address `get_mempolicy` EPERM issue.

# 2) `--security-opt seccomp=unconfined` is to enable `migrate_pages` for `numa_migrate_pages()`.
# Actually, `seccomp=unconfined` bypasses the seccomp for container,
# if it's unacceptable, you can customize your own seccomp profile,
# based on docker/runtime default.json and add `migrate_pages` to `SCMP_ACT_ALLOW` list.

# reference : https://docs.container.net.cn/engine/security/seccomp/

或者,使用 --privileged=true 运行也可以,但其范围更广,通常不推荐。

在 K8S 中,可以在工作负载 yaml 中添加以下配置来实现与上述相同效果。

securityContext:
  seccompProfile:
    type: Unconfined
  capabilities:
    add:
    - SYS_NICE