メインコンテンツまでスキップ

モデルの提供

vLLMは、効率的なメモリ管理を通じて大規模言語モデル(LLM)のパフォーマンスを最適化するために特別に設計されたオープンソースの推論・サービングエンジンです。MLコミュニティで人気のある推論ソリューションとして、vLLMはいくつかの主要な利点を提供します:

  • 効率的なメモリ管理:PagedAttentionテクノロジーを使用してGPU/アクセラレーターメモリの使用を最適化
  • 高いスループット:複数のリクエストの同時処理を可能にする
  • AWS Neuronサポート:AWS InferentiaおよびTrainiumアクセラレーターとのネイティブ統合
  • OpenAI互換API:OpenAIのAPIの代替として使用でき、統合を簡素化

AWS Neuron特有の機能として、vLLMは以下を提供します:

  • Neuron SDKおよびランタイムのネイティブサポート
  • Inferentia/Trainiumアーキテクチャ向けの最適化されたメモリ管理
  • 効率的なスケーリングのための継続的なモデルロード
  • AWS Neuronプロファイリングツールとの統合

このラボでは、neuronx-distributed-inferenceフレームワークでコンパイルされたMistral-7B-v0.3モデルを使用します。このモデルは能力とリソース要件のバランスが取れており、Trainiumを搭載した私たちのEKSクラスターへのデプロイに適しています。

モデルをデプロイするために、モデルとウェイトをロードするvLLMベースのコンテナイメージを使用する標準的なKubernetes Deploymentを使用します:

~/environment/eks-workshop/modules/aiml/chatbot/vllm.yaml
apiVersion: v1
kind: Service
metadata:
name: mistral
namespace: vllm
annotations:
prometheus.io/scrape: "true"
prometheus.io/app-metrics: "true"
prometheus.io/port: "8080"
labels:
model: mistral7b
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
model: mistral7b
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mistral
namespace: vllm
labels:
model: mistral7b
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
model: mistral7b
template:
metadata:
labels:
model: mistral7b
spec:
nodeSelector:
instanceType: trn1.2xlarge
neuron.amazonaws.com/neuron-device: "true"
tolerations:
- effect: NoSchedule
key: aws.amazon.com/neuron
operator: Exists
initContainers:
- name: model-download
image: python:3.11
command: ["/bin/sh", "-c"]
args:
- |
set -e
pip install -U "huggingface_hub[cli]"
pip install hf_transfer

mkdir -p /models/mistral-7b-v0.3
HF_HUB_ENABLE_HF_TRANSFER=1 hf download aws-neuron/Mistral-7B-Instruct-v0.3-seqlen-2048-bs-1-cores-2 --local-dir /models/mistral-7b-v0.3

echo ""
echo "Model download is complete."
volumeMounts:
- name: local-storage
mountPath: /models
containers:
- name: vllm
image: public.ecr.aws/neuron/pytorch-inference-vllm-neuronx:0.9.1-neuronx-py311-sdk2.26.0-ubuntu22.04
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c"]
args:
[
"vllm serve /models/mistral-7b-v0.3 --tokenizer /models/mistral-7b-v0.3 --port 8080 --host 0.0.0.0 --device neuron --tensor-parallel-size 2 --max-num-seqs 4 --use-v2-block-manager --max-model-len 2048 --dtype bfloat16",
]
ports:
- containerPort: 8080
protocol: TCP
name: http
resources:
requests:
cpu: 4
memory: 24Gi
aws.amazon.com/neuron: 1
limits:
cpu: 4
memory: 24Gi
aws.amazon.com/neuron: 1
volumeMounts:
- name: dshm
mountPath: /dev/shm
- name: local-storage
mountPath: /models
env:
- name: NEURON_RT_NUM_CORES
value: "2"
- name: NEURON_RT_VISIBLE_CORES
value: "0,1"
- name: VLLM_LOGGING_LEVEL
value: "INFO"
- name: VLLM_NEURON_FRAMEWORK
value: "neuronx-distributed-inference"
- name: NEURON_COMPILED_ARTIFACTS
value: "/models/mistral-7b-v0.3"
- name: MALLOC_ARENA_MAX
value: "1"
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 5
terminationGracePeriodSeconds: 10
volumes:
- name: dshm
emptyDir:
medium: Memory
- name: local-storage
hostPath:
path: /mnt/k8s-disks/0
type: Directory

