本文說明如何啟用及使用 GKE Inference Gateway 中 llm-d 提供的預測延遲時間轉送。根據預設,GKE Inference Gateway 會結合負載信號和前置字元快取親和性啟發式方法,將要求轉送至模型伺服器。以預測延遲時間為依據的轉送功能,會以根據即時流量持續訓練的 XGBoost 模型,取代靜態啟發式權重,在工作負載模式變化時,做出更準確的轉送決策。
使用預測延遲時間路徑的時機
如果工作負載符合下列條件,這項功能就能發揮最大效益:
- 提示和完成長度差異很大:如果要求大小差異很大,單靠佇列深度無法準確反映伺服器負載。延遲時間預測工具會考量每個要求的實際預填和解碼費用。
- 每個要求的延遲時間 SLO:當應用程式在個別要求中指定第一個權杖生成時間 (TTFT) 或每個輸出權杖的時間 (TPOT) 目標時,排程器會在轉送期間強制執行這些目標。方法是計算每個候選 Pod 的預留空間 (預測延遲時間減去 SLO 目標)。
- 靜態權重微調容易出錯:如果流量模式改變,您經常需要重新微調快取親和性和負載信號之間的平衡,線上訓練模型就會自動調整。
以預測延遲為準的路由運作方式
本節將詳細說明預測延遲時間型路徑轉送使用的架構和排程管道。
架構
以預測延遲時間為準的排程,會在 EPP Pod 內部署兩個額外的補充資訊容器,與 EPP 本身並列:
| 元件 | 說明 |
|---|---|
| 訓練伺服器 | 持續根據 EPP 接收到的已完成要求樣本,重新訓練 XGBoost TTFT 和 TPOT 模型。在滑動視窗上使用分層分組,確保不會忘記罕見的流量狀態。將更新的模型寫入共用磁碟區。 |
| 預測伺服器 | 在要求熱路徑上,將 TTFT 和 TPOT 預測結果提供給 EPP。從共用磁碟區讀取經過訓練的最新模型。可水平擴充:每個伺服器執行個體約可維持 300 QPS 的預測工作。EPP 中的 Go 合併 Proxy 會在 1 毫秒的時間範圍內,批次處理並行預測要求,藉此平衡多個執行個體的負載。 |
llm-d EPP 排程管道
啟用以預測延遲時間為準的排程後,EPP 會透過下列可組合外掛程式序列處理每項要求:
predicted-latency-producer:呼叫預測伺服器,根據每個 Pod 目前的 KV 快取使用率、佇列深度、前置字元快取比對分數和傳入的要求特徵,取得InferencePool中每個候選 Pod 的 TTFT 和 TPOT 估計值。回應傳回給用戶端後,製作人會將觀察到的 TTFT 和權杖間延遲時間傳回訓練伺服器,做為新的訓練樣本。- 備援行為:如果無法連線至預測伺服器或伺服器傳回錯誤,EPP 會自動改用根據 KV 快取使用率、佇列深度和前置字元快取比對結果計算的綜合分數。
prefix-cache-affinity-filter:當任何 Pod 的前置字元快取相符分數超過親和性門檻 (預設為 0.80) 時,這個篩選器會將候選項目集縮小至快取暖機 Pod。這個門檻會區分兩種在正式環境中觀察到的族群:一種是已從先前的輪次快取對話記錄的 Pod,另一種則否。這個篩選器會實作 epsilon-greedy 探索和開發策略:利用 (預設路徑):這個路徑會將流量導向快取暖機 Pod,因此評分會著重於這些 Pod 的快取重複使用率。
探索 (機率較小):這個路徑會完全略過可設定比例的要求篩選器,在冷 Pod 上植入快取項目,避免快取片段化。
TTFT 載入閘道:即使在利用路徑上,如果最佳快取暖機 Pod 的預測 TTFT 超過最佳整體 Pod 的 TTFT,且超過可設定的門檻 (預設為 5,000 毫秒),就會中斷親和性並使用完整候選項目集。
slo-headroom-tier-filter(僅限 SLO 要求):要求包含 SLO 標頭時,會將候選 Pod 分成正向層級 (預計符合 SLO) 和負向層級 (預計違反 SLO)。latency-scorer:為候選 Pod 評分。如果沒有 SLO 標頭,系統會選取預測延遲時間最短的 Pod。使用 SLO 標頭時,分數會根據預留空間 (SLO 減去預測延遲時間) 採用以下公式計算:headroomSelectionStrategy:least(預設):將項目裝入箱子。前往正向空間最小的 Pod,盡量提高使用率,並讓負載較低的 Pod 可供未來流量爆增時使用。most:擴散。前往 Pod 的路徑,且有最正向的預留空間,可因應非預期的負載尖峰。
latency-slo-admitter(僅限服務等級目標要求):如果預測沒有候選 Pod 能達到服務等級目標,則拒絕可卸除的要求 (優先順序小於 0),而不是在預測會錯過目標的要求上耗用容量。如果沒有服務水準目標標頭,或有符合服務水準目標的 Pod,這項篩選條件就不會生效。weighted-random-picker:使用加權隨機選取方式,根據分數選取最終 Pod。這樣可分散負載,同時優先處理評分較高的 Pod。
串流模式
predicted-latency-producer 外掛程式支援兩種訓練模式,可使用 streamingMode 參數設定:
streamingMode: false(預設值):根據端對端 (E2E) 要求延遲時間進行訓練。如果工作負載混合使用串流和非串流回應,或只需要延遲感知型路徑,而不需要強制執行每個要求的 SLO,請使用這個模式。streamingMode: true:訓練個別的 TTFT 和 TPOT 模型。TTFT 會記錄在第一個串流區塊中,TPOT 則會在後續的權杖中取樣。如果工作負載完全是串流,且需要有意義的x-slo-ttft-ms/x-slo-tpot-ms強制執行,請使用這個模式。
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
視需要啟用 Compute Engine API、Network Services API 和 Model Armor API。
確認您已部署可正常運作的 GKE Inference Gateway。請參閱「部署 GKE Inference Gateway」。
請確保
InferencePool使用同質的 Pod 組合,也就是相同的 GPU 類型、模型權重和服務設定。確認 GKE 叢集為 1.32.3 以上版本。
安裝 Helm。請參閱 Helm 安裝指南。
啟用以預測延遲時間為準的排程
下列步驟會引導您為 GKE Inference Gateway 部署作業啟用以預測延遲為準的排程。
步驟 1:安裝或升級 InferencePool,並啟用預測延遲功能
latencyPredictor.enabled=true 標記會在 EPP Pod 內部署 Training Server 和 Prediction Server Sidecar,並設定完整的排程外掛程式管道:
helm upgrade --install INFERENCE_POOL_NAME \
--set inferencePool.modelServers.matchLabels.app=MODEL_SERVER_LABEL \
--set provider.name=gke \
--set inferenceExtension.monitoring.gke.enabled=true \
--set inferenceExtension.latencyPredictor.enabled=true \
--version LLM_D_VERSION \
oci://LLM_D_REGISTRY_PATH
更改下列內容:
INFERENCE_POOL_NAME:InferencePool 的名稱,例如vllm-llama3-8b-instruct。MODEL_SERVER_LABEL:用於選取模型伺服器 Pod 的標籤鍵。LLM_D_VERSION:要使用的 llm-d Helm 資訊套件版本。LLM_D_REGISTRY_PATH:llm-d OCI 登錄路徑。
步驟 2:驗證部署作業
確認 EPP Pod 正在執行,且所有 Sidecar 容器均已準備就緒:
kubectl get pods -l app=INFERENCE_POOL_NAME-epp
EPP Pod 應會顯示所有處於「執行中」或「就緒」狀態的容器:EPP 本身、訓練伺服器,以及一或多個預測伺服器。
步驟 3:傳送基準要求
傳送標準推論要求,確認路由正常運作,再啟用 SLO 標頭:
curl -i -X POST GATEWAY_IP:PORT/v1/completions \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer $(gcloud auth print-access-token)' \
-H 'x-prediction-based-scheduling: true' \
-d '{
"model": "MODEL_NAME",
"prompt": "PROMPT_TEXT",
"max_tokens": MAX_TOKENS,
"temperature": "0"
}'
更改下列內容:
GATEWAY_IP:閘道服務的 IP 位址。PORT:閘道服務的通訊埠編號。MODEL_NAME:用於推論的模型名稱。PROMPT_TEXT:輸入提示。MAX_TOKENS:要產生的權杖數量上限。
x-prediction-based-scheduling: true 標頭會將這項要求加入預測延遲排程管道。在預測器暖機期間,EPP 會改用啟發式路徑。
步驟 4:傳送 SLO 感知要求 (選用)
如要啟用依要求強制執行的 SLO,請新增 TTFT 和 TPOT 延遲目標標頭:
curl -i -X POST GATEWAY_IP:PORT/v1/completions \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer $(gcloud auth print-access-token)' \
-H 'x-prediction-based-scheduling: true' \
-H 'x-slo-ttft-ms: 500' \
-H 'x-slo-tpot-ms: 50' \
-d '{
"model": "MODEL_NAME",
"prompt": "PROMPT_TEXT",
"max_tokens": MAX_TOKENS,
"temperature": "0",
"stream": true
}'
更改下列內容:
GATEWAY_IP:閘道服務的 IP 位址。PORT:閘道服務的通訊埠編號。MODEL_NAME:用於推論的模型名稱。PROMPT_TEXT:輸入提示。MAX_TOKENS:要產生的權杖數量上限。
要求標頭:
x-prediction-based-scheduling: true:要求加入預測延遲時間排程管道。x-slo-ttft-ms:可接受的「首次權杖時間」上限 (以毫秒為單位)。x-slo-tpot-ms:可接受的個別輸出詞元時間上限 (以毫秒為單位)。
監控預測延遲排程
啟用延遲預測器後,EPP 會透過 Cloud Monitoring 公布其他指標。
| 指標 | 說明 |
|---|---|
inference_objective_request_ttft_seconds |
實際 TTFT 分布 (或 E2E 延遲時間,如果 streamingMode=false)。 |
inference_objective_request_predicted_ttft_seconds |
預測 TTFT 分布情形 (如果 streamingMode=false,則為 E2E 延遲)。 |
inference_objective_request_tpot_seconds |
實際 TPOT 分配情形。 |
inference_objective_request_predicted_tpot_seconds |
預測的 TPOT 分布情形。 |
inference_objective_request_ttft_slo_violation_total |
違反 TTFT 服務水準目標的次數。 |
擴充預測伺服器
針對每個候選 Pod,EPP 會對每個傳入要求發出一次預測呼叫。每個 Prediction Server 執行個體可維持約 300 QPS 的預測工作。
預測伺服器執行個體數量的概略指引:
| 叢集 QPS (100 個 Pod) | 需要預測伺服器 |
|---|---|
| 每秒最多查詢 1,000 次 | 1 個伺服器 |
| 每秒最多查詢 5,000 次 | 2 部伺服器 |
| 每秒最多查詢 10,000 次 | 4 個伺服器 |
更新 latencyPredictor.predictionServerCount Helm 值,新增 Prediction Server 執行個體。
限制
- 需要同質性
InferencePool:不支援單一集區內的混合 GPU 類型、模型變體或服務設定。 - 暖機期:XGBoost 模型需要足夠的即時流量樣本,預測結果才會準確。
- 服務等級目標強制執行:強制執行只會在路由層級進行。模型伺服器不會在選取後終止超出服務等級目標的要求。
- 狀態:這項功能為預先發布版。如未經過完整測試,不建議將其用於服務水準協議要求嚴格的正式環境工作負載。