Amazon Web Services ブログ

Stability AI Japan の Japanese Stable LM Instruct Alpha 7B v2 が Amazon SageMaker JumpStart で使えるようになりました

アマゾン ウェブ サービス (AWS) は Amazon Bedrock を初めとした生成 AI サービスを提供しています。Amazon Bedrock では、Amazon の基盤モデルだけでなく、Anthropic、Stability AI、Meta といった代表的な生成 AI モデルプロバイダーの基盤モデルが利用可能です。一方で、日本語という言語の特殊性などへの対応のため、国内事業者により日本語特化の大規模言語モデル (LLM) の開発が進められています。AWS ジャパンは、LLM 開発支援プログラムなどを通じて、お客様にとってのモデルの選択肢を拡充する活動を行っています。この度、LLM を AWS 上で簡単にデプロイしたりファインチューニングできるサービスである Amazon SageMaker JumpStart において、Stability AI 社が開発した日本語 LLM である Japanese Stable LM Instruct Alpha 7B v2 が利用可能になりました。SageMaker JumpStart に日本語 LLM を掲載するのは、rinna 社に続いて 2 社目の事例となります。今回のモデル登録も AWS ジャパンとしての活動から生まれました。

japanese stable lm instruct alpha 7b v2

本記事では、SageMaker JumpStart を通じて Japanese Stable LM Instruct Alpha 7B v2 モデルを探して、ノーコード、および SageMaker Python SDK でデプロイする方法を解説します。

Japanese Stable LM Instruct Alpha 7B v2 とは

Japanese Stable LM Instruct Alpha 7B v2 は、Stability AI Japan によって開発された 70 億パラメータを持つ大規模言語モデルです。Transformer モデルのデコーダーのみで構成される自己回帰言語モデルである、Japanese Stable LM Base Alpha 7B の事前学習モデルをベースに構築されており、さらにさまざまな指示 (instruction) データセットを用いて微調整されています。指示データセットを用いた微調整により、テキスト生成、テキスト要約、質問応答など、さまざまなゼロショットおよび少数ショット (few-shot) の自然言語処理タスクを実行することができるようになっています。Apache License 2.0 の条項に従い、無料かつ商用利用可能でオープンなモデルであることも特徴です。

SageMaker JumpStart とは

SageMaker JumpStart は、機械学習の開発運用のプロセスを加速させることができるハブのサービスです。SageMaker JumpStart ではモデルカタログの機能も提供しており、幅広いタイプの基盤モデルが掲載されています。例えば、機械学習エンジニアの方々は、ネットワークから隔離された環境から専用の SageMaker インスタンスに基盤モデルをデプロイしたり、SageMaker 上でモデルのトレーニングを実行してカスタマイズすることができます。なお、同じく複数の基盤モデルにアクセスできるサービスとして Amazon Bedrock がありますが、Amazon Bedrock はサーバーレスのサービスであり、インフラを考慮ぜずに使えるのが特徴です。逆に、SageMaker JumpStart ではニーズに合わせてインフラをコントロールできる点が異なります。

以降で解説するように、SageMaker Studio の GUI で数回クリックするか、SageMaker Python SDK を介してプログラム的に Japanese Stable LM Instruct Alpha 7B v2 をご自身の環境にデプロイすることができます。また、SageMaker Pipelines などの SageMaker の MLOps 機能を使用して基盤モデルの運用を高度化することも可能です。モデルは AWS のセキュアな環境にデプロイされ、お客様の VPC 管理下に置くことも可能です。そのため、データセキュリティが確保されます。Japanese Stable LM Instruct Alpha 7B v2 モデルは、東京リージョン (ap-northeast-1) を含めた複数のリージョンで利用可能です。

SageMaker JumpStart で Japanese Stable LM Instruct Alpha v2 をノーコードでデプロイする

SageMaker Studio の GUI から SageMaker JumpStart を開くか、もしくは SageMaker Python SDK を利用して基盤モデルにアクセスすることができます。このセクションでは、SageMaker Studio でモデルを探す方法について説明します。

SageMaker Studio は統合開発環境 (IDE) であり、データの準備から機械学習モデルの構築、トレーニング、デプロイ、監視まで、機械学習の開発運用ライフサイクル全体をカバーする Web ベースのビジュアルインターフェイスを提供します。SageMaker Studio の開始方法とセットアップ方法の詳細については開発者ドキュメントを参照してください。

