Amazon Web Services ブログ

32,000トークン対応の商用利用可能な日本語チャットモデル CyberAgentLM2 をワンクリックで FineTune とデプロイ

生成 AI の発展と共にモデルの規模はどんどん大きくなり、デプロイするためのインフラの選択や設定はますます複雑になっています。 Amazon SageMaker JumpStart は大規模言語モデルを最適な設定、かつワンクリックでデプロイする機能を提供します。オープンソースコミュニティとの連携を通じ、AWS はこれまで Meta の Llama2TII の Falconrinna の japanese-gpt-neox などを JumpStart で提供してきました。このたび株式会社サイバーエージェントから公開されている大規模言語モデルである CyberAgentLM2-7B-Chat (CALM2-7B-Chat) が JumpStart から利用できるようになりました。(プレスリリース

サイバーエージェントは 2023 年 6 月に独自の LLM である OpenCALM を初めて発表し、このモデルを用いてクイズ王に挑戦するブログを掲載しました。今回 Amazon SageMaker Jumpstart から利用できるようになったモデルは、11 月に同社から発表された次世代の CALM2 シリーズのチャット用途向けの CALM2-7B-Chat です。このモデルは 1.3 兆トークンの日本語と英語の公開データセットで学習された Transformer ベース(Llama)の CyberAgentLM2-7B (CALM2-7B) をチャット向けに教師有り学習でファインチューニングしたモデルです。入出力の長さとして 32,000 トークンに対応しており、日本語の文章として約 50,000 文字を一度に処理することができます。モデルは商用利用可能な Apache License 2.0 で提供されています。

70 億パラメータのモデルであるため、昨今の大規模モデルに比べて比較的軽量です。応答速度も早く、軽量ながら高い精度を期待できます。そのため、有料なプロプライエタリモデルの代用としての利用が考えられます。例えば、コストを最適化したい場合や、プロプライエタリなモデルに送信できない社内の秘匿情報を使用したい場合などに CALM2 の利用を検討できます。また、CALM2-7B-Chat は 50,000 文字の日本語を一度に処理することができるため、他の OSS モデルと比べ RAG や要約などを用いたチャット用途で高い精度を期待できます。また、軽量なモデルのため低コストでファインチューニングを行いことができ用途にあったモデルへのカスタマイズに向いています。

今回のアップデートにより、この CALM2-7B-Chat を SageMaker JumpStart を利用して素早くお試しいただけます。また、データを用意するだけで JumpStart から追加学習を行えるため、各ユーザーの用途にあったチャットモデルを簡単に構築できます。

Amazon SageMaker JumpStart で CALM 2 のモデルを起動する

Amazon SageMaker Studio から JumpStart のメニューを起動します。 SageMaker Studio を使うのが初めてという方は、SageMaker Immersion Day のハンズオンを参考に環境を構築してください。環境を作るだけ / 起動するだけでは料金はかかりません。実行する Jupyter Notebook やエンドポイント、学習ジョブなどに割り当てたインスタンス、またデータの保管や転送に対し課金が発生します。ここから先、課金が発生するタイミングについてはその旨と価格の目安を記載します。

SageMaker Studio にアクセスしたら、 JumpStart のメニューから “calm2” で検索を行います。

ヒットしたモデルカードをクリックすると、モデルの詳細画面が開きます。デプロイするのに必要なのは、 “Deploy” のボタンを押すだけです。

Deployment Configuration ではインスタンスの選択やエンドポイントの設定を行うことができます。インスタンスは最適なものからのみ選べるようになっているので、非常に長いドロップダウンリストに悩まされることはありません。
Security Settings ではエンドポイントの作成に使用する IAM ロールや VPC 、モデルの暗号化に使うキーを設定できます。
Deploy を押すとデプロイが開始します。 4~5 分で完了します。

“In Service” となったらデプロイ完了です。この時点から、エンドポイント用に指定したインスタンスの課金 ( 今回は ml.g5.2xlargeオンデマンドの価格は 2024 年 2 月時点で $1.212/時 、同時期の換算レートで 181 円/時 ) が発生しますが、本ブログの動作確認をするだけなら 100 円程度で済みます。

Use Endpoint from Studio のセクションから “Open Notebook” をクリックします。

ここで、ノートブックを動かすためのインスタンスが別途必要になります。ノートブックが動けばよいので、それほどスペックのあるインスタンスは必要ありません。今回使用したインスタンスは ml.t3.medium東京リージョンのオンデマンド価格は $0.065 (同時期の換算レートで 10 円/時) です。料金が気になる方は、ローカル PC や Amazon SageMaker Studio Lab から API を通じ利用することもできます。

Notebook を立ち上げると目次が表示されます。Notebook には複数のタスクをすぐに試せるようにプロンプトエンジニアリングのサンプルが提供されています。(2024年4月追記:以下のサンプルノートブックはこちらに移動しました)

CALM2 に合わせてプロンプトのフォーマットを行う実装になっており、異なるユースケースでのプロンプトエンジニアリングの検証ができます。例えば、SageMaker の推論エンドポイントを呼び出す際は以下のようなコードでお試しいただけます。

import json
import boto3

newline, bold, unbold = '\n', '\033[1m', '\033[0m'
endpoint_name = "jumpstart-dft-hf-llm-calm2-7b-chat-bf16" # Your Inference Endpoint

parameters = {
    "max_new_tokens": 256,
    "return_full_text": False,
    "do_sample": True,
    "top_k": 2,
    "repetition_penalty": 1.1,
    "stop": ["<|endoftext|>", "USER:"]
}

def query_endpoint(payload, do_print = False):
    client = boto3.client('runtime.sagemaker')
    response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/json', Body=json.dumps(payload).encode('utf-8'))
    model_predictions = json.loads(response['Body'].read())
    generated_text = model_predictions[0]['generated_text']
    if do_print:
        print (
            f"Input Text: {payload['inputs']}{newline}"
            f"Generated Text: {bold}{generated_text}{unbold}{newline}")
    return generated_text

def format_prompt (prompt_pairs, system_add=True):
    prompt = [
        f"{uttr['speaker']}: {uttr['text']}" + ("<|endoftext|>" if uttr['speaker'] == "ASSISTANT" else "")
        for uttr in prompt_pairs
    ]
    prompt = "\n".join(prompt)
    if system_add:
        prompt = (
            prompt
            + "\n"
            + "ASSISTANT: "
        )
    return prompt

prompt = [
    {
        "speaker": "USER",
        "text": "Hello, you are an assistant that helps me learn Japanese."
    },
    {
        "speaker": "ASSISTANT",
        "text": "Sure, what can I do for you?"
    },
    {
        "speaker": "USER",
        "text": "VRはなんですか。"
    }
]
formated_prompt = format_prompt(prompt)

payload = {
    "inputs": formated_prompt,
    "parameters": parameters
}
query_endpoint(payload) 

検証が終了したら、忘れずに 1) Notebook に使ったインスタンスを停止して、 2) エンドポイントのインスタンスも停止してください。 SageMaker Studio の画面の左側にある電源メニューから Notebook の起動に使われているインスタンスを確認、停止できます。 JumpStart のエンドポイントはモデルの詳細画面にある Delete Endpoint から停止することができます。

