Qwen2-7B mit vLLM auf TPUs bereitstellen

In dieser Anleitung wird gezeigt, wie Sie das Modell Qwen/Qwen2-7B mit dem vLLM TPU-Bereitstellungs-Framework auf einer v6e TPU-VM bereitstellen.

Ziele

  1. Umgebung einrichten
  2. vLLM mit Qwen2-7B ausführen
  3. Inferenzanfrage senden
  4. Benchmark-Arbeitslast ausführen
  5. Bereinigen

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

Hinweis

Bevor Sie diese Anleitung durcharbeiten, folgen Sie der Anleitung auf der Seite Cloud TPU-Umgebung einrichten. Dort werden die Schritte beschrieben, die zum Erstellen eines Google Cloud Projekts und zum Konfigurieren der Verwendung von Cloud TPU erforderlich sind. Sie können auch ein vorhandenes Google Cloud Projekt verwenden. In diesem Fall können Sie den Schritt zum Erstellen eines Google Cloud Projekts überspringen und mit Umgebung für die Verwendung von Cloud TPU einrichten beginnen.

Für diese Anleitung benötigen Sie ein Hugging Face-Zugriffstoken. Sie können sich bei Hugging Face für ein kostenloses Konto registrieren. Nachdem Sie ein Konto haben, erstellen Sie ein Zugriffstoken:

  1. Klicken Sie auf der Seite Welcome to Hugging Face (Willkommen bei Hugging Face) auf Ihren Kontoavatar und wählen Sie Access tokens (Zugriffstokens) aus.
  2. Klicken Sie auf der Seite Access Tokens (Zugriffstokens) auf Create new token (Neues Token erstellen).
  3. Wählen Sie den Tokentyp Read (Lesen) aus und geben Sie einen Namen für Ihr Token ein.
  4. Ihr Zugriffstoken wird angezeigt. Speichern Sie das Token an einem sicheren Ort.

Umgebung einrichten

In die Warteschlange gestellte Ressourcen

Erstellen Sie eine Cloud TPU v6e-VM mit der API für in die Warteschlange gestellte Ressourcen. Für Qwen2-7B empfehlen wir die Verwendung einer v6e-4 TPU.

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

Legen Sie die Variablen fest:

  • PROJECT: Der Name Ihres Projekts
  • TPU_NAME - Der Name der TPU-VM-Instanz, die Sie erstellen.
  • ZONE – Die Cloud-Zone, in der Sie die neue VM erstellen.
  • TPU_TYPE – Der Typ der TPU-VM, die Sie erstellen. Beispiel: v6e-1 oder v6e-4.
  • QR_ID - Der Name der in die Warteschlange gestellten Ressource, die Sie erstellen.

Erstellen Sie die Anfrage für in die Warteschlange gestellte Ressourcen:

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

Prüfen Sie, ob Ihre TPU-VM bereit ist.

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

Beispiel: Wenn der Status ACTIVE ist:

name: projects/your-project-id/locations/your-zone/queuedResources/your-queued-resource-id
  state:
  state: ACTIVE
  tpu:
  nodeSpec:
  - node:
      acceleratorType: v6e-4
      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

Reservierung

Erstellen Sie eine Cloud TPU v6e-VM mit einer Reservierung. Für Qwen2-7B empfehlen wir die Verwendung einer v6e-4 TPU. Legen Sie zuerst Umgebungsvariablen fest:

export PROJECT_ID="YOUR_PROJECT_ID"
export TPU_NAME="TPU_MACHINE_NAME"
export ZONE="ZONE_NAME"
export TPU_TYPE=v6e-8
export HF_TOKEN="YOUR_HF_TOKEN"
export RESERVATION="RESERVATION_NAME"

Legen Sie die Variablen fest:

  • PROJECT: Der Name Ihres Projekts
  • TPU_NAME - Der Name der TPU-VM-Instanz, die Sie erstellen.
  • ZONE – Die Cloud-Zone, in der Sie die neue VM erstellen.
  • TPU_TYPE – Der Typ der TPU-VM, die Sie erstellen. Beispiel: v6e-1 oder v6e-4.
  • RESERVATION - Der Name der Reservierung mit Ihren TPUs.

Erstellen Sie die TPU-VM mit Ihrer Reservierung:

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

Stellen Sie eine Verbindung zur TPU-VM her.

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

vLLM mit Qwen2-7B ausführen

  1. Legen Sie die Variablen für das Hugging Face-Token und den Modellnamen fest.

      export HF_TOKEN="YOUR_HF_TOKEN"
      export MODEL_NAME="Qwen/Qwen2-7B"
    
  2. Führen Sie in der TPU-VM den vLLM-Docker-Container im getrennten Modus aus und starten Sie den vLLM-Server. Dieser Befehl verwendet eine Größe des gemeinsam genutzten Arbeitsspeichers von 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. Prüfen Sie die Serverlogs, um zu bestätigen, dass der Server ausgeführt wird.

    sudo docker logs -f "${CONTAINER_NAME}"

    Wenn der vLLM-Server ausgeführt wird, sehen Sie eine Ausgabe, die der folgenden ähnelt. Drücken Sie nach der Ausgabe CTRL+C, um zum Terminal zurückzukehren.

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

Inferenzanfrage senden

Sobald der vLLM-Server ausgeführt wird, können Sie Anfragen an die API senden. Weitere Informationen finden Sie in der vLLM API-Referenzdokumentation.

  1. Senden Sie mit curl eine Testanfrage an den Server.

    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
          }'

Die Antwort wird im JSON-Format zurückgegeben.

Benchmark-Arbeitslast ausführen

Sie können Benchmarks für den ausgeführten Server über Ihr zweites Terminal ausführen.

  1. Installieren Sie im Container die Bibliothek datasets.

    sudo docker exec "${CONTAINER_NAME}" pip install datasets
  2. Führen Sie im Container den Befehl vllm bench serve aus.

    sudo docker exec "${CONTAINER_NAME}" \
        vllm bench serve \
            --backend vllm \
            --dataset-name random \
            --num-prompts 1000 \
            --seed 100

Die Benchmark-Ergebnisse sehen so aus:

============ 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
==================================================

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

  1. Geben Sie im Terminal exit ein, um die Verbindung zur TPU-VM zu trennen.

Ressourcen löschen

Sie können das Projekt löschen, wodurch alle Ressourcen gelöscht werden, oder Sie können das Projekt beibehalten und die Ressourcen löschen.

Projekt löschen

So löschen Sie Ihr Google Cloud Projekt und alle zugehörigen Ressourcen:

    gcloud projects delete $PROJECT_ID

TPU-Ressourcen löschen

In die Warteschlange gestellte Ressourcen

Löschen Sie Ihre Cloud TPU-Ressourcen. Mit dem folgenden Befehl werden sowohl die Anfrage für in die Warteschlange gestellte Ressourcen als auch die TPU-VM mit dem Parameter --force gelöscht.

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

Reservierung

Löschen Sie Ihre Cloud TPU-VM. Verwenden Sie den folgenden Befehl, um die VM zu beenden und die TPUs wieder für Ihre Reservierung freizugeben.

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

Nächste Schritte