SageMaker Studio にアクセスすると、左側のメニューより SageMaker JumpStart にアクセスできます。

jumpstart menu

SageMaker JumpStart を開くと、さまざまなモデルハブやモデルプロバイダーのリストが表示されます。今回は Stability AI のカードをクリックします。

landing page of jump start

Stability AI のページでは画像生成モデルである Stable Diffusion のいくつかのバージョンが選択できますが、それだけではなく、新しい Japanese Stable LM Instruct Alpha 7B v2 も表示されています。

japanese stable lm instruct alpha 7b v2

Japanese Stable LM Instruct Alpha 7B v2 のカードを開くとモデルの詳細を確認できます。ここではモデルの説明、トレーニングに使われたデータセット、ライセンスなどが確認できます。右上の Deploy をクリックするとモデルデプロイ用の画面に遷移します。

japanese stable lm model card

推論エンドポイントの名前、インスタンスタイプ、インスタンス数、その他オプションをセットした上で右下の Deploy ボタンを押すとモデルのデプロイが開始されます。ちなみに、ここで選択している ml.g5.2xlarge は NVIDIA A10G Tensor Core GPU (GPU メモリ 24 GiB) が 1 台搭載されており、東京リージョンでは 1 時間あたり 2.197 USD で利用できる、推論用途に適したインスタンスです。インスタンスタイプごとの特徴はこちら、SageMaker の料金はこちらを参照してください。

deploy model to endpoint

5-10 分ほど待機して、ステータスが In service に変わればデプロイは成功です。

endpoint summary

SageMaker Python SDK でデプロイする

もちろん GUI からモデルをデプロイするだけでなく、SageMaker Python SDK を用いてプログラム的にデプロイすることもできます。その際には、SageMaker Python SDK の JumpStartModel クラスで対象のモデル ID を指定し、deploy() メソッドを呼ぶことで実行できます。

import sagemaker
from sagemaker.jumpstart.model import JumpStartModel

model_id = "model-textgenerationjp-japanese-stablelm-instruct-alpha-7b-v2"
model = JumpStartModel(model_id=model_id)

predictor = model.deploy()

後述するように、こちらの返り値の predictor を用いて推論自体を実行することもできます。

Japanese Stable LM Instruct Alpha 7B v2 で推論を実行する

Japanese Stable LM Instruct Alpha 7B v2 は以下のような形式で入力を受け取ることを前提にチューニングされています。「以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。」という文章は常に固定であり、「### 指示:」のセクションに質問事項や解きたいタスクの説明を与え、「### 入力:」のセクションはオプション変数として指示に関する詳細情報や選択肢などの補足情報を必要に応じて与えます。そして、「### 応答:」のセクションに LLM からの応答が入るという構成になっています。

以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
与えられたことわざの意味を小学生でも分かるように教えてください。

### 入力:
情けは人のためならず

### 応答: 

このプロンプトの形式を一定に保つため、以下のように build_prompt 関数を用意し、instructioninput のキーを持つ辞書をインプットとして、プロンプトを構築するような仕組みを用意することをおすすめします。以降のコードは SageMaker Studio から Code Editor などを開いて実行してください。

input1 = {
    "instruction": "与えられたことわざの意味を小学生でも分かるように教えてください。",
    "input": "情けは人のためならず",
}

def build_prompt(instruction, input="", sep="\n\n### "):

    sys_msg = "以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。"
    p = sys_msg

    roles = ["指示", "応答"]
    msgs = [": \n" + instruction, ": \n"]

    if input:
        roles.insert(1, "入力")
        msgs.insert(1, ": \n" + input)

    for role, msg in zip(roles, msgs):
        p += sep + role + msg

    return p
    
prompt1 = build_prompt(input1["instruction"], input1["input"])

プロンプトは JSON 形式にエンコードしていきます。text_inputs キーにプロンプトの文字列を渡します。その他、LLM の推論に関わるパラメーターも同時に渡すことができます。

payload = {
    "text_inputs": prompt1,
    "early_stopping": True,
    "no_repeat_ngram_size": 4,
    "max_new_tokens": 128,
    "do_sample": True,
    "temperature": 1.0,
    "top_p": 0.95,
} 

