隆重推出适用于 Amazon SageMaker 的 Hugging Face LLM 推理容器
这是一个示例,介绍如何使用新的 Hugging Face LLM 推理容器将开源 LLM(如 BLOOM)部署到 Amazon SageMaker 进行推理。我们将部署 12B 参数的 Pythia Open Assistant 模型,这是一个使用 Open Assistant 数据集训练的开源聊天 LLM。
本示例涵盖以下内容
- 设置开发环境
- 获取新的 Hugging Face LLM DLC
- 将 Open Assistant 12B 部署到 Amazon SageMaker
- 运行推理并与我们的模型聊天
- 创建由 Amazon SageMaker 支持的 Gradio 聊天机器人
你也可以在 notebooks 代码库中找到该示例的代码。
什么是 Hugging Face LLM 推理 DLC?
Hugging Face LLM DLC 是一款全新、专用的推理容器,可在安全且受托管的环境中轻松部署 LLM。该 DLC 由 Text Generation Inference (TGI) 提供支持,TGI 是一个开源、专用于部署和服务大型语言模型 (LLM) 的解决方案。TGI 通过张量并行和动态批处理技术,为包括 StarCoder、BLOOM、GPT-NeoX、Llama 和 T5 在内的最流行的开源 LLM 实现了高性能的文本生成。Text Generation Inference 已被 IBM、Grammarly 等客户以及 Open-Assistant 计划所采用,它为所有支持的模型架构实现了优化,包括:
- 张量并行和自定义 CUDA 内核
- 针对最流行的架构,使用 flash-attention 优化 transformers 推理代码
- 使用 bitsandbytes 进行量化
- 对传入请求进行连续批处理以提高总吞吐量
- 使用 safetensors 加速权重加载(启动时间)
- Logits 处理器(温度缩放、top-k、重复惩罚等)
- 使用《大型语言模型水印》技术添加水印
- 停止序列,对数概率
- 使用服务器发送事件 (SSE) 进行 token 流式传输
目前官方支持的模型架构有:
- BLOOM / BLOOMZ
- MT0-XXL
- Galactica
- SantaCoder
- GPT-Neox 20B (joi, pythia, lotus, rosey, chip, RedPajama, open assistant)
- FLAN-T5-XXL (T5-11B)
- Llama (vicuna, alpaca, koala)
- Starcoder / SantaCoder
- Falcon 7B / Falcon 40B
借助 Amazon SageMaker 上新的 Hugging Face LLM 推理 DLC,AWS 客户可以受益于同样的技术,这些技术支持着 HuggingChat、OpenAssistant 等高并发、低延迟的 LLM 体验,以及 Hugging Face Hub 上 LLM 模型的推理 API。
我们开始吧!
1. 设置开发环境
我们将使用 `sagemaker` Python SDK 将 BLOOM 部署到 Amazon SageMaker。我们需要确保已配置好 AWS 账户并安装了 `sagemaker` Python SDK。
!pip install "sagemaker==2.175.0" --upgrade --quiet
如果你要在本地环境中使用 Sagemaker,你需要一个拥有 Sagemaker 所需权限的 IAM 角色。你可以在这里找到更多相关信息。
import sagemaker
import boto3
sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it not exists
sagemaker_session_bucket=None
if sagemaker_session_bucket is None and sess is not None:
# set to default bucket if a bucket name is not given
sagemaker_session_bucket = sess.default_bucket()
try:
role = sagemaker.get_execution_role()
except ValueError:
iam = boto3.client('iam')
role = iam.get_role(RoleName='sagemaker_execution_role')['Role']['Arn']
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
print(f"sagemaker role arn: {role}")
print(f"sagemaker session region: {sess.boto_region_name}")
2. 获取新的 Hugging Face LLM DLC
与部署常规的 Hugging Face 模型相比,我们首先需要获取容器的 URI,并将其提供给我们的 `HuggingFaceModel` 模型类,其中 `image_uri` 指向该镜像。要在 Amazon SageMaker 中获取新的 Hugging Face LLM DLC,我们可以使用 `sagemaker` SDK 提供的 `get_huggingface_llm_image_uri` 方法。此方法允许我们根据指定的 `backend`、`session`、`region` 和 `version` 来获取所需 Hugging Face LLM DLC 的 URI。你可以在这里找到可用的版本。
from sagemaker.huggingface import get_huggingface_llm_image_uri
# retrieve the llm image uri
llm_image = get_huggingface_llm_image_uri(
"huggingface",
version="1.0.3"
)
# print ecr image uri
print(f"llm image uri: {llm_image}")
3. 将 Open Assistant 12B 部署到 Amazon SageMaker
注意:Amazon SageMaker 的配额在不同账户之间可能有所不同。如果你收到指示超出配额的错误,可以通过服务配额控制台来增加配额。
要将 Open Assistant 模型部署到 Amazon SageMaker,我们创建一个 `HuggingFaceModel` 模型类,并定义我们的端点配置,包括 `hf_model_id`、`instance_type` 等。我们将使用 `g5.12xlarge` 实例类型,它有 4 个 NVIDIA A10G GPU 和 96GB 的 GPU 内存。
注意:我们也可以为了成本优化部署,使用 `g5.2xlarge` 实例类型并启用 int-8 量化。
import json
from sagemaker.huggingface import HuggingFaceModel
# sagemaker config
instance_type = "ml.g5.12xlarge"
number_of_gpu = 4
health_check_timeout = 300
# Define Model and Endpoint configuration parameter
config = {
'HF_MODEL_ID': "OpenAssistant/pythia-12b-sft-v8-7k-steps", # model_id from hf.co/models
'SM_NUM_GPUS': json.dumps(number_of_gpu), # Number of GPU used per replica
'MAX_INPUT_LENGTH': json.dumps(1024), # Max length of input text
'MAX_TOTAL_TOKENS': json.dumps(2048), # Max length of the generation (including input text)
# 'HF_MODEL_QUANTIZE': "bitsandbytes", # comment in to quantize
}
# create HuggingFaceModel with the image uri
llm_model = HuggingFaceModel(
role=role,
image_uri=llm_image,
env=config
)
创建 `HuggingFaceModel` 后,我们可以使用 `deploy` 方法将其部署到 Amazon SageMaker。我们将使用 `ml.g5.12xlarge` 实例类型来部署模型。TGI 将自动在所有 GPU 上分布和分片模型。
# Deploy model to an endpoint
# https://sagemaker.readthedocs.io/en/stable/api/inference/model.html#sagemaker.model.Model.deploy
llm = llm_model.deploy(
initial_instance_count=1,
instance_type=instance_type,
# volume_size=400, # If using an instance with local SSD storage, volume_size must be None, e.g. p4 but not p3
container_startup_health_check_timeout=health_check_timeout, # 10 minutes to be able to load the model
)
SageMaker 现在将创建我们的端点并将模型部署到该端点。这可能需要 5-10 分钟。
4. 运行推理并与我们的模型聊天
端点部署完成后,我们可以使用 `predictor` 的 `predict` 方法在其上运行推理。我们可以使用不同的参数来控制生成,在有效载荷的 `parameters` 属性中定义它们。截至目前,TGI 支持以下参数:
- `temperature`:控制模型的随机性。值越低,模型越具确定性;值越高,模型越随机。默认值为 1.0。
- `max_new_tokens`:要生成的最大 token 数。默认值为 20,最大值为 512。
- `repetition_penalty`:控制重复的可能性,默认为 `null`。
- `seed`:用于随机生成的种子,默认为 `null`。
- `stop`:一个用于停止生成的 token 列表。当生成其中任何一个 token 时,生成将停止。
- `top_k`:用于 top-k 过滤的最高概率词汇 token 数量。默认值为 `null`,表示禁用 top-k 过滤。
- `top_p`:用于核采样的最高概率词汇 token 的累积概率参数,默认为 `null`。
- `do_sample`:是否使用采样;否则使用贪婪解码。默认值为 `false`。
- `best_of`:生成 best_of 个序列,并返回 token 对数概率最高的那个,默认为 `null`。
- `details`:是否返回有关生成的详细信息。默认值为 `false`。
- `return_full_text`:是返回全文还是仅返回生成的部分。默认值为 `false`。
- `truncate`:是否将输入截断到模型的最大长度。默认值为 `true`。
- `typical_p`:一个 token 的典型概率。默认值为 `null`。
- `watermark`:用于生成的水印。默认值为 `false`。
你可以在 swagger 文档中找到 TGI 的 open api 规范。
`OpenAssistant/pythia-12b-sft-v8-7k-steps` 是一个对话聊天模型,这意味着我们可以使用以下提示语与其聊天:
<|prompter|>[Instruction]<|endoftext|>
<|assistant|>
让我们先试一下,问问夏天有什么好玩的点子。
chat = llm.predict({
"inputs": """<|prompter|>What are some cool ideas to do in the summer?<|endoftext|><|assistant|>"""
})
print(chat[0]["generated_text"])
# <|prompter|>What are some cool ideas to do in the summer?<|endoftext|><|assistant|>There are many fun and exciting things you can do in the summer. Here are some ideas:
现在我们将展示如何在有效载荷的 `parameters` 属性中使用生成参数。除了设置自定义的 `temperature`、`top_p` 等之外,我们还在 `bot` 回合结束后停止生成。
# define payload
prompt="""<|prompter|>How can i stay more active during winter? Give me 3 tips.<|endoftext|><|assistant|>"""
# hyperparameters for llm
payload = {
"inputs": prompt,
"parameters": {
"do_sample": True,
"top_p": 0.7,
"temperature": 0.7,
"top_k": 50,
"max_new_tokens": 256,
"repetition_penalty": 1.03,
"stop": ["<|endoftext|>"]
}
}
# send request to endpoint
response = llm.predict(payload)
# print(response[0]["generated_text"][:-len("<human>:")])
print(response[0]["generated_text"])
5. 创建由 Amazon SageMaker 支持的 Gradio 聊天机器人
我们还可以创建一个 gradio 应用程序来与我们的模型聊天。Gradio 是一个 Python 库,可以让你围绕你的机器学习模型快速创建可定制的 UI 组件。你可以在这里找到更多关于 gradio 的信息。
!pip install gradio --upgrade
import gradio as gr
# hyperparameters for llm
parameters = {
"do_sample": True,
"top_p": 0.7,
"temperature": 0.7,
"top_k": 50,
"max_new_tokens": 256,
"repetition_penalty": 1.03,
"stop": ["<|endoftext|>"]
}
with gr.Blocks() as demo:
gr.Markdown("## Chat with Amazon SageMaker")
with gr.Column():
chatbot = gr.Chatbot()
with gr.Row():
with gr.Column():
message = gr.Textbox(label="Chat Message Box", placeholder="Chat Message Box", show_label=False)
with gr.Column():
with gr.Row():
submit = gr.Button("Submit")
clear = gr.Button("Clear")
def respond(message, chat_history):
# convert chat history to prompt
converted_chat_history = ""
if len(chat_history) > 0:
for c in chat_history:
converted_chat_history += f"<|prompter|>{c[0]}<|endoftext|><|assistant|>{c[1]}<|endoftext|>"
prompt = f"{converted_chat_history}<|prompter|>{message}<|endoftext|><|assistant|>"
# send request to endpoint
llm_response = llm.predict({"inputs": prompt, "parameters": parameters})
# remove prompt from response
parsed_response = llm_response[0]["generated_text"][len(prompt):]
chat_history.append((message, parsed_response))
return "", chat_history
submit.click(respond, [message, chatbot], [message, chatbot], queue=False)
clear.click(lambda: None, None, chatbot, queue=False)
demo.launch(share=True)
太棒了!🚀 我们已成功将 Open Assistant 模型部署到 Amazon SageMaker,并对其运行了推理。此外,我们还构建了一个快速的 gradio 应用程序来与我们的模型聊天。
现在,轮到你自己动手尝试,使用 Amazon SageMaker 上新的 Hugging Face LLM DLC 构建生成式 AI 应用程序了。
为了清理,我们可以删除模型和端点。
llm.delete_model()
llm.delete_endpoint()
总结
新的 Hugging Face LLM 推理 DLC 使客户能够轻松、安全地在 Amazon SageMaker 上部署开源 LLM。易于使用的 API 和部署过程让客户能够利用像 Open Assistant 这样的先进模型构建可扩展的 AI 聊天机器人和虚拟助手。总的来说,这款新的 DLC 将助力开发者和企业利用自然语言生成领域的最新进展。