1. はじめに
ファインチューニングが重要な理由
基盤モデルは汎用的にトレーニングされているため、期待したタスクが実行されないことがあります。これは、モデルに実行させたいタスクが特殊で、プロンプトの設計のみではモデルに学習させるのが難しいためです。このような場合は、モデルをチューニングして、特定のタスクに対するモデルのパフォーマンスを改善します。また、指示が不十分な場合に、特定の出力要件に準拠するようモデルをチューニングすることもできます。大規模言語モデル(LLM)は大量の情報を保持し、多くのタスクを実行できますが、特殊なトレーニングを提供した場合にのみ優れた性能を発揮します。ファインチューニングにより LLM をトレーニングし、事前トレーニングを経た LLM を特定のニーズに合わせて調整できます。
この Codelab では、LLM モデルの教師ありチューニング アプローチを使用してファインチューニングを行う方法について説明します。
教師ありチューニングでは、新しいスキルを教えることでモデルのパフォーマンスを改善します。ラベル付けされた何百ものサンプルを含むデータを使用して、目的の動作やタスクを模倣するようモデルに学習させます。入力テキスト(プロンプト)と出力テキスト(レスポンス)のラベル付きデータセットを提供して、特定のユースケースに合わせてレスポンスをカスタマイズする方法をモデルに学習させます。
モデルのカスタマイズについて詳しくは、こちらをご覧ください。
作成するアプリの概要
ユースケース: ニュース記事の見出しを生成する
ニュース記事の見出しを自動的に生成するとします。Vertex AI を使用すると、特定のスタイルで適切な要約タイトルを生成し、ニュース チャンネルのガイドラインに従ってタイトルをカスタマイズする 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. 始める前に
- Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
- Google Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- Colab Notebook を開き、現在アクティブな 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)
このステップの結果は次のようになります。

6. ステップ 3: 大規模言語モデルをファインチューニングする
この時点で、任意の大規模言語モデルをチューニングできます(サポート状況によります)。ただし、このスニペットでは、前のステップで読み込んだトレーニング データを含むデータフレームを使用して、事前トレーニング済みモデル「text-bison@002」をチューニングします。
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)
次のような結果が表示されます。

比較のためにベースモデル(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)
次のような結果が表示されます。

生成されたタイトルはどちらも適切に見えますが、最初のタイトル(ファインチューニング済みモデルで生成)は、問題のデータセットで使用されているタイトルのスタイルに合っています。
ファインチューニング済みモデルを読み込む
ファインチューニングしたばかりのモデルを読み込む方が簡単な場合があります。ただし、ステップ 3 で説明したように、コード自体のスコープ内で呼び出されるため、チューニング済みモデルは変数 tuned_model に保持されます。過去にチューニングされたモデルを呼び出す場合はどうすればよいでしょうか。
これを行うには、Vertex AI Model Registry からデプロイされたファインチューニング済みモデルの完全な ENDPOINT 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: 新しいファインチューニング済みモデルを評価する
評価は、生成されたレスポンスの品質と関連性を評価するうえで重要な要素です。これには、生成言語モデルの出力を調べて、その一貫性、精度、提供されたプロンプトとの整合性を判断することが含まれます。モデルの評価は、改善点を特定し、モデルのパフォーマンスを最適化し、生成されたテキストが品質と有用性の望ましい基準を満たしていることを確認するのに役立ちます。詳細については、ドキュメントをご覧ください。ここでは、ファインチューニング済みモデルの評価指標を取得し、ベースモデルと比較する方法について説明します。
- EVALUATION データセットを読み込みます。
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
- ファインチューニング済みモデルのテキスト要約タスクの評価仕様を定義します。
task_spec = EvaluationTextSummarizationSpec(
task_name = "summarization",
ground_truth_data=df
)
このステップが完了するまでに数分かかります。結果のパイプライン ジョブリンクを使用して、進行状況を追跡できます。完了すると、次の評価結果が表示されます。

評価結果の rougeLSum 指標は、サマリーの ROUGE-L スコアを指定します。ROUGE-L は、サマリーとリファレンス サマリーの重複度合いを測定する再現率ベースの指標です。2 つのサマリー間の最長共通部分列(LCS)を取得し、それをリファレンス サマリーの長さで割ることで計算されます。
指定された式の rougeLSum スコアは 0.36600753600753694 です。これは、サマリーがリファレンス サマリーと 36.6% 重なっていることを意味します。
ベースライン モデルで評価ステップを実行すると、ファインチューニング済みモデルのサマリー スコアが比較的高いことがわかります。
評価結果は、評価ジョブの作成時に指定した Cloud Storage 出力ディレクトリにあります。ファイル名は evaluation_metrics.json です。チューニングされたモデルについては、Vertex AI Model Registry ページの Google Cloud コンソールで評価結果を確認することもできます。
9. 重要な注意事項
- モデルのサポート: 最新の互換性については、必ずモデルのドキュメントをご確認ください。
- 迅速な開発: LLM の分野は急速に進歩しています。新しい高性能モデルは、古いベースで構築されたファインチューニング済みモデルよりも優れた性能を発揮する可能性があります。このファインチューニング手法は、機能が利用可能になったら新しいモデルに適用できます。
- LoRA: LoRA は、LLM を効率的にファインチューニングする手法です。これを行うには、トレーニング可能な低ランク分解行列を既存の事前トレーニング済みモデルのレイヤに導入します。詳細については、こちらをご覧ください。LoRA は、大規模な LLM のすべてのパラメータを更新するのではなく、元のモデルの重み行列に追加または乗算される小さな行列を学習します。これにより、ファインチューニング中に導入される追加パラメータの数が大幅に削減されます。
10. クリーンアップ
この Codelab で使用したリソースについて、Google Cloud アカウントに課金されないようにする手順は、次のとおりです。
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
- または、[Model Registry] に移動し、[モデルのデプロイとテスト] タブに移動して、エンドポイントのデプロイを解除し、デプロイされたチューニング済みモデルを削除します。
11. 完了
おめでとうございます!Vertex AI を使用して LLM モデルをファインチューニングできました。ファインチューニングは、ドメインやタスクに合わせて LLM をカスタマイズできる強力な手法です。Vertex AI には、モデルを効率的かつ効果的にファインチューニングするために必要なツールとリソースが用意されています。
GitHub リポジトリを調べてサンプルコードを試して、 ファインチューニングと 評価を直接体験してください。ターゲットを絞ったマーケティング コピーの生成から、複雑なドキュメントの要約、文化的なニュアンスを含む言語の翻訳まで、ファインチューニングされた LLM が特定のニーズにどのように対応できるかを検討してください。Vertex AI が提供する包括的なツールとサービスのスイートを使用して、ファインチューニング済みモデルを簡単に構築、トレーニング、評価、デプロイできます。