在亚马逊SageMaker JumpStart中流式传输大型语言模型响应

亚马逊SageMaker JumpStart中流式传输大型语言模型的高效响应' (Efficient Response of Streaming Large Language Models in Amazon SageMaker JumpStart)

我们很高兴地宣布,Amazon SageMaker JumpStart 现在可以流式传输大型语言模型(LLM)的推理响应。令牌流式传输允许您在模型生成响应之前就开始查看模型的输出,而不是等待LLM完成响应生成后才能使用或显示。SageMaker JumpStart中的流式传输能力可以帮助您构建具备更好用户体验的应用程序,通过创建对终端用户来说延迟很低的感觉。

在本文中,我们将介绍如何部署并流式传输Falcon 7B Instruct 模型的响应端点。

截至撰写本文时,SageMaker JumpStart中支持流式传输的以下LLMs可用:

  • Mistral AI 7B, Mistral AI 7B Instruct
  • Falcon 180B, Falcon 180B Chat
  • Falcon 40B, Falcon 40B Instruct
  • Falcon 7B, Falcon 7B Instruct
  • Rinna Japanese GPT NeoX 4B Instruction PPO
  • Rinna Japanese GPT NeoX 3.6B Instruction PPO

要查看在SageMaker JumpStart中支持流式传输的模型列表的更新,请在内置带有预训练模型表的算法中搜索“huggingface-llm”。

请注意,您可以使用Amazon SageMaker 的流式传输功能,直接为使用SageMaker TGI Deep Learning Container(DLC)部署的任何模型提供开箱即用的流式传输特性,就像在推出新的Hugging Face LLM推理容器的同时宣布了Amazon SageMaker上的发布中描述的那样。

SageMaker中的基础模型

SageMaker JumpStart提供了访问来自流行模型中心(包括Hugging Face,PyTorch Hub和TensorFlow Hub)的一系列模型,您可以在SageMaker的ML开发工作流程中使用。机器学习的最新进展使得出现了一类被称为基础模型的新型模型,它们通常使用数十亿个参数进行训练,并可以适用于各种用例,如文本摘要、生成数字艺术和语言翻译。由于这些模型的培训成本很高,客户希望使用现有的预训练基础模型,并根据需要进行微调,而不是自己训练这些模型。SageMaker提供了一个经过筛选的模型列表,您可以在SageMaker控制台上进行选择。

现在您可以在SageMaker JumpStart中找到来自不同模型提供商的基础模型,可以快速开始使用基础模型。SageMaker JumpStart基于不同任务或模型提供商提供基础模型,并可以轻松查看模型特征和使用条款。您还可以使用测试UI小部件尝试这些模型。当您希望以大规模使用基础模型时,您可以在不离开Sagemaker的情况下使用模型提供商的预构建笔记本。因为这些模型是在AWS上托管和部署的,您可以相信您的数据,无论是用于评估还是在大规模使用模型时,都不会与第三方共享。

令牌流式传输

令牌流式传输允许在模型生成响应时将推理响应返回。这样,您可以逐步查看生成的响应,而不必等待模型完成才提供完整的响应。流式传输可以帮助实现更好的用户体验,因为它减少了终端用户对延迟的感知。您可以在生成过程中开始查看输出,因此,如果输出对您的目的没有用处,可以提前停止生成。流式传输可能会产生很大的影响,特别是对于长时间运行的查询,因为您可以在输出被生成时开始查看,这可以创建较低延迟的感觉,即使端到端延迟保持不变。

截至目前,您可以在SageMaker JumpStart中使用流媒体功能,适用于使用Hugging Face LLM 文本生成推理 DLC的模型。

无流媒体响应 使用流媒体响应

解决方案概述

在本文中,我们使用Falcon 7B Instruct模型展示了SageMaker JumpStart的流媒体功能。

您可以使用以下代码查找在SageMaker JumpStart中支持流媒体功能的其他模型:

from sagemaker.jumpstart.notebook_utils import list_jumpstart_modelsfrom sagemaker.jumpstart.filters import Andfilter_value = And("task == llm", "framework == huggingface")model_ids = list_jumpstart_models(filter=filter_value)print(model_ids)

我们得到了以下支持流媒体响应的模型ID:

