Un grand modèle de langage (LLM) est un modèle neuronal doté de centaines de millions de paramètres, tels que GPT-3, GPT-4, PaLM et PaLM 2. En déployant un LLM sur Service Mesh (ASM) via ModelMesh, vous pouvez exposer des fonctionnalités de traitement du langage naturel (NLP) — classification de texte, analyse des sentiments, traduction automatique — sous forme d'endpoints API. Cette approche « LLM-as-a-service » vous permet d'éviter des coûts d'infrastructure élevés, de réagir rapidement aux évolutions du marché et de mettre à l'échelle vos services à la demande pour gérer les pics de trafic, tout en exécutant le modèle dans le cloud et en améliorant l'efficacité opérationnelle.
Cette rubrique détaille trois étapes : créer un runtime de service de modèle personnalisé, déployer le modèle en tant que service d'inférence et envoyer des requêtes d'inférence via la passerelle d'entrée ASM.
Fonctionnement
Ce déploiement utilise ModelMesh au sein d'ASM pour servir un LLM Hugging Face avec un ajustement fin économe en paramètres (PEFT) par prompt tuning. Le schéma suivant illustre l'articulation des composants :
+---------------------------------------------------------+
| ASM ingress gateway |
| (port 8008, HTTP) |
+----------------------------+----------------------------+
|
v
+---------------------------------------------------------+
| ModelMesh |
| (model routing and orchestration) |
+---------------------------------------------------------+
| ServingRuntime InferenceService |
| +------------------+ +-----------------------+ |
| | peft-model-server |<-----| peft-demo | |
| | (MLServer-based) | | (model endpoint) | |
| +------------------+ +-----------------------+ |
| | |
| v |
| +------------------+ +-----------------------+ |
| | MLServer | | Hugging Face model | |
| | (gRPC :8001, | | + PEFT config | |
| | HTTP :8002) | | (bloomz-560m) | |
| +------------------+ +-----------------------+ |
+---------------------------------------------------------+
ServingRuntime : définit l'image de conteneur et la configuration MLServer pour le service du modèle.
InferenceService : spécifie le modèle à charger et le ServingRuntime à utiliser. Il sert d'endpoint logique pour les requêtes d'inférence.
ModelMesh : achemine les requêtes entrantes depuis la passerelle d'entrée ASM vers le bon InferenceService. Il gère le chargement et la mise à l'échelle des modèles.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Activé ModelMesh dans votre instance ASM avec l'environnement ASM configuré. Effectuez les étapes 1 et 2 de la rubrique Utiliser ModelMesh pour déployer un service d'inférence multi-modèles avant de poursuivre.
Une familiarité avec la création de runtimes de service de modèles personnalisés avec ModelMesh. Pour plus d'informations, consultez la rubrique Utiliser ModelMesh pour créer un runtime de service de modèle personnalisé.
Étape 1 : Créer un runtime personnalisé
Créez un ServingRuntime personnalisé pour servir un LLM Hugging Face avec un ajustement fin PEFT par prompt tuning. Cela implique trois parties : implémenter la classe du serveur de modèle, l'empaqueter dans une image Docker et créer la ressource Kubernetes.
Implémenter la classe du serveur de modèle
Le serveur de modèle hérite de la classe de base MLServer MLModel et implémente deux gestionnaires :
**
load** : charge le LLM préentraîné, applique la configuration de prompt tuning PEFT et initialise un tokenizer. Le tokenizer permet au serveur d'accepter des entrées textuelles brutes plutôt que des tenseurs prétraités.**
predict** : tokenize le texte d'entrée, exécute l'inférence et décode la sortie pour obtenir un texte lisible.
L'implémentation complète se trouve dans le fichier peft_model_server.py :
Le serveur de modèle lit la configuration à partir de variables d'environnement :
| Variable d'environnement | Valeur par défaut | Description |
|---|---|---|
PRETRAINED_MODEL_PATH |
bigscience/bloomz-560m |
Chemin ou ID du modèle Hugging Face pour le LLM de base |
PEFT_MODEL_ID |
aipipeline/bloomz-560m_PROMPT_TUNING_CAUSAL_LM |
ID de configuration de prompt tuning PEFT |
DATASET_TEXT_COLUMN_NAME |
Tweet text |
Nom de la colonne utilisé pour le champ de texte d'entrée |
Construire l'image Docker
Empaquetez le serveur de modèle et ses dépendances dans une image Docker compatible avec ModelMesh.
L'image expose deux ports : gRPC sur 8001 et HTTP sur 8002. La définition de MLSERVER_MODEL_IMPLEMENTATION indique à MLServer quelle classe charger, ce qui rend inutile un fichier de paramètres de modèle séparé.
Créer la ressource ServingRuntime
Définissez un ServingRuntime qui pointe vers votre image Docker et configure l'environnement MLServer.
Déployez le ServingRuntime :
kubectl apply -f sample-runtime.yaml
Vérifiez que le runtime est disponible :
kubectl get servingruntimes -n modelmesh-serving
Résultat attendu :
NAME AGE
peft-model-server 10s
Le runtime peft-model-server doit apparaître dans la sortie.
Étape 2 : Déployer le service d'inférence
Créez une ressource InferenceService pour lier votre modèle au ServingRuntime défini à l'étape 1. L'InferenceService constitue l'endpoint logique que ModelMesh utilise pour acheminer les requêtes d'inférence vers le modèle.
Champs de configuration :
| Champ | Valeur | Description |
|---|---|---|
modelFormat.name |
peft-model |
Doit correspondre au format déclaré dans le ServingRuntime |
runtime |
peft-model-server |
Indique à ModelMesh quel runtime sert ce modèle |
serving.kserve.io/deploymentMode |
ModelMesh |
Annotation requise qui instruit KServe de déployer via ModelMesh plutôt que via des pods autonomes |
Déployez l'InferenceService :
kubectl apply -f peft-demo-isvc.yaml
Vérifiez que l'InferenceService est prêt :
kubectl get inferenceservices -n modelmesh-serving
Résultat attendu :
NAME URL READY AGE
peft-demo True 30s
Attendez que la colonne READY affiche True avant de poursuivre. Si le statut reste False, consultez la section Dépannage.
Étape 3 : Envoyer une requête d'inférence
Envoyez une requête POST au modèle déployé via la passerelle d'entrée ASM. La requête utilise le protocole d'inférence KServe v2.
MODEL_NAME="peft-demo"
ASM_GW_IP="<IP-address-of-the-ingress-gateway>"
curl -X POST -k http://${ASM_GW_IP}:8008/v2/models/${MODEL_NAME}/infer -d @./input.json
Remplacez l'espace réservé suivant par votre valeur réelle :
| Espace réservé | Description | Exemple |
|---|---|---|
<IP-address-of-the-ingress-gateway> |
IP externe de votre passerelle d'entrée ASM | 192.168.1.100 |
Le corps de la requête (input.json) suit le format du protocole d'inférence v2. Encodez le texte d'entrée en Base64 dans le champ bytes_contents :
{
"inputs": [
{
"name": "content",
"shape": [1],
"datatype": "BYTES",
"contents": {"bytes_contents": ["RXZlcnkgZGF5IGlzIGEgbmV3IGJpbm5pbmcsIGZpbGxlZCB3aXRoIG9wdGlvbnBpZW5pbmcgYW5kIGhvcGU="]}
}
]
}
Dans cet exemple, bytes_contents est la forme encodée en Base64 de "Every day is a new beginning, filled with opportunities and hope".
Réponse attendue
Une inférence réussie renvoie une réponse JSON contenant la sortie du modèle dans bytesContents (également encodée en Base64) :
{
"modelName": "peft-demo__isvc-5c5315c302",
"outputs": [
{
"name": "output-0",
"datatype": "BYTES",
"shape": [
"1",
"1"
],
"parameters": {
"content_type": {
"stringParam": "str"
}
},
"contents": {
"bytesContents": [
"VHdlZXQgdGV4dCA6IEV2ZXJ5IGRheSBpcyBhIG5ldyBiaW5uaW5nLCBmaWxsZWQgd2l0aCBvcHRpb25waWVuaW5nIGFuZCBob3BlIExhYmVsIDogbm8gY29tcGxhaW50"
]
}
}
]
}
Décodez la valeur bytesContents depuis le Base64 pour vérifier le résultat :
Tweet text : Every day is a new binning, filled with optionpiening and hope Label : no complaint
Le modèle a classifié le texte d'entrée avec l'étiquette no complaint, ce qui confirme le bon fonctionnement du service d'inférence.
Dépannage
| Problème | Cause | Solution |
|---|---|---|
Le pod ServingRuntime reste en état Pending |
CPU ou mémoire insuffisants dans le cluster | Ajoutez des nœuds ou réduisez les requests de ressources dans la spécification du ServingRuntime |
L'InferenceService n'atteint jamais l'état Ready: True |
Délai dépassé lors du chargement du modèle ou échec du téléchargement | Vérifiez les journaux du pod avec kubectl logs -n modelmesh-serving <pod-name>. Augmentez modelLoadingTimeoutMillis pour les téléchargements lents. Pour les clusters isolés, définissez TRANSFORMERS_OFFLINE et HF_DATASETS_OFFLINE sur "1" et préchargez les modèles dans le stockage local |
curl renvoie une erreur de connexion refusée |
Passerelle d'entrée mal configurée ou mauvaise IP/port | Vérifiez l'IP de la passerelle d'entrée ASM et confirmez que le port 8008 est exposé |
| Sortie du modèle inattendue | Incompatibilité entre le modèle et la configuration PEFT | Confirmez que PRETRAINED_MODEL_PATH et PEFT_MODEL_ID pointent vers des configurations de modèle et d'ajustement compatibles |
Étapes suivantes
Utiliser ModelMesh pour déployer un service d'inférence multi-modèles : déployez plusieurs modèles sous une seule instance ModelMesh pour partager les ressources.
Utiliser ModelMesh pour créer un runtime de service de modèle personnalisé : créez et personnalisez des ressources ServingRuntime pour d'autres frameworks de modèles.