モデルの詳細画面を見失った場合、JumpStart の Launched JumpStart assets のメニューからいつでも参照できます。 Title がリンクになっており、モデル詳細画面が開けます。一度エンドポイントを停止すると、ここには表示されなくなります。

Amazon SageMaker JumpStart で CALM2 を FineTune する方法

また、SageMaker JumpStart ではファインチューニング用のコードを書かずに、自社のデータを用意するだけで簡単にファインチューニングすることが可能です。

軽量な OSS モデルは大規模な API モデルと比較してレスポンス速度とコストの面で優れており、特定タスクに特化させるファインチューニングを行うことで該当タスクにおいて API モデルに匹敵する高精度なモデルを作れる可能性があります。例えば、情報抽出タスクに特化させたり、特定のフォーマットや文体で要約を行ったり、人格を模倣したりするなどのプロンプトエンジニアリングだけでは精度が不十分なユースケースに向いています。モデルのパラメータ数と学習させるデータ量による精度の違いについては以前 API と OSS のモデルを比較した記事で検証しており、モデルの選定と必要な学習データ量についての目安としてご参照ください。

モデルのファインチューニングを行うには、まずはデータを用意する必要があります。CALM2 のファインチューニングはデータのフォーマットとして、ドメイン適応ファインチューニング(Domain Adaptation Fine-Tuning)とインストラクションファインチューニング(Instruction Fine-Tuning)をサポートしています。一般的に、特定のタスクに特化させることが目的の場合インストラクションファインチューニングが利用されることが多く、ドメイン適応ファインチューニングはラベルなしデータで特定ドメインの知識を強化する際に利用されます。

