驗證架構

如果您想要部署的架構與本解決方案所述的架構類似,請依照下列主題中的條件進行驗證。考慮 GPU 選擇、叢集設定、分配與部署、自動調整、效能測試、安全性和成本。

選取 GPU

您需要部署 GPU 驅動的推論服務,才能將文字區隔轉換為語音,確保效能、擴展性及成本效益。您可以評估 GPU 模型 (A10、A100、L40S),以判斷最適合的使用案例。

您可以執行不同 GPU 類型的基準測試。下表提供範本。輸入 X 與 Y 的值,並使用該資料來比較實際績效與成本。

GPU 型態 平均延遲 (每 250 個區段) 傳輸量 (區段 / 秒) 備註
A10 X 毫秒 Y 低成本,適合開發 / 測試
A100 X 毫秒 Y 高效能、更高成本
L40S X 毫秒 Y 在價格 / 績效之間取得良好平衡
  • 建議:根據工作負載大小、SLA 延遲需求和預算選取 GPU。
  • 最佳化:以 FP16/ 混合精確度 (如果支援) 執行,以降低延遲。

設計 OKE 叢集

設計 OKE 叢集以配合您的部署。

在此範例中,我們使用具有兩個節點集區的叢集設定:

  • NodePool 1 (CPU 節點) :執行 UI、工作者、RabbitMQ 和內部資料庫
  • NodePool 2 (GPU 節點) :執行 TorchServe 推論 Pod

請確定 GPU 節點上有足夠的 BV。

為節點集區加上標籤:

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

確定 GPU 節點上已啟用 OKE NVIDIA 裝置 Plugin 附加元件,而且 nvidia-smi 可以運作。

驗證 GPU

若要確保 GPU 可供 OKE 節點和 TorchServe Pod 使用,請執行下列驗證步驟。

如果兩項檢查都成功,則確認已啟用 NVIDIA 裝置外掛程式,且不需要安裝其他驅動程式 / 軟體。
  1. 驗證工作者節點上的 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 模型可供推論 Pod 使用的選項。

  • 使用容器儲存介面 (CSI) 驅動程式,將 OCI Object Storage 儲存桶作為永久磁碟區宣告 (PVC)。
  • 使用安全複製協定 (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 Object Storage ,如果您有多個具有頻繁更新的模型,則建議使用 OCI File Storage

部署 TorchServe

驗證部署 TorchServe 的方法。

下列 YAML 檔案提供部署和組態的範例。

  • 使用 OCI 負載平衡顯示 (傳入至 OKE 至 TorchServe Pod)。
  • 在負載平衡器使用 TLS 保護。
  • 絕對不要將 TorchServe 管理連接埠 (8081) 公用網際網路公開。

附註:

  • 修改容器 image: 敘述句,以指向您實際的 TorchServe 容器位置和版本。
  • multispk_20250121_tts 是此處用來作為範例的自訂模型名稱。您可以將它取代為自己的模型名稱和 .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

組態圖 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

設定自動調整

在 Pod 和工作者層級設定自動調整功能。

使用含有 Prometheus 指標的 Kubernetes 事件導向自動調整工具 (KEDA) 在 Pod 層級設定自動調整功能,根據要求佇列深度、自訂指標或 CPU/GPU 使用率調整 TorchServe Pod。

設定工作層級自動調整 (TorchServe)。

附註:

在下列範例中,我們將 TorchServe 模型生命週期與 multispk_20250121_tts 搭配使用。
  1. 註冊模型。例如,從可透過 HTTP 連線至 TorchServe 端點的任何遠端從屬端執行下列命令,將您的 .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. 調整 / 新增工作者規模。例如,若要更新執行中模型的工作程式數目:
    curl -X PUT "http://10.0.20.160:8081/models/multispk_20250121_tts?min_worker=12"

測試效能

使用效能測試驗證您的設計。

  1. 從用戶端應用程式中,傳送 250 個並行區段。擷取:
    • 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 Object Storage over OCI File Storage
    • 推論不一定會全天候執行。在閒置期間與訓練工作負載共用未使用的 GPU,以最大化使用率並降低成本。