Diffuser Qwen2-7B-Instruct avec vLLM sur des TPU

Ce tutoriel explique comment diffuser le modèle Qwen/Qwen2-7B-Instruct à l'aide du framework de diffusion vLLM TPU sur une VM TPU v6e.

Objectifs

  1. configurer votre environnement ;
  2. Exécutez vLLM avec Qwen2-7B-Instruct.
  3. Envoyez une requête d'inférence.
  4. Exécutez une charge de travail de benchmark.
  5. Effectuer un nettoyage.

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud, dont :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.

Avant de commencer

Avant de suivre ce tutoriel, suivez les instructions de la page Configurer l'environnement Cloud TPU. Les instructions vous guident tout au long des étapes nécessaires pour créer un projet Google Cloudet le configurer afin d'utiliser Cloud TPU. Vous pouvez également utiliser un projetGoogle Cloud existant. Si vous le souhaitez, vous pouvez ignorer l'étape de création d'un projetGoogle Cloud et commencer par Configurer votre environnement pour qu'il utilise Cloud TPU.

Vous avez besoin d'un jeton d'accès Hugging Face pour suivre ce tutoriel. Vous pouvez créer un compte sans frais sur Hugging Face. Une fois que vous avez un compte, générez un jeton d'accès :

  1. Sur la page Bienvenue sur Hugging Face, cliquez sur l'avatar de votre compte, puis sélectionnez Jetons d'accès.
  2. Sur la page Jetons d'accès, cliquez sur Créer un jeton.
  3. Sélectionnez le type de jeton Read (Lecture) et saisissez un nom pour votre jeton.
  4. Votre jeton d'accès s'affiche. Enregistrez le jeton dans un endroit sûr.

Configurer votre environnement

  1. Créez une VM Cloud TPU v6e à l'aide de l'API des ressources en file d'attente. Pour qwen2-7b-instruct, nous vous recommandons d'utiliser un TPU v6e-1.

    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. Vérifiez que votre VM TPU est prête.

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

    Une fois votre VM TPU créée, l'état de la demande de ressource en file d'attente est défini sur ACTIVE. Exemple :

    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. Connectez-vous à la VM TPU.

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

Exécuter vLLM avec Qwen2-7B-instruct

  1. Dans la VM TPU, exécutez le conteneur Docker vLLM. Cette commande utilise une taille de mémoire partagée de 10 Go.

      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. Dans le conteneur, définissez votre jeton Hugging Face. Remplacez YOUR_HF_TOKEN par votre jeton Hugging Face.

    export HF_HOME=/dev/shm
    export HF_TOKEN=YOUR_HF_TOKEN
    
  3. Démarrez le serveur vLLM à l'aide de la commande vllm serve.

    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
    

    Lorsque le serveur vLLM est en cours d'exécution, un résultat semblable à celui-ci s'affiche :

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

Envoyer une requête d'inférence

Une fois le serveur vLLM en cours d'exécution, vous pouvez lui envoyer des requêtes à partir d'un nouveau shell.

  1. Ouvrez une nouvelle interface système et connectez-vous à votre VM TPU.

      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. Ouvrez une interface système dans le conteneur Docker en cours d'exécution.

      sudo docker exec -it $USER-vllm /bin/bash
    
  3. Envoyez une requête de test au serveur à l'aide de 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
          }'
    

La réponse est renvoyée au format JSON.

Exécuter une charge de travail de benchmark

Vous pouvez exécuter des benchmarks sur le serveur en cours d'exécution à partir de votre deuxième terminal.

  1. Dans le conteneur, installez la bibliothèque datasets.

    pip install datasets
    
  2. Exécutez la commande 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
    

Les résultats du benchmark se présentent comme suit :

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

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

  1. Dans la deuxième interface système, saisissez exit pour quitter le conteneur vLLM.
  2. Dans la deuxième interface système, saisissez la commande exit pour fermer le terminal.
  3. Dans le premier shell, appuyez sur Ctrl+C pour arrêter le serveur vLLM.
  4. Dans le premier shell, saisissez exit pour quitter le conteneur vLLM.
  5. Dans le premier shell, saisissez exit pour vous déconnecter de la VM TPU.

Supprimer vos ressources

Vous pouvez supprimer le projet, ce qui supprimera toutes les ressources, ou conserver le projet et supprimer les ressources.

Supprimer votre projet

Pour supprimer votre projet Google Cloud et toutes les ressources associées, exécutez la commande suivante :

    gcloud projects delete $PROJECT_ID

Supprimer des ressources TPU

Supprimez vos ressources Cloud TPU. La commande suivante supprime à la fois la demande de ressource en file d'attente et la VM TPU à l'aide du paramètre --force.

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

Étapes suivantes