当前位置: 首页 > news >正文

告别KV Cache无法复用!Amazon SageMaker加速LLM推理

随着大语言模型(LLM)的广泛应用,如何优化推理性能已成为企业级应用部署中的核心挑战,传统的无状态推理架构在处理LLM应用时面临诸多性能瓶颈:每次请求被随机路由到不同的计算实例,导致KV Cache无法有效复用、多轮对话上下文频繁重建、系统提示词重复处理等问题,严重影响了用户体验和系统效率。

针对这些痛点,Amazon SageMaker推理集群的粘性会话路由(Sticky Session Routing)功能,通过会话绑定机制,确保同一用户会话的所有请求都路由到相同的推理集群实例,从而实现缓存复用和状态保持,显著提升LLM推理性能和交互体验。

技术原理与优势

Amazon SageMaker Sticky Session

技术原理

Amazon SageMaker Sticky Session通过会话标识符(Session ID)实现智能路由机制。与传统的负载均衡策略不同,该机制确保来自同一会话的所有请求都被定向到特定的计算实例。

这种“会话亲和性”(Session Affinity)设计使得GPU内存中的KV Cache、中间结果等状态信息得以持续保存和复用,从而避免了重复的计算开销

核心优势

启用粘性会话后,同一会话的所有请求都会路由到同一实例,这样您的AI应用程序就能重复使用先前处理过的信息,避免了不必要的重复计算,从而减少延迟并改善用户体验。

当客户想要使用大型数据负载或需要无缝的交互体验时,这项功能尤其有用。通过利用以前的推理请求,客户现在可以借助这项功能在Amazon SageMaker上构建创新的状态感知AI应用程序。

工作流程

一起看看客户端在Amazon SageMaker上启动粘性会话时的事件序列,Sticky Session的完整工作流程包含三个核心阶段:会话创建、会话维持和会话关闭:

1.在第一个请求中,当调用Boto3 SageMaker runtime的invoke_endpoint时,在请求头中设置session-id=NEW_SESSION,并在请求负载中指明这是一个打开会话类型的请求。然后Amazon SageMaker会创建一个新的会话并存储会话ID。Amazon SageMaker会向推理服务器发起一个打开会话的请求(这个API是由客户端定义的,也可以使用其他名称,比如start_session),并返回200状态码,同时附带会话ID和生存时间(TTL),这些信息会被发送回客户端。

2.后续请求中,客户端在invoke_endpoint调用中传递相同的会话ID。Amazon SageMaker路由服务根据会话ID识别对应的推理实例,确保所有请求都路由到同一台服务器。这样,在LLM推理的多轮对话场景中,GPU内存中的KV Cache得以保持和累积,显著减少了计算开销,从而显著降低推理延迟。

3.当对话结束时,客户端可以发送关闭会话请求,您可以使用invoke_endpoint传入一个包含会话ID的关闭请求。Amazon SageMaker路由器首先会检查该会话是否存在。如果存在,路由器会向推理服务器发起关闭会话的调用,服务器会返回一个成功的200响应以及会话ID,这些信息随后会被发送回客户端。在会话ID不存在的情况下,路由器会返回一个400响应。

这种设计带来的性能提升主要体现在:

  • 首次响应时间优化:避免重复处理系统提示词和上下文信息

  • 后续对话加速:利用已缓存的键值对,减少大量重复计算

  • 内存使用效率:合理利用GPU内存,避免频繁的内存分配和释放

实践案例

构建支持Sticky Session的LLM推理服务

本案例将以基于SGLang推理引擎的模型部署为例,展示如何在Amazon SageMaker上构建支持Sticky Session的高性能LLM推理服务。整个实现涉及推理容器构建、模型部署和客户端调用三个核心部分。

构建支持会话管理的推理容器

在推理服务器端,使用Sanic Web框架构建了支持会话管理的推理服务。核心实现包括三种请求类型的处理逻辑:

