大規模言語モデル (LLM) は、スケールに応じた推論処理を実行するために GPU 加速インフラストラクチャと最適化されたサービングスタックを必要とします。本ドキュメントでは、T4 または A10 GPU 上で vLLM バックエンドを備えた NVIDIA Triton Inference Server を使用し、Container Service for Kubernetes (ACK) 上で Qwen1.5-4B-Chat モデルを推論サービスとしてデプロイする方法について説明します。
背景情報
Qwen1.5-4B-Chat
Qwen1.5-4B-Chat は、Alibaba Cloud が Transformer アーキテクチャに基づいて開発した 40 億パラメーターの LLM です。このモデルは、Web テキスト、特定分野の書籍、コードなど、大規模なデータセットで学習されています。詳細については、「Qwen GitHub リポジトリ」をご参照ください。
Triton Inference Server
Triton Inference Server は、NVIDIA が開発したオープンソースの推論サービングフレームワークです。TensorRT、TensorFlow、PyTorch、ONNX、vLLM など、複数の機械学習フレームワークバックエンドをサポートしています。
主な特徴:
複数の機械学習および深層学習フレームワークをサポート
同時実行モデル実行
連続バッチ処理(Continuous batching)
組み込み推論メトリック:GPU 利用率、リクエスト遅延、スループット
詳細については、「Triton Inference Server GitHub リポジトリ」をご参照ください。
vLLM
vLLM は、Qwen モデルを含むほとんどの主要な LLM をサポートする高性能 LLM 推論フレームワークです。vLLM は、PagedAttention 最適化、連続バッチ処理、モデル量子化を活用することで、LLM 推論のスループットを大幅に向上させます。詳細については、「vLLM GitHub リポジトリ」をご参照ください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
GPU 加速ノードを備えた ACK Pro マネージドクラスター(Kubernetes 1.22 以降、ノードあたり GPU メモリ 16 GB 以上)。詳細については、「マネージドクラスターの作成」をご参照ください。
GPU ノードに GPU ドライバー バージョン 525 がインストールされていること。ドライバー バージョンを固定するため、GPU 加速ノードに
ack.aliyun.com/nvidia-driver-version:525.105.17のラベルを追加します。詳細については、「ラベルを追加してノードの NVIDIA ドライバー バージョンを指定する」をご参照ください。最新版 Arena クライアントがインストール済みであること。詳細については、「Arena クライアントの設定」をご参照ください。
ステップ 1:モデルデータの準備
Qwen1.5-4B-Chat モデルをダウンロードし、Object Storage Service (OSS) にアップロードした後、ACK クラスター内に永続ボリューム (PV) および永続ボリューム要求 (PVC) を作成します。
その他の vLLM 対応モデルをデプロイする場合は、「対応モデル」をご参照ください。OSS の代わりに File Storage NAS を使用する場合は、「静的プロビジョニング NAS ボリュームのマウント」をご参照ください。
モデルのダウンロード
Git をインストールします。
# yum install git または apt install git を使用 yum install gitGit Large File Storage (LFS) プラグインをインストールします。
# yum install git-lfs または apt install git-lfs を使用 yum install git-lfsModelScope から Qwen1.5-4B-Chat リポジトリをクローンします。
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.gitディレクトリに移動し、大規模ファイルをプルします。
cd Qwen1.5-4B-Chat git lfs pull
モデルの OSS へのアップロード
OSS コンソール にログインし、ご利用の OSS バケット名を確認します。バケットを作成する場合は、「バケットの作成」をご参照ください。
ossutil をインストールおよび設定します。詳細については、「ossutil のインストール」をご参照ください。
OSS 内にディレクトリを作成し、モデルをアップロードします。
ossutil mkdir oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat ossutil cp -r ./Qwen1.5-4B-Chat oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat
PV および PVC の作成
OSS モデルデータをクラスターにマウントするため、PV および PVC を作成します。詳細については、「静的プロビジョニング OSS ボリュームのマウント」をご参照ください。
PV のパラメーター
| パラメーター | 値 |
|---|---|
| PV の種類 | OSS |
| ボリューム名 | llm-model |
| アクセス証明書 | OSS バケットへのアクセスに使用する AccessKey ID および AccessKey Secret |
| バケット ID | ご利用の OSS バケット名 |
| OSS パス | モデルパス(例:/models/Qwen1.5-4B-Chat) |
PVC のパラメーター
| パラメーター | 値 |
|---|---|
| PVC の種類 | OSS |
| ボリューム名 | llm-model |
| 割り当てモード | 既存のボリューム |
| 既存のボリューム | 作成した PV を選択 |
ステップ 2:vLLM を使用した Triton の構成
Triton バックエンド用の config.pbtxt および vLLM エンジンパラメーター用の model.json の 2 つの構成ファイルを作成します。
バックエンド構成の作成
作業ディレクトリおよび config.pbtxt ファイルを作成します。
mkdir triton-vllm
cat << EOF > triton-vllm/config.pbtxt
backend: "vllm"
# デバイスの使用は vLLM エンジンに委任されます
instance_group [
{
count: 1
kind: KIND_MODEL
}
]
version_policy: { all { }}
EOFモデル構成の作成
model.json ファイルは、vLLM エンジンにパラメーターを渡します。ご利用の GPU の種類に合った構成を選択してください。
vLLM は起動時に GPU メモリを積極的に確保します。gpu_memory_utilization パラメーターでこの動作を制御できます。この値を 0.95 に設定すると、モデルに GPU メモリの 95 % を確保します。他のワークロードが同じ GPU を共有する場合は、メモリ不足エラーを回避するためにこの値を低く設定してください。
A10 GPU(本番環境向け)
A10 GPU は高いスループットを提供し、bfloat16 精度をサポートします。本番ワークロードには A10 をご使用ください。
cat << EOF > triton-vllm/model.json
{
"model":"/model/Qwen1.5-4B-Chat",
"disable_log_requests": "true",
"gpu_memory_utilization": 0.95,
"trust_remote_code": "true",
"dtype": "half",
"max_model_len": 8192
}
EOFT4 GPU(テスト向け)
T4 GPU は広く利用可能でコスト効率が高く、bfloat16(bf16)精度をサポートしません。dtype を half(FP16)に設定し、max_model_len を低く設定して、16 GB のメモリ制限内に収める必要があります。
cat << EOF > triton-vllm/model.json
{
"model":"/model/Qwen1.5-4B-Chat",
"disable_log_requests": "true",
"gpu_memory_utilization": 0.95,
"trust_remote_code": "true",
"dtype": "half",
"max_model_len": 8192
}
EOF主なパラメーター
| パラメーター | 説明 |
|---|---|
max_model_len | モデルが処理可能な最大トークンシーケンス長。値が高いほど会話品質が向上しますが、GPU メモリ消費量も増加します。 |
dtype | モデル読み込み時の浮動小数点精度。T4 のような bf16 非対応 GPU では half(FP16)を指定します。 |
gpu_memory_utilization | モデルに割り当てる GPU メモリの割合。デフォルト値は 0.9 です。 |
設定可能なパラメーターの一覧については、vLLM の「Engine Arguments」ドキュメントをご参照ください。その他の構成例については、「Triton で vLLM モデルをデプロイする」をご参照ください。
ステップ 3:推論サービスのデプロイ
Arena を使用して、Triton および vLLM を用いた Qwen1.5-4B-Chat 推論サービスをデプロイします。
構成ファイルのパスを環境変数としてエクスポートします。
export triton_config_file="triton-vllm/config.pbtxt" export model_config_file="triton-vllm/model.json"推論サービスをデプロイします。予想される出力:
パラメーター
パラメーター 説明 --name推論サービスの名前。 --version推論サービスのバージョン。 --imageTriton サーバー用コンテナーイメージ。 --gpusレプリカあたりの GPU 数。 --cpuレプリカあたりの CPU コア数。 --memoryレプリカあたりのメモリ割り当て量。 --dataPVC のマウント( <pvc-name>:<mount-path>形式)。利用可能な PVC を一覧表示するには、arena data listを実行します。--config-fileローカルファイルのマウント( <local-path>:<container-path>形式)。--model-repositoryTriton モデルリポジトリディレクトリ。各サブディレクトリはモデルを表し、その構成ファイルを含む必要があります。詳細については、「Triton モデルリポジトリ」をご参照ください。 --http-portTriton サービスの HTTP ポート。 --grpc-portTriton サービスの gRPC ポート。 --allow-metrics推論メトリック(GPU 利用率、遅延、スループット)を公開します。 arena serve triton \ --name=triton-vllm \ --version=v1 \ --image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/tritonserver:24.04-vllm-python-py3-ubuntu22.04 \ --gpus=1 \ --cpu=6 \ --memory=30Gi \ --data="llm-model:/model/Qwen1.5-4B-Chat" \ --model-repository /triton-config \ --config-file="$model_config_file:/triton-config/qwen-4b/1/model.json" \ --config-file="$triton_config_file:/triton-config/qwen-4b/config.pbtxt" \ --http-port=8000 \ --grpc-port=9000 \ --allow-metrics=trueconfigmap/triton-vllm-v1-4bd5884e6b5b6a3 created configmap/triton-vllm-v1-7815124a8204002 created service/triton-vllm-v1-tritoninferenceserver created deployment.apps/triton-vllm-v1-tritoninferenceserver created INFO[0007] The Job triton-vllm has been submitted successfully INFO[0007] You can run `arena serve get triton-vllm --type triton-serving -n default` to check the job statusサービスが実行中であることを確認します。
Availableが1になるまで待ちます。予想される出力:arena serve get triton-vllmName: triton-vllm Namespace: default Type: Triton Version: v1 Desired: 1 Available: 1 Age: 3m Address: 172.16.XX.XX Port: RESTFUL:8000,GRPC:9000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- triton-vllm-v1-tritoninferenceserver-b69cb7759-gkwz6 Running 3m 1/1 0 1 cn-beijing.172.16.XX.XX
ステップ 4:推論サービスの検証
ポート フォワーディング(開発のみ)
kubectl port-forward を使用したポート フォワーディングは、開発およびデバッグ専用です。本番環境でのネットワーキングには信頼性、セキュリティ、スケーラビリティが不足しており、推奨されません。本番環境向けのネットワーキングについては、「Ingress の概要」をご参照ください。
ポート フォワーディングを設定します。予想される出力:
kubectl port-forward svc/triton-vllm-v1-tritoninferenceserver 8000:8000Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000Triton generate エンドポイントにテストリクエストを送信します。
qwen-4bは実際のモデル名に置き換えてください。予想される出力:curl -X POST localhost:8000/v2/models/qwen-4b/generate \ -d '{"text_input": "What is AI? AI is", "parameters": {"stream": false, "temperature": 0}}'{"model_name":"qwen-4b","model_version":"1","text_output":"What is AI? AI is a branch of computer science that studies how to make computers intelligent. Purpose of AI"}
(任意)クリーンアップ
推論サービスおよびストレージリソースが不要になった場合、以下のコマンドで削除します。
# 推論サービスの削除
arena serve del triton-vllm
# PVC および PV の削除
kubectl delete pvc llm-model
kubectl delete pv llm-model