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

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

この Codelab について

subject最終更新: 5月 2, 2024
account_circle作成者: Author: Abirami Sukumaran, Editor: Muthu Ganesh

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 ニュース データセットなど、ニュース記事とそれに対応するヘッドラインのデータセットから始めます。
  • 事前トレーニング済みモデルをファインチューニングする:text-bison@002」などのベースモデルを選択し、Vertex AI SDK for Python を使用してニュースデータでファインチューニングします。
  • 結果を評価する: ファインチューニング モデルのパフォーマンスをベースモデルと比較して、ヘッドライン生成の品質の向上を確認します。
  • モデルをデプロイして使用する: ファインチューニング済みモデルを API エンドポイントで利用できるようにし、新しい記事の見出しを自動的に生成します。

2. 始める前に

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. 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)

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

17274866af36a47c.png

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)

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

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 ではコード自体のスコープで呼び出されるため、チューニング済みモデルは引き続き変数 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: 新しいファインチューニング モデルを評価する

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

  1. 評価データセットを読み込みます。
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 が提供する包括的なツールとサービスのスイートを使用して、ファインチューニングされたモデルを簡単に構築、トレーニング、評価、デプロイできます。