全部產品
Search
文件中心

Platform For AI:LLM智能路由:提升LLM推理系統整體效率

更新時間:Sep 28, 2024

在大語言模型(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智能路由服務

支援以下兩種部署方式:

方式一:通過控制台部署

  1. 登入PAI控制台,選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS

  2. 模型線上服務(EAS)頁面,單擊部署服務

  3. 部署服務頁面,選擇以下任意一種部署方式:

    • 選擇自訂模型部署>自訂部署

    • 選擇情境化模型部署>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。

  4. 服務功能配置地區,單擊LLM智能路由,並開啟LLM智能路由開關,然後在下拉式清單中,單擊建立LLM智能路由image

  5. 建立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智能路由服務名稱image

說明

由於智能路由與服務隊列衝突,建議您不要在該服務群組中建立佇列服務。

方式二:通過JSON獨立部署

  1. 登入PAI控制台,選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS

  2. 在模型線上服務(EAS)頁面,單擊部署服務

  3. 自訂模型部署地區,單擊JSON獨立部署

  4. 在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)服務

支援以下兩種部署方式:

方式一:通過控制台部署

  1. 登入PAI控制台,選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS

  2. 模型線上服務(EAS)頁面,單擊部署服務

  3. 在部署服務頁面,選擇以下任意一種部署方式,並配置關鍵參數,其他參數配置說明,請參見服務部署:控制台

    • 選擇自訂部署,並配置以下關鍵參數。

      參數

      描述

      模型服務資訊

      部署方式

      選擇鏡像部署AI-Web應用

      鏡像選擇

      支援使用PAI平台鏡像或自訂鏡像:

      • 選擇PAI平台鏡像,鏡像選擇chat-llm-webui,鏡像版本選擇3.0-vllm3.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智能路由。

  4. 參數配置完成後,單擊部署

方式二:通過JSON獨立部署

本方案以PAI提供的預置鏡像-開源vLLM-0.3.3版本為例,具體操作步驟如下:

  1. 在模型線上服務(EAS)頁面,單擊部署服務

  2. 自訂模型部署地區,單擊JSON獨立部署

  3. 在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

  1. 進入模型線上服務頁面。

    1. 登入PAI控制台

    2. 在左側導覽列單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。

    3. 在工作空間頁面的左側導覽列選擇模型部署>模型線上服務(EAS),進入模型線上服務(EAS)頁面。image

  2. 單擊LLM智能路由服務的服務方式列下的調用資訊

  3. 調用資訊對話方塊的公網地址調用頁簽,查詢服務訪問地址和Token。image

  4. 配置訪問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]

查看服務監控指標

服務測試完成後,您可以通過查看服務監控指標,來瞭解服務的效能。具體操作步驟如下:

  1. 在模型線上服務(EAS)頁面,單擊已部署的LLM智能路由服務的服務監控列下的image

  2. 服務監控頁簽,查看以下指標資訊。

    Token Throughput

    LLM輸入和輸出Token的Throughoutimage

    • IN:表示LLM輸入Token的輸送量。

    • OUT:表示LLM輸出Token的輸送量。

    GPU Cache Usage

    LLM Engine GPU KV Cache的使用率

    image

    Engine Current Requests

    LLM Engine即時請求並發數

    image

    • Running:LLM Engine正在執行的請求數量。

    • Waiting:LLM Engine等待隊列中的請求數量。

    Gateway Current Requests

    LLM智能路由即時請求數

    image

    • Total:LLM智能路由當前總共接收的請求數量(總即時並發數)。

    • Pending:LLM Engine未處理的緩衝在LLM智能路由中的請求數。

    Time To First Token

    請求的首包延時

    image

    • Max:請求首包延遲的最大值。

    • Avg:請求首包延遲的平均值。

    • Min:請求首包延遲的最小值。

    • TPxx:請求首包延遲的各個分位點值。

    Time Per Output Token

    請求的每包延時

    image

    • 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數。