教師ありファインチューニングを使用して Gemini モデルをチューニングする

このドキュメントでは、教師ありファインチューニングを使用して Gemini モデルをチューニングする方法について説明します。

始める前に

調整ジョブを作成する

テキストモデルの教師ありファインチューニング ジョブは、Google Cloud コンソール、API、または Vertex AI SDK for Python を使用して作成できます。モデルのチューニング構成のガイダンスについては、推奨構成をご覧ください。

REST

モデルのチューニング ジョブを作成するには、tuningJobs.create メソッドを使用して POST リクエストを送信します。一部のパラメータは、すべてのモデルでサポートされているわけではありません。チューニングするモデルに適用可能なパラメータのみを含めるようにしてください。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID
  • TUNING_JOB_REGION: チューニング ジョブを実行するリージョン。これは、チューニング済みのモデルをアップロードするデフォルトのリージョンでもあります。
  • BASE_MODEL: チューニングする基盤モデルの名前。サポートされる値: gemini-1.0-pro-002
  • TRAINING_DATASET_URI: トレーニング データセットの Cloud Storage URI。データセットは JSONL ファイル形式でなければなりません。最適な結果を得るには、少なくとも 100~500 個のサンプルを含めます。詳細については、教師ありチューニング データセットについてをご覧ください。
  • VALIDATION_DATASET_URI: 省略可。検証データセット ファイルの Cloud Storage URI。
  • EPOCH_COUNT: 省略可。トレーニング中にモデルがトレーニング データセット全体に対して行った完全なパスの数。推奨値を使用する場合は、未設定のままにします。
  • ADAPTER_SIZE: 省略可。チューニング ジョブに使用するアダプタのサイズ
  • LEARNING_RATE_MULTIPLIER: 省略可。推奨学習率に適用する乗数。推奨値を使用する場合は、未設定のままにします。
  • TUNED_MODEL_DISPLAYNAME: 省略可。チューニングされたモデルの表示名。設定されていない場合は、ランダムな名前が生成されます。

HTTP メソッドと URL:

POST https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs

リクエストの本文(JSON):

{
  "baseModel": "BASE_MODEL",
  "supervisedTuningSpec" : {
      "trainingDatasetUri": "TRAINING_DATASET_URI",
      "validationDatasetUri": "VALIDATION_DATASET_URI",
      "hyperParameters": {
          "epochCount": EPOCH_COUNT,
          "adapterSize": "ADAPTER_SIZE",
          "learningRateMultiplier": LEARNING_RATE_MULTIPLIER
      },
  },
  "tunedModelDisplayName": "TUNED_MODEL_DISPLAYNAME"
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

curl コマンドの例

PROJECT_ID=myproject
LOCATION=us-central1
curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
"https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/tuningJobs" \
-d \
$'{
   "baseModel": "gemini-1.0-pro-002",
   "supervisedTuningSpec" : {
      "training_dataset_uri": "gs://cloud-samples-data/ai-platform/generative_ai/sft_train_data.jsonl",
      "validation_dataset_uri": "gs://cloud-samples-data/ai-platform/generative_ai/sft_validation_data.jsonl"
   },
   "tunedModelDisplayName": "tuned_gemini_pro"
}'

Python


import time

import vertexai
from vertexai.preview.tuning import sft

# TODO(developer): Update project
vertexai.init(project=PROJECT_ID, location="us-central1")

sft_tuning_job = sft.train(
    source_model="gemini-1.0-pro-002",
    train_dataset="gs://cloud-samples-data/ai-platform/generative_ai/sft_train_data.jsonl",
    # The following parameters are optional
    validation_dataset="gs://cloud-samples-data/ai-platform/generative_ai/sft_validation_data.jsonl",
    epochs=4,
    adapter_size=4,
    learning_rate_multiplier=1.0,
    tuned_model_display_name="tuned_gemini_pro",
)

# Polling for job completion
while not sft_tuning_job.has_ended:
    time.sleep(60)
    sft_tuning_job.refresh()

print(sft_tuning_job.tuned_model_name)
print(sft_tuning_job.tuned_model_endpoint_name)
print(sft_tuning_job.experiment)

コンソール

