不增加 GPU,首 Token 延遲下降 50%|LLM 服務負載均衡的新實踐

作者:鈺誠

簡介

傳統的負載均衡算法主要設計用于通用的 Web 服務或微服務架構中,其目標是通過最小化響應時間、最大化吞吐量或保持服務器負載平衡來提高系統的整體效率,常見的負載均衡算法有輪詢、隨機、最小請求數、一致性哈希等。然而,在面對 LLM 服務時,這些傳統方法往往暴露出以下幾個關鍵缺陷:

  1. 忽略任務復雜度差異:LLM 推理請求的復雜度差異極大。例如,一個長文本生成任務可能需要數十倍于短文本分類任務的計算資源。而傳統負載均衡器無法感知這種差異,容易導致某些節點過載,而其他節點空閑,造成資源浪費和響應延遲。

  2. 缺乏對 GPU 資源水位的感知:在 LLM 推理服務中,計算瓶頸主要集中在 GPU 上,傳統負載均衡器往往無法感知到這一細粒度的資源消耗情況,導致某些 GPU 節點因顯存不足而拒絕請求或響應緩慢,而其他節點卻處于空閑狀態。

  3. 缺乏對 KV Cache 的復用能力:在并發請求處理中,如果多個請求具有相似的前綴,則它們的 KV Cache 可能存在重疊部分,可以通過共享或壓縮的方式減少顯存占用并提升生成速度。傳統負載均衡策略并未考慮請求之間的語義相似性或 KV Cache 的可復用性,難以將具有潛在復用價值的請求分配到同一 GPU 實例上,從而錯失優化機會。

針對 LLM 服務的特點,Higress AI 網關以插件形式提供了面向 LLM 服務的負載均衡算法,包括全局最小請求數負載均衡、前綴匹配負載均衡以及 GPU 感知負載均衡,能夠在不增加硬件成本的前提下,提升系統的吞吐能力、降低響應延遲,并實現更公平、高效的任務調度。

以前綴匹配負載均衡為例,壓測工具使用 NVIDIA GenAI-Perf,設置每輪輸入平均為 200 token,輸出平均為 800 token,并發為 20,每個會話包含 5 輪對話,共計 60 個會話,性能指標前后對比如下:

image

技術選型

目前已經有很多優秀的開源項目,例如 Envoy AI Gateway、AIBrix 等,基于 Envoy External Processing 機制外接一個負載均衡器實現面向 LLM 的負載均衡,負載均衡器以 sidecar 或者 K8s 服務形式部署。

Higress AI 網關以 wasm 插件形式提供了面向 LLM 服務的核心負載均衡能力,具有如下特點:

  • 免運維:以 wasm 形式提供負載均衡能力,不需要用戶額外維護 sidecar,只需要在 Higress 控制臺開啟插件即可,部署運維成本大大降低。
  • 熱插拔:即插即用,用戶僅需要在控制臺進行策略配置即可,開啟插件時采用面向 LLM 服務的專屬負載均衡策略,關掉插件后自動切換為服務基礎的負載均衡策略(輪詢、最小請求數、隨機、一致性哈希)。
  • 易擴展:插件本身提供了多種負載均衡算法,并且在不斷豐富完善中,采用 go 1.24 編寫,代碼開源,如果有特殊需求,用戶可以基于現有插件進行定制。
  • 全局視野:借助 Redis,網關的多個節點具有全局視野,負載均衡更加公平、高效。
  • 細粒度控制:插件可以在實例級、域名級、路由級、服務級等不同粒度進行生效,方便用戶做細粒度的控制。

負載均衡算法介紹

接下來,本文會介紹 Higress AI 網關提供的三種負載均衡算法:全局最小請求數負載均衡、前綴匹配負載均衡、GPU 感知負載均衡。

全局最小請求數負載均衡

在分布式環境中,網關實例往往具有多個節點,傳統的負載均衡策略是每個節點做局部的負載均衡,缺乏全局視野。在 Higress AI 網關中,我們借助 Redis 實現了全局最小請求數負載均衡算法,根據每個 LLM Pod 上正在處理的請求數進行負載均衡。

選取 Pod 的大致流程如下:

image

在全局最小請求數負載均衡中我們重點關注了請求異常(例如后端服務不可訪問、客戶端斷連、服務端斷連等)情況下的處理,通過在 HttpStreamDone 階段統一進行計數的變更可以保證異常中斷的請求也能夠得到計數的更新,避免因請求異常導致服務計數異常情況。