必要なリソースを作成しましょう:

~$kubectl create namespace vllm
~$kubectl apply -f ~/environment/eks-workshop/modules/aiml/chatbot/vllm.yaml

作成されたリソースを確認します:

~$kubectl get deployment -n vllm
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
mistral   0/1     1            0           33s
~$kubectl get service -n vllm
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
mistral   ClusterIP   172.16.149.89   <none>        8080/TCP   33m

モデルの初期化プロセスには数分かかります。vLLM Podは以下の段階を経ます:

  1. Karpenterが Trainium インスタンスをプロビジョニングするまでPending状態のままになる
  2. initコンテナを使用してHugging Faceからモデルをホストファイルシステムのパスにダウンロード
  3. vLLMコンテナイメージをダウンロード(約10GB)
  4. vLLMサービスを起動
  5. ファイルシステムからモデルをロード
  6. ポート8080でHTTPエンドポイント経由でモデルの提供を開始

これらの段階を通じてPodの状態を監視するか、モデルがロードされている間に次のセクションに進むことができます。

待つことを選択した場合は、PodがInit状態に移行するのを監視できます(Ctrl + Cで終了):

~$kubectl get pod -n vllm --watch
NAME                       READY   STATUS    RESTARTS   AGE
mistral-6889d675c5-2l6x2   0/1     Pending   0          21s
mistral-6889d675c5-2l6x2   0/1     Pending   0          29s
mistral-6889d675c5-2l6x2   0/1     Pending   0          29s
mistral-6889d675c5-2l6x2   0/1     Pending   0          30s
mistral-6889d675c5-2l6x2   0/1     Pending   0          38s
mistral-6889d675c5-2l6x2   0/1     Pending   0          50s
mistral-6889d675c5-2l6x2   0/1     Init:0/1   0          50s
# Podがinit状態に達したら終了

モデルをダウンロードしているinitコンテナのログを確認できます(Ctrl + Cで終了):

~$kubectl logs deployment/mistral -n vllm -c model-download -f
[...]
Downloading 'weights/tp0_sharded_checkpoint.safetensors' to '/models/mistral-7b-v0.3/.cache/huggingface/download/weights/dAuF3Bw92r-GdZ-yzT84Iweq-RQ=.6794a3d7f2b1d071399a899a42bcd5652e83ebdd140f02f562d90b292ae750aa.incomplete'
Download complete. Moving file to /models/mistral-7b-v0.3/weights/tp0_sharded_checkpoint.safetensors
Downloading 'weights/tp1_sharded_checkpoint.safetensors' to '/models/mistral-7b-v0.3/.cache/huggingface/download/weights/eEdQSCIfRYQ2putRDwZhjh7Te8E=.14c5bd3b07c4f4b752a65ee99fe9c79ae0110c7e61df0d83ef4993c1ee63a749.incomplete'
Download complete. Moving file to /models/mistral-7b-v0.3/weights/tp1_sharded_checkpoint.safetensors
 
Model download is complete.
# ログがここまで到達したら終了

initコンテナが完了したら、vLLMコンテナの起動時のログを監視できます(Ctrl + Cで終了):

~$kubectl logs deployment/mistral -n vllm -c vllm -f
[...]
INFO 09-30 04:43:37 [launcher.py:36] Route: /v2/rerank, Methods: POST
INFO 09-30 04:43:37 [launcher.py:36] Route: /invocations, Methods: POST
INFO 09-30 04:43:37 [launcher.py:36] Route: /metrics, Methods: GET
INFO:     Started server process [7]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     10.42.114.242:38674 - "GET /health HTTP/1.1" 200 OK
INFO:     10.42.114.242:50134 - "GET /health HTTP/1.1" 200 OK
# ログがここまで到達したら終了

これらのステップを完了したか、モデルの初期化中に次に進むことを決めたら、次のタスクに進むことができます。