Google Cloud コンソールを使用し、教師ありファインチューニングでテキストモデルをチューニングするには、次のステップを実行します。

  1. Google Cloud コンソールの [Vertex AI Studio] セクションで、[Vertex AI Studio] ページに移動します。

    Vertex AI Studio に移動

  2. [チューニング済みモデルを作成] をクリックします。

  3. [チューニング方法] で、[教師ありチューニング] のラジオボタンを選択します。

  4. [モデルの詳細] で、次のように構成します。

    1. [チューニング済みモデル名] フィールドに、新しいチューニング済みモデルの名前を入力します(最大 128 文字)。
    2. [ベースモデル] フィールドで、[gemini-1.0-pro-002] を選択します。
    3. [リージョン] プルダウン フィールドで、パイプライン チューニング ジョブが実行されるリージョンと、チューニングされたモデルがデプロイされるリージョンを選択します。
  5. 省略可: [詳細オプション] プルダウン矢印を開き、以下を構成します。

    1. [エポック数] フィールドに、モデルのチューニングで実行するステップ数を入力します。
    2. [アダプタサイズ] フィールドに、モデルのチューニングに使用するアダプタサイズを入力します。
    3. [学習率の乗数] フィールドに、各反復処理のステップサイズを入力します。デフォルト値は 1 です。
  6. [続行] をクリックします。

    [チューニング用データセット] ページが開きます。

  7. データセット ファイルをアップロードするには、次のいずれかを選択します。

    1. まだデータセットをアップロードしていない場合は、[ファイルを Cloud Storage にアップロード] のラジオボタンを選択します。
    2. [JSONL ファイルの選択] フィールドで [参照] をクリックし、データセット ファイルを選択します。
    3. [データセットの場所] で [参照] をクリックし、データセット ファイルを保存する Cloud Storage バケットを選択します。
    4. データセット ファイルがすでに Cloud Storage バケットにある場合は、[Cloud Storage 上の既存ファイル] のラジオボタンを選択します。
    5. [Cloud Storage のファイルパス] フィールドで [参照] をクリックし、データセット ファイルがある Cloud Storage バケットを選択します。
  8. (省略可)トレーニング中に検証指標を取得するには、[モデル検証を有効にする] 切り替えボタンをクリックします。

    1. [検証データセット] に、検証データセットの Cloud Storage パスを入力します。
  9. [チューニングを開始] をクリックします。

    新しいモデルは、[チューニングと抽出] ページの [Gemini Pro チューニング済みモデル] セクションに表示されます。モデルのチューニングが完了すると、[ステータス] に「成功」と表示されます。

タスクごとに基盤モデルをチューニングするための推奨構成を、次の表に示します。

タスク データセットのサンプル数 エポック数
分類 500+ 2-4
要約 1,000 以上 2-4
抽出型の QA 500+ 2-4
チャット 1,000 以上 2-4

特定のデータセットでパフォーマンスを最適化するには、エポック値を大きくしてみてください。エポック数を増やすと、結果が改善される可能性があります。ただし、特に小さなデータセットを扱う場合は、オーバーフィッティングに注意してください。オーバーフィッティングが発生した場合は、エポックの数を減らすことを検討してください。

分類タスクの場合、タスクの複雑さはクラスの数に比例して増加します。クラスの数が多い場合は、より大きなデータセットが必要になることがあります。

チューニング ジョブのリストを表示する

現在のプロジェクトのチューニング ジョブのリストを表示するには、Google Cloud コンソール、Vertex AI SDK for Python を使用するか、tuningJobs メソッドを使用して GET リクエストを送信します。

REST

モデルのチューニング ジョブのリストを表示するには、tuningJobs.list メソッドを使用して GET リクエストを送信します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID
  • TUNING_JOB_REGION: チューニング ジョブを実行するリージョン。これは、チューニング済みのモデルをアップロードするデフォルトのリージョンでもあります。

HTTP メソッドと URL:

GET https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

次のコマンドを実行します。

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs"

PowerShell

次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

Python

import vertexai
from vertexai.preview.tuning import sft

# TODO(developer): Update project
vertexai.init(project=PROJECT_ID, location="us-central1")

responses = sft.SupervisedTuningJob.list()

for response in responses:
    print(response)

コンソール

Google Cloud コンソールでチューニング ジョブを表示するには、[Vertex AI Studio] ページに移動します。

Vertex AI Studio に移動

Gemini チューニング ジョブは、[Gemini Pro チューニング済みモデル] セクションの表に表示されます。

チューニング ジョブの詳細を取得する