@app.route("/invocations", methods=["POST"])async def generate(request): reqType = request.json.get("requestType") extSessID = request.json.get("extSessionID") # 处理新建Session请求 if'NEW_SESSION' == reqType: current_time = datetime.now(dt.timezone.utc) future_time = current_time + timedelta(minutes = int(os.environ['SES_TTL_MIN'])) formatted_time = future_time.strftime("%Y-%m-%dT%H:%M:%SZ") response = json({}) response.headers["X-Amzn-SageMaker-Session-Id"] = f'{extSessID}; Expires={formatted_time}' return response # 处理Session关闭请求 elif 'CLOSE_SESSION' == reqType: response = json({}) response.headers["X-Amzn-SageMaker-Closed-Session-Id"] = extSessID return response # 处理Session内推理请求 else: prompt = request.json.get("inputs") ifnot prompt: return json({"error": "inputs is required"}, status=400) inf_params = request.json.get("parameters") # 使用部署至 SGLang 推理引擎的模型产生图里结果 result = await engine.async_generate(prompt=prompt, sampling_params=inf_params) return json({"generation": result})

左右滑动查看完整示意

构建客户端调用封装

为了简化Amazon SageMaker Sticky Session的使用,本例封装了一个客户端工具类,提供了会话管理的完整功能:

import boto3, json classStatefulSMEDPBuilder: def __init__(self, endpoint_name): self.endpoint_name = endpoint_name ## Boto3 API self.sm_bt3_client = boto3.client("runtime.sagemaker") def start_session(self, extSessID): """创建新的粘性会话""" payload = { "extSessionID": extSessID, "requestType": 'NEW_SESSION' } response = self.sm_bt3_client.invoke_endpoint( EndpointName=self.endpoint_name, Body=json.dumps(payload), ContentType="application/json", SessionId="NEW_SESSION" ) return response def end_session(self, extSessID): """关闭指定会话""" payload = { "extSessionID": extSessID, "requestType": 'CLOSE_SESSION' } response = self.sm_bt3_client.invoke_endpoint( EndpointName=self.endpoint_name, Body=json.dumps(payload), ContentType="application/json", SessionId=extSessID ) return response def invoke(self, textPayload, sampling_params=None, extSessID=None): """在会话中进行推理调用""" if None == sampling_params: sampling_params = {"temperature":0.9, "max_new_token":128, "do_sample":True} payload = { "inputs": textPayload, "sampling_params": sampling_params, "extSessionID": extSessID, "requestType": 'SESSION' } response = self.sm_bt3_client.invoke_endpoint( EndpointName=self.endpoint_name, Body=json.dumps(payload), ContentType="application/json", SessionId=extSessID ) return response def invoke_stream(self, textPayload, sampling_params=None, extSessID=None): """流式推理接口""" pass

左右滑动查看完整示意

使用示例

下面展示如何使用封装好的客户端进行多轮对话:

import uuid # 初始化客户端client = StatefulSMEDPBuilder(endpoint_name="llama3-sticky-session-endpoint") # 生成唯一会话 IDsession_id = f"conversation-{uuid.uuid4().hex[:8]}" try: # 创建新会话 session_response = client.start_session(session_id) print(f"会话 {session_id} 创建成功") # 第一轮对话 response1 = client.invoke("你好,请介绍一下自己", extSessID=session_id) result1 = json.loads(response1['Body'].read().decode()) print(f"AI: {result1['generation']['text']}") # 第二轮对话(利用上下文) response2 = client.invoke("请详细说明你刚才提到的能力", extSessID=session_id) result2 = json.loads(response2['Body'].read().decode()) print(f"AI: {result2['generation']['text']}") # 第三轮对话(继续利用完整上下文) response3 = client.invoke("基于我们之前的对话,你觉得哪个能力最重要?", extSessID=session_id) result3 = json.loads(response3['Body'].read().decode()) print(f"AI: {result3['generation']['text']}") finally: # 会话结束后清理资源 client.end_session(session_id) print(f"会话 {session_id} 已关闭")

左右滑动查看完整示意

通过这种方式,同一会话的所有请求都会路由到相同的推理实例,确保KV Cache的有效复用,显著提升多轮对话的性能表现。

完整的部署和使用代码可参考项目仓库。

项目仓库:

https://github.com/aws-samples/sample-sagemaker-sticky-session

总结

本文深入介绍了Amazon SageMaker Sticky Session在LLM推理中的技术原理和实践应用。

通过会话亲和性设计,该技术有效解决了传统无状态推理架构在处理LLM应用时面临的性能瓶颈,这一功能特别适合需要维持对话上下文的应用以及要求低延迟的实时交互场景。后续博客将展示详细的性能对比测试结果。

参考链接

1.https://aws.amazon.com/cn/about-aws/whats-new/2024/09/sticky-session-routing-amazon-sagemaker-inference

