Press "Enter" to skip to content

介绍适用于Amazon SageMaker的Hugging Face LLM推理容器

这是一个关于如何使用新的Hugging Face LLM Inference Container将开源LLMs(如BLOOM)部署到Amazon SageMaker进行推理的示例。我们将部署12B Pythia Open Assistant Model,这是一个使用Open Assistant数据集训练的开源Chat LLM。

示例内容包括:

  1. 设置开发环境
  2. 获取新的Hugging Face LLM DLC
  3. 将Open Assistant 12B部署到Amazon SageMaker
  4. 运行推理并与我们的模型聊天
  5. 创建由Amazon SageMaker支持的Gradio Chatbot

你也可以在notebooks存储库中找到示例的代码。

Hugging Face LLM Inference DLC是什么?

Hugging Face LLM DLC是一个新的专门构建的推理容器,可以在安全和托管的环境中轻松部署LLMs。该DLC由Text Generation Inference (TGI)驱动,它是一个用于部署和提供大型语言模型(LLMs)的开源、专门构建的解决方案。TGI利用张量并行和动态批处理实现高性能的文本生成,适用于最流行的开源LLMs,包括StarCoder、BLOOM、GPT-NeoX、Llama和T5。Text Generation Inference已被IBM、Grammarly等客户使用,Open-Assistant计划对所有支持的模型架构进行了优化,包括:

  • 张量并行和自定义cuda内核
  • 通过闪电注意力优化推理的transformer代码,适用于最流行的架构
  • 使用bitsandbytes进行量化
  • 连续批处理传入请求,提高总吞吐量
  • 使用safetensors加速权重加载(启动时间)
  • 使用Logits warpers(温度缩放、topk、重复惩罚等)
  • 使用A Watermark for Large Language Models进行水印
  • 停止序列,对数概率
  • 使用Server-Sent Events(SSE)进行令牌流式传输

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

  • 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 Inference DLC,AWS客户可以享受到与HuggingChat、OpenAssistant和Hugging Face Hub上的LLM模型推理API相同的技术,实现高并发、低延迟的LLM体验。

让我们开始吧!

1. 设置开发环境

我们将使用sagemaker python SDK将BLOOM部署到Amazon SageMaker。我们需要确保已配置AWS账户并安装了sagemaker python SDK。

!pip install "sagemaker==2.163.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方法。该方法允许我们根据指定的backendsessionregionversion来检索所需的Hugging Face LLM DLC的URI。您可以在此处找到可用的版本

from sagemaker.huggingface import get_huggingface_llm_image_uri

# 检索llm镜像URI
llm_image = get_huggingface_llm_image_uri(
  "huggingface",
  version="0.8.2"
)

# 打印ECR镜像URI
print(f"llm镜像URI: {llm_image}")

3. 将Open Assistant 12B部署到Amazon SageMaker

注意:Amazon SageMaker的配额可能因账户而异。如果收到指示已超过配额的错误,可以通过Service Quotas控制台进行增加。

要将Open Assistant模型部署到Amazon SageMaker,我们创建一个HuggingFaceModel模型类,并定义我们的端点配置,包括hf_model_idinstance_type等。我们将使用g5.12xlarge实例类型,它有4个NVIDIA A10G GPU和96GB的GPU内存。

注意:我们还可以优化成本并使用g5.2xlarge实例类型并启用int-8量化。

import json
from sagemaker.huggingface import HuggingFaceModel

# SageMaker配置
instance_type = "ml.g5.12xlarge"
number_of_gpu = 4
health_check_timeout = 300

# 定义模型和端点配置参数
config = {
  'HF_MODEL_ID': "OpenAssistant/pythia-12b-sft-v8-7k-steps", # hf.co/models中的model_id
  'SM_NUM_GPUS': json.dumps(number_of_gpu), # 每个副本使用的GPU数量
  'MAX_INPUT_LENGTH': json.dumps(1024),  # 输入文本的最大长度
  'MAX_TOTAL_TOKENS': json.dumps(2048),  # 生成的最大长度(包括输入文本)
  # 'HF_MODEL_QUANTIZE': "bitsandbytes", # 解除注释以进行量化
}

# 使用镜像URI创建HuggingFaceModel
llm_model = HuggingFaceModel(
  role=role,
  image_uri=llm_image,
  env=config
)

创建了HuggingFaceModel之后,我们可以使用deploy方法将其部署到Amazon SageMaker。我们将使用ml.g5.12xlarge实例类型部署模型。TGI将自动分配和分片模型到所有GPU上。

# 部署模型到端点
# 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, # 如果使用具有本地SSD存储的实例,volume_size必须为None,例如p4而不是p3
  container_startup_health_check_timeout=health_check_timeout, # 10分钟以加载模型
)

