Amazon SageMakerのHugging Face LLM推論コンテナをご紹介します
こちらは、Amazon SageMakerのHugging Face LLM推論コンテナをご紹介します
これは、オープンソースのLLM(Large Language Model)であるBLOOMをAmazon SageMakerに展開し、新しいHugging Face LLM Inference Containerを使用して推論を行う方法の例です。Open Assistantデータセットで訓練されたオープンソースのチャットLLMである12B Pythia Open Assistant Modelを展開します。
この例では以下の内容をカバーしています:
- 開発環境のセットアップ
- 新しいHugging Face LLM DLCの取得
- Open Assistant 12BのAmazon SageMakerへの展開
- モデルを使用して推論およびチャットを行う
- Amazon SageMakerをバックエンドとしたGradio Chatbotの作成
この例のコードは、notebooksリポジトリでも見つけることができます。
Hugging Face LLM Inference DLCとは何ですか?
Hugging Face LLM DLCは、LLMを安全で管理された環境で簡単に展開するための目的に特化したInference Containerです。このDLCは、Text Generation Inference(TGI)によって動作しており、Tensor Parallelismと動的バッチングを使用して、StarCoder、BLOOM、GPT-NeoX、Llama、T5などの最も人気のあるオープンソースのLLMによる高性能なテキスト生成を実現します。TGIは、IBM、Grammarly、Open-Assistantイニシアチブなどの顧客によってすでに使用されており、以下のモデルアーキテクチャに対して最適化されています:
- テンソル並列処理とカスタムCUDAカーネル
- 最も人気のあるアーキテクチャでの推論用の最適化されたtransformersコード
- bitsandbytesによる量子化
- 全体のスループットを向上させるための連続的なリクエストのバッチ処理
- safetensorsによる高速なウェイトのロード(起動時間)
- Logits warpers(温度スケーリング、topk、繰り返しペナルティなど)
- 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. 開発環境のセットアップ
BLOOMをAmazon SageMakerに展開するために、sagemaker
のPython SDKを使用します。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
メソッドを使用できます。このメソッドを使用すると、指定されたbackend
、session
、region
、およびversion
に基づいて、必要な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コンソールからクォータを増やすことができます。
Amazon SageMakerにOpen Assistantモデルをデプロイするために、HuggingFaceModel
モデルクラスを作成し、hf_model_id
、instance_type
などのエンドポイント設定を定義します。4つのNVIDIA A10G GPUと96GBのGPUメモリを持つg5.12xlarge
インスタンスタイプを使用します。
注意: コストを最適化し、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. 推論を実行し、モデルとチャットする
エンドポイントがデプロイされた後、predictor
のpredict
メソッドを使用してエンドポイント上で推論を実行できます。ペイロードのparameters
属性に定義することで、生成を制御するためにさまざまなパラメータを使用できます。現在、TGIは以下のパラメータをサポートしています。
temperature
:モデル内のランダム性を制御します。値を下げるとモデルはより決定論的になり、値を上げるとモデルはよりランダムになります。デフォルト値は1.0です。max_new_tokens
:生成するトークンの最大数です。デフォルト値は20で、最大値は512です。repetition_penalty
:繰り返しの可能性を制御します。デフォルトではnull
です。seed
:ランダム生成に使用するシードです。デフォルトはnull
です。stop
:生成を停止するトークンのリストです。生成されたトークンのいずれかが生成されると、生成は停止します。top_k
:最も確率の高い語彙トークンをトップ-kフィルタリングのために保持する数です。デフォルト値はnull
で、トップ-kフィルタリングは無効になります。top_p
:ヌクレウスサンプリングのために確率が最も高い語彙トークンを保持する累積確率です。デフォルトはnull
です。do_sample
:サンプリングを使用するかどうか。使用しない場合はグリーディーデコーディングを使用します。デフォルト値はfalse
です。best_of
:best_ofシーケンスを生成し、最も高いトークンの対数確率を持つものを返します。デフォルトはnull
です。details
:生成に関する詳細情報を返すかどうか。デフォルト値はfalse
です。return_full_text
:生成された部分のみではなく、フルテキストを返すかどうか。デフォルト値はfalse
です。truncate
:入力をモデルの最大長さに切り詰めるかどうか。デフォルト値はtrue
です。typical_p
:トークンの典型的な確率です。デフォルト値はnull
です。watermark
:生成に使用するウォーターマークです。デフォルト値はfalse
です。
TGIのオープンAPI仕様はスワッガーのドキュメントで見つけることができます。
OpenAssistant/pythia-12b-sft-v8-7k-steps
は対話型チャットモデルであり、以下のプロンプトを使用してチャットすることができます:
<|prompter|>[Instruction]<|endoftext|>
<|assistant|>
さあ、最初に試してみましょう。夏にするのに面白いアイデアについて尋ねてみましょう:
chat = llm.predict({
"inputs": """<|prompter|>夏にするのに面白いアイデアはありますか?<|endoftext|><|assistant|>"""
})
print(chat[0]["generated_text"])
# <|prompter|>夏にするのに面白いアイデアはありますか?<|endoftext|><|assistant|>夏にはたくさんの楽しいエキサイティングなことができます。以下はいくつかのアイデアです。
次に、ペイロードのparameters
属性で生成パラメータを使用する方法を示します。カスタムのtemperature
、top_p
などを設定するだけでなく、bot
のターン後に生成を停止します。
# ペイロードを定義
prompt="""<|prompter|>冬の間にもっとアクティブに過ごす方法はありますか?3つのヒントを教えてください。<|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は、機械学習モデルの周りにカスタマイズ可能なUIコンポーネントを素早く作成するためのPythonライブラリです。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にOpen Assistantモデルを正常にデプロイし、推論を実行しました。さらに、モデルとチャットするためのクイックなGradioアプリケーションも作成しました。
さあ、自分で試して、Amazon SageMakerでHugging Face LLM DLCを使用してGeneration AIアプリケーションを構築してみましょう。
後片付けには、モデルとエンドポイントを削除することができます。
llm.delete_model()
llm.delete_endpoint()
結論
新しいHugging Face LLM Inference DLCにより、お客様は簡単かつ安全にオープンソースのLLMをAmazon SageMakerにデプロイすることができます。使いやすいAPIとデプロイプロセスにより、お客様はOpen Assistantのような最先端のモデルを使用してスケーラブルなAIチャットボットやバーチャルアシスタントを構築することができます。全体的に、この新しいDLCは開発者やビジネスが自然言語生成の最新の進歩を活用することを可能にします。
読んでいただきありがとうございます!ご質問がある場合は、お気軽にTwitterやLinkedInでご連絡ください。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles