Vectorized Large Language Model (vLLM) は、複数のモデル形式とバックエンドサービスの高速化をサポートする高性能のlarge language model (LLM) 推論ライブラリです。 vLLMは、LLMを推論サービスとしてデプロイするのに適しています。 このトピックでは、vLLMモデルを推論サービスとしてデプロイする方法について説明します。 この例では、NVIDIA V100 GPUを使用するQwen-7B-Chat-Int8モデルが使用されています。
vLLMの詳細については、「vllm-project」をご参照ください。
前提条件
Container Service for Kubernetes (ACK) 管理クラスター、またはGPU高速化ノードを備えたACK専用クラスターが作成されます。 クラスターはKubernetes 1.22以降を実行し、Compute Unified Device Architecture (CUDA) 12.0以降を使用します。 詳細については、「GPU高速化ノードを使用したACKクラスターの作成」または「GPU高速化ノードを使用したACK専用クラスターの作成」をご参照ください。
デフォルトでは、GPU高速化ノードはCUDA 11を使用します。
ack.aliyun.com/nvidia-driver-version:525.105.17タグをGPU高速化ノードプールに追加して、GPU高速化ノードにCUDA 12を指定できます。 詳細については、「ラベルの追加によるノードのNVIDIAドライバーバージョンの指定」をご参照ください。ack-kserveコンポーネントがインストールされています。 詳細については、「ack-kserveのインストール」をご参照ください。
クラウドネイティブAIスイートがインストールされています。
バージョン0.9.15以降のArenaクライアントがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。
Object Storage Service (OSS) が有効化されています。 詳細については、「OSSの有効化」をご参照ください。
ステップ1: モデルデータを準備し、モデルデータをOSSバケットにアップロードする
OSSバケットまたはApsara File Storage NAS (NAS) ファイルシステムを使用して、モデルデータを準備できます。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」または「静的にプロビジョニングされたNASボリュームのマウント」をご参照ください。 この例では、OSSバケットが使用されています。
モデルをダウンロードします。 この例では、Qwen-7B-Chat-Int8モデルが使用される。
次のコマンドを実行してGitをインストールします。
sudo yum install git次のコマンドを実行して、LFS (Large File Support) プラグインをインストールします。
sudo yum install git-lfs次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリをModelScopeコミュニティからローカルホストに複製します。
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat-Int8.git次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリが格納されているディレクトリに移動します。
cd Qwen-7B-Chat-Int8次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリが格納されているディレクトリからLFSで管理されている大きなファイルをダウンロードします。
git lfs pull
ダウンロードしたQwen-7B-Chat-Int8ファイルをOSSバケットにアップロードします。
OSSコンソールにログインし、作成したOSSバケットの名前を表示および記録します。
OSSバケットの作成方法の詳細については、「バケットの作成」をご参照ください。
ossutilをインストールして構成します。 詳細については、「ossutil のインストール」をご参照ください。
次のコマンドを実行して、OSSバケットにQwen-7B-Chat-Int8という名前のディレクトリを作成します。
ossutil mkdir oss://<your-bucket-name>/Qwen-7B-Chat-Int8次のコマンドを実行して、モデルファイルをOSSバケットにアップロードします。
ossutil cp -r ./Qwen-7B-Chat-Int8 oss://<Your-Bucket-Name>/Qwen-7B-Chat-Int8
クラスターのllm-modelという名前の永続ボリューム (PV) と永続ボリューム要求 (PVC) を設定します。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。
次の表に、PVの作成に使用される基本的なパラメーターを示します。
パラメーター
説明
ストレージタイプ
PVのタイプ。 この例では、OSSが選択されています。
ボリューム名:
PV の名前。 この例では、PVはllm-modelと名付けられています。
アクセス証明書
OSSバケットへのアクセスに使用されるAccessKeyペア。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。
バケット ID:
OSS バケットの名前。 作成したOSSバケットを選択します。
OSSパス
モデルが存在するパス。 例: /Qwen-7B-Chat-Int8
次の表に、PVCの作成に使用される基本的なパラメーターを示します。
パラメーター
説明
ボリュームタイプ
PVCのタイプ。 この例では、OSSが選択されています。
名前
PVCの名前。 この例では、PVCはllm-modelと名付けられています。
割り当てモード
この例では、既存ボリューム が選択されています。
既存ボリューム
ボリュームの選択 をクリックします。 [PVの選択] ダイアログボックスで、使用するPVを見つけ、[操作] 列の [選択] をクリックします。
手順2: 推論サービスのデプロイ
次のコマンドを実行して、クラスターで使用可能なGPUリソースを照会します。
arena top node推論サービスの実行に使用できるGPU高速化ノードの数が返されます。
次のコマンドを実行して、
vllmという名前の推論サービスを開始します。arena serve kserve \ --name=qwen \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \ --gpus=1 \ --cpu=4 \ --memory=12Gi \ --data="llm-model:/mnt/models/Qwen-7B-Chat-Int8" \ "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen-7B-Chat-Int8 --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"下表に、各パラメーターを説明します。
パラメーター
必須
説明
-- name
必須
送信する推論サービスの名前。グローバルに一意です。
-- イメージ
必須
推論サービスのイメージアドレス。
-- gpus
任意
推論サービスによって使用されるGPUの数。 デフォルト値:0
-- cpu
任意
推論サービスが使用するCPUコアの数。
-メモリ
任意
推論サービスによって使用されるメモリのサイズ。
-- データ
任意
推論サービスとしてデプロイされるモデルのアドレス。 この例では、モデルはllm-modelディレクトリに格納され、ポッドの /mnt/models /ディレクトリにマウントされます。
期待される出力:
inferenceservice.serving.kserve.io/qwen created INFO[0006] The Job qwen has been submitted successfully INFO[0006] You can run `arena serve get qwen --type kserve -n default` to check the job statusを確認できます。
上記の出力は、推論サービスがデプロイされていることを示します。
手順3: 推論サービスの検証
次のコマンドを実行して、KServeを使用してデプロイされた推論サービスのデプロイの進行状況を表示します。
arena serve get qwen期待される出力:
上記の出力は、推論サービスがKServeを使用してデプロイされ、
http://qwen-default.example.comからモデルにアクセスできることを示しています。次のコマンドを実行して、NGINX IngressコントローラーのIPアドレスを取得し、そのIPアドレスを使用して推論サービスにアクセスします。
# Obtain the IP address of the NGINX Ingress controller. NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}') # Obtain the hostname of the inference service. SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen -o jsonpath='{.status.url}' | cut -d "/" -f 3) # Send a request to access the inference service. curl -H "Host: $SERVICE_HOSTNAME" -H "Content-Type: application/json" http://$NGINX_INGRESS_IP:80/v1/chat/completions -d '{"model": "qwen", "messages": [{"role": "user", "content": "Perform a text."}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}期待される出力:
上記の出力は、リクエストが推論サービスに正しく送信され、サービスが期待されるレスポンスをJSON形式で返すことを示しています。
ステップ4: (オプション) 推論サービスを削除する
推論サービスを削除する前に、推論サービスとその関連リソースが不要になったことを確認してください。
次のコマンドを実行して、推論サービスを削除します。
arena serve delete qwen関連ドキュメント
Prometheusのマネージドサービスを構成して、推論サービスを監視し、例外を検出できます。 このようにして、できるだけ早い機会に例外を処理できます。 詳細については、「Prometheusのマネージドサービスの構成」をご参照ください。
KServeを使用してモデルを高速化する方法の詳細については、「KServeでFluidを使用してモデルのデータプルを高速化する」をご参照ください。