【vLLM 学习】使用 CPU 安装

news/2025/2/8 22:11:59 标签: 人工智能, 机器学习, LLMs, vLLM, CPU, 编程, 计算机技术

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。

更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/

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

依赖环境

  • 操作系统:Linux

  • 编译器:gcc/g++>=12.3.0(可选,推荐)

  • 指令集架构 (ISA) 依赖:AVX512(可选,推荐)

使用 Dockerfile 快速开始

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

从源代码构建

  • 首先,安装推荐的编译器。我们建议使用 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 wheel packaging ninja "setuptools>=49.4.0" numpy
pip install -v -r requirements-cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu
  • 第三步,从源代码构建并安装 oneDNN 库:
git clone -b rls-v3.5 https://github.com/oneapi-src/oneDNN.git
cmake -B ./oneDNN/build -S ./oneDNN -G Ninja -DONEDNN_LIBRARY_TYPE=STATIC \
    -DONEDNN_BUILD_DOC=OFF \
    -DONEDNN_BUILD_EXAMPLES=OFF \
    -DONEDNN_BUILD_TESTS=OFF \
    -DONEDNN_BUILD_GRAPH=OFF \
    -DONEDNN_ENABLE_WORKLOAD=INFERENCE \
    -DONEDNN_ENABLE_PRIMITIVE=MATMUL
cmake --build ./oneDNN/build --target install --config Release
  • 最后,构建并安装 vLLM CPU 后端:
VLLM_TARGET_DEVICE=cpu python setup.py install

注意

  • BF16 是当前 CPU 后端的默认数据类型 (这意味着后端会将 FP16 转换为 BF16),并且与所有支持 AVX512 ISA 的 CPU 兼容。

  • AVX512_BF16 是 ISA 的扩展,提供原生的 BF16 数据类型转换和向量积指令,与纯 AVX512 相比会带来一定的性能提升。CPU 后端构建脚本将检查主机 CPU 标志,以确定是否启用 AVX512_BF16。

  • 如果要强制启用 AVX512_BF16 进行交叉编译,请在编译前设置环境变量 VLLM_CPU_AVX512BF16=1。

相关运行时环境变量

  • VLLM_CPU_KVCACHE_SPACE:指定 KV 缓存大小(例如,VLLM_CPU_KVCACHE_SPACE=40 表示 KV 缓存空间为 40 GB),设置得越大,允许 vLLM 并行处理的请求就越多。该参数应根据用户的硬件配置和内存管理模式来设置。

  • VLLM_CPU_OMP_THREADS_BIND: 指定专用于 OpenMP 线程的 CPU 内核。例如, 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 内核上。

PyTorch 的英特尔扩展

  • PyTorch 的英特尔扩展 (IPEX) 对 PyTorch 进行了扩展,增加了最新的特性优化,以便在 Intel 硬件上实现额外的性能提升。

性能提示

  • 我们强烈建议使用 TCMalloc 来实现高性能内存分配和更好的缓存局部性。例如,在 Ubuntu 22.4 上,您可以运行:
sudo apt-get install libtcmalloc-minimal4 # install TCMalloc library

sudo apt-get install libtcmalloc-minimal4 # 安装 TCMalloc 库

find / -name *libtcmalloc* # find the dynamic link library path

find / -name *libtcmalloc* #查找动态链接库路径

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4:$LD_PRELOAD # prepend the library to LD_PRELOAD

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4:$LD_PRELOAD # 将库添加到 LD_PRELOAD 之前

python examples/offline_inference.py # run vLLM

python examples/offline_inference.py # 运行 vLLM
  • 使用在线服务时,建议为服务框架预留 1-2 个 CPU 核心,以避免 CPU 超额使用。例如,在一个具有 32 个物理 CPU 核心的平台上,为框架预留 CPU 30 和 31,并将 CPU 0-29 用于 OpenMP:
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在每个物理 CPU 核心上仅绑定一个 OpenMP 线程。在一个启用超线程且具有 16 个逻辑 CPU 核心 / 8 个物理 CPU 核心的平台上:
lscpu -e # check the mapping between logical CPU cores and physical CPU cores
lscpu -e # 查看逻辑 CPU 核和物理 CPU 核的映射关系



# 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」列表示逻辑 CPU 核心 ID,「CORE」列表示物理核心 ID。在此平台上,两个逻辑核心共享一个物理核心。

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

# 在此平台上,建议仅在逻辑 CPU 核心 0-78-15 上绑定 openMP 线程

export VLLM_CPU_OMP_THREADS_BIND=0-7 
python examples/offline_inference.py
  • 如果在具有非统一内存访问架构(NUMA)的多插槽机器上使用 vLLMCPU 后端,请注意使用 VLLM_CPU_OMP_THREADS_BIND 设置 CPU 核心,以避免跨 NUMA 节点的内存访问。

http://www.niftyadmin.cn/n/5845331.html

相关文章

通过代理模式理解Java注解的实现原理

参考文章&#xff1a;Java 代理模式详解 | JavaGuide 相当于来自JavaGuide文章的简单总结&#xff0c;其中结合了自己对Java注解的体会 什么是代理模式 代理模式是一种比较好理解的设计模式。 简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c…

GO、GSEA富集分析一网打进

富集分析是生物信息分析中快速了解目标基因或目标区域功能倾向性的最重要方法之一。其中代表性的计算方式有两种&#xff1a; 一是基于筛选的差异基因&#xff0c;采用超几何检验判断上调或下调基因在哪些GO或KEGG或其它定义的通路富集。假设背景基因数目为m&#xff0c;背景基…

电脑运行黑屏是什么原因?原因及解决方法

电脑运行黑屏是指电脑在正常开机或使用过程中&#xff0c;突然出现屏幕变黑&#xff0c;无法显示任何内容的现象。这种现象可能会给用户带来很多不便&#xff0c;甚至造成数据丢失或硬件损坏。那么&#xff0c;电脑运行黑屏是什么原因呢&#xff1f;下面我们将分析几种可能的原…

LabVIEW铅酸蓄电池测试系统

本文介绍了基于LabVIEW的通用飞机铅酸蓄电池测试系统的设计与实现。系统通过模块化设计&#xff0c;利用多点传感器采集与高效的数据处理技术&#xff0c;显著提高了蓄电池测试的准确性和效率。 ​ 项目背景 随着通用航空的快速发展&#xff0c;对飞机铅酸蓄电池的测试需求也…

学习threejs,使用Lensflare模拟镜头眩光

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Lensflare 二、&…

蓝桥杯准备 【入门3】循环结构

素数小算法&#xff08;埃氏筛&&欧拉筛&#xff09; 以下四段代码都是求20以内的所有素数 1.0版求素数 #include<iostream> using namespace std;int main() {int n 20;for(int i2;i<n;i){int j0;for(j2;j<i;j)//遍历i{if(i%j0){break;}}if(ij){cout&l…

74.在 Vue 3 中使用 OpenLayers 实现游龙动画效果

1. 引言 在 WebGIS 开发中&#xff0c;OpenLayers 是一个强大的开源库&#xff0c;可以用于渲染地图、绘制矢量图层等功能。本篇文章将介绍如何在 Vue 3 中使用 OpenLayers 结合 Composition API&#xff0c;实现一个“游龙”动画效果&#xff0c;该动画通过数学公式计算轨迹&…

《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》

首先讲在前面&#xff0c;介绍一些背景 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合了信息检索与语言生成模型的技术&#xff0c;通过从外部知识库中检索相关信息&#xff0c;并将其作为提示输入给大型语言模型&#xff…