隆重推出適用於 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與我聯絡。

社群

註冊登入 以發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.