前言
在CPU環(huán)境使用vLLM推理框架會明顯比GPU緩慢的多。但是CPU也是有很大的優(yōu)化空間的。
本篇為大家?guī)韛LLM CPU推理的優(yōu)化配置方式。
vLLM參數(shù)
--tensor-parallel-size 張量并行度。如果下面distributed-executor-backend配置的是mp,則張量并行度對應(yīng)的是openMP進程數(shù)。不一定越多越好。需要選擇合適的數(shù)值。
要注意該值必須能被注意力頭數(shù)(attention heads,數(shù)量和采用的模型有關(guān))整除,否則啟動vllm會出現(xiàn)類似如下錯誤:
Total number of attention heads (40) must be divisible by tensor parallel size (3)
還需要注意的是張量并行度不宜設(shè)置的過多,否則會出現(xiàn)類似如下錯誤:
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 分布式執(zhí)行后端類型。配置值使用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)
環(huán)境變量
VLLM_CPU_OMP_THREADS_BIND 將openMP線程和CPU內(nèi)核綁定。如果需要分別綁定多個openMP進程和CPU內(nèi)核,使用|分隔。例如VLLM_CPU_OMP_THREADS_BIND=0-59|60-119|120-179|180-239。盡量完全使用CPU所有的物理核心。但務(wù)必預(yù)留少量物理核心供框架本身使用。需要注意的是該環(huán)境變量綁定的openMP進程數(shù)(|分隔開的字符串數(shù))必須和--tensor-parallel-size一致。
VLLM_CPU_KVCACHE_SPACE 配置KV cache大小。單位為GB。
啟用TCMalloc
TCMalloc提供了高性能的內(nèi)存分配和緩存本地化能力,強烈建議使用。使用的方式為:
# 先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,可以在容器內(nèi)部安裝和配置tcmalloc。方法和上面的相同。如果使用官方項目中提供的Dockerfile制作鏡像,已經(jīng)默認啟用了TCMalloc,無需其他操作。
其他注意事項
不要使用超線程出來的虛擬核,務(wù)必使用物理核??赏ㄟ^cat /proc/cpuinfo來查看CPU的型號和核心數(shù)。如果CPU支持超線程,則核心數(shù)除以2才是真正的物理核心數(shù)。
采用支持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