618ZXW

[vLLM Learning] CPUを使ったインストール

vLLMは、大規模言語モデルの推論を高速化するために設計されたフレームワークです。KVキャッシュにおけるメモリの無駄をほぼゼロに抑え、メモリ管理のボトルネック問題を解決します。

vLLM の中国語ドキュメントとチュートリアルについては、こちらをご覧ください → https://vllm.hyper.ai/

vLLM は当初、データ型 FP32 および BF16 を使用して、x86 CPU プラットフォーム上で基本的なモデル推論とサービスをサポートしていました。

環境依存性

  • オペレーティングシステム: 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
  • 3 番目のステップは、ソース コードから 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スレッドがCPUコア0~31にバインドされることを意味します。VLLM_CPU_OMP_THREADS_BIND=0-31|32-63 は、2つのテンソル並列プロセスが存在し、ランク0のOpenMPスレッド32個がCPUコア0~31にバインドされ、ランク1のOpenMPスレッドがCPUコア32~63にバインドされることを意味します。

PyTorch の Intel 拡張機能

  • Intel Extensions for 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
  • オンラインサービスを利用する際は、CPUの過剰な使用を避けるため、サービスフレームワーク用に1~2個のCPUコアを予約することをお勧めします。例えば、物理CPUコアが32個のプラットフォームでは、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コアごとに1つの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-7 或8-15 上绑定openMP 线程export VLLM_CPU_OMP_THREADS_BIND=0-7 python examples/offline_inference.py
  • 非均一メモリ アクセス アーキテクチャ (NUMA) を備えたマルチソケット マシンで vLLM CPU バックエンドを使用している場合は、NUMA ノード間のメモリ アクセスを回避するために、CPU コアを VLLM_CPU_OMP_THREADS_BIND で設定する必要があることに注意してください。