TPU で vLLM を使用して Qwen2-7B-Instruct をサービングする

このチュートリアルでは、v6e TPU VM で vLLM TPU サービング フレームワークを使用して Qwen/Qwen2-7B-Instruct モデルをサービングします。

目標

  1. 環境をセットアップする。
  2. Qwen2-7B-Instruct で vLLM を実行します。
  3. 推論リクエストを送信します。
  4. ベンチマーク ワークロードを実行します。
  5. クリーンアップする。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

始める前に

このチュートリアルに進む前に、Cloud TPU 環境を設定するの手順に沿って操作してください。この手順では、 Google Cloudプロジェクトを作成し、Cloud TPU を使用するように構成するために必要な手順について説明します。既存のGoogle Cloud プロジェクトを使用することもできます。その場合は、Google Cloud プロジェクトの作成手順をスキップして、Cloud TPU を使用するための環境を設定するから開始できます。

このチュートリアルを使用するには、Hugging Face アクセス トークンが必要です。Hugging Face で無料アカウントを登録できます。アカウントを作成したら、アクセス トークンを生成します。

  1. [Welcome to Hugging Face] ページで、アカウントのアバターをクリックして [アクセス トークン] を選択します。
  2. [アクセス トークン] ページで、[新しいトークンを作成] をクリックします。
  3. [読み取り] トークン タイプを選択し、トークンの名前を入力します。
  4. アクセス トークンが表示されます。トークンは安全な場所に保存してください。

環境の設定

  1. キューに格納されたリソース API を使用して Cloud TPU v6e VM を作成します。qwen2-7b-instruct には、v6e-1 TPU を使用することをおすすめします。

    export PROJECT_ID=YOUR_PROJECT_ID
    export TPU_NAME=qwen2-7b-instruct-tutorial
    export ZONE=us-east5-a
    export QR_ID=qwen2-7b-instruct-qr
    
    gcloud alpha compute tpus queued-resources create $QR_ID \
     --node-id $TPU_NAME \
     --project $PROJECT_ID \
     --zone $ZONE \
     --accelerator-type v6e-1 \
     --runtime-version v2-alpha-tpuv6e
    
  2. TPU VM の準備が整っていることを確認します。

    gcloud compute tpus queued-resources describe $QR_ID \
      --project $PROJECT_ID \
      --zone $ZONE
    

    TPU VM が作成されると、キューに格納されたリソース リクエストのステータスが ACTIVE に設定されます。次に例を示します。

    name: projects/your-project-id/locations/your-zone/queuedResources/your-queued-resource-id
      state:
      state: ACTIVE
      tpu:
      nodeSpec:
      - node:
          acceleratorType: v6e-1
          bootDisk: {}
          networkConfig:
              enableExternalIps: true
          queuedResource: projects/your-project-number/locations/your-zone/queuedResources/your-queued-resource-id
          runtimeVersion: v2-alpha-tpuv6e
          schedulingConfig: {}
          serviceAccount: {}
          shieldedInstanceConfig: {}
          useTpuVm: true
          nodeId: your-node-id
          parent: projects/your-project-number/locations/your-zone
    
  3. TPU VM に接続します。

      gcloud compute tpus tpu-vm ssh $TPU_NAME \
        --project $PROJECT_ID \
        --zone $ZONE
    

Qwen2-7B-instruct で vLLM を実行する

  1. TPU VM 内で、vLLM Docker コンテナを実行します。このコマンドは、共有メモリサイズとして 10 GB を使用します。

      export DOCKER_URI=vllm/vllm-tpu:latest
    
      sudo docker run -it --rm --name $USER-vllm --privileged --net=host \
        -v /dev/shm:/dev/shm \
        --shm-size 10gb \
        -p 8000:8000 \
        --entrypoint /bin/bash ${DOCKER_URI}
    
  2. コンテナ内で、Hugging Face トークンを設定します。YOUR_HF_TOKEN は、Hugging Face トークンに置き換えます。

    export HF_HOME=/dev/shm
    export HF_TOKEN=YOUR_HF_TOKEN
    
  3. vllm serve コマンドを使用して vLLM サーバーを起動します。

    export MAX_MODEL_LEN=4096
    export TP=1 # number of chips
    
    vllm serve Qwen/Qwen2-7B-Instruct \
        --seed 42 \
        --disable-log-requests \
        --gpu-memory-utilization 0.98 \
        --max-num-batched-tokens 1024 \
        --max-num-seqs 128 \
        --tensor-parallel-size $TP \
        --max-model-len $MAX_MODEL_LEN
    

    vLLM サーバーが実行されると、次のような出力が表示されます。

    (APIServer pid=7) INFO:     Started server process [7]
    (APIServer pid=7) INFO:     Waiting for application startup.
    (APIServer pid=7) INFO:     Application startup complete.
    

