隆重推出适用于 Amazon SageMaker 的 Hugging Face LLM 推理容器

发布于 2023 年 5 月 31 日
在 GitHub 上更新

这是一个示例,介绍如何使用新的 Hugging Face LLM 推理容器将开源 LLM(如 BLOOM)部署到 Amazon SageMaker 进行推理。我们将部署 12B 参数的 Pythia Open Assistant 模型,这是一个使用 Open Assistant 数据集训练的开源聊天 LLM。

本示例涵盖以下内容

  1. 设置开发环境
  2. 获取新的 Hugging Face LLM DLC
  3. 将 Open Assistant 12B 部署到 Amazon SageMaker
  4. 运行推理并与我们的模型聊天
  5. 创建由 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 流式传输

目前官方支持的模型架构有:

借助 Amazon SageMaker 上新的 Hugging Face LLM 推理 DLC,AWS 客户可以受益于同样的技术,这些技术支持着 HuggingChatOpenAssistant 等高并发、低延迟的 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)

Gradio Chat application

太棒了!🚀 我们已成功将 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 将助力开发者和企业利用自然语言生成领域的最新进展。


感谢您的阅读!如果您有任何问题,请随时通过TwitterLinkedIn与我联系。

社区

注册登录 以发表评论