验证体系结构

如果要部署类似于此解决方案中描述的体系结构,应根据以下主题中的标准对其进行验证。考虑 GPU 选择、集群设置、分发和部署、自动缩放、性能测试、安全性和成本。

选择 GPU

您需要部署基于 GPU 的推断服务来将文本段转换为语音,从而确保性能、可扩展性和成本效率。您可以评估 GPU 模型(A10、A100、L40S)以确定适合该用例的最佳方案。

您可以对不同的 GPU 类型执行基准测试。下表提供了模板。输入 X 和 Y 的值,然后使用该数据将实际绩效与成本进行比较。

GPU 类型 平均延迟(每 250 个段) 吞吐量(段/秒) 说明
A10 X 毫秒 降低成本,适合开发/测试
A100 X 毫秒 高性能、高成本
L40S X 毫秒 性价比之间的良好平衡
  • 建议:根据工作负载大小、SLA 延迟要求和预算选择 GPU。
  • 优化:以 FP16/混合精度(如果支持)运行,以减少延迟。

设计 OKE 集群

设计 OKE 集群以适应您的部署。

在此示例中,我们使用具有两个节点池的群集设置:

  • NodePool 1(CPU 节点):运行 UI、worker、RabbitMQ 和内部数据库
  • NodePool 2(GPU 节点):运行 TorchServe 推断 pod

确保 GPU 节点上有足够的 BV。

对节点池进行标记:

  • CPU 节点上的 nodepool=cpu
  • GPU 节点上的 nodepool-gpunvidia.com/gpu.present=true

确保在 GPU 节点上启用了 OKE NVIDIA 设备插件附加,并且 nvidia-smi 可以正常工作。

验证 GPU

要确保 GPU 可用于 OKE 节点和 TorchServe 云池,请运行以下验证步骤。

如果两项检查都成功,它将确认 NVIDIA 设备插件插件已启用,并且不需要额外的驱动程序/软件安装。
  1. 验证 Worker 节点上的 GPU 可见性。例如:
    [opc@oke-cvxkfx3tnkq-nkteldpxwna-s3xcmkmmoda-0 ~]$ nvidia-smi -L
    GPU 0: NVIDIA A10 (UUID: GPU-eae0552a-e1d7-7c0f-dc39-886f4eafb439)
  2. 验证 TorchServe pod 中的 GPU 访问。例如:
    [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)

设计模型分布

有两个选项可用于将 .mar 模型提供给推断云池。

  • 使用容器存储接口 (Container Storage Interface,CSI) 驱动程序,将 OCI Object Storage 存储桶用作持久性卷声明 (PVC)。
  • 使用安全复制协议 (Secure Copy Protocol,SCP) 将模型传输到 OCI 文件存储,并将文件系统用作 PVC 的挂载点。例如:
    scp -i /path/to/private_key /path/to/local/model.mar
          opc@<file_storage_instance_ip>:/path/to/destination/mount/point/models/

我们建议您使用 OCI 对象存储来简化操作,如果您有多种型号且经常更新,我们建议您使用 OCI 文件存储

部署 TorchServe

验证部署 TorchServe 的方法。

以下 YAML 文件提供了部署和配置的示例。

  • 使用 OCI Load Balancing (从 OKE 入站到 TorchServe 云池)公开。
  • 在负载平衡器上使用 TLS 进行安全保护。
  • 切勿将 TorchServe 管理端口 (8081) 公开到公共 Internet。

注意:

  • 修改容器 image: 语句以指向您的实际 TorchServe 容器位置和版本。
  • multispk_20250121_tts 是此处用作示例的定制模型名称。您可以将其替换为您自己的模型名称和 .mar 文件。

火把 -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

设置自动缩放

在云池和员工级别设置自动缩放。

通过将 Kubernetes 事件驱动的自动缩放器 (KEDA) 与 Prometheus 度量一起使用,在云池级别设置自动缩放,以根据请求队列深度或定制度量或 CPU/GPU 占用率来扩展 TorchServe 云池。

设置员工级别的自动缩放 (TorchServe)。

注意:

在以下示例中,我们将 TorchServe 模型生命周期与 multispk_20250121_tts 一起使用。
  1. 注册模型。例如,从任何可以通过 HTTP 访问 TorchServe 端点的远程客户端运行以下命令,以向一个初始 worker 注册 .mar 文件。
    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.
    IP (10.0.20.160) 和端口 (8081) 指 TorchServe 推断管理 API 端点。
  2. 取消注册模型。例如:
    curl -X DELETE "http://10.0.20.160:8081/models/multispk_20250121_tts"
  3. 缩放/添加员工。例如,要更新正在运行的模型的 Worker 数,请执行以下操作:
    curl -X PUT "http://10.0.20.160:8081/models/multispk_20250121_tts?min_worker=12"

测试性能

通过性能测试验证您的设计。

  1. 在客户机应用程序中,发送 250 个并发段。Capture:
    • p50/p95 延迟
    • 吞吐量(段/秒)
    • GPU 使用率 (nvidia-smi)
    • 端到端作业完成时间
  2. 从 pod 运行:
    kubectl exec -it <pod_name> -- nvidia-smi
  3. 从 TorchServe 度量 API(端口 8082)运行:
    curl http://10.0.20.160:8082/metrics

安全性和成本优化的注意事项

验证设计时,请考虑安全性和成本优化因素:

  • 安全注意事项:
    • 在负载平衡器或入站处强制终止 TLS。
    • 仅在内部保留 TorchServe 管理 API。
    • 使用 OCI Identity and Access Management 和网络安全组来限制访问。
  • 成本优化注意事项:
    • 根据服务级别协议 (SLA) 与成本之间的平衡选择 GPU 类型。
    • 使用安排的缩放(在非高峰时段缩放 GPU 节点池)。
    • 如果不经常更新模型,请在 OCI File Storage 上使用 OCI Object Storage
    • 推理并不总是 24 × 7 运行。在空闲期间将未使用的 GPU 与训练负载共享,以充分提高利用率并降低成本。