AWS JAPAN APN ブログ

NTT データによる Custom Model Import on Amazon Bedrock を用いた 700 億パラメータの日本語 LLM のサーバーレス化検証

本稿は、以下 3 名による共著です。

  • 株式会社 NTT データ – デジタルサクセスコンサルティング事業部 主任 鯨田 連也
  • アマゾン ウェブ サービス ジャパン合同会社 – シニアパートナーソリューションアーキテクト 江成 篤
  • アマゾン ウェブ サービス ジャパン合同会社 – 機械学習パートナーソリューションアーキテクト 本橋 和貴

はじめに

大規模言語モデル (LLM) は膨大な量のデータを学習し、人間のようにテキストを理解し生成する能力を獲得しています。日本国内においても、アマゾン ウェブ サービス (AWS) ジャパンによる AWS LLM 開発支援プログラムや経済産業省の GENIAC プログラムなどを通じて、独自の基盤モデルの開発が活発に行われています。これらのイニシアチブは、日本語に対応した基盤モデルの精度向上と計算コストパフォーマンスの改善を目指し、企業のカスタマイズのニーズに応えます。また、経済安全保障や技術イノベーションの観点からも重要な意義を持っています。

一方で、開発された基盤モデルのホスティングには、計算資源の確保と運用コストの最適化が主要な課題として挙げられます。基盤モデルの大規模化に伴い、必要とされる GPU 等の計算リソースは増大しています。数十億 (数 B) 規模のパラメータのモデルであれば、NVIDIA A10G Tensor Core GPU を搭載する G5 ファミリーの Amazon Elastic Compute Cloud (EC2) インスタンスなどにデプロイすることが可能ですが、最小の g5.xlarge であっても、オンデマンド料金は米国東部 (バージニア北部) リージョンで $1.006/hour であり、24 時間 30 日起動すると一台だけでも $724 ほどかかります (2024 年 7 月時点)。

AWS の生成 AI アプリケーション構築サービスである Amazon Bedrock では、Amazon のほか、Anthropic、Cohere、Meta といった主要な基盤モデルプロバイダーが提供するモデルを、統合された API 経由で簡単に利用することができます。基盤モデルはサーバーレスとして利用可能であり、基本的にはリクエスト単位の課金となります。入力と出力のトークン数に応じた料金体系であり、背後のサーバーインスタンスの稼働時間や管理を気にする必要はありません。

自身で開発した基盤モデルや Hugging Face モデルハブで公開されている基盤モデルなどを自身でホスティングするのではなく、Amazon Bedrock へ持ち込み、直接サポートされているモデルと同様にサーバーレスで扱いたいという要望は以前から多くあり、2024 年 4 月に Custom Model Import on Amazon Bedrock という機能がプレビューで発表されました。Custom Model Import は、特定のタイプのモデルを Amazon Bedrock の InvokeModel API で実行できるようにインポートする機能であり、取り込んだモデルは他のモデルと同様にサーバーレスの形式で呼び出すことができるようになります (注: 執筆時点のプレビュー提供では詳細な料金体系が公開されていません。今後、仕様が変更になる可能性がある点にはご注意ください)

以下では、Custom Model Import on Amazon Bedrock について深掘りし、利用手順や、株式会社 NTT データと AWS が共同で実際に日本語 LLM をインポートした検証結果を紹介します。

Custom Model Import on Amazon Bedrock (プレビュー) とは

Amazon Bedrock の新機能である Custom Model Import (プレビュー) は、Amazon SageMaker など、Amazon Bedrock の外部の環境でカスタマイズした基盤モデルを Amazon Bedrock にインポートする機能です。これにより、日本語 LLM など、独自の基盤モデルに対して Amazon Bedrock の API を活用して推論を実行できるようになります。執筆時点では米国東部 (バージニア北部) リージョンと米国西部 (オレゴン) リージョンでサポートされており、オンデマンドのサーバーレス形式での利用が可能です。

Custom Model Import では、ファインチューニング、継続的事前学習、ドメイン適応などのチューニングを施したモデルだけでなく、ゼロから事前学習したモデルを取り込むことができます。モデルアーキテクチャーは現状 Mistral、Flan、Llama 2 および Llama 3 のみを対象としています。

インポート方法には、Amazon Simple Storage Service (Amazon S3) バケットから Hugging Face 形式のモデルファイルをインポートする方法と、SageMaker で作成したモデルを直接インポートする方法があります。S3 からインポートする場合は、.safetensor (モデルの重み)、config.json、tokenizer 関連のファイルが必要です。なお、FP32、FP16、BF16 精度のみがサポートされており、現状、量子化モデルは非対応です。

日本語 LLM との親和性

