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 環境を設定するの手順に沿って操作してください。この 手順では、プロジェクトを作成し、Cloud TPU を使用するように構成するために必要な手順について説明します。 Google Cloud既存の Google Cloud プロジェクトを使用することもできます。その場合は、プロジェクトを作成する手順をスキップして、Cloud TPU を使用するように環境をセットアップするから開始できます。Google Cloud

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

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

環境の設定

キューに格納されたリソース

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

export PROJECT_ID=<PROJECT>
export TPU_NAME=<TPU_NAME>
export ZONE=<ZONE>
export QR_ID=<QR_ID>
export TPU_TYPE=<TPU_TYPE>

変数を設定します。

  • PROJECT - プロジェクトの名前。
  • TPU_NAME - 作成する TPU VM マシンの名前。
  • ZONE - 新しい VM を作成するクラウド ゾーン。
  • TPU_TYPE - 作成する TPU VM のタイプ。例: v6e-1v6e-4
  • QR_ID - 作成するキューに格納されたリソースの名前。

キューに格納されたリソース リクエストを作成します。

gcloud alpha compute tpus queued-resources create $QR_ID \
 --node-id $TPU_NAME \
 --project $PROJECT_ID \
 --zone $ZONE \
 --accelerator-type $TPU_TYPE \
 --runtime-version v2-alpha-tpuv6e

TPU VM の準備ができていることを確認します。

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

たとえば、ステータスが 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

予約

予約を使用して Cloud TPU v6e VM を作成します。qwen2-7b-instruct の場合は、v6e-1 TPU を使用することをおすすめします。まず、環境変数を設定します。

export PROJECT_ID=<PROJECT>
export TPU_NAME=<TPU_NAME>
export ZONE=<ZONE>
export TPU_TYPE=v6e-8
export HF_TOKEN=<HF_TOKEN>
export RESERVATION=<RESERVATION>

変数を設定します。

  • PROJECT - プロジェクトの名前。
  • TPU_NAME - 作成する TPU VM マシンの名前。
  • ZONE - 新しい VM を作成するクラウド ゾーン。
  • TPU_TYPE - 作成する TPU VM のタイプ。例: v6e-1v6e-4
  • RESERVATION - TPU を含む予約の名前。

予約を使用して TPU VM を作成します。

gcloud alpha compute tpus tpu-vm create $TPU_NAME \
    --zone=$ZONE \
    --project $PROJECT_ID \
    --accelerator-type=$TPU_TYPE \
    --version=v2-alpha-tpuv6e \
    --provisioning-model=reservation-bound \
    --reservation=$RESERVATION

TPU VM に接続します。

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

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

  1. Hugging Face トークンとモデル名の変数を設定します。

      export HF_TOKEN="YOUR_HF_TOKEN"
      export MODEL_NAME="Qwen/Qwen2-7B-Instruct"
    
  2. TPU VM 内で、vLLM Docker コンテナをデタッチ モードで実行し、vLLM サーバーを起動します。このコマンドでは、共有メモリサイズ 10 GB を使用します。

    export DOCKER_URI="vllm/vllm-tpu:v0.18.0"
    export CONTAINER_NAME="${USER}-vllm"
    export MAX_MODEL_LEN=4096
    export TP=1 # number of chips
    
    sudo docker run -d --name "${CONTAINER_NAME}" \
        --privileged --net=host \
        -v /dev/shm:/dev/shm \
        --shm-size 10gb \
        -e "HF_HOME=/dev/shm" \
        -e "HF_TOKEN=${HF_TOKEN}" \
        -p 8000:8000 "${DOCKER_URI}" \
            vllm serve ${MODEL_NAME} \
                --seed 42 \
                --gpu-memory-utilization 0.98 \
                --max-num-batched-tokens 1024 \
                --max-num-seqs 128 \
                --tensor-parallel-size $TP \
                --max-model-len $MAX_MODEL_LEN
  3. サーバーログを確認して、実行されていることを確認します。

    sudo docker logs -f "${CONTAINER_NAME}"

    vLLM サーバーが実行されると、次のような出力が表示されます。出力が表示されたら、CTRL+C を押してターミナルに戻ります。

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

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

vLLM サーバーが実行されたら、API にリクエストを送信できます。詳細については、vLLM API リファレンス ドキュメントをご覧ください。

  1. curl を使用して、サーバーにテスト リクエストを送信します。

    sudo docker exec "${CONTAINER_NAME}" \
      curl http://localhost:8000/v1/completions \
        -H "Content-Type: application/json" \
        -d '{
            "prompt": "The future of AI is",
            "max_tokens": 200,
            "temperature": 0
          }'

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

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

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

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

    sudo docker exec "${CONTAINER_NAME}" pip install datasets
  2. コンテナ内で、vllm bench serve コマンドを実行します。

    sudo docker exec "${CONTAINER_NAME}" \
        vllm bench serve \
            --backend vllm \
            --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. ターミナルで「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

予約

Cloud TPU VM を削除します。次のコマンドを使用して VM を終了し、 TPU を予約に戻します。

gcloud compute tpus tpu-vm delete $TPU_NAME --zone $ZONE --project $PROJECT_ID --quiet

次のステップ

  • Cloud TPU での vLLM の詳細を確認する。
  • Cloud TPU の詳細を確認する。