ファインチューニングのチュートリアル

このチュートリアルでは、Python SDK または curl を使用して REST API のいずれかを使用して、Gemini API チューニング サービスを開始する方法について説明します。これらの例では、Gemini API テキスト生成サービスの背後にあるテキストモデルをチューニングする方法を示します。

始める前に

Gemini API を呼び出す前に、任意の SDK がインストールされ、Gemini API キーが構成され、使用可能であることを確認してください。

制限事項

モデルをチューニングする前に、次の制限事項に注意してください。

ファインチューニング データセット

Gemini 1.5 Flash のファインチューニング データセットには次の制限があります。

  • 1 つの例あたりの最大入力サイズは 40,000 文字です。
  • 1 つの例あたりの出力の最大サイズは 5,000 文字です。
  • 入出力ペアの例のみがサポートされます。チャット形式のマルチターンの会話はサポートされていません。

チューニングされたモデル

チューニング済みモデルには次の制限があります。

  • チューニング済みの Gemini 1.5 Flash モデルの入力上限は 40,000 文字です。
  • JSON モードは、チューニング済みモデルではサポートされていません。
  • テキスト入力のみがサポートされています。

チューニング済みモデルを一覧表示する

既存のチューニング済みモデルは、tunedModels.list メソッドで確認できます。

# Sending a page_size is optional
curl -X GET https://generativelanguage.googleapis.com/v1beta/tunedModels?page_size=5 \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" > tuned_models.json

jq .tunedModels[].name < tuned_models.json

# Send the nextPageToken to get the next page.
page_token=$(jq .nextPageToken < tuned_models.json | tr -d '"')

if [[ "$page_token" != "null"" ]]; then
curl -X GET https://generativelanguage.googleapis.com/v1beta/tunedModels?page_size=5\&page_token=${page_token}?key=$GEMINI_API_KEY \
    -H "Content-Type: application/json"  > tuned_models2.json
jq .tunedModels[].name < tuned_models.json
fi

チューニング済みモデルの作成

チューニング済みモデルを作成するには、tunedModels.create メソッドでdatasetをモデルに渡す必要があります。

この例では、シーケンスの次の番号を生成するようにモデルをチューニングします。たとえば、入力が 1 の場合、モデルは 2 を出力します。入力が one hundred の場合、出力は one hundred one になります。

curl -X POST "https://generativelanguage.googleapis.com/v1beta/tunedModels?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d '
      {
        "display_name": "number generator model",
        "base_model": "models/gemini-1.5-flash-001-tuning",
        "tuning_task": {
          "hyperparameters": {
            "batch_size": 2,
            "learning_rate": 0.001,
            "epoch_count":5,
          },
          "training_data": {
            "examples": {
              "examples": [
                {
                    "text_input": "1",
                    "output": "2",
                },{
                    "text_input": "3",
                    "output": "4",
                },{
                    "text_input": "-3",
                    "output": "-2",
                },{
                    "text_input": "twenty two",
                    "output": "twenty three",
                },{
                    "text_input": "two hundred",
                    "output": "two hundred one",
                },{
                    "text_input": "ninety nine",
                    "output": "one hundred",
                },{
                    "text_input": "8",
                    "output": "9",
                },{
                    "text_input": "-98",
                    "output": "-97",
                },{
                    "text_input": "1,000",
                    "output": "1,001",
                },{
                    "text_input": "10,100,000",
                    "output": "10,100,001",
                },{
                    "text_input": "thirteen",
                    "output": "fourteen",
                },{
                    "text_input": "eighty",
                    "output": "eighty one",
                },{
                    "text_input": "one",
                    "output": "two",
                },{
                    "text_input": "three",
                    "output": "four",
                },{
                    "text_input": "seven",
                    "output": "eight",
                }
              ]
            }
          }
        }
      }' | tee tunemodel.json

# Check the operation for status updates during training.
# Note: you can only check the operation on v1/
operation=$(cat tunemodel.json | jq ".name" | tr -d '"')
tuning_done=false

while [[ "$tuning_done" != "true" ]];
do
  sleep 5
  curl -X GET "https://generativelanguage.googleapis.com/v1/${operation}?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
     2> /dev/null > tuning_operation.json

  complete=$(jq .metadata.completedPercent < tuning_operation.json)
  tput cuu1
  tput el
  echo "Tuning...${complete}%"
  tuning_done=$(jq .done < tuning_operation.json)
done

# Or get the TunedModel and check it's state. The model is ready to use if the state is active.
modelname=$(cat tunemodel.json | jq ".metadata.tunedModel" | tr -d '"')
curl -X GET  https://generativelanguage.googleapis.com/v1beta/${modelname}?key=$GEMINI_API_KEY \
    -H 'Content-Type: application/json' > tuned_model.json

cat tuned_model.json | jq ".state"

エポック数、バッチサイズ、学習率の最適な値は、データセットとユースケースのその他の制約によって異なります。これらの値の詳細については、詳細なチューニング設定ハイパーパラメータをご覧ください。

チューニング済みモデルは、チューニング済みモデルのリストにすぐに追加されますが、モデルのチューニング中は状態が「作成中」に設定されます。

モデルを試す

tunedModels.generateContent メソッドを使用して、チューニング済みモデルの名前を指定し、そのパフォーマンスをテストできます。

curl -X POST https://generativelanguage.googleapis.com/v1beta/$modelname:generateContent?key=$GEMINI_API_KEY \
    -H 'Content-Type: application/json' \
    -d '{
        "contents": [{
        "parts": [{
          "text": "LXIII"
          }]
        }]
        }' 2> /dev/null

モデルを削除する

不要になったモデルを削除して、チューニング済みモデルのリストをクリーンアップできます。モデルを削除するには、tunedModels.delete メソッドを使用します。チューニング ジョブをキャンセルした場合は、パフォーマンスが予測できない可能性があるため、削除することをおすすめします。

curl -X DELETE https://generativelanguage.googleapis.com/v1beta/${modelname}?key=$GEMINI_API_KEY \
    -H 'Content-Type: application/json'