用最专业的眼光看待互联网
立即咨询随着生成 AI 应用的快速普及,对这些应用的实时响应需求日益增加,以降低感知延迟并提高吞吐量。基础模型FMs通常在大量数据上进行预训练,参数范围从数百万到数十亿及以上。大型语言模型LLMs作为一类 FMs,能够生成基于用户推理的文本。对这些模型的推理在使用不同干预参数配置时可能会导致延迟不一致。这种不一致可能源于期望从模型返回的响应令牌数量不同,或模型所部署的加速器类型不同。
为了解决这一问题,可以采用响应流方法进行推理,它在生成的信息的同时将其分块发送回客户端,而不是等待完整的响应。这种方式创建了一个交互式的体验,让用户能够实时查看部分响应,而不必等待完整的结果。
随着Amazon SageMaker 实时推理现已支持响应流,您现在可以在使用 Amazon SageMaker 实时推理时,持续地向客户端推送推理结果。该解决方案能够帮助您为各种生成 AI 应用如聊天机器人、虚拟助手和音乐生成器构建互动体验。本文将展示如何通过控制首次字节时间TTFB来实现更快的响应时间,并减少推理 Llama 2 模型时的整体感知延迟。
我们将使用 SageMaker 这一完全托管的服务来准备数据、构建、训练和部署机器学习ML模型,以便应对各种用例。有关 SageMaker 提供的各种部署选项的更多信息,请参阅 Amazon SageMaker 模型托管 FAQ。让我们来了解如何通过实时推理和响应流来解决延迟问题。
为了应对与 LLM 实时推理相关的延迟问题,首先需要了解如何利用响应流来进行实时推理。而实际上,任何 LLM 都可以利用响应流支持进行实时推理。
Llama 2 是一系列经过预训练和微调的生成文本模型,其规模从 70 亿到 700 亿参数不等。Llama 2 模型为自回归模型,采用解码器架构。当提供一个提示和推理参数时,Llama 2 模型能够生成文本响应。这些模型可以用于翻译、摘要、问答和对话等任务。
在本篇中,我们将在 SageMaker 部署 Llama 2 聊天模型 metallama/Llama213bchathf 进行实时推理和响应流。
在将模型部署到 SageMaker 端点时,您可以使用针对流行开源库的专业化的 AWS 深度学习容器DLC镜像将模型容器化。由于 Llama 2 模型是文本生成模型,您可以使用由 Hugging Face 文本生成推理TGI驱动的 Hugging Face LLM 推理容器 ,或使用 大型模型推理LMI相关的 AWS DLC。
在本文中,我们将使用 DLC 在 SageMaker 主机上部署 Llama 2 13B 聊天模型,使用 G5 实例提供实时推理。G5 实例是用于图形密集型应用程序和 ML 推理的高性能 GPU 实例。您还可以使用受支持的实例类型如 p4d、p3、g5 和 g4dn,根据实例配置进行相应的更改。
实施此解决方案,您需要具备以下条件:
拥有 AWS 帐户,并配置有适当权限以管理作为解决方案的一部分创建的资源的 AWS 身份和访问管理IAM角色。如果您第一次使用 Amazon SageMaker Studio,请首先创建一个 SageMaker 域。拥有 Hugging Face 帐户。如果没有,请通过电子邮件 注册。 为了便于访问 Hugging Face 上可用的模型,尤其是如 Llama 的受限模型,以便用于微调和推理,您需要拥有 Hugging Face 帐户来获取读取访问令牌。注册成功后,请 登录,访问 https//huggingfaceco/settings/tokens 来创建读取访问令牌。使用注册 Hugging Face 时的邮箱 ID 获取 Llama 2 的访问权限。通过 Hugging Face 获取的 Llama 2 模型为受控模型,该模型的使用受 Meta 许可证管制。要下载模型权重和分词器,请 请求获取 Llama 的访问权限 并接受其许可证。在获得访问权限后通常会在几天内进行处理,您会收到电子邮件确认。在这篇文章中,我们使用的模型是 Llama213bchathf,但您也应该能够访问其他变体。
在本节中,我们将展示如何使用 Hugging Face TGI 将 metallama/Llama213bchathf 模型部署到 SageMaker 实时端点,并实现响应流。下表概述了此次部署的规格。
规格值容器Hugging Face TGI模型名称metallama/Llama213bchathfML 实例mlg512xlarge推理实时,带响应流首先,您需要检索要部署的 LLM 的基本镜像。然后在基本镜像上构建模型,最后将模型部署到 SageMaker Hosting 的 ML 实例进行实时推理。
让我们观察如何以编程方式实现部署。为简洁起见,本节仅讨论帮助部署步骤的代码。完整的源代码可以在笔记本中找到:llama2hftgi/llama213bchathf/1deployllama213bchathftgisagemakeripynb。
检索最新的 Hugging Face LLM DLC由 TGI 提供支持可以通过预构建的 SageMaker DLCs 实现。您将使用此镜像在 SageMaker 上部署 metallama/Llama213bchathf 模型。以下是相关代码:
pythonfrom sagemakerhuggingface import gethuggingfacellmimageuri
llmimage = gethuggingfacellmimageuri( huggingface version=103)
定义模型的环境时,配置参数如下:
pythoninstancetype = mlg512xlargenumberofgpu = 4config = { HFMODELID metallama/Llama213bchathf # 来自 hfco/models 的 modelid SMNUMGPUS jsondumps(numberofgpu) # 每个副本使用的 GPU 数量 MAXINPUTLENGTH jsondumps(2048) # 输入文本的最大长度 MAXTOTALTOKENS jsondumps(4096) # 生成最大长度包括输入文本 MAXBATCHTOTALTOKENS jsondumps(8192) # 在生成过程中可以并行处理的最大令牌数量 HUGGINGFACEHUBTOKEN ltYOURHUGGINGFACEREADACCESSTOKENgt}
替换 ltYOURHUGGINGFACEREADACCESSTOKENgt 为参数 HUGGINGFACEHUBTOKEN 的值,使用您 Hugging Face 个人资料上获得的令牌。在配置中,您将每个模型副本使用的 GPU 数量定义为 4。接下来,您可以将在 mlg512xlarge 实例上部署的 metallama/Llama213bchathf 模型构建成 HuggingFaceModel 的实例,并传入上述环境配置:
pythonllmmodel = HuggingFaceModel( role=role imageuri=llmimage env=config)
最后,通过提供各种参数值如 endpointname、initialinstancecount 和 instancetype调用模型的部署方法:
pythonllm = llmmodeldeploy( endpointname=endpointname initialinstancecount=1 instancetype=instancetype containerstartuphealthchecktimeout=healthchecktimeout)
Hugging Face TGI DLC 具备在不进行任何自定义或代码更改的情况下流式传输响应的能力。如果您使用 Boto3,可以使用 invokeendpointwithresponsestream;使用 SageMaker Python SDK 时,可以使用 InvokeEndpointWithResponseStream。
SageMaker 的 InvokeEndpointWithResponseStream API 允许开发人员从 SageMaker 模型中流式返回响应,从而帮助提高客户满意度,降低感知延迟。这对于使用生成 AI 模型构建的应用程序尤为重要,因为即使需要等到完整响应,立即处理也比等待完整响应更重要。
以下是使用 Boto3 对模型进行推理,并通过 SageMaker API 调用 invokeendpointwithresponsestream 的示例:
蘑菇加速器安卓pythondef getrealtimeresponsestream(sagemakerruntime endpointname payload) responsestream = sagemakerruntimeinvokeendpointwithresponsestream( EndpointName=endpointname Body=jsondumps(payload) ContentType=application/json CustomAttributes=accepteula=false ) return responsestream
其中,CustomAttributes 的值设置为 accepteula=false。为了成功获得来自 Llama 2 模型的响应,accepteula 参数必须设置为 true。在使用 invokeendpointwithresponsestream 成功调用后,该方法将返回字节响应流。
以下的图示展示了该工作流程。
您需要一个循环遍历字节流并将其解析为可读文本的迭代器。LineIterator 的实现可以在 llama2hftgi/llama213bchathf/utils/LineIteratorpy 找到。现在您已准备好创建提示和说明,以将其作为负载,用于推理模型。
在此步骤中,您将为 LLM 准备提示和指令。提示 Llama 2 时,您应使用以下提示模板:
plaintext[INST] ltgt{{ systemprompt }}ltgt
{{ usermessage }} [/INST]
您可以通过程序化方式在 buildllama2prompt 方法中构建与上述提示模板一致的提示模板。然后根据使用案例定义说明。在这里,我们的任务是指示模型为营销活动生成一封电子邮件,详细信息在 getinstructions 方法中已覆盖。相关代码在 llama2hftgi/llama213bchathf/2sagemakerrealtimeinferencellama213bchathftgistreamingresponseipynb 中。
构建与任务配合的指令,如下所示:
pythonuserask1 = fAnyCompany 最近宣布推出了一项新服务,名为 AnyCloud 网络服务。写一封关于产品发布的简短电子邮件,并提醒 Alice Smith,电子邮件地址是 alicesmith@examplecom。提及优惠码:EARLYB1RD 可在前 3 个月享受 20 折扣。instructions = getinstructions(userask1)prompt = buildllama2prompt(instructions)
我们将说明传递给 buildllama2prompt 以根据该提示模板构建提示。
pythoninferenceparams = { dosample True topp 06 temperature 09 topk 50 maxnewtokens 512 repetitionpenalty 103 stop [lt/sgt] returnfulltext False }payload = { inputs prompt parameters inferenceparams stream True ## lt 用于启用响应流。}
我们将推理参数与提示结合,使用 stream 关键字的值设置为 True 来构建最终负载。将负载发送到 getrealtimeresponsestream,用于通过响应流调用端点:
pythonresp = getrealtimeresponsestream(sagemakerruntime endpointname payload)printresponsestream(resp)
LLM 生成的文本将以流式方式输出,如下图所示。
在本节中,我们将展示如何使用 LMI 和 DJL Serving 将 metallama/Llama213bchathf 模型部署到 SageMaker 实时端点,并实现响应流。下表概述了此次部署的规格。
规格值容器带 DJL Serving 的 LMI 容器镜像模型名称metallama/Llama213bchathfML 实例mlg512xlarge推理实时,带响应流您首先下载模型并将其存储在 Amazon Simple Storage Service Amazon S3中。接着,您在 servingproperties 文件中指定模型的 S3 URI 前缀。然后,检索要部署的 LLM 的基本镜像,构建模型,并将其部署到 SageMaker Hosting 的 ML 实例,以实现实时推理。
让我们观察如何以编程方式实现上述部署步骤。为简洁起见、本节仅描述帮助部署步骤的代码。该部署的完整源代码可以在笔记本中找到:llama2lmi/llama213bchat/1deployllama213bchatlmiresponsestreamingipynb。
在上述准备阶段条件下,下载模型到 SageMaker 笔记本实例,然后将其上传到 S3 桶中以便后续部署:
python