ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

LLMのModel Serving環境を構築する

生成AIを活用した環境を独自で構築する場合に、まずはLLMモデルを元にAPI Serviceを提供するModel Servingの環境が必要になります。一般的にModel ServingではOpen AIが提供しているAPIと互換のREST APIの機能を提供します。Model Servingは様々なアプリケーションが提供されていますが、今回はTensorRT-LLMvLLMという2種類を利用して比較を行いました。今回はLLMを動作させる為にNVDIAのL40S4枚使った環境で検証を行いました。

ライター:荒牧 大樹
2007年ネットワンシステムズ入社し、コラボレーション・クラウド製品の担当を経て現在はAI・データ分析製品と技術の推進に従事。最近では次世代の計算環境であるGPU・FPGA・量子コンピュータに注目している。

目次

Model Serving環境の構築

まずは、TensorRT-LLMvLLMを使ってModel Serving環境を構築します。

検証環境

今回はNVIDIAL40S4Dell PowerEdgeに搭載されており、VMwareの仮想化環境を利用しています。

TensorRT-LLMについて

TensorRT-LLMNVIDIAが開発しているNVIDIA GPU上での推論性能を高速化するライブラリです。TensorRT-LLM使ってLLMモデルの高速動作が可能となります。TensorRT-LLMはHugging Faceにあるようなオープンモデルや、独自モデルをコンパイルする事で高速動作を実現します。TensorRT-LLMにて作成されたモデルはTriton Inference Serverを使ってAPI EndpointとしてServingが可能となります。

TensorRT-LLMでのモデルコンパイル

今回はLlama3-8Bを利用してモデルの配信を行います。以下のNVIDIADocumentを参考にしながら動作確認をしています。一部今回の環境に合わせる為に最新のCUDAを利用したり、オプション指定を増やしています。

https://developer.nvidia.com/blog/turbocharging-meta-llama-3-performance-with-nvidia-tensorrt-llm-and-nvidia-triton-inference-server/

TensorRT-LLMでのモデルのコンパイルを行います。事前にHuggingFace上でLlama3へのアクセス権取得とTokenを取得しておきます。

# Llama3-8Bを取得する為にHugging Faceにログインします。
pip install huggingface_hub
huggingface-cli login

# TensorRT-LLMを取得します。
git clone -b v0.8.0 https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM

# Llama3-8Bを取得します。
git lfs install
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct

#コンパイル作業用のコンテナを起動します。
docker run --rm --gpus all --volume ${PWD}:/TensorRT-LLM --entrypoint /bin/bash -it --workdir /TensorRT-LLM nvidia/cuda:12.4.0-devel-ubuntu22.04

#以降コンテナ内での作業
apt-get update && apt-get -y install python3.10 python3-pip openmpi-bin libopenmpi-dev

# TensorRT-LLMのインストール
pip3 install tensorrt_llm==0.9.0 -U --extra-index-url https://pypi.nvidia.com

#1-gpu,BF16llamaexampleを使ってチェックポイントの作成
python3 examples/llama/convert_checkpoint.py --model_dir ./Meta-Llama-3-8B-Instruct --output_dir ./tllm_checkpoint_1gpu_bf16 --dtype bfloat16

#作成されたチェックポイントから作成
trtllm-build --checkpoint_dir ./tllm_checkpoint_1gpu_bf16 --output_dir ./tmp/llama/8B/trt_engines/bf16/1-gpu --gpt_attention_plugin bfloat16 --gemm_plugin bfloat16

#コマンドでモデルのテスト
python3 examples/run.py --engine_dir=./tmp/llama/8B/trt_engines/bf16/1-gpu --max_output_len 1000 --tokenizer_dir ./Meta-Llama-3-8B-Instruct --input_text "Please tell me about Cisco Systems”

Check Point作成時のオプション等は以下を参照します。2-GPUTensor parallelで利用する時はチェックポイント作成から変更します。

