見出し画像

Gemini API の ファインチューニング を試す

「Gemini API」 の ファインチューニングを試したので、まとめました。


1. Gemini API の ファインチューニング

ファインチューニング」は、特定タスクにおけるモデル性能を向上させることができます。タスクの多くの例を含む学習データセットをモデルに提供することで機能します。ニッチなタスクの場合、適度な数のサンプルでモデルを調整することで、モデルの性能を大幅に向上させることができます。

2. client_secret.json の取得

「ファインチューニング」や「セマンティック検索」など、「Gemini API」の一部では、認証に「OAuth」を使用します。「OAuth」を使用するには、「Google Cloud Platform」で「client_secret.json」を取得します。

(1) 「Google Cloud Platform」を開く。
(2) 「Google Cloud Platform」の「プロジェクト」の作成。
(3) 「Generative Language API」の有効化
コンソールで「Generative Language API」を検索して有効化します。

(4) 「OAuth 同意画面」で「ユーザーの種類」で「外部」を選択し、「テストユーザー」を追加。

(5) 「認証情報」で「+認証情報を作成 → OAuthクライアントID」を選択。

(6) 名前を設定して「作成」ボタンを押す。

(7) 「JSONをダウンロード」を押す。

client_secret.json」が取得できます。

3. gcloud CLI のインストール

「gcloud CLI」をローカルマシンにインストールします。

4. OAuthの認証

ColabでのOAuth認証の手順は、次のとおりです。

(1) 左端の鍵アイコンで「CLIENT_SECRET」に「client_secret.json」の中身をコピー。

(2) シークレットキーから「client_secret.json」を生成

from google.colab import userdata
import pathlib
pathlib.Path("client_secret.json").write_text(userdata.get("CLIENT_SECRET"))

(3) client_secret.json ファイルを使用可能な認証情報に変換。
以下のセルを実行後、指示に従ってローカルマシンでコマンドを実行し、「Google Cloud Platform」にログインし、出力結果をセルのテキストボックスに入力します。

!gcloud auth application-default login \
    --no-browser --client-id-file client_secret.json \
    --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning,https://www.googleapis.com/auth/generative-language.retriever'

5. 学習

Colabでの学習の手順は、次のとおりです。

(1) パッケージのインストール。

# パッケージのインストール
!pip install -q -U google-generativeai

(2) ファインチューニング済みモデルの確認。
初回はまだありません。

import google.generativeai as genai

# ファインチューニングモデルの確認
for model in genai.list_tuned_models():
    print(model.name)

(3) ファインチューニングモデルの準備。
現在、ファインチューニング可能なモデルは「models/gemini-1.0-pro-001」のみです。

# ファインチューニングモデルの準備
base_model = [
    m for m in genai.list_models()
    if "createTunedModel" in m.supported_generation_methods][0]
base_model
Model(name='models/gemini-1.0-pro-001',
      base_model_id='',
      version='001',
      display_name='Gemini 1.0 Pro 001 (Tuning)',
      description=('The best model for scaling across a wide range of tasks. This is a stable '
                   'model that supports tuning.'),
      input_token_limit=30720,
      output_token_limit=2048,
      supported_generation_methods=['generateContent', 'countTokens', 'createTunedModel'],
      temperature=0.9,
      top_p=1.0,
      top_k=1)

(4) 学習の開始。
training_dataに学習データを設定します。今回は、数値を1加算するタスクの入出力ペアを準備しました。

import random

# ファインチューニングの開始
name = f'generate-num-{random.randint(0,10000)}'
operation = genai.create_tuned_model(
    # チューニングしたモデルも使用可能
    # source_model="tunedModels/..."
    source_model=base_model.name,
    training_data=[
        {
             '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',
        }
    ],
    id = name,
    epoch_count = 100,
    batch_size=4,
    learning_rate=0.001,
)

(5) 学習状況の確認。
model.stateで状態、operation.metadataでオペレーションのメタデータを確認できます。

# モデルの取得
model = genai.get_tuned_model(f'tunedModels/{name}')

# 学習状況の確認
print(model.state)
print(operation.metadata)
<State.CREATING: 1>
total_steps: 375
tuned_model: "tunedModels/generate-num-6684"

(7) インジケーターの表示。
学習完了までのインジケータを表示します。

import time

# インジケーターの表示
for status in operation.wait_bar():
    time.sleep(30)

キャンセルしたい時は、operation.cancel() を呼びます。

(8) 学習結果をグラフで確認。

import pandas as pd
import seaborn as sns

# 学習結果をグラフで確認
model = operation.result()
snapshots = pd.DataFrame(model.tuning_task.snapshots)
sns.lineplot(data=snapshots, x = "epoch", y="mean_loss")

6. 推論

Colabでの推論の手順は、次のとおりです。

(1) モデルの取得。

# モデルの取得
model = genai.GenerativeModel(model_name=f"tunedModels/{name}")

(2) 推論の実行。

result = model.generate_content("55")
result.text
56

(3) 推論の実行。

result = model.generate_content("four")
result.text
five

(4) 推論の実行。

result = model.generate_content("七") 
result.text                     

7. 削除

Colabでの削除の手順は、次のとおりです。

(1) ファインチューン済みモデルの削除。

# ファインチューン済みモデルの削除
genai.delete_tuned_model(f"tunedModels/{name}")



この記事が気に入ったらサポートをしてみませんか?