前綴匹配負載均衡

在多輪對話場景下,一次會話會涉及多次 LLM 的調用,多次調用時請求攜帶了相同的上下文信息,如果能夠感知上下文信息并將同屬一個會話的多次請求路由到相同的 LLM Pod 中,將能夠充分利用 LLM Pod 的 KV Cache,從而大幅提高請求的 RT、Token 吞吐等性能指標。

在 Higress AI 網關中,我們借助 Redis 實現了全局的前綴匹配負載均衡算法,能夠充分適應分布式環境,在請求到達網關時,會根據當前的前綴樹信息進行前綴匹配,如果能夠匹配成功,則會路由至對應 LLM Pod,如果匹配不到前綴,則會根據全局最小請求數負載均衡方法選出當前處理請求最小的 LLM Pod。

選取 Pod 的大致流程如下:

image

接下來簡單介紹如何在 Redis 中構建前綴樹。

首先將 LLM 請求的 messages 以 user 為界限劃分為不同的 block,并通過哈希獲得一個 16 進制字符串,如下圖所示,messages 被劃分為兩個 block,并且計算了每個 block 的 sha-1 值:

image

假設有一個請求被劃分成了 n 個 block,在進行前綴匹配時:

1)在 redis 中查詢?sha-1(block 1)?是否存在

  1. 如果不存在,前綴匹配失敗,采用全局最小請求數選擇 pod,pod 選取結束,根據當前請求內容更新前綴樹
  2. 如果存在,前綴匹配成功,記錄當前的 pod,轉步驟 2

2)在 redis 中查詢?sha-1(block 1) XOR sha-1(block 2)?是否存在

  1. 如果不存在,前綴匹配失敗,步驟1中選出來的 pod 即為目標 pod,根據當前請求內容更新前綴樹,pod 選取結束
  2. 如果存在,前綴匹配成功,轉步驟 3

3)在 redis 中查詢?sha-1(block 1) XOR sha-1(block 2) XOR … XOR sha-1(block n)?是否存在

  1. 如果不存在,前綴匹配失敗,步驟 2 中選出來的 pod 即為目標 pod,根據當前請求內容更新前綴樹,pod 選取結束
  2. 如果存在,前綴匹配成功,pod 選取結束

通過以上過程,能夠將同一個會話的多次請求路由至同一個 pod,從而提高 KV Cache 的復用。

GPU 感知負載均衡

一些 LLM Server 框架(如 vllm、sglang 等)自身會暴露一些監控指標,這些指標能夠實時反應 GPU 負載信息,基于這些監控指標可以實現 GPU 感知的負載均衡算法,使流量調度更加適合 LLM 服務。

目前已經有一些開源項目基于 envoy ext-proc 機制實現了 GPU 感知的負載均衡算法,但 ext-proc 機制需要借助一個外部進程,部署與維護較為復雜,Higress AI 網關實現了后臺定期拉取 metrics 的機制(目前支持 vllm),以熱插拔的插件形式提供了 GPU 感知的負載均衡能力,并且場景不局限于 K8s 環境,任何 Higress AI 網關支持的服務來源均可使用此能力。

選取 Pod 的大致流程如下:

image

目前基于 metrics 的負載均衡策略遵循了?gateway-api-inference-extension【1】?的 pod 選取算法,根據 LoRA Adaotor 親和、隊列長度、KV Cache 使用率進行負載均衡,選取過程如下圖所示:

image

使用方法

以前綴匹配負載均衡為例:

  1. 準備 Redis 資源:登錄阿里云 Redis 控制臺【2】,創建Redis實例,并設置連接密碼。具體操作,請參見?Redis 快速入門概覽【3】。
  2. 準備 LLM 服務:以 ECS 形式基于 vllm 框架部署 llama3 模型,共 3 個節點。
  3. 在網關配置服務:在網關實例中導入 Redis 服務以及 LLM 服務,其中 redis 為DNS類型服務,llama3 為固定地址類型服務。

image

  1. 在網關配置 API:在網關中創建一個 LLM API,后端服務指向 llama3.

image

  1. 在網關配置插件:在插件市場找到 ai-load-balancer 插件進行安裝,然后在 LLM API 粒度下給剛才創建的 LLM API 配置負載均衡策略。