Custom Model Import では、対応モデルアーキテクチャーの制限はあるものの、日本語 LLM の開発において、Llama や Mistral をベースとしたアーキテクチャーが広く採用されています。例えば、elyza/Llama-3-ELYZA-JP-8B は、その名の通り meta-llama/Meta-Llama-3-8B-Instruct に日本語を追加学習させており、stabilityai/japanese-stablelm-instruct-gamma-7bmistralai/Mistral-7B-v0.1 をベースに日本語データを学習しています。これらのアーキテクチャーは、高性能な英語モデルを基盤としつつ、日本語特有の表現や文法を効率的に学習できる利点があります。また、tokyotech-llm/Llama-3-Swallow-70B-Instruct-v0.1 のように Llama 3 ベースで 700 億パラメータ規模の大規模なモデルを学習した事例も登場しています。

このように、公開されている日本語 LLM の多くは Custom Model Import がサポートしているアーキテクチャーをベースにしています。Custom Model Import は、運用効率のよい日本語 LLM のホスティングサービスとして期待されます。以下では、Custom Model Import の具体的な利用手順と、日本語 LLM に対して実際に検証した結果を紹介します。

Custom Model Import on Amazon Bedrock の利用手順

Amazon Bedrock コンソール上での、Custom Model Import の利用手順を説明します。なお、執筆時点では、本機能は米国東部 (バージニア北部) リージョンと米国西部 (オレゴン) リージョンでのみ利用可能です。また、本機能を利用するには、以下の 2 つの Service Quotas の上限緩和申請が必要です。

  • Concurrent model import jobs
  • Imported models per account

以降、Llama 3 Swallow 70B Instruct を Custom Model Import で インポートし、実際に Amazon Bedrock で利用できることを確認します。Llama 3 Swallow は、東京工業大学情報理工学院と国立研究開発法人産業技術総合研究所の研究チームで開発された大規模言語モデルです。Llama 3-Swallow 70B Instruct は、Llama 3 70B に対して、Swallow コーパスでの継続事前学習と指示チューニングを行うことで、日本語能力および指示に追従する能力を向上させたモデルであり、オープンな大規模言語モデルの中で、日本語や英語の言語理解・生成タスクにおいてトップクラスの性能を発揮しています (2024 年 7 月現在)。

S3 へモデルをアップロード

バージニア北部の任意の S3 バケットにモデルをアップロードします。本検証は、Ubuntu 20.04.6 LTS を利用し、以下のコマンドでモデルのダウンロードおよび、S3 へのアップロードを行いました。コマンド中の <your bucket> は、任意のバケット名に置き換えてください。

# Git Large File Storage をインストール
sudo apt install git-lfs

# モデルのダウンロード
git clone https://huggingface.co/tokyotech-llm/Llama-3-Swallow-70B-Instruct-v0.1

# S3 へモデルをアップロード
aws s3 cp Llama-3-Swallow-70B-Instruct-v0.1/ s3://<your bucket>/Llama-3-Swallow-70B-Instruct-v0.1/ --recursive

なお、モデルファイルの総量は約 132 GB あります。本検証では、モデルのダウンロードや S3 への転送にそれぞれ 1 時間以上かかりました。

Model Import Job の実行

バージニア北部リージョンで、Amazon Bedrock コンソールから、左側にあるナビケーションペインの [基盤モデル] セクションから [Imported models] を選択します。

imported_models

[Import model] を選択します。

import model

Model Import Job を実行するため、以下の情報を入力します。その他の項目はデフォルト値のままで問題ありません。

  • Model name: 任意のモデル名
  • S3 の場所: 先ほどアップロードしたモデルの S3 URI

import model job config

[Import model] ボタンをクリックすると、Model Import Job が開始されます。Status が Importing から Completed に変わるまで待ちます。

importing

Model Import Job が完了すると、Status が Completed に変わります。今回の検証では 20 分程度で完了しました。

completed

[Models] を選択し、モデル名を選択すると、モデルの S3 URI やインポートしたモデルの Model ARN などの詳細情報を確認できます。また、右上の [プレイグラウンドで開く] を選択すると、プレイグラウンドでの検証が可能です。

models

open playground

以下がプレイグラウンドでの検証画面です。画面の左上に表示されているモデル名が、自身で設定したモデル名になっていることを確認できます。

playground

Custom Model Import on Amazon Bedrock の機能検証

本節では、プレイグラウンドおよび、AWS SDK for Python (Boto3) を利用して、実際にインポートしたモデルで推論することができるかを検証します。

検証設定

利用するモデルは、前述の Llama 3 Swallow 70B Instruct です。評価用データセットとしては、JCommonsenseQA の validation データを利用しました。JCommonsenseQA は、日本語の常識推論能力を評価するための 5 択選択式の質問応答データセットです。

プロンプトの設定