推論リクエストを送信する

vLLM サーバーが実行されたら、新しいシェルからリクエストを送信できます。

  1. 新しいシェルを開き、TPU VM に接続します。

      export PROJECT_ID=YOUR_PROJECT_ID
      export TPU_NAME=qwen2-7b-instruct-tutorial
      export ZONE=us-east5-a
    
      gcloud compute tpus tpu-vm ssh $TPU_NAME \
        --project $PROJECT_ID \
        --zone=$ZONE
    
  2. 実行中の Docker コンテナでシェルを開きます。

      sudo docker exec -it $USER-vllm /bin/bash
    
  3. curl を使用して、サーバーにテスト リクエストを送信します。

      curl http://localhost:8000/v1/completions \
        -H "Content-Type: application/json" \
        -d '{
            "model": "Qwen/Qwen2-7B-Instruct",
            "prompt": "The future of AI is",
            "max_tokens": 200,
            "temperature": 0
          }'
    

レスポンスは JSON 形式で返されます。

ベンチマーク ワークロードを実行する

2 つ目のターミナルから、実行中のサーバーに対してベンチマークを実行できます。

  1. コンテナ内で datasets ライブラリをインストールします。

    pip install datasets
    
  2. vllm bench serve コマンドを実行します。

    export HF_HOME=/dev/shm
    cd /workspace/vllm
    
    vllm bench serve \
        --backend vllm \
        --model "Qwen/Qwen2-7B-Instruct"  \
        --dataset-name random \
        --num-prompts 1000 \
        --seed 100
    

ベンチマーク結果は次のようになります。

============ Serving Benchmark Result ============
Successful requests:                     1000
Benchmark duration (s):                  45.35
Total input tokens:                      1024000
Total generated tokens:                  126848
Request throughput (req/s):              22.05
Output token throughput (tok/s):         2797.15
Peak output token throughput (tok/s):    4258.00
Peak concurrent requests:                1000.00
Total Token throughput (tok/s):          25377.57
---------------Time to First Token----------------
Mean TTFT (ms):                          21332.46
Median TTFT (ms):                        21330.37
P99 TTFT (ms):                           42436.47
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          37.36
Median TPOT (ms):                        38.56
P99 TPOT (ms):                           38.69
---------------Inter-token Latency----------------
Mean ITL (ms):                           37.35
Median ITL (ms):                         38.55
P99 ITL (ms):                            39.43
==================================================

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

  1. 2 つ目のシェルで「exit」と入力して、vLLM コンテナを終了します。
  2. 2 つ目のシェルで「exit」コマンドを入力して、ターミナルを閉じます。
  3. 最初のシェルで、Ctrl+C と入力して vLLM サーバーを停止します。
  4. 最初のシェルで「exit」と入力して、vLLM コンテナを終了します。
  5. 最初のシェルで「exit」と入力して、TPU VM との接続を解除します。

リソースを削除する

プロジェクトを削除してすべてのリソースを削除することも、プロジェクトを保持してリソースを削除することもできます。

プロジェクトの削除

Google Cloud プロジェクトと関連するすべてのリソースを削除するには、次のコマンドを実行します。

    gcloud projects delete $PROJECT_ID

TPU リソースを削除する

Cloud TPU リソースを削除します。次のコマンドは、--force パラメータを使用して、キューに格納されたリソース リクエストと TPU VM の両方を削除します。

  gcloud alpha compute tpus queued-resources delete $QR_ID \
    --project=$PROJECT_ID \
    --zone=$ZONE \
    --force

次のステップ