CPU#
vLLM 是一个 Python 库,支持以下 CPU 变体。选择您的 CPU 类型以查看特定于供应商的说明
vLLM 最初支持在 x86 CPU 平台上进行基本模型推理和服务,数据类型为 FP32、FP16 和 BF16。
注意
此设备没有预构建的 wheels 或镜像,因此您必须从源代码构建 vLLM。
vLLM 已经过调整,可以在支持 NEON 的 ARM64 CPU 上工作,利用最初为 x86 平台开发的 CPU 后端。
ARM CPU 后端目前支持 Float32、FP16 和 BFloat16 数据类型。
注意
此设备没有预构建的 wheels 或镜像,因此您必须从源代码构建 vLLM。
vLLM 实验性地支持带有 Apple 芯片的 macOS。目前,用户应从源代码构建 vLLM 以在 macOS 上本地运行。
目前,macOS 的 CPU 实现支持 FP32 和 FP16 数据类型。
注意
此设备没有预构建的 wheels 或镜像,因此您必须从源代码构建 vLLM。
要求#
Python:3.9 – 3.12
操作系统:Linux
编译器:
gcc/g++ >= 12.3.0
(可选,推荐)指令集架构 (ISA):AVX512(可选,推荐)
提示
Intel Extension for PyTorch (IPEX) 通过最新的功能优化扩展了 PyTorch,可在 Intel 硬件上获得额外的性能提升。
操作系统:Linux
编译器:
gcc/g++ >= 12.3.0
(可选,推荐)指令集架构 (ISA):需要 NEON 支持
操作系统:
macOS Sonoma
或更高版本SDK:
XCode 15.4
或更高版本,带有命令行工具编译器:
Apple Clang >= 15.0.0
使用 Python 设置#
创建新的 Python 环境#
您可以使用 conda
创建新的 Python 环境
# (Recommended) Create a new conda environment.
conda create -n vllm python=3.12 -y
conda activate vllm
注意
PyTorch 已弃用 conda 发布渠道。如果您使用 conda
,请仅将其用于创建 Python 环境,而不是安装软件包。
或者,您可以使用 uv(一个非常快速的 Python 环境管理器)创建新的 Python 环境。请按照文档安装 uv
。安装 uv
后,您可以使用以下命令创建新的 Python 环境
# (Recommended) Create a new uv environment. Use `--seed` to install `pip` and `setuptools` in the environment.
uv venv vllm --python 3.12 --seed
source vllm/bin/activate
预构建 wheels#
目前,没有预构建的 CPU wheels。
从源代码构建 wheel#
首先,安装推荐的编译器。我们建议使用 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
其次,安装用于 vLLM CPU 后端构建的 Python 软件包
pip install --upgrade pip
pip install "cmake>=3.26" wheel packaging ninja "setuptools-scm>=8" numpy
pip install -v -r requirements-cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu
最后,构建并安装 vLLM CPU 后端
VLLM_TARGET_DEVICE=cpu python setup.py install
注意
AVX512_BF16 是一个扩展 ISA,提供原生 BF16 数据类型转换和向量积指令,与纯 AVX512 相比,它带来了一些性能提升。CPU 后端构建脚本将检查主机 CPU 标志以确定是否启用 AVX512_BF16。
如果您想强制为交叉编译启用 AVX512_BF16,请在构建前设置环境变量
VLLM_CPU_AVX512BF16=1
。
首先,安装推荐的编译器。我们建议使用 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
其次,安装用于 vLLM CPU 后端构建的 Python 软件包
pip install --upgrade pip
pip install "cmake>=3.26" wheel packaging ninja "setuptools-scm>=8" numpy
pip install -v -r requirements-cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu
最后,构建并安装 vLLM CPU 后端
VLLM_TARGET_DEVICE=cpu python setup.py install
已在 AWS Graviton3 实例上进行了兼容性测试。
安装 XCode 和命令行工具(包括 Apple Clang)后,执行以下命令从源代码构建和安装 vLLM。
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -r requirements-cpu.txt
pip install -e .
注意
在 macOS 上,VLLM_TARGET_DEVICE
会自动设置为 cpu
,目前这是唯一支持的设备。
故障排除
如果构建出现类似以下代码段的错误,其中找不到标准 C++ 头文件,请尝试删除并重新安装您的 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.
使用 Docker 设置#
预构建镜像#
目前,没有预构建的 CPU 镜像。
从源代码构建镜像#
$ docker build -f Dockerfile.cpu -t vllm-cpu-env --shm-size=4g .
$ docker run -it \
--rm \
--network=host \
--cpuset-cpus=<cpu-id-list, optional> \
--cpuset-mems=<memory-node, optional> \
vllm-cpu-env
提示
对于 ARM 或 Apple 芯片,请使用 Dockerfile.arm
支持的特性#
vLLM CPU 后端支持以下 vLLM 特性
张量并行
模型量化 (
INT8 W8A8, AWQ, GPTQ
)分块预填充
前缀缓存
FP8-E5M2 KV 缓存 (TODO)
性能技巧#
我们强烈建议使用 TCMalloc 以获得高性能内存分配和更好的缓存局部性。例如,在 Ubuntu 22.4 上,您可以运行
sudo apt-get install libtcmalloc-minimal4 # install TCMalloc library
find / -name *libtcmalloc* # find the dynamic link library path
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4:$LD_PRELOAD # prepend the library to LD_PRELOAD
python examples/offline_inference/basic/basic.py # run vLLM
当使用在线服务时,建议为服务框架保留 1-2 个 CPU 核心,以避免 CPU 超额订阅。例如,在具有 32 个物理 CPU 核心的平台上,为框架保留 CPU 30 和 31,并为 OpenMP 使用 CPU 0-29
export VLLM_CPU_KVCACHE_SPACE=40
export VLLM_CPU_OMP_THREADS_BIND=0-29
vllm serve facebook/opt-125m
如果在具有超线程的机器上使用 vLLM CPU 后端,建议使用
VLLM_CPU_OMP_THREADS_BIND
仅将一个 OpenMP 线程绑定到每个物理 CPU 核心。在具有 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 recommend 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 后端,请注意使用
VLLM_CPU_OMP_THREADS_BIND
设置 CPU 核心,以避免跨 NUMA 节点内存访问。
其他注意事项#
CPU 后端与 GPU 后端显着不同,因为 vLLM 架构最初是为 GPU 使用而优化的。需要进行许多优化以增强其性能。
将 HTTP 服务组件与推理组件解耦。在 GPU 后端配置中,HTTP 服务和分词任务在 CPU 上运行,而推理在 GPU 上运行,这通常不会造成问题。但是,在基于 CPU 的设置中,HTTP 服务和分词可能会导致显着的上下文切换和降低的缓存效率。因此,强烈建议隔离这两个组件以提高性能。
在启用 NUMA 的基于 CPU 的设置中,内存访问性能可能会受到 拓扑结构 的很大影响。对于 NUMA 架构,建议进行两项优化:张量并行或数据并行。
对延迟约束部署使用张量并行:遵循 GPU 后端设计,将使用 Megatron-LM 的并行算法来分片模型,基于 NUMA 节点的数量(例如,对于双 NUMA 节点系统,TP = 2)。随着 CPU 上 TP 功能 的合并,张量并行支持服务和离线推理。通常,每个 NUMA 节点都被视为一个 GPU 卡。以下是启用张量并行 = 2 进行服务的示例脚本
VLLM_CPU_KVCACHE_SPACE=40 VLLM_CPU_OMP_THREADS_BIND="0-31|32-63" vllm serve meta-llama/Llama-2-7b-chat-hf -tp=2 --distributed-executor-backend mp
使用数据并行以获得最大吞吐量:在每个 NUMA 节点上启动 LLM 服务端点,以及一个额外的负载均衡器,以将请求分派到这些端点。Nginx 或 HAProxy 等常用解决方案是推荐的。Anyscale Ray 项目在 LLM 服务 上提供了该功能。以下是使用 Ray Serve 设置可扩展 LLM 服务的示例。