大規模言語モデルのファインチューニング: Vertex AI が LLM を次のレベルに引き上げる方法

1. はじめに

ファインチューニングが重要な理由

基盤モデルは汎用的にトレーニングされているため、期待したタスクが実行されないことがあります。その理由としては、モデルに実行させたいタスクが特殊なタスクであり、プロンプト設計のみではモデルに学習させることが難しいためです。このような場合は、モデルをチューニングして、特定のタスクに対するモデルのパフォーマンスを改善できます。モデルのチューニングは、指示が不十分な場合に特定の出力要件に従う場合にも役立ちます。大規模言語モデル(LLM)は、膨大な量の情報を持つことができ、多くのタスクを実行できますが、その能力を発揮するには、専門的なトレーニングが必要です。ファインチューニングによって LLM をトレーニングし、事前トレーニング済みの LLM を特定のニーズに合わせて適応させることができます。

この Codelab では、教師ありチューニング アプローチを使用して LLM モデルにファインチューニングを行う方法を学びます。

教師ありチューニングでは、新しいスキルを教えることでモデルのパフォーマンスを改善します。ラベル付けされた何百ものサンプルを含むデータを使用して、目的の動作やタスクを模倣するようモデルに学習させます。入力テキスト(プロンプト)と出力テキスト(レスポンス)用のラベル付きデータセットを提供し、特定のユースケースに合わせてレスポンスをカスタマイズする方法をモデルに学習させます。

モデルのカスタマイズについて詳しくは、こちらをご覧ください。

作成するアプリの概要

ユースケース: ニュース記事の見出しを生成する

ニュース記事の見出しを自動生成するとします。Vertex AI を使用すると、LLM をファインチューニングできます。この LLM は、特定のスタイルで適切な要約されたタイトルを生成し、ニュース チャンネルのガイドラインに従ってタイトルをカスタマイズするものです。

この Codelab では、以下のことを行います。

  • BBC FULLTEXT DATA(BigQuery 一般公開データセット bigquery-public-data.bbc_news.fulltext で利用可能)を使用します。
  • LLM(text-bison@002)をファインチューニングして、新しいモデル「bbc-news-summary-tuned」にファインチューニングしますその結果をベースモデルからのレスポンスと比較します。この Codelab 用のサンプル JSONL ファイルはリポジトリにあります。ファイルを Cloud Storage バケットにアップロードして、次のファインチューニング手順を実行できます。
  • データを準備する: サンプルコードで使用した BBC News のデータセットなど、ニュース記事とそれに対応する見出しのデータセットから始めます。
  • 事前トレーニング済みモデルのファインチューニング:text-bison@002」などのベースモデルを選択します。Vertex AI SDK for Python を使用してニュースデータで 微調整できます
  • 結果を評価する: ファインチューニングしたモデルとベースモデルのパフォーマンスを比較して、広告見出し生成の品質が向上しているかどうかを確認します。
  • モデルをデプロイして使用する: ファインチューニングしたモデルを API エンドポイントを介して利用可能にし、新しい記事の見出しの自動生成を開始します。

2. 始める前に

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. Colab ノートブックを開き、現在アクティブな Google Cloud アカウントと同じアカウントにログインします。

3. 大規模言語モデルをファインチューニングする

この Codelab では、Vertex AI SDK for Python を使用してモデルをファインチューニングします。HTTP、CURL コマンド、Java SDK、コンソールなどの他のオプションを使用して微調整することもできます。

5 つのステップでモデルをファインチューニングして評価し、カスタマイズされたレスポンスが得られます。完全なコードは、リポジトリllm_fine_tuning_supervised.ipynb ファイルで確認できます。

4. ステップ 1: 依存関係をインストールしてインポートする

!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components

リポジトリの .ipynb ファイルに記載されている残りの手順に沿って操作します。PROJECT_ID と BUCKET_NAME を自分の認証情報に置き換えてください。

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import warnings
warnings.filterwarnings('ignore')
import vertexai
vertexai.init(project=PROJECT_ID, location=REGION)
import kfp
import sys
import uuid
import json
import pandas as pd
from google.auth import default
from datasets import load_dataset
from google.cloud import aiplatform
from vertexai.preview.language_models import TextGenerationModel, EvaluationTextSummarizationSpec

5. ステップ 2: トレーニング データを準備して読み込む

YOUR_BUCKET をバケットに置き換え、サンプルの TRAIN.jsonl トレーニング データ ファイルをアップロードします。このユースケースのサンプルデータは、上記のリンクでプロビジョニングされています。

json_url = 'https://storage.googleapis.com/YOUR_BUCKET/TRAIN.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)

このステップでは、次のようになります。

17274866af36a47c.png

6. ステップ 3: 大規模言語モデルをファインチューニングする

この時点で、どのような大規模言語モデルでもチューニングできます(サポートの有無によって異なります)。ただし、このスニペットでは、事前トレーニング済みモデル「text-bison@002」をチューニングしています。を、前のステップで読み込んだトレーニング データを含む DataFrame に置き換える必要があります。

model_display_name = 'bbc-finetuned-model' # @param {type:"string"}
tuned_model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model.tune_model(
training_data=df,
train_steps=100,
tuning_job_location="europe-west4",
tuned_model_location="europe-west4",
)

このステップが完了するまでに数時間かかります。結果のパイプライン ジョブリンクを使用して、ファインチューニングの進行状況を追跡できます。

7. ステップ 4: 新しいファインチューニングされたモデルで予測する

