Ce guide explique comment déployer un service d'inférence Qwen1.5-4B-Chat sur Container Service for Kubernetes (ACK) à l'aide du framework Text Generation Inference (TGI) de Hugging Face, en utilisant un GPU A10 comme matériel cible.
Contexte
Qwen1.5-4B-Chat
Qwen1.5-4B-Chat est un grand modèle de langage (LLM) de 4 milliards de paramètres développé par Alibaba Cloud. Basé sur l'architecture Transformer, il a été entraîné sur un vaste ensemble de données comprenant des textes web, des ouvrages spécialisés et du code. Pour plus d'informations, consultez le référentiel GitHub Qwen.
Text Generation Inference (TGI)
TGI est une boîte à outils open source de Hugging Face dédiée au déploiement de LLM en tant que services d'inférence. Elle prend en charge des techniques d'accélération telles que Flash Attention, Paged Attention, le batching continu et le tensor parallelism. Pour en savoir plus, consultez la documentation TGI.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
-
Un cluster ACK doté de nœuds accélérés par GPU (GPU A10) et exécutant Kubernetes 1.22 ou une version ultérieure. Pour plus d'informations, consultez la rubrique Créer un cluster ACK avec des nœuds accélérés par GPU.
Nous vous recommandons d'installer un pilote GPU de version 525. Ajoutez le libellé
ack.aliyun.com/nvidia-driver-version:525.105.17aux nœuds accélérés par GPU pour spécifier la version 525.105.17 du pilote GPU. Pour plus d'informations, consultez la rubrique Spécifier une version de pilote NVIDIA pour les nœuds en ajoutant un libellé. La dernière version du client Arena installée. Pour plus d'informations, consultez la rubrique Configurer le client Arena.
TGI ne prend pas en charge les GPU V100 ou T4. Utilisez un GPU A10 ou un GPU disposant d'une architecture plus récente.
Étape 1 : Préparer les données du modèle
Téléchargez le modèle Qwen1.5-4B-Chat, transférez-le vers Object Storage Service (OSS), puis créez un volume persistant (PV) et une revendication de volume persistant (PVC) dans le cluster ACK afin que le service d'inférence puisse charger le modèle au moment de l'exécution.
Pour une alternative utilisant File Storage NAS (NAS), consultez la rubrique Monter un volume NAS pré-provisionné de manière statique.
Télécharger les poids du modèle
-
Installez Git :
# RHEL/CentOS yum install git # Debian/Ubuntu # apt install git -
Installez Git Large File Storage (LFS) :
# RHEL/CentOS yum install git-lfs # Debian/Ubuntu # apt install git-lfs -
Clonez le référentiel Qwen1.5-4B-Chat depuis ModelScope, en ignorant les téléchargements LFS :
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.git -
Récupérez les fichiers de poids volumineux du modèle gérés par LFS :
cd Qwen1.5-4B-Chat git lfs pull
Transférer le modèle vers OSS
Connectez-vous à la console OSS et notez le nom de votre bucket OSS. Pour créer un bucket, consultez la rubrique Créer un bucket.
Installez et configurez ossutil. Pour plus d'informations, consultez la rubrique Installer ossutil.
-
Créez un répertoire pour le modèle dans OSS :
ossutil mkdir oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat -
Transférez les fichiers du modèle vers OSS :
ossutil cp -r ./Qwen1.5-4B-Chat oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat
Configurer un PV et un PVC
Créez un PV et un PVC dans le cluster ACK pour monter le modèle hébergé sur OSS dans le conteneur du service d'inférence. Pour obtenir des instructions détaillées, consultez la rubrique Monter un volume OSS pré-provisionné de manière statique.
Utilisez les paramètres suivants :
Paramètres du PV
| Paramètre | Valeur |
|---|---|
| PV type | OSS |
| Volume name | llm-model |
| Access certificate | Votre ID AccessKey et votre secret AccessKey pour le bucket OSS |
| Bucket ID | Le nom de votre bucket OSS |
| OSS path | Le chemin d'accès au répertoire du modèle, par exemple /models/Qwen1.5-4B-Chat |
Paramètres du PVC
| Paramètre | Valeur |
|---|---|
| PVC type | OSS |
| Volume name | llm-model |
| Allocation mode | Volumes existants |
| Existing volumes | Sélectionnez le PV que vous avez créé |
Étape 2 : Déployer le service d'inférence
TGI ne prend pas en charge les GPU V100 ou T4. Utilisez un GPU A10 ou un GPU disposant d'une architecture plus récente.
Exécutez la commande Arena suivante pour déployer le service d'inférence :
arena serve custom \
--name=tgi-qwen-4b-chat \
--version=v1 \
--gpus=1 \
--replicas=1 \
--restful-port=8000 \
--readiness-probe-action="tcpSocket" \
--readiness-probe-action-option="port: 8000" \
--readiness-probe-option="initialDelaySeconds: 30" \
--readiness-probe-option="periodSeconds: 30" \
--image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/text-generation-inference:2.0.2-ubuntu22.04 \
--data=llm-model:/model/Qwen1.5-4B-Chat \
"text-generation-launcher --model-id /model/Qwen1.5-4B-Chat --num-shard 1 -p 8000"
Le tableau suivant décrit les paramètres :
| Paramètre | Description |
|---|---|
--name |
Nom du service d'inférence |
--version |
Version du service d'inférence |
--gpus |
Nombre de GPU par réplica |
--replicas |
Nombre de réplicas |
--restful-port |
Port exposé par le service d'inférence |
--readiness-probe-action |
Type de connexion pour les sondes de disponibilité. Valeurs valides : HttpGet, Exec, gRPC, TCPSocket |
--readiness-probe-action-option |
Méthode de connexion pour les sondes de disponibilité |
--readiness-probe-option |
Configuration de la sonde de disponibilité |
--data |
Monte un PVC dans le conteneur. Format : <pvc-name>:<mount-path>. Exécutez arena data list pour répertorier les PVC disponibles |
--image |
Image de conteneur pour le service d'inférence |
Le résultat attendu est le suivant :
service/tgi-qwen-4b-chat-v1 created
deployment.apps/tgi-qwen-4b-chat-v1-custom-serving created
INFO[0001] The Job tgi-qwen-4b-chat has been submitted successfully
INFO[0001] You can run `arena serve get tgi-qwen-4b-chat --type custom-serving -n default` to check the job status
Vérifiez que le service est en cours d'exécution :
arena serve get tgi-qwen-4b-chat
Le résultat attendu est le suivant :
Name: tgi-qwen-4b-chat
Namespace: default
Type: Custom
Version: v1
Desired: 1
Available: 1
Age: 3m
Address: 172.16.XX.XX
Port: RESTFUL:8000
GPU: 1
Instances:
NAME STATUS AGE READY RESTARTS GPU NODE
---- ------ --- ----- -------- --- ----
tgi-qwen-4b-chat-v1-custom-serving-67b58c9865-m89lq Running 3m 1/1 0 1 cn-beijing.192.168.XX.XX
Les indications Available: 1 et STATUS: Running confirment que le pod est prêt à traiter les requêtes.
Étape 3 : Vérifier le service d'inférence
-
Configurez la redirection de port pour accéder au service depuis votre machine locale :
ImportantLa commande
kubectl port-forwardest destinée uniquement au développement et au débogage. Elle n'est ni fiable, ni sécurisée, ni évolutive pour le trafic de production. Pour la mise en réseau de production dans les clusters ACK, consultez la rubrique Présentation d'Ingress.kubectl port-forward svc/tgi-qwen-4b-chat-v1 8000:8000Résultat attendu :
Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000 -
Envoyez une requête de test au point de terminaison chat completions :
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model": "/model/Qwen1.5-4B-Chat/", "messages": [{"role": "user", "content": "Test"}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}'Résultat attendu :
{"id":"","object":"text_completion","created":1716274541,"model":"/model/Qwen1.5-4B-Chat","system_fingerprint":"2.0.2-sha-6073ece","choices":[{"index":0,"message":{"role":"assistant","content":"OK. What test do you want me to run?"},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":21,"completion_tokens":10,"total_tokens":31}}Une réponse JSON valide contenant un tableau
choicesconfirme que le modèle est chargé et qu'il génère du texte.
(Facultatif) Étape 4 : Nettoyer les ressources
Si vous n'avez plus besoin des ressources, supprimez-les pour éviter des frais continus.
Supprimez le service d'inférence :
arena serve delete tgi-qwen-4b-chat
Supprimez le PVC et le PV :
kubectl delete pvc llm-model
kubectl delete pv llm-model