SageMaker现在将创建我们的端点并将模型部署到该端点。这可能需要5-10分钟。

4. 运行推理并与我们的模型聊天

在部署了我们的端点之后,我们可以使用predictorpredict方法对其进行推理。我们可以使用不同的参数来控制生成,将其定义在负载的parameters属性中。截至今天,TGI支持以下参数:

  • temperature:控制模型中的随机性。较低的值会使模型更加确定性,而较高的值会使模型更加随机。默认值为1.0。
  • max_new_tokens:生成的最大标记数。默认值为20,最大值为512。
  • repetition_penalty:控制重复出现的可能性,默认为null
  • seed:用于随机生成的种子,默认为null
  • stop:停止生成的标记列表。当生成其中一个标记时,生成将停止。
  • top_k:在top-k过滤中保留的具有最高概率的词汇标记数。默认值为null,表示禁用top-k过滤。
  • top_p:在核心抽样中保留的参数最高概率词汇标记的累积概率,默认为null
  • do_sample:是否使用抽样;否则使用贪婪解码。默认值为false
  • best_of:生成best_of序列,并返回具有最高标记logprobs的序列。默认为null
  • details:是否返回有关生成的详细信息。默认值为false
  • return_full_text:是否返回完整文本或仅返回生成的部分。默认值为false
  • truncate:是否将输入截断为模型的最大长度。默认值为true
  • typical_p:标记的典型概率。默认值为null
  • watermark:用于生成的水印。默认值为false

您可以在Swagger文档中找到TGI的开放API规范

OpenAssistant/pythia-12b-sft-v8-7k-steps是一个对话式聊天模型,意味着我们可以使用以下提示与其聊天:

<|prompter|>[指令]<|endoftext|>
<|assistant|>

让我们首先尝试一下,并询问一些夏天的酷点子:

chat = llm.predict({
    "inputs": """<|prompter|>夏天有哪些酷点子?<|endoftext|><|assistant|>"""
})

print(chat[0]["generated_text"])
#     <|prompter|>夏天有哪些酷点子?<|endoftext|><|assistant|>夏天有很多有趣的事情可以做。以下是一些点子:

现在我们将展示如何在负载的parameters属性中使用生成参数。除了设置自定义的temperaturetop_p等,我们还会在bot的轮次之后停止生成。

# 定义负载
prompt="""<|prompter|>冬天如何保持更活跃?给我三个建议。<|endoftext|><|assistant|>"""

# 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|>"]
  }
}

# 发送请求到端点
response = llm.predict(payload)

# print(response[0]["generated_text"][:-len("<human>:")])
print(response[0]["generated_text"])

5. 创建由Amazon SageMaker支持的Gradio Chatbot

我们还可以创建一个Gradio应用程序来与我们的模型进行聊天。Gradio是一个Python库,允许您快速创建可自定义的UI组件,围绕您的机器学习模型。您可以在这里了解更多关于Gradio的信息。

!pip install gradio  --upgrade

import gradio as gr

# 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("## 与Amazon SageMaker聊天")
    with gr.Column():
        chatbot = gr.Chatbot()
        with gr.Row():
            with gr.Column():
                message = gr.Textbox(label="聊天消息框", placeholder="聊天消息框", show_label=False)
            with gr.Column():
                with gr.Row():
                    submit = gr.Button("提交")
                    clear = gr.Button("清除")

    def respond(message, chat_history):
        # 将聊天历史转换为提示
        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|>"

        # 发送请求到端点
        llm_response = llm.predict({"inputs": prompt, "parameters": parameters})

        # 从响应中删除提示
        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)

介绍适用于Amazon SageMaker的Hugging Face LLM推理容器 四海 第1张

太棒了!🚀 我们已经成功将Open Assistant模型部署到Amazon SageMaker并对其进行推理。此外,我们还构建了一个快速的Gradio应用程序,可以与我们的模型进行聊天。

现在,是时候让您自己尝试并使用新的Hugging Face LLM DLC在Amazon SageMaker上构建生成AI应用程序了。

为了清理,我们可以删除模型和端点。

llm.delete_model()
llm.delete_endpoint()

结论

新的Hugging Face LLM推理DLC使客户能够轻松安全地在Amazon SageMaker上部署开源LLM。易于使用的API和部署过程使客户能够构建可扩展的AI聊天机器人和虚拟助手,使用Open Assistant等最先进的模型。总体而言,这个新的DLC将为开发人员和企业提供利用自然语言生成的最新进展的能力。


感谢您的阅读!如果您有任何问题,请随时在Twitter或LinkedIn上与我联系。

Leave a Reply

Your email address will not be published. Required fields are marked *