ファインチューニング ジョブが完了すると、新しいモデルで予測できるようになります。新しいチューニング済みモデルを使用して予測するには:

response = tuned_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

次のような結果が表示されます。

67061c36b7ba39b7.png

比較のためにベースモデル(text-bison@002)を使用して予測するには、次のコマンドを実行します。

base_model = TextGenerationModel.from_pretrained("text-bison@002")
response = base_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

次のような結果が表示されます。

22ec58e4261405d6.png

生成された両方のタイトルは適切であるように見えますが、最初のタイトル(ファインチューニングされたモデルで生成されたもの)は、問題のデータセットで使用されているタイトルのスタイルにより合っています。

ファインチューニングされたモデルを読み込む

ファインチューニングしたモデルを読み込む方が簡単な場合もあります。ただし、ステップ 3 では、これはコード自体のスコープ内で呼び出されるため、チューニング済みモデルを変数 tuning_model に保持します。しかし、過去にチューニングされたモデルを呼び出す場合はどうでしょうか。

そのためには、Vertex AI Model Registry にあるファインチューニングされたデプロイ済みモデルの完全なエンドポイント URL を使用して、LLM で get_tuned_model() メソッドを呼び出します。この例では、ID の代わりに PROJECT_NUMBER と MODEL_NUMBER を入力します。

tuned_model_1 = TextGenerationModel.get_tuned_model("projects/<<PROJECT_NUMBER>>/locations/europe-west4/models/<<MODEL_NUMBER>>")
print(tuned_model_1.predict("YOUR_PROMPT"))

8. ステップ 5: ファインチューニングされた新しいモデルを評価する

生成された回答の品質と関連性を評価するには、評価が重要な作業となります。これには、生成言語モデルからの出力を調べて、その一貫性、精度、指定されたプロンプトとの整合性を判断することが含まれます。モデルの評価は、改善の余地がある領域を特定し、モデルのパフォーマンスを最適化して、生成されたテキストが品質と有用性に関する必要な基準を満たしていることを確認するのに役立ちます。詳しくは、こちらのドキュメントをご覧ください。ひとまず、ファインチューニングされたモデルの評価指標を取得してベースモデルと比較する方法を説明します。

  1. EVALUATION データセットを読み込みます。
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
  1. ファインチューニングされたモデルでのテキスト要約タスクの評価仕様を定義します。
task_spec = EvaluationTextSummarizationSpec(
 task_name = "summarization",
 ground_truth_data=df
)

このステップが完了するまでに数分かかります。結果内のパイプライン ジョブリンクを使用して進行状況を追跡できます。完了すると、次の評価結果が表示されます。

387843d6c970e02.png

評価結果の rougeLSum 指標は、サマリーの ROUGE-L スコアを指定します。ROUGE-L は要約と参照要約の重複を測定する再現率ベースの指標です。2 つのサマリーの間で最長共通部分列(LCS)を取り出し、参照サマリーの長さで割って計算されます。

指定された式の rougeLSum スコアは 0.36600753600753694 です。これは、要約が参照要約と 36.6% の重複があることを意味します。

ベースライン モデルに対して評価ステップを実行すると、ファインチューニングされたモデルの方がサマリースコアが相対的に高くなります。

評価結果は、評価ジョブの作成時に指定した Cloud Storage 出力ディレクトリにあります。ファイル名は evaluation_metrics.json です。チューニング済みモデルの場合は、Google Cloud コンソールの Vertex AI の [Model Registry] ページで評価結果を確認することもできます。

9. 重要な考慮事項

  • モデルのサポート: 最新の互換性については、必ずモデルのドキュメントを確認してください。
  • 迅速な開発: LLM の分野は急速に進歩しています。より強力な新しいモデルは、古い基盤に基づいて構築されたファインチューニングされたモデルよりも優れたパフォーマンスを発揮する可能性があります。幸いなことに、これらのファインチューニング手法は、機能が使用可能になったときに新しいモデルに適用できます。
  • LoRA: LoRA は、LLM を効率的にファインチューニングするための手法です。これは、トレーニング可能な低ランクの分解行列を既存の事前トレーニング済みモデルのレイヤに導入することで実現されます。詳しくはこちらをご覧ください。LoRA では、大規模な LLM のすべてのパラメータを更新するのではなく、元のモデルの重み行列に追加または乗算される、より小さな行列を学習します。これにより、ファインチューニングで導入される追加パラメータの数が大幅に削減されます。

10. クリーンアップ

この Codelab で使用したリソースについて、Google Cloud アカウントに課金されないようにする手順は次のとおりです。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  4. または、[Model Registry] に移動して [モデルのデプロイとテスト] タブに移動し、エンドポイントのデプロイを解除して、デプロイされたチューニング済みモデルを削除します。

11. 完了

これで、Vertex AI を使用して LLM モデルをファインチューニングすることができました。ファインチューニングは、ドメインとタスクに合わせて LLM をカスタマイズできる優れた手法です。Vertex AI には、モデルを効率的かつ効果的にファインチューニングするために必要なツールとリソースが用意されています。

GitHub リポジトリを探索し、サンプルコードを試して、ファインチューニング評価を直接体験してください。ターゲットを絞ったマーケティング コピーの生成、複雑なドキュメントの要約、文化的なニュアンスに合わせて言語の翻訳など、ファインチューニングされた LLM が特定のニーズにどのように対応できるかを検討します。Vertex AI が提供する包括的なツールとサービス スイートを活用して、ファインチューニングされたモデルを簡単に構築、トレーニング、評価、デプロイできます。