Architektur validieren

Wenn Sie eine Architektur bereitstellen möchten, die der in dieser Lösung dargestellten ähnelt, sollten Sie sie gemäß den Kriterien in den folgenden Themen validieren. Berücksichtigen Sie GPU-Auswahl, Cluster-Setup, Verteilung und Bereitstellung, Autoscaling, Performancetests, Sicherheit und Kosten.

GPUs auswählen

Sie müssen einen GPU-gestützten Inferenzservice bereitstellen, um Textsegmente in Sprache zu konvertieren und so Performance, Skalierbarkeit und Kosteneffizienz sicherzustellen. Sie können GPU-Modelle (A10, A100, L40S) auswerten, um die beste Passform für den Anwendungsfall zu ermitteln.

Sie können Benchmarking-Tests mit verschiedenen GPU-Typen durchführen. Die folgende Tabelle enthält eine Vorlage. Geben Sie Werte für "X" und "Y" ein, und vergleichen Sie anhand dieser Daten Ihre tatsächliche Leistung mit den Kosten.

GPU-Typ Durchschn. Latenz (pro 250 Segmente) Durchsatz (Segmente/Sek.) Hinweise:
A10 X ms J Geringere Kosten, geeignet für Entwicklung/Test
A100 X ms J Hohe Leistung, höhere Kosten
L40S X ms J Gutes Gleichgewicht zwischen Preis/Leistung
  • Empfehlung: Wählen Sie GPU basierend auf Workload-Größe, SLA-Latenzanforderungen und Budget aus.
  • Optimierung: Wird mit FP16/gemischter Genauigkeit (sofern unterstützt) ausgeführt, um die Latenz zu reduzieren.

OKE-Cluster entwerfen

Entwerfen Sie Ihre OKE-Cluster entsprechend Ihrem Deployment.

In diesem Beispiel wird ein Cluster-Setup mit zwei Knotenpools verwendet:

  • NodePool 1 (CPU-Knoten): Führt UI, Worker, RabbitMQ und interne DB aus
  • NodePool 2 (GPU-Knoten): Führt TorchServe-Inferenzpods aus

Stellen Sie ausreichend BV auf den GPU-Knoten sicher.

Beschriften Sie die Knotenpools:

  • nodepool=cpu auf CPU-Knoten
  • nodepool-gpu und nvidia.com/gpu.present=true auf GPU-Knoten

Stellen Sie sicher, dass das OKE NVIDIA-Geräte-Plug-in-Add-on auf GPU-Knoten aktiviert ist und dass nvidia-smi funktioniert.

GPUs validieren

Um sicherzustellen, dass GPUs sowohl für den OKE-Knoten als auch für TorchServe-Pods verfügbar sind, führen Sie die folgenden Validierungsschritte aus.

Wenn beide Prüfungen erfolgreich sind, wird bestätigt, dass das NVIDIA-Geräte-Plug-in-Add-on aktiviert ist und keine zusätzliche Treiber-/Softwareinstallation erforderlich ist.
  1. GPU-Sichtbarkeit auf dem Worker-Knoten prüfen. Beispiel:
    [opc@oke-cvxkfx3tnkq-nkteldpxwna-s3xcmkmmoda-0 ~]$ nvidia-smi -L
    GPU 0: NVIDIA A10 (UUID: GPU-eae0552a-e1d7-7c0f-dc39-886f4eafb439)
  2. Prüfen Sie den GPU-Zugriff im Pod TorchServe. Beispiel:
    [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)

Designmodellverteilung

Sie haben zwei Optionen, um das Modell .mar für Inferenzpods verfügbar zu machen.

  • Verwenden Sie OCI Object Storage-Buckets als Persistent Volume Claim (PVC) mit dem Container Storage Interface-(CSI-)Treiber.
  • Übertragen Sie Ihr Modell mit Secure Copy Protocol (SCP) in OCI File Storage, und verwenden Sie das Dateisystem als Mount Point für einen PVC. Beispiel:
    scp -i /path/to/private_key /path/to/local/model.mar
          opc@<file_storage_instance_ip>:/path/to/destination/mount/point/models/

Wir empfehlen OCI Object Storage aus Gründen der Einfachheit oder OCI File Storage, wenn mehrere Modelle mit häufigen Updates vorhanden sind.