2.https://aws.amazon.com/cn/blogs/machine-learning/build-ultra-low-latency-multimodal-generative-ai-applications-using-sticky-session-routing-in-amazon

本篇作者

胡凯

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案架构的咨询和设计,致力于亚马逊云科技云服务在企业的应用和推广。

郑昊

亚马逊云科技AI/ML解决方案架构师。主要专注于基础模型的训练、推理及性能优化;广告、排序算法等及其基于亚马逊云科技AI/ML技术栈的相关优化及方案构建,拥有多年排序、定价及竞价机制等算法研发经验。

新用户注册海外区域账户,可获得最高200美元服务抵扣金,覆盖Amazon Bedrock生成式AI相关服务。“免费计划”账户类型,确保零花费,安心试用。

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

听说,点完下面4个按钮

就不会碰到bug了!

点击阅读原文查看博客!获得更详细内容!

http://www.jsqmd.com/news/338188/

相关文章:

  • Mastercam许可证的类型与区别
  • 2026老字号制药企业TOP5榜单(权威解读)——百年匠心,创新致远 - 博客万
  • 企业实习生专属:GitLab客户端+IDEA配合使用教程(协作开发快速上手)GitLab新手教程 入门到实战
  • 金融数据治理新范式:如何用算子级血缘与主动元数据 10分 钟定位 EAST 报送异常?
  • 2026年中国GEO服务商综合能力排行对比 - 品牌策略主理人
  • 高性价比 vs 高精度:国产与进口多普勒测速仪DVL如何选? - 品牌推荐大师
  • GitLab完整汉化教程(网页端+服务器端,适配企业实习生)图文 按图一步一步一定成功
  • 2026年最新成都公墓代理商五大推荐:专业、透明、温情,选对服务更安心 - 深度智识库
  • 制造大数据应用在哪些工业场景中最值得推荐?
  • 2026年 反应釜厂家推荐排行榜:外盘管/电加热/导热油/树脂/硅油/聚酯/远红外/非标定制/立式/多功能/蒸汽加热/高速分散反应釜专业制造 - 品牌企业推荐师(官方)
  • 身体乳哪个最好?2026干燥止痒保湿效果好性价比高的润肤身体乳推荐,精准适配 - 资讯焦点
  • 别再用老话术!工厂老板吃这套沟通技巧
  • 京东e卡回收一般几折,价目表新鲜出炉 - 京回收小程序
  • 高清视频素材网站推荐,全类型剪辑素材网站推荐,剪辑师必备 - 品牌2026
  • 2026年方管铝型材厂家权威推荐榜:方管铝型材/异形铝型材/铝型材圆管/铝材铝型材/开模铝型材/氟碳喷涂铝型材/选择指南 - 优质品牌商家
  • SLO 玩明白,Timeline 用到位,系统优化稳了!
  • 单北斗变形监测系统的应用与安装维护探讨
  • 银泰百货卡回收几折,揭秘高折扣下的陷阱与市场行情 - 淘淘收小程序
  • 同程、飞猪、携程、去哪儿 国际退改签服务实测对比 - 资讯焦点
  • 2026年 游戏盒APP推荐排行榜:91玩吧/单机/免费/正版游戏盒软件,十大热门游戏盒深度解析与精选指南 - 品牌企业推荐师(官方)
  • WPF xaml中的 xmlns:d=“http://schemas.microsoft.com/expression/blend/2008“ 的使用
  • 2026年 内蒙古消防工程服务推荐榜单:专业消防检测、维保、安装、设计、施工、评估与智能消防系统一站式解决方案 - 品牌企业推荐师(官方)
  • 从“金鱼记忆“到“持久化大脑“:AI Agent三大核心技术突破,开发者必藏
  • 数据智能服务商评估报告
  • 《如何解决复杂的公网 IP 配置:JSON Crack 和 cpolar 》
  • 2026年婚介机构公司权威推荐:婚介机构/附近有婚介所吗/婚介信息/选择指南 - 优质品牌商家
  • 2026年20号无缝钢管公司权威推荐:中厚壁无缝钢管/酸洗钝化无缝钢管/20号无缝钢管/高压锅炉无缝钢管/45号无缝钢管/选择指南 - 优质品牌商家
  • 收藏!Agent+MCP+Skills:AI从“能聊“到“能干“的跃迁之路
  • IPD咨询:企业如何打破部门墙,实现一体化产品创新?
  • 同程国际机票退改签服务体系解析:基于标准化与透明化的体验构建 - 资讯焦点