在LLM情境中,業務應用需要對接內部或外部的基本模型服務。Service Mesh (ASM)支援同時對接多個基本模型服務,並且可以實現當一個模型服務不可用時,自動回退到另一個模型服務,助力企業實現LLM應用的高可用。本文介紹如何在對接LLM服務時使用流量回退功能。
前提條件
已添加叢集到ASM執行個體,且ASM執行個體版本為v1.22.6.72及以上。
已為命名空間注入Sidecar。具體操作,請參見管理全域命名空間。
步驟一:建立兩個LLMProvider
使用以下內容建立provider.yaml。此YAML將會在ASM中建立兩個LLMProvider,一個是測試Provider,用於類比Provider出現無法提供服務時的情境,另一個是可以正常使用的千問Provider。
apiVersion: istio.alibabacloud.com/v1beta1 kind: LLMProvider metadata: name: asm-llm-provider-test spec: host: asm-llm-provider-test.com path: /compatible-mode/v1/chat/completions workloadSelector: labels: app: sleep configs: defaultConfig: openAIConfig: model: test-model stream: false apiKey: test-api-key --- apiVersion: istio.alibabacloud.com/v1beta1 kind: LLMProvider metadata: name: dashscope-qwen spec: host: dashscope.aliyuncs.com path: /compatible-mode/v1/chat/completions workloadSelector: labels: app: sleep configs: defaultConfig: openAIConfig: model: qwen1.5-72b-chat # 千問開源系列大模型 stream: false apiKey: ${dashscope的API_KEY}您可以根據實際需求修改
.spec.configs.defaultConfig.openAIConfig.model來體驗其他模型。更多千問開源模型,請參見文本產生-千問-開源版。使用ASM的kubeconfig執行以下命令,部署LLMProvider。
kubectl apply -f provider.yaml
步驟二:配置異常端點驅逐策略以及回退策略
異常端點驅逐策略需要在目標規則中進行配置。通過配置驅逐策略和回退策略,可以在LLM請求出現異常時,驅逐對應的Provider,並將請求流量回退到可用的Provider上。LLMProvider資源預設會自動產生對應的目標規則,因此需要修改對應的目標規則資源來添加異常端點驅逐策略。
執行以下命令,為LLMProvider
asm-llm-provider-test配置註解以開啟自訂目標規則,防止修改後的目標規則被ASM控制面覆蓋。kubectl annotate llmprovider asm-llm-provider-test asm.alibabacloud.com/custom-destinationrule=true執行以下命令,修改目標規則,增加異常端點驅逐策略。
kubectl edit DestinationRule/asm-llm-provider-test修改後目標規則如下。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: asm-llm-provider-test namespace: default spec: host: asm-llm-provider-test.com trafficPolicy: portLevelSettings: - port: number: 80 tls: mode: SIMPLE sni: asm-llm-provider-test outlierDetection: consecutive5xxErrors: 1 interval: 1s baseEjectionTime: 10s maxEjectionPercent: 100 minHealthPercent: 0以上修改在目標規則中新增了一段
outlierDetection配置。如果LLM請求在1s內出現1個5xx錯誤,將驅逐該端點,驅逐的時間長度為10s。outlierDetection配置說明如下:配置項
說明
consecutive5xxErrors
定義在驅逐之前,允許的連續5xx錯誤請求的最大數量。如果達到這個閾值,將進行驅逐。預設值為
5,即如果連續五次請求返回5xx錯誤,服務將被標記為不健康。interval
定義活動訊號間隔時間時間,即多長時間檢查一次服務的健康情況。預設值為
10s。例如,5s表示每五秒檢查一次。支援格式為1h/1m/1s/1ms,最小值必須≥1ms。baseEjectionTime
指定服務被驅逐的基礎時間。即一個服務在被標識為不健康後,將在此時間內不被重新使用,預設值為
30s。支援格式為1h/1m/1s/1ms,最小值必須≥1ms。maxEjectionPercent
允許被驅逐的最大服務比例,防止過多服務被同時排除。例如,設定為
100表示可以驅逐所有服務。預設值為10%。minHealthPercent
定義健康服務的最小百分比,以確保在驅逐某些服務後,仍然有足夠的健康服務可供請求處理。預設值為
0,表示禁用檢測當前是否存在處於健康狀態的服務,即允許所有服務被標記為不健康。更多關於
outlierDetection的配置資訊,請參見OutlierDetection。建立虛擬服務,配置回退策略。
使用以下內容,建立vs.yaml。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: test-fallback-llm-vs namespace: default spec: hosts: - asm-llm-provider-test.com http: - name: fallback-route route: - destination: host: asm-llm-provider-test.com port: number: 80 fallback: target: host: dashscope.aliyuncs.com執行以下命令,建立虛擬服務。
kubectl apply -f vs.yaml此配置聲明了當
asm-llm-provider-test.com被判定為不健康時,請求將自動轉寄給dashscope.aliyuncs.com。
步驟三:建立測試應用sleep
為了確保配置的asm-llm-provider-test.com可以被DNS解析,此sleep Deployment中使用hostAlias添加了靜態DNS配置。使用以下內容,建立sleep.yaml
使用資料面叢集的kubeconfig,執行以下命令。
kubectl apply -f sleep.yaml
步驟四:測試
從sleep Pod中連續發起兩次以下LLM請求。
本文中配置的驅逐時間長度為10s,因此需要在10s內發起第二次請求。您可以根據實際業務需求,自行調整outlierDetection配置。
kubectl exec deployment/sleep -it -- curl http://asm-llm-provider-test.com \
--header 'Content-Type: application/json' \
--data '{
"messages": [
{"role": "user", "content": "請介紹你自己"}
]
}'預期輸出:
no healthy upstream%
{"choices":[{"message":{"role":"assistant","content":"我是來自阿里雲的大規模語言模型,我叫千問。我的主要功能是回答使用者的問題、提供資訊和進行對話交流。我可以理解使用者的提問,並基於自然語言產生相應的答案或建議。我也可以學習新的知識,並將其應用於各種情境中。如果您有任何問題或需要協助,請隨時告訴我,我會儘力為您提供支援。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":11,"completion_tokens":72,"total_tokens":83},"created":1730261854,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"xxxxxx"}可以看到,請求直接被發送給了dashscope.aliyuncs.com。
相關文檔
流量回退是流量路由中的一種重要流量管理原則,當請求鏈路中某個LLM Provider出現臨時的不可用狀態時,您可以通過配置異常驅逐和回退策略來確保服務的正常運行。若您想瞭解更多流量路由的應用情境,例如不同使用者訪問不同的LLM Provider,請參見流量路由:使用ASM高效管理LLM流量。