隆重推出適用於 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 將助力開發者和企業利用自然語言生成領域的最新進展。