前言
在CPU环境使用vLLM推理框架会明显比GPU缓慢的多。但是CPU也是有很大的优化空间的。
本篇为大家带来vLLM CPU推理的优化配置方式。
vLLM参数
--tensor-parallel-size
张量并行度。如果下面distributed-executor-backend
配置的是mp
,则张量并行度对应的是openMP进程数。不一定越多越好。需要选择合适的数值。
要注意该值必须能被注意力头数(attention heads,数量和采用的模型有关)整除,否则启动vllm会出现类似如下错误:
Total number of attention heads (40) must be divisible by tensor parallel size (3)
还需要注意的是张量并行度不宜设置的过多,否则会出现类似如下错误:
RuntimeError: Expected group_size <= 8 to be true, but got false. (Could this error message be improved? If so, please report an enhancement request to PyTorch.)
--distributed-executor-backend
分布式执行后端类型。配置值使用mp
启用openMP(Open Multi-Processing)。
--enable-chunked-prefill
启用chunk-prefill。官方原文:Chunked prefill allows vLLM to process large prefills in smaller chunks and batch them together with decode requests. This feature helps improve both throughput and latency by better balancing compute-bound (prefill) and memory-bound (decode) operations.(摘自Optimization and Tuning - vLLM)
环境变量
VLLM_CPU_OMP_THREADS_BIND 将openMP线程和CPU内核绑定。如果需要分别绑定多个openMP进程和CPU内核,使用|
分隔。例如VLLM_CPU_OMP_THREADS_BIND=0-59|60-119|120-179|180-239
。尽量完全使用CPU所有的物理核心。但务必预留少量物理核心供框架本身使用。需要注意的是该环境变量绑定的openMP进程数(|
分隔开的字符串数)必须和--tensor-parallel-size
一致。
VLLM_CPU_KVCACHE_SPACE 配置KV cache大小。单位为GB。
启用TCMalloc
TCMalloc提供了高性能的内存分配和缓存本地化能力,强烈建议使用。使用的方式为:
# 先search一下tcmalloc的包名,然后安装
apt install libtcmalloc-minimal4/now
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4:$LD_PRELOAD
# 启动vllm
vllm serve ...
如果使用Docker,可以在容器内部安装和配置tcmalloc。方法和上面的相同。如果使用官方项目中提供的Dockerfile制作镜像,已经默认启用了TCMalloc,无需其他操作。
其他注意事项
不要使用超线程出来的虚拟核,务必使用物理核。可通过cat /proc/cpuinfo
来查看CPU的型号和核心数。如果CPU支持超线程,则核心数除以2才是真正的物理核心数。
采用支持avx512bf16指令集的CPU可以显著提高推理速度。
Docker镜像实例
启动命令:
docker run --name vllm_paul --rm --privileged -d -v /home/paul/DeepSeek-R1-Distill-Qwen-14B:/models -p 8000:8000 --env "HF_HUB_OFFLINE=1" --env "VLLM_CPU_KVCACHE_SPACE=40" --env "VLLM_CPU_OMP_THREADS_BIND=0-59|60-119|120-179|180-239" --shm-size=32g --ipc=host vllm-cpu-env --model /models --served_model_name deepseek --max_model_len 10000 --tensor-parallel-size 4 --distributed-executor-backend mp