TorchServe bereitstellen

Validieren Sie die Methode für das Deployment von TorchServe.

Die folgenden YAML-Dateien enthalten Beispiele für Deployment und Konfiguration.

  • Verwenden Sie OCI Load Balancing (Ingress zu OKE zu TorchServe-Pods).
  • Sicher mit TLS am Load Balancer.
  • Setzen Sie den TorchServe-Verwaltungsport (8081) niemals dem öffentlichen Internet frei.

Hinweis:

  • Ändern Sie die image:-Anweisung des Containers so, dass sie auf den tatsächlichen Speicherort und die tatsächliche Version des TorchServe-Containers verweist.
  • multispk_20250121_tts ist ein benutzerdefinierter Modellname, der hier als Beispiel verwendet wird. Sie können ihn durch den Namen Ihres eigenen Modells und die Datei .mar ersetzen.

Taschenlampe 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

Autoscaling einrichten

Autoscaling auf Pod- und Mitarbeiterebene einrichten

Richten Sie Autoscaling auf Pod-Ebene ein, indem Sie Kubernetes Event-driven Autoscaler (KEDA) mit Prometheus-Metriken verwenden, um TorchServe-Pods basierend auf der Tiefe der Anforderungswarteschlange oder benutzerdefinierten Metriken oder der CPU/GPU-Auslastung zu skalieren.

Richten Sie Autoscaling auf Mitarbeiterebene ein (TorchServe).

Hinweis:

In den folgenden Beispielen wird TorchServe Model Lifecycle mit multispk_20250121_tts verwendet.
  1. Registrieren Sie das Modell. Beispiel: Führen Sie den folgenden Befehl von einem beliebigen Remoteclient aus, der den Endpunkt TorchServe über HTTP erreichen kann, um die Datei .mar bei einem anfänglichen Worker zu registrieren.
    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.
    Die IP (10.0.20.160) und der Port (8081) beziehen sich auf den Inferenzmanagement-API-Endpunkt TorchServe.
  2. Heben Sie die Registrierung eines Modells auf. Beispiel:
    curl -X DELETE "http://10.0.20.160:8081/models/multispk_20250121_tts"
  3. Skalieren/Hinzufügen von Mitarbeitern. Beispiel: So aktualisieren Sie die Anzahl der Mitarbeiter für das ausgeführte Modell:
    curl -X PUT "http://10.0.20.160:8081/models/multispk_20250121_tts?min_worker=12"

Testperformance

Validieren Sie Ihr Design mit Performancetests.

  1. Senden Sie aus der Clientanwendung 250 nebenläufige Segmente. Erfassung:
    • Latenzzeit p50/p95
    • Durchsatz (Segmente/Sek.)
    • GPU-Auslastung (nvidia-smi)
    • End-to-End-Jobabschlusszeit
  2. Führen Sie aus dem Pod Folgendes aus:
    kubectl exec -it <pod_name> -- nvidia-smi
  3. Führen Sie in der TorchServe-Metrik-API (Port 8082) Folgendes aus:
    curl http://10.0.20.160:8082/metrics

Überlegungen zur Sicherheit und Kostenoptimierung

Berücksichtigen Sie bei der Validierung Ihres Designs Sicherheits- und Kostenoptimierungsfaktoren:

  • Sicherheitsbetrachtungen:
    • Erzwingen Sie die TLS-Beendigung beim Load Balancer oder Ingress.
    • Behalten Sie die TorchServe-Management-API nur intern bei.
    • Mit OCI Identity and Access Management und Netzwerksicherheitsgruppen können Sie den Zugriff einschränken.
  • Überlegungen zur Kostenoptimierung:
    • Wählen Sie Ihren GPU-Typ basierend auf einem Gleichgewicht zwischen Service Level Agreement (SLA) und Kosten aus.
    • Geplante Skalierung verwenden (GPU-Knotenpool außerhalb der Spitzenzeiten horizontal skalieren).
    • Verwenden Sie OCI Object Storage über OCI File Storage, wenn Ihre Modelle selten aktualisiert werden.
    • Inferenz läuft nicht immer 24×7. Teilen Sie nicht verwendete GPUs mit Trainings-Workloads in Leerlaufphasen, um die Auslastung zu maximieren und Kosten zu senken.