['huggingface-llm-bilingual-rinna-4b-instruction-ppo-bf16', 'huggingface-llm-falcon-180b-bf16', 'huggingface-llm-falcon-180b-chat-bf16', 'huggingface-llm-falcon-40b-bf16', 'huggingface-llm-falcon-40b-instruct-bf16', 'huggingface-llm-falcon-7b-bf16', 'huggingface-llm-falcon-7b-instruct-bf16', 'huggingface-llm-mistral-7b', 'huggingface-llm-mistral-7b-instruct', 'huggingface-llm-rinna-3-6b-instruction-ppo-bf16']

先决条件

在运行笔记本之前,需要进行一些初始设置。运行以下命令:

%pip install --upgrade sagemaker –quiet

部署模型

作为第一步,使用SageMaker JumpStart部署Falcon 7B Instruct模型。有关完整的说明,请参阅Falcon 180B基础模型现已通过Amazon SageMaker JumpStart可用。使用以下代码:

from sagemaker.jumpstart.model import JumpStartModelmy_model = JumpStartModel(model_id="huggingface-llm-falcon-7b-instruct-bf16")predictor = my_model.deploy()

查询端点和流式响应

接下来,构建一个有效载荷来调用部署的端点。重要的是,有效载荷应包含键/值对"stream": True。这表示文本生成推理服务器会生成流式响应。

payload = {    "inputs": "如何构建网站?",    "parameters": {"max_new_tokens": 256},    "stream": True}

在查询端点之前,您需要创建一个可以解析端点的字节流响应的迭代器。每个令牌的数据作为响应中的单独行提供,因此此迭代器在流式缓冲区中识别到新行时返回一个令牌。此迭代器的设计很简单,您可能需要根据您的用例调整其行为; 例如,虽然此迭代器返回令牌字符串,但行数据包含其他信息,例如令牌对数概率,可能会有兴趣。

import ioimport jsonclass TokenIterator:    def __init__(self, stream):        self.byte_iterator = iter(stream)        self.buffer = io.BytesIO()        self.read_pos = 0    def __iter__(self):        return self    def __next__(self):        while True:            self.buffer.seek(self.read_pos)            line = self.buffer.readline()            if line and line[-1] == ord("\n"):                self.read_pos += len(line) + 1                full_line = line[:-1].decode("utf-8")                line_data = json.loads(full_line.lstrip("data:").rstrip("/n"))                return line_data["token"]["text"]            chunk = next(self.byte_iterator)            self.buffer.seek(0, io.SEEK_END)            self.buffer.write(chunk["PayloadPart"]["Bytes"])

现在,您可以在创建的终端节点上使用Boto3的invoke_endpoint_with_response_stream API,并通过迭代TokenIterator实例来启用流式处理:

import boto3client = boto3.client("runtime.sagemaker")response = client.invoke_endpoint_with_response_stream(    EndpointName=predictor.endpoint_name,    Body=json.dumps(payload),    ContentType="application/json",)for token in TokenIterator(response["Body"]):    print(token, end="")

通过将空的end参数指定给print函数,可以启用可视化流式处理,而无需插入换行符。这会产生以下输出:

构建一个网站可能是一个复杂的过程,但通常包括以下步骤:1. 确定您网站的目的和目标2. 选择一个域名和托管提供商3. 使用HTML、CSS和JavaScript设计和开发您的网站4. 向您的网站添加内容,并为搜索引擎进行优化5. 测试和排除故障,以确保其正常工作6. 定期维护和更新您的网站,以确保其平稳运行。有许多在线资源可指导您完成这些步骤,包括教程和模板。如果对这些步骤中的任何一个不确定,也可以寻求网站开发人员或设计师的建议。<|endoftext|>

您可以在笔记本电脑或其他应用程序(如Streamlit或Gradio)中使用此代码,以查看流媒体功能的实际效果和为客户提供的体验。

清理

最后,请记得清理已部署的模型和终端节点,以避免产生额外的费用:

predictor.delete_model()predictor.delete_endpoint()

结论

在本文中,我们向您展示了如何使用SageMaker JumpStart中新推出的流媒体功能。我们希望您能利用标记流媒体功能构建需要低延迟的交互式应用程序,以提供更好的用户体验。