image

插件配置示例如下:

lb_policy: prefix_cache
lb_config:serviceFQDN: redis.dnsservicePort:?6379username: defaultpassword: xxxxxxxxxxxxredisKeyTTL:?60

附錄:壓測結果與 vllm 監控大盤

無負載均衡

GenAI-Perf 統計結果如下:

image

vllm 監控如下:

image

前綴匹配負載均衡

GenAI-Perf 統計結果如下:

image

vllm 監控如下:

image

相關鏈接:

【1】gateway-api-inference-extension

https://github.com/kubernetes-sigs/gateway-api-inference-extension/tree/main

【2】阿里云 Redis 控制臺

https://kvstore.console.aliyun.com/Redis/instance/cn-hangzhou

【3】Redis 快速入門概覽

https://help.aliyun.com/zh/redis/getting-started/overview


🔥🔥擁抱 AI 原生!

8月29日深圳,企業實踐工作坊火熱報名中!

阿里云誠摯邀請您參加【AI 原生,智構未來——AI 原生架構與企業實踐】工作坊,從開發范式到工程化實踐,全鏈路解析AI原生架構奧秘,與AI先行者共探增長新機遇。

???點擊此處,立即了解完整議程!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97000.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Linux內存管理:實驗驅動的深度探索》【附錄】【實驗環境搭建 7】【使用buildroot方式構建文件系統】

1. 使用Buildroot 構建的優勢 使用 Buildroot 構建 rootfs 的優點在于 快速、簡潔、可裁剪、可重復,特別適合 中小型嵌入式 Linux 項目(如車機、路由器、工業控制設備、IoT 網關)。它幫助開發者避免繁瑣的手動編譯和集成工作,專注…

一洽客服系統:網頁咨詢入口設置

一洽客服系統提供了靈活的網頁咨詢入口設置,旨在為用戶提供多樣化的咨詢類別選擇,并根據用戶的需求接入指定的路由線路。以下是該功能的詳細說明:一、網頁咨詢入口設置針對用戶的不同業務提供不同的咨詢類別選擇,用戶選擇業務后接…

Apache Flink錯誤處理實戰手冊:2年生產環境調試經驗總結

作者:_Naci Simsek 前言 在流處理領域,Apache Flink 已經成為企業級實時數據處理的首選框架。然而,在生產環境中,開發者和運維人員經常會遇到各種看似神秘的問題。基于過去兩年中大量客戶在真實場景中的使用案例,可以觀…

嵌入式開發學習 C++:day01

C概述 C誕生 1972年前后,計算機先驅丹尼斯里奇開始設計C語言并用它來重寫Unix系統,里奇的這個決定催生了計算機領域最石破天驚的兩門重炮:Unix和C,這兩者都是IT產業中鼻祖級的存在,Unix是現代蘋果系統和Linux系統的最初來源&#…

LeaferJS創建支持縮放、平移的畫布,并繪制簡單圖形

文章目錄介紹原生JS使用LeaferJS的簡單示例原生JS使用LeaferJS并支持縮放平移畫布Vue中使用LeaferJS并支持縮放平移介紹 LeaferJS官網:https://www.leaferjs.com/ 官方快速上手的教程地址:https://www.leaferjs.com/ui/guide/install/ui/start.html 原…

JumpServer 堡壘機部署與 SSH 公鑰接入服務器教程

前言:在企業運維場景中,服務器的安全訪問與操作管控至關重要。JumpServer 作為開源堡壘機的典型代表,憑借集中管控、權限精細分配、操作全鏈路審計等核心能力,成為保障運維安全合規的關鍵工具。 無論是中小企業簡化運維權限管理&a…

TensorFlow 面試題及詳細答案 120道(21-30)-- 模型構建與神經網絡

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 21. TensorFlow中構建神經…

Qt圖片上傳系統的設計與實現:從客戶端到服務器的完整方案

文章目錄系統架構概覽核心組件解析1. ImageUploadWorker:上傳任務的執行者關鍵方法解析2. ImageUploadManager:線程的"指揮官"3. ImageUploader:網絡通信的"信使"4. 服務器端:圖片的"收納箱"關鍵技…

MySQL InnoDB vs MyISAM

MySQL 兩種引擎(InnoDB vs MyISAM)核心區別事務與鎖機制??特性??InnoDB??MyISAM??事務支持?支持 ACID 事務(原子性、一致性、隔離性、持久性),適用于需強數據一致性的場景(如金融交易)…

