Valider une architecture

Si vous souhaitez déployer une architecture similaire à celle décrite dans cette solution, vous devez la valider en fonction des critères décrits dans les rubriques suivantes. Envisagez la sélection de processeurs graphiques, la configuration des grappes, la distribution et le déploiement, l'ajustement automatique, les tests de performance, la sécurité et le coût.

Sélectionner des GPU

Vous devez déployer un service d'inférence alimenté par GPU pour convertir des segments de texte en discours, assurant ainsi performances, évolutivité et rentabilité. Vous pouvez évaluer les modèles GPU (A10, A100, L40S) pour déterminer la meilleure correspondance pour le cas d'utilisation.

Vous pouvez effectuer des tests de benchmarking avec différents types de GPU. Le tableau suivant présente un modèle. Entrez des valeurs pour X et Y et utilisez ces données pour comparer votre rendement réel au coût.

Type de GPU Latence moyenne (pour 250 segments) Débit (segments/s) Notes
A10 X ms Y Coût réduit, adapté au développement/test
A100 X ms Y Haute performance, coût plus élevé
L40S X ms Y Bon équilibre entre prix/performance
  • Recommandation : Sélectionnez un processeur graphique en fonction de la taille de la charge de travail, des exigences de latence du CNS et du budget.
  • Optimisation : Exécutez avec une précision FP16/mixte (lorsqu'elle est prise en charge) pour une latence réduite.

Concevoir des grappes OKE

Concevez vos grappes OKE en fonction de votre déploiement.

Dans cet exemple, nous utilisons une configuration de grappe avec deux groupes de noeuds :

  • NodePool 1 (Noeuds d'UC) : Exécute l'interface utilisateur, les programmes, RabbitMQ et la base de données interne
  • NodePool 2 (Noeuds GPU) : Exécute les pods d'inférence TorchServe

Assurez-vous que la valeur BV est suffisante sur les noeuds GPU.

Intitulez les groupes de noeuds :

  • nodepool=cpu sur les noeuds d'UC
  • nodepool-gpu et nvidia.com/gpu.present=true sur les noeuds GPU

Assurez-vous que le module complémentaire de plugiciel de périphérique OKE NVIDIA est activé sur les noeuds GPU et que nvidia-smi fonctionne.

Valider les GPU

Pour vous assurer que les GPU sont disponibles pour le noeud OKE et les pods TorchServe, exécutez les étapes de validation suivantes.

Si les deux vérifications réussissent, cela confirme que l'extension de plugiciel de périphérique NVIDIA est activée et qu'aucune installation de pilote/logiciel supplémentaire n'est nécessaire.
  1. Vérifiez la visibilité du processeur graphique sur le noeud de travail. Par exemple :
    [opc@oke-cvxkfx3tnkq-nkteldpxwna-s3xcmkmmoda-0 ~]$ nvidia-smi -L
    GPU 0: NVIDIA A10 (UUID: GPU-eae0552a-e1d7-7c0f-dc39-886f4eafb439)
  2. Vérifiez l'accès GPU dans le pod TorchServe. Par exemple :
    [opc@glvoicepoc-bastion guru]$ kubectl exec -it torchserve-7859b89965-rtqw9 -- /bin/bash
    model-server@torchserve-7859b89965-rtqw9:~$ nvidia-smi -L
    GPU 0: NVIDIA A10 (UUID: GPU-d6d1852e-6d04-59b9-10de-f68422638fb3)

Répartition du modèle de conception

Vous disposez de deux options pour rendre le modèle .mar disponible pour les pods d'inférence.

  • Utilisez des seaux de stockage d'objets OCI en tant que revendication de volume persistant à l'aide du pilote CSI (Container Storage Interface).
  • Transférez votre modèle vers le service Stockage de fichiers OCI à l'aide du protocole SCP (Secure Copy Protocol) et utilisez le système de fichiers comme point de montage pour une revendication de volume persistant. Par exemple :
    scp -i /path/to/private_key /path/to/local/model.mar
          opc@<file_storage_instance_ip>:/path/to/destination/mount/point/models/

Nous vous recommandons de simplifier le stockage d'objets OCI ou le stockage de fichiers OCI si vous avez plusieurs modèles avec des mises à jour fréquentes.

Déployer TorchServe

Validez votre méthode pour déployer TorchServe.

Les fichiers YAML suivants fournissent des exemples de déploiement et de configuration.

  • Présenter à l'aide de l'équilibrage de charge OCI (trafic entrant vers les pods OKE vers TorchServe).
  • Sécuriser avec TLS au niveau de l'équilibreur de charge.
  • N'exposez jamais le port de gestion TorchServe (8081) à l'Internet public.

Note :

  • Modifiez l'énoncé image: du conteneur pour qu'il pointe vers l'emplacement et la version réels du conteneur TorchServe.
  • multispk_20250121_tts est un nom de modèle personnalisé utilisé ici à titre d'exemple. Vous pouvez le remplacer par le nom de votre propre modèle et le fichier .mar.

torchserve-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: torchserve
  labels:
    app: torchserve
spec:
  replicas: 1
  selector:
    matchLabels:
      app: torchserve
  template:
    metadata:
      labels:
        app: torchserve
    spec:
      nodeSelector:
        nodepool: torchserve
      tolerations:
        - key: "nvidia.com/gpu"
          operator: "Exists"
          effect: "NoSchedule"
      imagePullSecrets:
        - name: ocir-creds
      containers:
        - name: torchserve
          image: ocir.<your-region>.oci.oraclecloud.com/<tenancy-namespace>/<torchserve_image>:<version>
          ports:
            - containerPort: 8080
            - containerPort: 8081
            - containerPort: 8082
            - containerPort: 7070
            - containerPort: 7071
          env:
            - name: GPUS__DEVICES
              value: "0"
            - name: METRICS_MODE
              value: "logical"  # or "endpoint"
            - name: ENABLE_METRICS_API
              value: "true"  
          resources:
            limits:
              nvidia.com/gpu: 1
          volumeMounts:
            - name: models-volume
              mountPath: /home/model-server/model-store
      volumes:
        - name: models-volume
          persistentVolumeClaim:
            claimName: fss-voiceengine-models

configmap-torchserve.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-properties
  namespace: default # Adjust the namespace as necessary
data:
  config.properties: |
    inference_address=http://0.0.0.0:8080
    management_address=http://0.0.0.0:8081
    metrics_address=http://0.0.0.0:8082
    number_of_netty_threads=32
    job_queue_size=1000
    model_store=/home/model-server/model-store
    workflow_store=/home/model-server/wf-store
    install_py_dep_per_model=true
    max_request_size=196605000
    max_response_size=196605000
    default_workers_per_model=1
    job_queue_size=100
    metrics_mode=logical
    load_models=/home/model-server/model-store/multispk_20250121_tts.mar

Configurer l'ajustement automatique

Configurez l'ajustement automatique au niveau du pod et du travailleur.

Configurez l'ajustement automatique au niveau du pod à l'aide du composant d'ajustement automatique basé sur les événements de Kubernetes avec les mesures Prometheus pour ajuster les pods TorchServe en fonction de la profondeur de la file d'attente des demandes, des mesures personnalisées ou de l'utilisation d'UC/de processeur graphique.

Configurez l'ajustement automatique au niveau du travailleur (TorchServe).

Note :

Dans les exemples suivants, nous utilisons TorchServe Model Lifecycle avec multispk_20250121_tts.
  1. Enregistrez le modèle. Par exemple, exécutez la commande suivante à partir de n'importe quel client distant qui peut atteindre le point d'extrémité TorchServe sur HTTP pour enregistrer votre fichier .mar auprès d'un programme initial.
    curl -X POST "http://10.0.20.160:8081/models?model_name=multispk_20250121_tts&url=multispk_20250121_tts.mar&initial_workers=1"
    
    Configure initial_workers per model demand.
    L'adresse IP (10.0.20.160) et le port (8081) font référence au point d'extrémité de l'API de gestion des inférences TorchServe.
  2. Annulez l'enregistrement d'un modèle. Par exemple :
    curl -X DELETE "http://10.0.20.160:8081/models/multispk_20250121_tts"
  3. Ajoutez/ajoutez des travailleurs. Par exemple, pour mettre à jour le nombre de travailleurs pour le modèle en cours d'exécution :
    curl -X PUT "http://10.0.20.160:8081/models/multispk_20250121_tts?min_worker=12"

Performance de test

Validez votre conception avec des tests de performance.

  1. À partir de l'application client, envoyez 250 segments concurrents. Saisir :
    • Latence p50/p95
    • Débit (segments/s)
    • Utilisation de GPU (nvidia-smi)
    • Heure de fin d'exécution de commande de production de bout en bout
  2. À partir du pod, exécutez :
    kubectl exec -it <pod_name> -- nvidia-smi
  3. À partir de l'API de mesures TorchServe (port 8082), exécutez :
    curl http://10.0.20.160:8082/metrics

Considérations relatives à la sécurité et à l'optimisation des coûts

Lors de la validation de votre conception, tenez compte des facteurs de sécurité et d'optimisation des coûts :

  • Considérations relatives à la sécurité :
    • Appliquer l'arrêt TLS au niveau de l'équilibreur de charge ou du trafic entrant.
    • Conservez l'API de gestion TorchServe à l'interne seulement.
    • Utilisez le service de gestion des identités et des accès OCI et les groupes de sécurité de réseau pour limiter l'accès.
  • Considérations relatives à l'optimisation des coûts :
    • Choisissez votre type de GPU en fonction d'un équilibre entre le contrat de niveau de service (CNS) et le coût.
    • Utiliser l'ajustement programmé (réduire le groupe de noeuds GPU en dehors des heures de pointe).
    • Utilisez le stockage d'objets OCI sur le stockage de fichiers OCI si vos modèles sont rarement mis à jour.
    • L'inférence ne fonctionne pas toujours 24×7. Partager les processeurs graphiques inutilisés avec les charges de travail d'entraînement pendant les périodes d'inactivité pour optimiser l'utilisation et réduire les coûts.