作者:钰诚

简介

传统的负载均衡算法主要设计用于通用的 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 函…