以下のような、1-shot のプロンプトを与えました。なお、プロンプトには Llama 3 で利用されている Special Tokens を利用しています。Special Tokens を利用することで、システムプロンプトやユーザーの入力、LLM の出力の位置を明示することができます。以下では、<|start_header_id|><|end_header_id|> タグ内にロール (system/user/assistant) を指定し、その後に具体的な指示を与えています。それぞれのロールのメッセージは <|eot_id|> タグが終了の区切りとなります。

<|begin_of_text|>
<|start_header_id|>system<|end_header_id|>
あなたは誠実で優秀な日本人のアシスタントです。
<|eot_id|>
<|start_header_id|>user<|end_header_id|>
### 例 ###
質問: 電子機器で使用される最も主要な電子回路基板の事をなんと言う?
choice0: 掲示板
choice1: パソコン
choice2: マザーボード
choice3: ハードディスク
choice4: まな板
回答: マザーボード

質問: 次のうち、金管楽器であるのはどれ?
choice0: トランペット
choice1: ガラス
choice2: メビウス
choice3: メタル
choice4: 設計
回答:
<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>

コンソール上での検証

前述のプロンプトをプレイグラウンドに入力し、[実行] ボタンを押下します。

execute inference

実行結果は以下です。適切にプロンプト内の質問に回答することができています。

infer result

AWS SDK for Python (Boto3) での検証

AWS SDK for Python (Boto3) を利用し、API経由でインポートしたモデルを呼び出すことも可能です。具体的には、Amazon Bedrock の InvokeModel API を利用し、引数の modelId にインポートしたモデルの ARN を指定することで、推論を行えます。

本検証では、以下のコードを利用しました。コード中の変数 model_id にインポートしたモデルの ARN を指定しています。また、モデルの生成結果を出力する際、メッセージの終了を示す <|eot_id|> トークンとそれ以降を出力しないように実装しています。プレビュー中の現状では停止シーケンス (stop sequence) を直接パラメータとして与えることはできませんが、今後改善される可能性があります。

import json
import boto3

model_id = "<import model arn>"

system_prompt = "あなたは誠実で優秀な日本人のアシスタントです。"
prompt = """
### 例 ###
質問: 電子機器で使用される最も主要な電子回路基板の事をなんと言う?
choice0: 掲示板
choice1: パソコン
choice2: マザーボード
choice3: ハードディスク
choice4: まな板
回答: マザーボード

質問: 次のうち、金管楽器であるのはどれ?
choice0: トランペット
choice1: ガラス
choice2: メビウス
choice3: メタル
choice4: 設計
回答:
"""
stop_sequence = "<|eot_id|>"

formatted_prompt = f"""
<|begin_of_text|>
<|start_header_id|>system<|end_header_id|>
{system_prompt}
<|eot_id|>
<|start_header_id|>user<|end_header_id|>
{prompt}
<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
"""

client = boto3.client(service_name="bedrock-runtime", region_name="us-east-1")

response = client.invoke_model(
    body=json.dumps(
        {
            "prompt": formatted_prompt,
            "top_p": 0.9,
            "temperature": 0.5,
        }
    ),
    modelId=model_id,
)
output = response.get("body").read().decode("utf-8")
response_body = json.loads(output)
response_text = response_body["outputs"][0]["text"]
print(response_text.split(stop_sequence)[0])   # stop_sequenceとそれ以降は表示しない

上記のコードを実行すると、以下が出力されました。

トランペット

質問に対する回答のみが適切に出力されていることが確認できます。このように、プレイグラウンドの GUI 上だけでなく、Boto3 でも利用できるため、アプリケーションへの組み込みも容易に行うことが可能です。

まとめ

本稿では、Custom Model Import on Amazon Bedrock と、その利用方法について紹介しました。また、Llama 3 Swallow 70B Instruct のような大規模なモデルでも Amazon Bedrock 上にインポートすることで、サーバーレスで実行できることを確認しました。仮に本モデルをローカルで実行したい場合、NVIDIA A100 や NVIDIA H100 などの高スペックなマシンリソースや、数百 GB 以上のストレージが必要になります。Custom Model Import on Amazon Bedrock を利用することで、これらのマシンリソースの調達・管理やストレージの確保といった運用が不要になるという点は、利用者にとって大きなメリットとなります。

是非 Custom Model Import on Amazon Bedrock を活用し、幅広い日本語 LLM の業務への適用を検討ください。AWS と AWS パートナーがみなさまをご支援します。

Kazuki Motohashi

Kazuki Motohashi

アマゾン ウェブ サービス ジャパン合同会社の機械学習パートナーソリューションアーキテクトとして、AWS 上で機械学習関連プロダクトを開発するパートナーの皆様に対する技術支援を担当。博士(理学)