現在のプロジェクトのチューニング ジョブの詳細を取得するには、Google Cloud コンソールまたは Vertex AI SDK for Python を使用します。また、tuningJobs メソッドを使用して GET リクエストを送信することで取得することもできます。

REST

モデルのチューニング ジョブのリストを表示するには、tuningJobs.get メソッドを使用して GET リクエストを送信し、TuningJob_ID を指定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID
  • TUNING_JOB_REGION: チューニング ジョブを実行するリージョン。これは、チューニング済みのモデルをアップロードするデフォルトのリージョンでもあります。
  • TUNING_JOB_ID: チューニング ジョブの ID。

HTTP メソッドと URL:

GET https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

次のコマンドを実行します。

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID"

PowerShell

次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

Python

import vertexai
from vertexai.preview.tuning import sft

# TODO(developer): Update project, location
vertexai.init(project=PROJECT_ID, location=LOCATION)

tuning_job_id = "4982013113894174720"
response = sft.SupervisedTuningJob(
    f"projects/{PROJECT_ID}/locations/{LOCATION}/tuningJobs/{tuning_job_id}"
)

print(response)

コンソール

  1. チューニング済みモデルの詳細を Google Cloud コンソールで表示するには、[Vertex AI Studio] ページに移動します。

    Vertex AI Studio に移動

  2. [Gemini Pro チューニング済みモデル] の表でモデルを見つけて、[詳細] をクリックします。

    モデルの詳細が表示されます。

チューニング ジョブをキャンセルする

現在のプロジェクトのチューニング ジョブをキャンセルするには、Google Cloud コンソールまたは Vertex AI SDK for Python を使用します。また、tuningJobs メソッドを使用して POST リクエストを送信することでキャンセルすることもできます。

REST

モデルのチューニング ジョブのリストを表示するには、tuningJobs.cancel メソッドを使用して GET リクエストを送信し、TuningJob_ID を指定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID
  • TUNING_JOB_REGION: チューニング ジョブを実行するリージョン。これは、チューニング済みのモデルをアップロードするデフォルトのリージョンでもあります。
  • TUNING_JOB_ID: チューニング ジョブの ID。

HTTP メソッドと URL:

POST https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID:cancel

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID:cancel"

PowerShell

次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID:cancel" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

Python

import vertexai
from vertexai.preview.tuning import sft

# TODO(developer): Update project, location
vertexai.init(project=PROJECT_ID, location=LOCATION)

tuning_job_id = "4982013113894174720"
job = sft.SupervisedTuningJob(
    f"projects/{PROJECT_ID}/locations/{LOCATION}/tuningJobs/{tuning_job_id}"
)
job.cancel()

コンソール

  1. Google Cloud コンソールでチューニング ジョブをキャンセルするには、[Vertex AI Studio] ページに移動します。

    Vertex AI Studio に移動

  2. [Gemini Pro チューニング済みモデル] の表で、[ 実行を管理] をクリックします。

  3. [キャンセル] をクリックします。

プロンプトを使用してチューニングしたモデルをテストする

現在のプロジェクトのチューニング ジョブをテストするには、Vertex AI SDK for Python を使用するか、tuningJobs メソッドを使用して POST リクエストを送信します。

次の例では、「空はなぜ青いの?」という質問をモデルに提示します。

REST

プロンプトを使用してチューニング済みモデルをテストするには、POST リクエストを送信して TUNED_ENDPOINT_ID を指定します。

データをリクエストする前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID
  • TUNING_JOB_REGION: チューニング ジョブを実行するリージョン。これは、チューニング済みのモデルをアップロードするデフォルトのリージョンでもあります。
  • ENDPOINT_ID: GET API から取得したチューニング済みモデルのエンドポイント ID。
  • TEMPERATURE: 温度は、topPtopK が適用された場合に発生するレスポンス生成時のサンプリングに使用されます。温度は、トークン選択のランダム性の度合いを制御します。温度が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、温度が高いと、より多様で創造的な結果を導くことができます。温度が 0 の場合、確率が最も高いトークンが常に選択されます。この場合、特定のプロンプトに対するレスポンスはほとんど確定的ですが、わずかに変動する可能性は残ります。

    モデルが返すレスポンスが一般的すぎる、短すぎる、あるいはフォールバック(代替)レスポンスが返ってくる場合は、温度を高く設定してみてください。

  • TOP_P: Top-P は、モデルが出力用にトークンを選択する方法を変更します。トークンは、確率の合計が Top-P 値に等しくなるまで、確率の高いもの(Top-K を参照)から低いものへと選択されます。たとえば、トークン A、B、C の確率が 0.3、0.2、0.1 であり、Top-P 値が 0.5 であるとします。この場合、モデルは温度を使用して A または B を次のトークンとして選択し、C は候補から除外します。

    ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。

  • TOP_K: Top-K は、モデルが出力用にトークンを選択する方法を変更します。Top-K が 1 の場合、次に選択されるトークンは、モデルの語彙内のすべてのトークンで最も確率の高いものであることになります(グリーディ デコードとも呼ばれます)。Top-K が 3 の場合は、最も確率が高い上位 3 つのトークンから次のトークン選択されることになります(温度を使用します)。

    トークン選択のそれぞれのステップで、最も高い確率を持つ Top-K のトークンがサンプリングされます。その後、トークンは Top-P に基づいてさらにフィルタリングされ、最終的なトークンは温度サンプリングを用いて選択されます。

    ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。

  • MAX_OUTPUT_TOKENS: レスポンスで生成できるトークンの最大数。1 トークンは約 4 文字です。100 トークンは約 60~80 語に相当します。

    レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。

HTTP メソッドと URL:

POST https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/endpoints/ENDPOINT_ID:generateContent

リクエストの本文(JSON):

{
    "contents": [
        {
            "role": "USER",
            "parts": {
                "text" : "Why is sky blue?"
            }
        }
    ],
    "generation_config": {
        "temperature":TEMPERATURE,
        "topP": TOP_P,
        "topK": TOP_K,
        "maxOutputTokens": MAX_OUTPUT_TOKENS
    }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/endpoints/ENDPOINT_ID:generateContent"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/endpoints/ENDPOINT_ID:generateContent" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

Python

from vertexai.preview.generative_models import GenerativeModel
from vertexai.preview import tuning
from vertexai.preview.tuning import sft

sft_tuning_job = sft.SupervisedTuningJob("projects/<PROJECT_ID>/locations/<TUNING_JOB_REGION>/tuningJobs/<TUNING_JOB_ID>")
tuned_model = GenerativeModel(sft_tuning_job.tuned_model_endpoint_name)
print(tuned_model.generate_content(content))

コンソール

  1. チューニング済みモデルの詳細を Google Cloud コンソールで表示するには、[Vertex AI Studio] ページに移動します。

    Vertex AI Studio に移動

  2. [Gemini Pro チューニング済みモデル] の表で、[テスト] を選択します。

    チューニングしたモデルで会話を作成できるページが開きます。

チューニングと検証の指標

モデルのチューニングとモデルの評価の指標を収集して報告するよう、モデルのチューニング ジョブを構成できます。その後、Vertex AI Studio でこれらの指標を可視化できます。

  1. チューニング済みモデルの詳細を Google Cloud コンソールで表示するには、[Vertex AI Studio] ページに移動します。

    Vertex AI Studio に移動

  2. [チューニングと抽出] テーブルで、指標を表示する調整済みモデルの名前をクリックします。

    チューニング指標は [モニタリング] タブに表示されます。

モデル チューニングの指標

モデルのチューニング ジョブは、gemini-1.0-pro-002 について次のチューニング指標を自動的に収集します。

  • /train_total_loss: トレーニング ステップでのチューニング データセットの損失。
  • /train_fraction_of_correct_next_step_preds: トレーニング ステップでのトークンの精度。1 回の予測は一連のトークンで構成されます。この指標は、チューニング用データセットのグラウンド トゥルースと比較したときに予測される、トークンの精度を測定します。
  • /train_num_predictions: トレーニング ステップで予測されるトークンの数。

モデル検証の指標

モデルのチューニング ジョブを構成して、gemini-1.0-pro-002 について次の検証指標を収集できます。

  • /eval_total_loss: 検証ステップでの検証データセットの損失。
  • /eval_fraction_of_correct_next_step_preds: 評価ステップでのトークンの精度。1 回の予測は一連のトークンで構成されます。この指標は、検証データセットのグラウンド トゥルースと比較したときに予測される、トークンの精度を測定します。
  • /eval_num_predictions: 検証ステップで予測されるトークンの数。

指標の可視化は、モデルのチューニング ジョブの完了後に利用できます。チューニング ジョブの作成時に検証データセットを指定しなかった場合、チューニング指標の可視化のみを行うことができます。

次のステップ