ドメイン適応ファインチューニングの場合は学習データは CSV / JSON / TXT ファイルを用意します。インストラクションファインチューニングの場合は、学習データが含まれる JSON 行 (.jsonl) 形式のファイルと入出力のフォーマットを記述する JSON ファイルを用意します。例えば、instruction , input , output の列が含まれる JSON 行 データセットで情報抽出タスクで学習させる場合は以下のような JSON ファイルで入出力のフォーマットを指定します。詳細なデータフォーマットの仕様については SageMaker JumpStart のモデルの詳細画面をご確認ください。

{
    "prompt": "USER: 与えられた文脈から、質問に対する答えを抜き出してください。\n\n文脈:{input}\n質問:{instruction}\nASSISTANT: ",
    "completion": "{output}<|endoftext|>"
}

このブログの検証を行いたい場合は、例えばサンプルデータとして Databricks 社が公開している Dolly Dataset や要約データセットの xlsum をダウンロードし上記のフォーマットを指定する JSON を手元に作成してください。

データを用意したら、S3 にアップロードし学習データが格納された S3 パスを指定します。また、必要に応じてハイパーパラメーターも変更することが可能です。学習の設定が完了したら “Train” を押すと学習が開始されます。学習時間はデータ量、インスタンスサイズ、バッチサイズ、学習手法(フルパラメータ/LoRA)などのハイパーパラメーターにより変化します。

学習が終了したら、ファインチューニングしたモデルをデプロイすることが可能です。

AWS Japan の大規模言語モデルに対する取り組み

AWS Japan では昨年 7 月 3 日に「LLM 開発支援プログラム」を発表し、日本で大規模言語モデルの構築にチャレンジするお客様を支援しており、1 月 30 日には成果発表が行われました。開発支援プログラムの成果として Karakuri LMNekomatastockmark-13bWatashiha-Llama2-13B-Ogiri など、LLM のトレーニングを最大 50 %削減可能な AWS Trainium を活用して学習を行った複数のモデルが OSS モデルとして公開されています

AWS は、常にお客様の声に耳を傾け、そのご要望にお応えすることを大切にしています。特に日本のお客様からいただいたフィードバックは、サービス改善に欠かせない貴重な意見となっています。日本語対応の強化やモデルのカスタマイズなど、お客様のニーズに合わせて機能を拡充することで、AWS はより使いやすく、便利なサービスを提供していきます。先の API と OSS モデルを比較した記事のように性能検証も公平に行い、モデルのメリットを最大限に引き出せるよう取り組んでまいります。AWS はオープンプラットフォームとして、常に進化を続けていきます。その原動力となるのが、お客様の生の声です。今後もお客様とともに歩み、ご要望にお応えすることで、AWS の価値を高めてまいりたいと考えています。ぜひ引き続き、ご意見・ご要望をお寄せください。

著者プロフィール

前川 泰毅 (Taiki Maekawa) は AWS Japan のソリューションアーキテクトでメディア領域のお客様中心にアーキテクチャ設計や構築を支援しています。機械学習領域を得意としておりソリューションやサンプルコードの作成を行っています。
黒澤 蓮 (Ren Kurosawa) は AWS Japan のソリューションアーキテクトで、Web 業界のお客様を中心にアーキテクチャ設計や構築をサポートしています。データアナリティクスサービスや機械学習の領域を得意としています。将来の夢は宇宙でポエムを詠むことです。