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

AIニュース

「全てのOECDおよびG20加盟国において、インドがAIスキルと人材で1位にランクされました」

技術の絶え間ない進化の中で、一つのスキルが輝く存在となりました。それが人工知能(AI)です。インドはその膨大な技術労働...

データサイエンス

MusicGenを再構築:MetaのAI音楽における地下進化

2023年2月、Googleは彼らの生成音楽AI MusicLMで波風を立てましたその時点で、二つのことが明確になりました 多くの人が次の...

データサイエンス

「OpenAIの信頼性と安全性の責任者が辞任:ChatGPTに与える影響は何ですか?」

OpenAIという先駆的な人工知能企業では、ChatGPTなどの革新的な技術により、世界に生成型AIを紹介しました。LinkedInでの最近...

AI研究

スタンフォード大学の研究者が『FlashFFTConv』を導入:長いシーケンスのFFT畳み込みを最適化するための新しい人工知能システム

効率的な推論は、機械学習において長いシーケンスを取り扱う上での主要な困難です。最近では、畳み込みがシーケンスモデリン...

AI研究

韓国の研究者がVITS2を提案:自然さと効率性の向上のためのシングルステージのテキスト読み上げモデルにおける飛躍的な進歩

この論文では、以前のモデルのさまざまな側面を改善することにより、より自然な音声を合成する単一ステージのテキストから音...

AIニュース

Dropboxが、ゲームチェンジングなAIパワードツールを発表:生産性とコラボレーションの新時代

今日のデジタル世界では、常にデータに圧倒されています。以前に比べて情報がより多く利用可能になっていますが、必要な情報...