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 CPUnodepool-gpu
envidia.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.
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 commultispk_20250121_tts
.
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.