軟件定義汽車(SDV)調試——如何做到 適配軟件定義汽車(SDV)?(上)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

windows下 docker desktop 清理ext4.vhdx文件 并縮小ext4.vhdx文件

1、路徑C:\Users\Administrator\AppData\Local\Docker\wsl\dataext4.vhdx 清理之前30多G,現在只有不到2個G2、清理命令# 1、清?清理懸空鏡像和緩存? docker image prune -f # 刪除未被引用的鏡像層 docker builder prune -f # 清理構建緩存# 2、壓縮虛擬磁盤&a…

超越ChatBI!深度解析衡石HENGSHI SENSE 6.0如何實現全流程AI賦能

在數據智能領域風起云涌的2025年,“ChatBI”已成為一個炙手可熱卻又令人疲憊的概念。市場上充斥著各式各樣的問答式BI工具,它們雖然帶來了交互的新穎體驗,卻往往局限于“問答”這一單一環節,無法解決數據從整合到洞察的全鏈路痛點…

Apple Silicon Mac 上解決 Docker 平臺不匹配和 QEMU 段錯誤問題

問題概述 許多用戶在 Apple Silicon (M1/M2) Mac 上嘗試運行 W3AF Docker 鏡像時遇到了以下錯誤: WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested qemu: uncau…

如何借助文檔控件 TX Text Control 輕松優化 PDF 文件大小?

在數字文檔的日常使用中,PDF 文件的體積大小直接影響存儲空間、傳輸速度和打開體驗。尤其是在包含大量圖片、圖表或字體資源的文檔中,文件往往會變得非常龐大。 文檔處理控件TX Text Control 為開發者提供了多種可配置的工具與策略,幫助在不同…

[身份驗證腳手架] 前端認證與個人資料界面

第2章:前端認證與個人資料界面 歡迎回來,未來的Web開發者!在前一章中,我們學習了breeze:install命令如何為您的Laravel應用設置用戶認證基礎。您選擇了一個"前端技術棧"(如Blade、React、Vue或Livewire)并運行了一些命…

RabbitMQ、RocketMQ 和 ActiveMQ 三種主流消息隊列的詳細部署安裝指南

RabbitMQ、RocketMQ 和 ActiveMQ 三種主流消息隊列的詳細部署安裝指南 RabbitMQ、RocketMQ 和 ActiveMQ 三種主流消息隊列的詳細部署安裝指南。 一、RabbitMQ 部署安裝 RabbitMQ 用 Erlang 語言編寫,推薦使用官方提供的 Docker 鏡像或包管理器安裝。 方法一:使用 Docker (…

vue新增用戶密碼框自動將當前用戶的密碼自動填充的問題

1.問題 新增店鋪的時候&#xff0c;設置管理員賬號&#xff0c;輸入框已將當前登錄用戶的密碼填充上了解決方式 在el-input輸入框類型為password的上增加參數autocomplete“new-password”<el-form-item :label"$t(storeList.password)" prop"shopUserPasswo…

設計模式:工廠模式(Factory Pattern)

文章目錄一、工廠模式簡介二、簡單工廠模式的概念三、工廠方法模式的概念四、抽象工廠模式的概念一、工廠模式簡介 工廠模式是一種創建型設計模式&#xff0c;主要解決對象創建 的問題。它的核心思想是&#xff1a;把對象的創建和使用分離&#xff0c;讓使用者不直接依賴具體類…

【Qt調試】斷點時,Expressions不能查看變量

環境Qt版本&#xff1a;6.9.1問題Qt creator進入斷點&#xff0c;Expressions不能查看變量&#xff08;類型&#xff1a;int&#xff09;的值&#xff0c;而局部變量可以查看。解決方法調試器/CDB&#xff0c;勾選【Use Python dumper】

C++ 函數:從基礎到現代特性的全面解析

《C++ 函數:從基礎到現代特性的全面解析》 目錄 函數基礎 1.1 函數定義與聲明 1.2 參數傳遞機制(值傳遞、引用傳遞、指針傳遞) 1.3 返回值與void函數 1.4 函數聲明與定義的分離 函數進階 2.1 函數重載的多態性 2.2 遞歸函數的設計與優化 2.3 Lambda表達式與匿名函數 2.4 函…