Validar uma Arquitetura

Se quiser implantar uma arquitetura semelhante à descrita nesta solução, você deverá validá-la de acordo com os critérios nos tópicos a seguir. Considere a seleção de GPU, a configuração do cluster, a distribuição e a implantação, o dimensionamento automático, o teste de desempenho, a segurança e o custo.

Selecionar GPUs

Você precisa implantar um serviço de inferência com GPU para converter segmentos de texto em fala, garantindo desempenho, escalabilidade e economia. Você pode avaliar modelos de GPU (A10, A100, L40S) para determinar o melhor ajuste para o caso de uso.

Você pode executar testes de benchmarking com diferentes tipos de GPU. A tabela a seguir fornece um modelo. Informe valores para X e Y e use esses dados para comparar seu desempenho real com o custo.

Tipo de GPU Média de Latência (por 250 segmentos) Throughput (segmentos/segundo) Notas
A10 X ms S Menor custo, adequado para desenvolvimento/teste
A100 X ms S Alto desempenho, custo mais alto
L40S X ms S Bom equilíbrio entre preço e desempenho
  • Recomendação: selecione GPU com base no tamanho da carga de trabalho, requisitos de latência de SLA e orçamento.
  • Otimização: Execute com precisão FP16/misturada (onde for suportado) para reduzir a latência.

Projetar Clusters do OKE

Projete seus clusters do OKE para se adequarem à sua implantação.

Neste exemplo, usamos uma configuração de cluster com dois pools de nós:

  • NodePool 1 (Nós de CPU): Executa UI, workers, RabbitMQ e BD interno
  • NodePool 2 (Nós GPU): Executa pods de inferência TorchServe

Garanta BV suficiente nos nós de GPU.

Identifique os pools de nós como:

  • nodepool=cpu nos nós da CPU
  • nodepool-gpu e nvidia.com/gpu.present=true nos nós de GPU

Certifique-se de que o complemento de plug-in de dispositivo NVIDIA do OKE esteja ativado nos nós GPU e que o nvidia-smi funcione.

Validar GPUs

Para garantir que as GPUs estejam disponíveis para os pods do nó OKE e TorchServe, execute as etapas de validação a seguir.

Se ambas as verificações forem bem-sucedidas, ele confirmará que o complemento de plug-in do dispositivo NVIDIA está ativado e que nenhuma instalação adicional de driver/software é necessária.
  1. Verifique a visibilidade da GPU no nó de trabalho. Por exemplo:
    [opc@oke-cvxkfx3tnkq-nkteldpxwna-s3xcmkmmoda-0 ~]$ nvidia-smi -L
    GPU 0: NVIDIA A10 (UUID: GPU-eae0552a-e1d7-7c0f-dc39-886f4eafb439)
  2. Verifique o acesso à GPU dentro do pod TorchServe. Por exemplo:
    [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)

Distribuição do Modelo de Design

Você tem duas opções para disponibilizar o modelo .mar para pods de inferência.

  • Use os buckets do OCI Object Storage como uma reivindicação de volume persistente (PVC) usando o driver CSI (Container Storage Interface).
  • Transfira seu modelo para o OCI File Storage usando o Secure Copy Protocol (SCP) e use o sistema de arquivos como ponto de montagem para uma PVC. Por exemplo:
    scp -i /path/to/private_key /path/to/local/model.mar
          opc@<file_storage_instance_ip>:/path/to/destination/mount/point/models/

Recomendamos o OCI Object Storage para simplificar ou o OCI File Storage se você tiver vários modelos com atualizações frequentes.

Implantar TorchServe

Valide seu método para implantar o TorchServe.

Os arquivos YAML a seguir fornecem exemplos de implantação e configuração.

  • Exponha o uso do OCI Load Balancing (Entrada para pods OKE a TorchServe).
  • Proteja com TLS no balanceador de carga.
  • Nunca exponha a porta de gerenciamento TorchServe (8081) à internet pública.

Observação:

  • Modifique a instrução image: do contêiner para apontar para o local e a versão reais do contêiner TorchServe.
  • multispk_20250121_tts é um nome de modelo personalizado usado aqui como exemplo. Você pode substituí-lo pelo nome do seu próprio modelo e pelo arquivo .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

Configurar Dimensionamento Automático

Configure o dimensionamento automático no nível do pod e do colaborador.

Configure o dimensionamento automático no nível do pod usando o KEDA (Kubernetes Event-driven Autoscaler) com métricas do Prometheus para dimensionar pods TorchServe com base na profundidade da fila de solicitações ou métricas personalizadas ou utilização de CPU/GPU.

Configure o dimensionamento automático no nível do colaborador (TorchServe).

Observação:

Nos exemplos a seguir, estamos usando o Ciclo de Vida do Modelo TorchServe com multispk_20250121_tts.
  1. Registre o modelo. Por exemplo, execute o comando a seguir em qualquer cliente remoto que possa acessar o ponto final TorchServe por HTTP para registrar seu arquivo .mar com um worker inicial.
    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.
    O IP (10.0.20.160) e a porta (8081) referem-se ao ponto final da API de gerenciamento de inferência TorchServe.
  2. Cancelar o registro de um modelo. Por exemplo:
    curl -X DELETE "http://10.0.20.160:8081/models/multispk_20250121_tts"
  3. Dimensionar/adicionar colaboradores. Por exemplo, para atualizar o número de colaboradores do modelo em execução:
    curl -X PUT "http://10.0.20.160:8081/models/multispk_20250121_tts?min_worker=12"

Desempenho do Teste

Valide seu design com testes de desempenho.

  1. No aplicativo cliente, envie 250 segmentos simultâneos. Captura:
    • Latência p50/p95
    • Throughput (segmentos/segundo)
    • Utilização de GPU (nvidia-smi)
    • Tempo de conclusão do job de ponta a ponta
  2. No pod, execute:
    kubectl exec -it <pod_name> -- nvidia-smi
  3. Na API de métricas TorchServe (porta 8082), execute:
    curl http://10.0.20.160:8082/metrics

Considerações sobre Segurança e Otimização de Custos

Ao validar seu design, considere fatores de segurança e otimização de custos:

  • Considerações de segurança:
    • Imponha o encerramento de TLS no balanceador de carga ou na entrada.
    • Mantenha a API de gerenciamento TorchServe somente interna.
    • Use o OCI Identity and Access Management e os Grupos de Segurança de Rede para limitar o acesso.
  • Considerações sobre otimização de custos:
    • Escolha seu tipo de GPU com base em um saldo entre contrato de nível de serviço (SLA) e custo.
    • Use o dimensionamento programado (diminua o pool de nós de GPU durante horas sem pico).
    • Use o OCI Object Storage no OCI File Storage se seus modelos forem atualizados com pouca frequência.
    • A inferência nem sempre é 24×7. Compartilhe GPUs não utilizadas com cargas de trabalho de treinamento durante períodos ociosos para maximizar a utilização e reduzir custos.