Déployez Qwen1.5-4B-Chat en tant que service d'inférence sur un nœud GPU unique A10 ou T4 dans ACK avec vLLM et Arena.
Prérequis
Assurez-vous de disposer des éléments suivants :
Un cluster ACK Pro doté de nœuds accélérés par GPU exécutant Kubernetes 1.22 ou une version ultérieure, chacun disposant d'au moins 16 Go de mémoire GPU. Consultez la page Créer un cluster ACK managé.
La dernière version du client Arena. Consultez la section Configurer le client Arena.
Utilisez la version 525 du pilote GPU. Ajoutez le libellé ack.aliyun.com/nvidia-driver-version:525.105.17 à vos nœuds accélérés par GPU. Consultez la page Spécifier une version de pilote NVIDIA pour les nœuds en ajoutant un libellé.
Contexte
Qwen1.5-4B-Chat
Qwen1.5-4B-Chat est un LLM basé sur l'architecture Transformer comptant 4 milliards de paramètres, développé par Alibaba Cloud et entraîné sur du texte web, des livres spécialisés et du code. Consultez le référentiel GitHub Qwen.
vLLM
vLLM est un framework d'inférence LLM open source optimisé pour un débit élevé et une faible latence. Il prend en charge la plupart des LLM largement utilisés, y compris Qwen, et utilise PagedAttention, le regroupement continu (continuous batching) et la quantification pour améliorer l'efficacité. Consultez le référentiel GitHub vLLM.
Étape 1 : Préparer les données du modèle
Téléchargez Qwen1.5-4B-Chat, importez-le dans Object Storage Service (OSS), puis créez un volume persistant (PV) et une revendication de volume persistant (PVC) dans votre cluster ACK.
Vous pouvez également stocker le modèle dans File Storage NAS au lieu d'OSS. Consultez la page Monter un volume NAS provisionné de manière statique.
Télécharger le modèle
-
Installez Git :
# Run yum install git or apt install git. yum install git -
Installez Git Large File Storage (Git LFS) :
# Run yum install git-lfs or apt install git-lfs. yum install git-lfs -
Clonez Qwen1.5-4B-Chat depuis ModelScope :
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.git -
Accédez au répertoire Qwen1.5-4B-Chat et récupérez les fichiers Git LFS :
cd Qwen1.5-4B-Chat git lfs pull
Importer le modèle dans OSS
Connectez-vous à la console OSS et notez le nom de votre bucket. Pour en créer un, consultez la page Créer un bucket.
Installez et configurez ossutil. Consultez la page Installer ossutil.
-
Créez un répertoire
Qwen1.5-4B-Chatdans votre bucket OSS :ossutil mkdir oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat -
Importez les fichiers du modèle dans OSS :
ossutil cp -r ./Qwen1.5-4B-Chat oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat
Créer un PV et un PVC
Créez un PV et un PVC dans votre cluster ACK pour monter le modèle depuis OSS. Consultez la page Monter un volume OSS provisionné de manière statique.
Paramètres du PV :
| Parameter | Description |
|---|---|
| PV Type | OSS |
| Volume Name | llm-model |
| Access Certificate | AccessKey ID et AccessKey secret pour le bucket OSS |
| Bucket ID | Nom de votre bucket OSS |
| OSS Path | Chemin d'accès au modèle, par exemple /models/Qwen1.5-4B-Chat |
Paramètres du PVC :
| Parameter | Description |
|---|---|
| PVC Type | OSS |
| Volume Name | llm-model |
| Allocation Mode | Sélectionnez Existing Volumes |
| Existing Volumes | Cliquez sur Existing Volumes et sélectionnez votre PV |
Étape 2 : Déployer le service d'inférence
Arena traite les fichiers de modèle comme un ensemble de données. Utilisez --data pour monter le modèle dans le conteneur. Dans cet exemple, le chemin de montage est /model/Qwen1.5-4B-Chat.
Le paramètre --max-model-len définit la longueur maximale de jetons que le modèle peut traiter. Des valeurs plus élevées améliorent la qualité des interactions, mais consomment davantage de mémoire GPU. Consultez le référentiel de code vLLM sur GitHub pour obtenir la liste complète des paramètres disponibles.
Choisir un type de GPU
| GPU | Use case | max-model-len | Additional parameters |
|---|---|---|---|
| NVIDIA A10 | Production (hautes performances) | 16384 | Aucun |
| NVIDIA T4 | Tests (coût réduit) | 8192 | --dtype half |
Déployer le service
Choisissez une commande en fonction de votre type de GPU.
NVIDIA A10 (recommandé pour la production)
arena serve custom \
--name=vllm-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/vllm:0.4.1-ubuntu22.04 \
--data=llm-model:/model/Qwen1.5-4B-Chat \
"python3 -m vllm.entrypoints.openai.api_server --trust-remote-code --model /model/Qwen1.5-4B-Chat/ --gpu-memory-utilization 0.95 --max-model-len 16384"
NVIDIA T4 (pour les tests)
arena serve custom \
--name=vllm-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/vllm:0.4.1-ubuntu22.04 \
--data=llm-model:/model/Qwen1.5-4B-Chat \
"python3 -m vllm.entrypoints.openai.api_server --trust-remote-code --model /model/Qwen1.5-4B-Chat/ --gpu-memory-utilization 0.95 --max-model-len 8192 --dtype half"
Le T4 utilise --max-model-len 8192 (contre 16384 pour l'A10) et ajoute --dtype half afin de respecter les contraintes de mémoire du T4.
Paramètres Arena :
| Parameter | 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 du service d'inférence |
--readiness-probe-action |
Type de sonde de disponibilité. Valeurs valides : HttpGet, Exec, gRPC et TCPSocket |
--readiness-probe-action-option |
Méthode de connexion de la sonde de disponibilité |
--readiness-probe-option |
Configuration de la sonde de disponibilité |
--data |
Monte un PVC partagé. Format : PVCName:MountPath. Utilisez arena data list pour interroger les PVC disponibles |
--image |
Image de conteneur pour le service d'inférence |
Sortie attendue :
service/vllm-qwen-4b-chat-v1 created
deployment.apps/vllm-qwen-4b-chat-v1-custom-serving created
INFO[0008] The Job vllm-qwen-4b-chat has been submitted successfully
INFO[0008] You can run `arena serve get vllm-qwen-4b-chat --type custom-serving -n default` to check the job status
Vérifier le déploiement
Vérifiez l'état du service d'inférence :
arena serve get vllm-qwen-4b-chat
Sortie attendue :
Name: vllm-qwen-4b-chat
Namespace: default
Type: Custom
Version: v1
Desired: 1
Available: 1
Age: 36m
Address: 172.16.XX.XX
Port: RESTFUL:8000
GPU: 1
Instances:
NAME STATUS AGE READY RESTARTS GPU NODE
---- ------ --- ----- -------- --- ----
vllm-qwen-4b-chat-v1-custom-serving-6d7c786b9f-z6nfk Running 36m 1/1 0 1 cn-beijing.192.168.XX.XX
Lorsque Available correspond à Desired et que le statut de l'instance est Running, le service est prêt.
Étape 3 : Tester le service d'inférence
Configurer la redirection de port
La redirection de port avec kubectl port-forward est réservée au développement et au débogage. Pour la production, utilisez un Ingress.
Redirigez le port 8000 vers votre machine locale :
kubectl port-forward svc/vllm-qwen-4b-chat-v1 8000:8000
Sortie attendue :
Forwarding from 127.0.0.1:8000 -> 8000
Forwarding from [::1]:8000 -> 8000
Envoyer une requête de test
Ouvrez un nouveau terminal et envoyez une requête d'inférence :
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}'
Sortie attendue :
{"id":"cmpl-503270b21fa44db2b6b3c3e0abaa3c02","object":"chat.completion","created":1717141209,"model":"/model/Qwen1.5-4B-Chat/","choices":[{"index":0,"message":{"role":"assistant","content":"OK. What do you want to test?"},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":21,"total_tokens":30,"completion_tokens":9}}
vLLM expose une API compatible OpenAI au niveau du point de terminaison /v1/chat/completions.
(Facultatif) Nettoyer les ressources
Supprimez les ressources inutilisées afin d'éviter des coûts inutiles.
Supprimez le service d'inférence :
arena serve delete vllm-qwen-4b-chat
Supprimez le PVC et le PV :
kubectl delete pvc llm-model
kubectl delete pv llm-model
Étapes suivantes
Configurez un Ingress pour exposer le service d'inférence en production.
Pour déployer d'autres modèles Qwen, ajustez
--max-model-lenet--gpu-memory-utilizationen fonction de la taille du modèle et de la mémoire GPU.Consultez le référentiel GitHub vLLM pour connaître les options de configuration.