推論を実行するには、SageMaker のランタイムのクライアントを用意し、invoke_endpoint API を実行します。EndpointName には推論エンドポイントの名前、ContentType には application/jsonBody には JSON エンコードした上記のペイロードを渡します。すると、推論エンドポイントからのレスポンスが返ってきます。

import json
import boto3
from pprint import pprint

client = boto3.client("runtime.sagemaker", region_name=region_name)
response = client.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType="application/json",
    Body=json.dumps(payload).encode("utf-8"),
)

なお、Japanese Stable LM Instruct Alpha 7B v2 を ml.g5.2xlarge インスタンス 1 台にデプロイした推論エンドポイントを上記のスクリプトで 700 回実行して推論にかかる時間の統計を取ったところ、今回の設定では 2.09 s ± 102 ms (平均値 ± 標準偏差) という結果になりました。この結果は、インスタンスタイプや、インスタンス数、推論パラメーター (特に出力文の長さを調整する max_new_tokens) に依存する点にはご注意ください。

さて、LLM からの出力 (completion) は Body キーに StreamingBody 形式で格納されているので、read() で読み込みます。

prediction = json.loads(response["Body"].read())
generated_text = prediction[0][0]["generated_text"]

pprint(generated_text)

生成されたテキストは以下のようになっています。今回は推論パラメーターの top_p (上位 p % のトークンを取得) と temperature (確率分布の散らばり具合を調整) をそれぞれランダム性が出るように設定しているため、推論を実行するたびに異なった出力文が生成されます。

# generated_text の中身
('以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n'
 '\n'
 '### 指示: \n'
 '与えられたことわざの意味を小学生でも分かるように教えてください。\n'
 '\n'
 '### 入力: \n'
 '情けは人のためならず\n'
 '\n'
 '### 応答: \n'
 '「情けは人の為ならず」は、情けは他人のためを思ってかけるものですが、結果として、自分に恩恵が戻ってくるという意味です。')

応答部分だけ抜き出すと『「情けは人の為ならず」は、情けは他人のためを思ってかけるものですが、結果として、自分に恩恵が戻ってくるという意味です。 』となっています。「情けは人の為ならず」ということわざは、三省堂のスーパー大辞林では『情けを人にかけておけば,巡り巡って自分によい報いが来るということ。』という意味であると説明されています。誤用されがちなことわざではありますが、Japanese Stable LM Instruct Alpha 7B v2 も辞書と同等の説明ができていることがわかります。

SageMaker Python SDK でモデルをデプロイした場合の推論方法

SageMaker Python SDK の JumpStartModel クラスの deploy() メソッドを用いてモデルをデプロイした場合、返り値の predictor を用いて推論を実行することができます。裏側では上記の方法と同様に invoke_endpoint が呼ばれていますが、複数の処理が隠蔽されており、シンプルな API で推論を実行することができます。

predictor.content_type = "application/json"
prediction = predictor.predict(
    json.dumps(payload).encode("utf-8"), 
)

あと片付け

SageMaker のリアルタイム推論エンドポイントは、起動中に課金され続けるため、検証が終わったら忘れずに削除してください。

sagemaker_client = boto3.client("sagemaker", region_name=region_name)
# 推論エンドポイントの削除
sagemaker_client.delete_endpoint(EndpointName=endpoint_name)
# SageMaker Python SDK を利用した場合
predictor.delete_endpoint()

まとめ

本記事では、SageMaker Studio から SageMaker JumpStart に掲載されている Japanese Stable LM Instruct Alpha 7B v2 モデルを使い始める方法を紹介しました。SageMaker JumpStart を使うことで、動作が保証されているインスタンス上で最適化された推論コードを用いた推論エンドポイントの作成を行うことができます。基盤モデルは事前にトレーニングされているため、追加のトレーニングを行うことなく、ユースケースに合わせてすぐ利用を開始することができます。ぜひみなさんも SageMaker JumpStart から Japanese Stable LM Instruct Alpha 7B v2 を試してみてください!


著者について

kazmot本橋 和貴 (Kazuki Motohashi) は、AWS Japan の機械学習パートナーソリューションアーキテクトです。AWS 上で機械学習関連のソフトウェアを開発しているパートナー企業の技術支援を担当をしています。好きなサービスは Amazon SageMaker です。週末は某世界旅行すごろく系ゲームを 1 人で 100 年分走り切る修行をしていましたが、挫折しています。