跳到內容

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://dockerdocs.tw/engine/security/seccomp/

或者,使用 --privileged=true 執行也可以,但其範圍更廣,通常不推薦。

在 K8S 中,可以在工作負載 yaml 中新增以下配置來實現與上述相同效果。

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