TensorRT-LLM/examples/llama at main · NVIDIA/TensorRT-LLM · GitHub

#2-gpu,BF16llamaexampleを使ってチェックポイントの作成.tp_sizeで利用するGPUの数を指定。
python3 examples/llama/convert_checkpoint.py --model_dir ./Meta-Llama-3-8B-Instruct --output_dir ./tllm_checkpoint_2gpu_bf16 --dtype bfloat16 --tp_size 2

#作成元と作成先のフォルダだけ変えています。
trtllm-build --checkpoint_dir ./tllm_checkpoint_2gpu_bf16 --output_dir ./tmp/llama/8B/trt_engines/bf16/2-gpu --gpt_attention_plugin bfloat16 --gemm_plugin bfloat16

Triton Inference Serverでのモデル配信

作成したモデルをTriton Inference Serverで配信します。

# 先ほどのDockerコンテナを抜けた後、Triton Inference Serverを取得します。
cd ..
git clone -b v0.8.0 https://github.com/triton-inference-server/tensorrtllm_backend.git
cd tensorrtllm_backend

#先ほど作成したモデルをコピーします。
cp ../TensorRT-LLM/tmp/llama/8B/trt_engines/bf16/1-gpu/* all_models/inflight_batcher_llm/tensorrt_llm/1/

#Tritonの設定を作成します。
HF_LLAMA_MODEL=TensorRT-LLM/Meta-Llama-3-8B-Instruct
ENGINE_PATH=tensorrtllm_backend/all_models/inflight_batcher_llm/tensorrt_llm/1
python3 tools/fill_template.py -i all_models/inflight_batcher_llm/preprocessing/config.pbtxt tokenizer_dir:${HF_LLAMA_MODEL},tokenizer_type:auto,triton_max_batch_size:64,preprocessing_instance_count:1
python3 tools/fill_template.py -i all_models/inflight_batcher_llm/postprocessing/config.pbtxt tokenizer_dir:${HF_LLAMA_MODEL},tokenizer_type:auto,triton_max_batch_size:64,postprocessing_instance_count:1
python3 tools/fill_template.py -i all_models/inflight_batcher_llm/tensorrt_llm_bls/config.pbtxt triton_max_batch_size:64,decoupled_mode:False,bls_instance_count:1,accumulate_tokens:False
python3 tools/fill_template.py -i all_models/inflight_batcher_llm/ensemble/config.pbtxt triton_max_batch_size:64
python3 tools/fill_template.py -i all_models/inflight_batcher_llm/tensorrt_llm/config.pbtxt triton_max_batch_size:64,decoupled_mode:False,max_beam_width:1,engine_dir:${ENGINE_PATH},max_tokens_in_paged_kv_cache:2560,max_attention_window_size:2560,kv_cache_free_gpu_mem_fraction:0.5,exclude_input_in_output:True,enable_kv_cache_reuse:False,batching_strategy:inflight_fused_batching,max_queue_delay_microseconds:0

#Tritonを起動します。
cd..
docker run -it --rm --gpus all --network host --shm-size=1g -v $(pwd):/workspace --workdir /workspace nvcr.io/nvidia/tritonserver:24.04-trtllm-python-py3

# Install python dependencies
pip install sentencepiece protobuf

# サーバを起動します。2 GPU利用する場合はworld_size2とします。
python3 tensorrtllm_backend/scripts/launch_triton_server.py --model_repo tensorrtllm_backend/all_models/inflight_batcher_llm --world_size 1

#curlコマンドでテストを行います。
curl -X POST localhost:8000/v2/models/ensemble/generate -d \
'{
"text_input": "Please tell me about Cisco Systems",
"parameters": {
"max_tokens": 1000,
"bad_words":[""],
"stop_words":[""]
}
}'

vLLMについて

vLLMTensorRT-LLMとは違いNVIDIA以外のGPUでも環境の構築が可能です。vLLMは独自の仕組みを使って高速にHugging Face上にあるモデルや独自モデルのServingが出来ます。vLLMは比較的簡単に環境の構築とModel Servingが行えるようになっています。

vLLMの構築

基本的にpipコマンドでvLLMが利用できる。今回は最新のCUDAを利用したい為コンテナからコンパイルを行う。

#Dockerを起動する
docker run –gpus all it –rm –ipc=host nvidia/cuda:12.2.2-devel-ubuntu22.04

#コンテナ内でvLLMのレポジトリをCopyしてbuild
git clone https://github.com/vllm-project/vllm.git

#vLLMBuild
cd vllm
pip install -e . # This may take 5-10 minutes.

#vLLMを起動する。起動時のメモリ確保を失敗する事があるので90%確保としています。tensor-parallel-sizeで利用するGPUを指定
python3 -m vllm.entrypoints.openai.api_server --model meta-llama/Meta-Llama-3-8B --dtype auto --gpu-memory-utilization 0.9 --tensor-parallel-size 4

# curlコマンドで確認
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Meta-Llama-3-8B ",
"prompt": "Please tell me about Cisco Systems",
"max_tokens": 1000,
"temperature": 0
}'

TensorRT-LLMとvLLMの性能比較

TensorRT-LLMとvLLMの性能比較を行います。今回はモデルが秒間で生成するトークン数: TPS(Token per sec)で比較を行います。大きいほど時間単位での多くのトークンを生成できています。GPT 3.5 Turbo53 TPS程度と言われていますので、一般的には50-60TPS程度で生成出来れば十分だと考える事が出来ます。

Llama3-8Bを利用した場合

Meta社が最近リリースしたLLMモデルのLlama3の中で80億パラメータのLlama3-8Bを利用した比較を行います。Llama3-8BはL40Sの場合は1つのGPUでも動作可能です。今回は文章生成処理を主に行うGPUを1,2,4個利用した場合の比較を行いました。複数GPUを利用する場合は今回は1つのモデルを分割して複数GPUで動作させるTensor Parallelを利用しました。

Serving形式

1-GPU

2-GPU

4-GPU

TensorRT-LLM

47 TPS

100 TPS

150 TPS

vLLM

45 TPS

71 TPS

90 TPS

TensorRT-LLMとvLLMでのTPSを比較すると、マルチGPUで性能差が出ました。TensorRT-LLMの方が1秒間辺り多くのトークンを生成できています。この違いは、TensorRT-LLMはGPUを99%利用していましたが、vLLMはGPUを増えると使用率が60%程度まで低下しており、その差が文章生成の能力差になったと考えられます。

TensorRT-LLM利用時のGPUの様子

Mixtral-8x7B(karakuri-ai/karakuri-lm-70b-v0.1)を利用した場合

MoEの構成でMixtral-8x7Bを元にした日本語LLMを利用してみました。vLLMはモデルを指定すれば動作しました。TensorRTMixtralexampleを参考にしましたがllamaと同一との事でモデル名以外の手順は同一で動作します。

https://github.com/NVIDIA/TensorRT-LLM/tree/main/examples/mixtral

Serving形式

4-GPU

TensorRT-LLM

90 TPS

vLLM

60 TPS

Llama3-8Bと同様にTensorRT-LLMとvLLMでは差が出ました。

所感

GPUのメモリよりGPUの利用率でTensor Parallelでモデルを複数のGPUに配置するとLLMの文章生成速度の恩恵を受ける事が出来る事が確認出来ました。GPU間はPCIEで接続されている為複数GPUを利用した場合に影響が出るかと考えましたが、GPUの利用率を見る限りは今回の条件に於いては問題にならないようです。TensorRTはモデル生成時のGPUを極限まで利用できることが確認出来ましたが、動作させる為の手順が多くかかってしまいます。vLLMはコマンド一行で手軽に利用を開始する事が出来ます。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND