在大語言模型(LLM)應用場景中,存在資源需求不確定性、后端推理實例負載不均衡等問題。為了優化這類問題,EAS引入了LLM智能路由基礎組件。在請求調度層,基于LLM場景所特有的Metrics(指標),來動態進行請求分發,保證后端推理實例處理的算力和顯存盡可能均勻,提升集群資源使用水位。
背景信息
在大語言模型應用場景中,用戶請求與模型響應的長度差異,以及模型在Prompt提示和Generate生成階段產生的Token數量的隨機性,導致單個請求所占用的GPU資源量不確定。傳統網關的負載均衡策略,如輪詢(Round-Robin)和最少連接(Least-Connection),因無法實時感知后端算力資源的負載壓力,從而導致后端推理實例的負載不均衡,影響系統吞吐量和響應延時。尤其是耗時較長、GPU計算量較大或占用GPU顯存較高的長尾請求,會進一步加劇資源分配不均衡的問題,降低了集群的整體效能。
為有效優化上述問題,EAS在請求調度層面提供了LLM智能路由這一基礎組件。該組件針對LLM場景所特有的Metrics來動態進行請求分發,確保各個推理實例的計算力與顯存資源得到均衡分配,從而顯著提升集群資源的利用效率與穩定性。
LLM智能路由在推理服務的速度和吞吐上有顯著的效果提升,請查閱附錄1:測試結果對比。
工作原理
LLM智能路由本質上是一種特殊的EAS服務,能夠將請求智能調度給后端推理服務。智能路由與推理實例是通過“服務群組”關聯的。具體原理如下:
LLM智能路由服務內部會默認內置一個LLM-Scheduler對象,用于實際匯集推理實例的Metrics(指標),并基于Metrics數據通過一定的算法來選擇全局最優的實例用于LLM-智能路由轉發請求。更多關于Metrics接口說明,請參見附錄2:Metrics接口說明。
LLM-Scheduler同時也會與推理實例之間建立保活鏈接,推理實例異常時會第一時間被感知到并停止轉發流量。
LLM-Gateway根據LLM-Scheduler的指示進行請求轉發,支持HTTP(SSE)和WebSocket協議。
使用限制
LLM智能路由應用于LLM推理場景,后端實例的推理框架僅支持BladeLLM或vLLM。
只有關聯多個推理實例,即與多個推理實例在同一服務群組中,LLM智能路由的功能價值才能得以發揮。
部署服務
部署LLM智能路由服務
支持以下兩種部署方式:
方式一:通過控制臺部署
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
在模型在線服務(EAS)頁面,單擊部署服務。
在部署服務頁面,選擇以下任意一種部署方式:
選擇自定義模型部署>自定義部署。
選擇場景化模型部署>LLM大語言模型部署,并在基本信息區域,選擇支持推理加速的模型類別:Qwen2-7b、Qwen1.5-1.8b、Qwen1.5-7b、Qwen1.5-14b、llama3-8b、llama2-7b、llama2-13b、chatglm3-6b、baichuan2-7b、baichuan2-13b、falcon-7b、yi-6b、mistral-7b-instruct-v0.2、gemma-2b-it、gemma-7b-it、deepseek-coder-7b-instruct-v1.5。
在服務功能區域,打開LLM智能路由開關,然后在下拉列表中,單擊新建LLM智能路由。
在新建LLM智能路由配置面板中,配置以下關鍵參數,然后單擊部署。
參數
描述
基本信息
服務名稱
按照控制臺操作指引,自定義配置LLM智能路由服務名稱。例如llm_router。
資源配置
部署資源
LLM-智能路由的資源配置。默認配置如下:
最小實例數:默認為2,建議您將最小實例數設置為2,以確保智能路由能夠多實例運行。
CPU:默認為2核。
內存:默認為4 GB。
調度資源
LLM-Scheduler調度資源。默認為:
CPU:2核。
內存:4 GB。
推理加速
請選擇您在鏡像中使用的推理框架,目前,LLM網關支持以下兩種框架類型:
PAI-BladeLLM自動推理加速
開源框架vllm推理加速
LLM智能路由服務部署成功后,會同步創建一個群組服務。您可以前往模型在線服務(EAS)頁面的灰度發布頁簽進行查看。服務群組名稱命名格式為group_LLM智能路由服務名稱。
由于智能路由與服務隊列沖突,建議您不要在該服務群組中創建隊列服務。
方式二:通過JSON獨立部署
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
在模型在線服務(EAS)頁面,單擊部署服務。
在自定義模型部署區域,單擊JSON獨立部署。
在JSON文本編輯框中配置以下內容,然后單擊部署。
配置文件內容示例如下:
說明為了防止單點故障,建議您將metadata.instance至少設置為2,以確保智能路由能夠多實例運行。
如果先部署LLM智能路由服務,該服務將保持等待狀態直至大語言模型(LLM)服務部署成功。
基礎配置:
{ "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "metadata": { "type": "LLMGatewayService", "cpu": 4, "group": "llm_group", "instance": 2, "memory": 4000, "name": "llm_router" } }
您只需將metadata.type配置為LLMGatewayService,即可部署LLM智能路由服務。其他參數配置說明,請參見服務模型所有相關參數說明。服務部署成功后,EAS會自動創建一個組合服務,包含LLM-智能路由和LLM-Scheduler,其中LLM-智能路由的資源配置使用的就是該服務的配置;LLM-Scheduler默認的資源配置為4核CPU和4 GiB內存。
高階配置:如果基礎配置無法滿足您的需求,您還可以參考以下高階配置,準備JSON文件:
{ "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "llm_gateway": { "infer_backend": "vllm", "max_queue_size": 128, "retry_count": 2, "wait_schedule_timeout": 5000, "wait_schedule_try_period": 500 }, "llm_scheduler": { "cpu": 4, "memory": 4000 }, "metadata": { "cpu": 2, "group": "llm_group", "instance": 2, "memory": 4000, "name": "llm_router", "type": "LLMGatewayService" } }
其中關鍵配置說明如下,其他參數配置說明,請參見服務模型所有相關參數說明。
配置
說明
llm_gateway.infer_backend
大語言模型使用的推理框架,支持:
vllm(默認值)
bladellm
llm_gateway.max_queue_size
LLM智能路由緩存隊列的最大長度,默認是128。
當超過后端推理框架處理能力時,待有可用推理實例時進行調度轉發。
llm_gateway.retry_count
重試次數,默認是2。當后端推理實例異常時,進行請求重試并轉發到新的實例。
llm_gateway.wait_schedule_timeout
超時時間,默認為5000毫秒。當LLM-Scheduler不可用時間達到超時時間后,LLM-智能路由使用簡單的Round-Robin策略進行請求分發。
llm_gateway.wait_schedule_try_period
當LLM-Scheduler不可用時,系統在wait_schedule_timeout超時時間內的重試頻率,默認為500毫秒。
llm_scheduler.cpu
指定LLM-Scheduler的CPU,默認為4核。
llm_scheduler.memory
指定LLM-Scheduler的Memory,默認為4 GiB。
llm_scheduler.instance_type
指定LLM-Scheduler的實例規格。該規格已經定義了CPU核數和內存大小,無需單獨配置CPU和Memory。
部署大語言模型(LLM)服務
支持以下兩種部署方式:
方式一:通過控制臺部署
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
在模型在線服務(EAS)頁面,單擊部署服務。
在部署服務頁面,選擇以下任意一種部署方式,并配置關鍵參數,其他參數配置說明,請參見服務部署:控制臺。
選擇自定義部署,并配置以下關鍵參數。
參數
描述
環境信息
部署方式
選擇鏡像部署,并選中開啟Web應用。
鏡像配置
支持使用官方鏡像或自定義鏡像:
選擇官方鏡像,鏡像選擇chat-llm-webui,鏡像名稱選擇chat-llm-webui:3.0-vllm或chat-llm-webui:3.0-blade。
選擇鏡像地址,并在文本框中輸入自定義鏡像地址。您的自定義鏡像后端推理框架需要是BladeLLM或vllm。
服務功能
LLM智能路由
打開LLM智能路由開關,并選擇已創建的LLM智能路由。
選擇LLM大語言模型部署,并配置以下關鍵參數。
參數
描述
基本信息
模型類別
從如下模型中任意選擇一個支持推理加速的模型類別:Qwen2-7b、Qwen1.5-1.8b、Qwen1.5-7b、Qwen1.5-14b、llama3-8b、llama2-7b、llama2-13b、chatglm3-6b、baichuan2-7b、baichuan2-13b、falcon-7b、yi-6b、mistral-7b-instruct-v0.2、gemma-2b-it、gemma-7b-it、deepseek-coder-7b-instruct-v1.5。
服務功能配置
LLM智能路由
打開LLM智能路由開關,并選擇已創建的LLM智能路由。
參數配置完成后,單擊部署。
方式二:通過JSON獨立部署
本方案以PAI提供的預置鏡像-開源vLLM-0.3.3版本為例,具體操作步驟如下:
在模型在線服務(EAS)頁面,單擊部署服務。
在自定義模型部署區域,單擊JSON獨立部署。
在JSON文本編輯框中配置以下內容,然后單擊部署。
配置文件內容示例如下:
{ "cloud": { "computing": { "instance_type": "ecs.gn7i-c16g1.4xlarge" } }, "containers": [ { "image": "eas-registry-vpc.<regionid>.cr.aliyuncs.com/pai-eas/chat-llm:vllm-0.3.3", "port": 8000, "script": "python3 -m vllm.entrypoints.openai.api_server --served-model-name llama2 --model /huggingface/models--meta-llama--Llama-2-7b-chat-hf/snapshots/c1d3cabadba7ec7f1a9ef2ba5467ad31b3b84ff0/" } ], "features": { "eas.aliyun.com/extra-ephemeral-storage": "50Gi" }, "metadata": { "cpu": 16, "gpu": 1, "instance": 5, "memory": 60000, "group": "llm_group", "name": "vllm_service" } }
其中關鍵配置說明如下,其他參數配置說明,請參見服務模型所有相關參數說明。
metadata.group:服務群組名稱。LLM服務必須與LLM智能路由在同一個群組下,這樣LLM服務才能向LLM-Scheduler進行注冊,并上報相關的Metric(指標),同時LLM智能路由才能進行流量轉發。
當使用控制臺方式創建LLM智能路由時,您需要在模型在線服務(EAS)頁面的服務群組頁簽,查看LLM智能路由所在的服務群組名稱。命名格式為group_LLM智能路由名稱。
當使用JSON獨立部署時,配置為llm_group。
containers.image:本方案使用PAI提供的預置鏡像,您需要將<regionid>替換為實際服務所在地域的ID,例如華北2(北京)配置為cn-beijing。
訪問服務
獲取服務訪問地址和Token
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
單擊LLM智能路由服務的服務方式列下的調用信息。
在調用信息對話框的公網地址調用頁簽,查詢服務訪問地址和Token。
配置訪問LLM智能路由服務的訪問地址。
訪問地址配置規則
示例值
配置規則為:
{domain}/api/predict/{group_name}.{router_service_name}_llm_gateway/{endpoint}
其中{endpoint}值需要根據您的LLM服務的API接口支持情況來進行配置,例如:
v1/completions
。以上述JSON獨立部署的LLM智能路由服務為例,步驟3的查詢結果為
http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/api/predict/llm_group.llm_router
,則服務訪問地址為http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/api/predict/llm_group.llm_router_llm_gateway/v1/completions
。
訪問測試
在終端中,執行以下命令訪問服務。
$curl -H "Authorization: xxxxxx" -H "Content-Type: application/json" http://***http://********.cn-beijing.pai-eas.aliyuncs.com/api/predict/{group_name}.{router_service_name}_llm_gateway/v1/completions -d '{"model": "llama2", "prompt": "I need your help writing an article. I will provide you with some background information to begin with. And then I will provide you with directions to help me write the article.", "temperature": 0.0, "best_of": 1, "n_predict": 34, "max_tokens": 34, "stream": true}'
其中:
"Authorization: xxxxxx":需要配置為上述步驟已獲取的Token。
http://********.cn-beijing.pai-eas.aliyuncs.com/api/predict/{group_name}.{router_service_name}_llm_gateway/v1/completions
:更新為上述步驟已配置的訪問地址。
返回結果示例如下:
data: {"id":"0d9e74cf-1025-446c-8aac-89711b2e9a38","choices":[{"finish_reason":"","index":0,"logprobs":null,"text":"\n"}],"object":"text_completion","usage":{"prompt_tokens":36,"completion_tokens":1,"total_tokens":37},"error_info":null}
data: {"id":"0d9e74cf-1025-446c-8aac-89711b2e9a38","choices":[{"finish_reason":"","index":0,"logprobs":null,"text":"\n"}],"object":"text_completion","usage":{"prompt_tokens":36,"completion_tokens":2,"total_tokens":38},"error_info":null}
data: {"id":"0d9e74cf-1025-446c-8aac-89711b2e9a38","choices":[{"finish_reason":"","index":0,"logprobs":null,"text":""}],"object":"text_completion","usage":{"prompt_tokens":36,"completion_tokens":3,"total_tokens":39},"error_info":null}
...
[DONE]
查看服務監控指標
服務測試完成后,您可以通過查看服務監控指標,來了解服務的性能。具體操作步驟如下:
在模型在線服務(EAS)頁面,單擊已部署的LLM智能路由服務的監控列下的。
在監控頁簽,查看以下指標信息。
Token Throughput
LLM輸入和輸出Token的Throughout
IN:表示LLM輸入Token的吞吐量。
OUT:表示LLM輸出Token的吞吐量。
GPU Cache Usage
LLM Engine GPU KV Cache的使用率
Engine Current Requests
LLM Engine實時請求并發數
Running:LLM Engine正在執行的請求數量。
Waiting:LLM Engine等待隊列中的請求數量。
Gateway Current Requests
LLM智能路由實時請求數
Total:LLM智能路由當前總共接收的請求數量(總實時并發數)。
Pending:LLM Engine未處理的緩存在LLM智能路由中的請求數。
Time To First Token
請求的首包延時
Max:請求首包延遲的最大值。
Avg:請求首包延遲的平均值。
Min:請求首包延遲的最小值。
TPxx:請求首包延遲的各個分位點值。
Time Per Output Token
請求的每包延時
Max:請求每包延遲的最大值。
Avg:請求每包延遲的平均值。
Min:請求每包延遲的最小值。
TPxx:請求每包延遲的各個分位點值。
附錄1:測試結果對比
以下測試結果僅供參考,實際表現請以您的實際測試結果為準。
測試環境
配置項 | 配置內容 |
測試模型 | Llama2-7B |
測試數據 | ShareGPT_V3_unfiltered_cleaned_split.json |
測試客戶端代碼(有改動) | vllm/benchmarks/benchmark_serving.py |
測試GPU卡型 | ecs.gn7i-c8g1.2xlarge(24G A10) |
測試的推理引擎 | vLLM |
后端實例個數 | 5 |
壓測代碼
本文提供了針對上面vllm-0.3.3版本的服務測試代碼:
下載地址:benchmarks.tgz。
主要文件:
benchmarks ├── benchmark.sh # 運行腳本。 ├── backend_request_func.py ├── benchmark_serving.py ├── samples.txt # 摘自ShareGPT_V3_unfiltered_cleaned_split.json的請求數據。 └── tokenizer # Llama2-7B的tokenizer ├── tokenizer_config.json ├── tokenizer.json └── tokenizer.model
測試代碼:
# 安裝對應的vLLM版本。 $pip install vllm==0.3.3 # 其中{router_service_token}需要替換為LLM智能路由服務的Token。 $export OPENAI_API_KEY={router_service_token} # 執行客戶端測試代碼。 $python ./benchmark_serving.py --base-url http://********.cn-beijing.pai-eas.aliyuncs.com/api/predict/{group_name}.{router_service_name}_llm_gateway \ --endpoint /v1/completions \ --tokenizer ./tokenizer/ \ --model-id llama2 \ --load-inputs ./samples.txt \ --request-count 10000 \ --max-concurrent 160
測試結果
監控指標 | 無LLM智能路由 | 使用LLM智能路由 | 效果提升 |
Successful requests | 9851 | 9851 | - |
Benchmark duration | 1138.429295 s | 1060.888924 s | +6.8% |
Total input tokens | 1527985 | 1527985 | - |
Total generated tokens | 2808261 | 2812861 | - |
Input token throughput | 1342.19 tokens/s | 1440.29 tokens/s | +7.3% |
Output token throughput | 2466.79 tokens/s | 2651.42 tokens/s | +7.5% |
Mean TTFT | 1981.86 ms | 304.00 ms | +84% |
Median TTFT | 161.69 ms | 158.67 ms | +1.8% |
P99 TTFT | 19396.84 ms | 3534.64 ms | +81% |
Mean TPOT | 120.33 ms | 69.41 ms | +42% |
P99 TPOT | 852.49 ms | 260.33 ms | +69% |
附錄2:Metrics接口說明
LLM智能路由的調度算法根據后端不同推理實例的Metrics進行請求調度,綜合選出盡可能空閑的實例。要使用LLM智能路由,則要求推理實例中必須實現Metrics接口,并按要求輸出相關的指標。目前LLM智能路由已兼容了vLLM和BladeLLM的Metrics接口。
以vLLM推理框架為例,其Metrics接口的輸出結果如下:
# HELP vllm:num_requests_running Number of requests currently running on GPU.
# TYPE vllm:num_requests_running gauge
vllm:num_requests_running{model_name="Llama-2-7b-chat-hf"} 30.0
# HELP vllm:num_requests_swapped Number of requests swapped to CPU.
# TYPE vllm:num_requests_swapped gauge
vllm:num_requests_swapped{model_name="Llama-2-7b-chat-hf"} 0.0
# HELP vllm:num_requests_waiting Number of requests waiting to be processed.
# TYPE vllm:num_requests_waiting gauge
vllm:num_requests_waiting{model_name="Llama-2-7b-chat-hf"} 0.0
# HELP vllm:gpu_cache_usage_perc GPU KV-cache usage. 1 means 100 percent usage.
# TYPE vllm:gpu_cache_usage_perc gauge
vllm:gpu_cache_usage_perc{model_name="Llama-2-7b-chat-hf"} 0.8426270136307311
# HELP vllm:prompt_tokens_total Number of prefill tokens processed.
# TYPE vllm:prompt_tokens_total counter
vllm:prompt_tokens_total{model_name="Llama-2-7b-chat-hf"} 15708.0
# HELP vllm:generation_tokens_total Number of generation tokens processed.
# TYPE vllm:generation_tokens_total counter
vllm:generation_tokens_total{model_name="Llama-2-7b-chat-hf"} 13419.0
LLM-Scheduler會將上述指標數據進行轉換和計算,并依據計算結果對后端推理實例進行優先級排序,LLM-智能路由訪問LLM-Scheduler時獲取優先級最高的后端推理實例進行轉發。
支持的LLM推理框架以及對應的采集指標如下:
LLM智能路由也可以與其他推理框架配合使用,只要該框架能兼容以下指標,LLM智能路由就可以正常運行并有效地進行請求調度。
LLM推理引擎 | 指標 | 說明 |
vLLM | vllm:num_requests_running | 正在運行的請求數。 |
vllm:num_requests_waiting | 在排隊等待的請求數。 | |
vllm:gpu_cache_usage_perc | GPU KV Cache的使用率。 | |
vllm:prompt_tokens_total | 總Prompt的Token數。 | |
vllm:generation_tokens_total | 總Generate的Token數。 | |
BladeLLM | decode_batch_size_mean | 正在運行的請求數。 |
wait_queue_size_mean | 在排隊等待的請求數。 | |
block_usage_gpu_mean | GPU KV Cache的使用率。 | |
tps_total | 每秒總共處理的Token數。 | |
tps_out | 每秒Generate的Token數。 |