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を展開します。

この例では以下の内容をカバーしています:

  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は、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を取得するために、sagemakerSDKが提供するget_huggingface_llm_image_uriメソッドを使用できます。このメソッドを使用すると、指定されたbackendsessionregion、および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_idinstance_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. 推論を実行し、モデルとチャットする

エンドポイントがデプロイされた後、predictorpredictメソッドを使用してエンドポイント上で推論を実行できます。ペイロードの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属性で生成パラメータを使用する方法を示します。カスタムのtemperaturetop_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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

データサイエンス

エントロピーを使用した時系列複雑性解析

すべてのデータサイエンティストはこれを知っています:Machine Learningの問題の解決における最初のステップは、データの探...

データサイエンス

Voxel51 は、コンピュータビジョンデータセット分析のための Python コードを生成するために GPT-3.5 の能力を活用する AI アシスタントである VoxelGPT をオープンソース化しました

データ中心のコンピュータビジョンと機械学習ソフトウェアの有名なイノベーターであるVoxel51は、最近VoxelGPTを立ち上げ、コ...

AIニュース

「ロボット支援TMSによるうつ病治療の可能性を探る研究」

「韓国の科学者たちは、うつ病の治療における経頭蓋磁気刺激(TMS)コイルの配置のために開発されたカスタムロボットシステム...

AI研究

芝浦工業大学の研究者たちは、深層学習を用いて顔方向検出を革新します:隠れた顔の特徴や広がる画角の課題に挑戦しています

コンピュータビジョンと人間との相互作用において、顔の向き推定という重要なタスクは、多様な応用を持つ重要な要素として浮...

AIニュース

「デベロッパー用の15以上のAIツール(2023年12月)」

“`html GitHub Copilot GitHub Copilotは、市場をリードするAIによるコーディングアシスタントです。開発者が効率的に...

AIニュース

「Googleの検索ボックスは情報の意味を変えた」

ウェブ検索は疑問を解決すると約束されていましたしかし、それは真実のソフトな黙示録をもたらしました