教師ありチューニングを使用してテキストモデルをチューニングする

教師ありチューニングでは、ラベル付けされた例を使用してモデルをチューニングします。それぞれの例は、推論時にテキストモデルから期待される出力を示しています。教師ありチューニングは、モデルの出力がそれほど複雑ではなく、定義が簡単な場合に適しています。モデルからの出力を定義するのが難しい場合は、人間からのフィードバックを用いた強化学習(RLHF)チューニングを使用して、テキストモデルをチューニングすることを検討してください。

テキストモデルの教師ありチューニングの詳細なガイダンス

次のガイド付きチュートリアルでは、教師ありチューニングを使用して、Google Cloud コンソールでテキストの基盤モデルをチューニングする方法について説明します。


このタスクを Google Cloud コンソールで直接行う際の順を追ったガイダンスについては、「ガイドを表示」をクリックしてください。

ガイドを表示


サポートされているモデル

教師ありチューニングは、次のテキストモデルでサポートされています。

  • text-bison@002
  • chat-bison@002
  • text-bison-32k
  • chat-bison-32k

テキストモデルで教師ありチューニングを使用するユースケース

基盤テキストモデルは、期待される出力やタスクがプロンプトで明確かつ簡潔に定義可能で、プロンプトが常に期待される出力を生成する場合に適しています。一般的な言語パターンから逸脱するニッチな、または特定の情報をモデルに学習させるときは、そのモデルのチューニングを検討してください。たとえば、モデルのチューニングを使用して、モデルに次のことを学習させられます。

  • 出力を生成するための特定の構造や形式
  • 場合に応じて出力を簡潔または詳細にするなどの、特定の動作
  • 入力のタイプに合わせてカスタマイズされた特定の出力

次の例は、プロンプトの指示だけではキャプチャが難しいユースケースです。

  • 分類: 期待されるレスポンスが特定の単語やフレーズ。

    モデルをチューニングすると、モデルが冗長なレスポンスを生成しないようにできます。

  • 要約: 要約は特定の形式に従っています。たとえば、チャットの概要で個人情報(PII)の削除が必要な場合があります。

    この形式では、話者の名前を #Person1#Person2 で置き換えていますが、記述しにくく、基盤モデルではこのようなレスポンスが自然に得られない可能性があります。

  • 抜粋された質問応答: 質問はコンテキストに関するもので、回答はコンテキストの部分文字列です。

    「最終氷期極大期」というレスポンスは、コンテキストから抜き出した特定のフレーズです。

  • チャット: ペルソナ、ロール、キャラクターに合わせて、モデルのレスポンスをカスタマイズする必要があります。

次のような状況でも、モデルをチューニングできます。

  • プロンプトが、希望する結果を十分に一貫して生成しない。
  • タスクが複雑すぎて、プロンプトで定義できない。たとえば、プロンプトで表現するのが難しい動作について、モデルに動作を再現させることができます。
  • タスクについての直感が複雑で、引き出すのは簡単だが、プロンプトとして定式化するのが難しい。
  • 少数ショットの例を削除して、コンテキストを短くしたい。

教師ありチューニングのデータセットを準備する

基盤モデルのチューニングに使用するデータセットには、モデルで実行するタスクに応じたサンプルを含める必要があります。テキストからテキストへの形式で、トレーニング データセットを構造化します。データセット内の各レコード(または行)には入力テキスト(プロンプトとも呼ばれます)が含まれており、このテキストはモデルから予測される出力と対になります。教師ありチューニングでは、データセットを使用し、必要とする動作(タスク)を示す数百のサンプルを与えて、その動作を模倣するようモデルに学習させます。

データセットは少なくとも 10 個のサンプルを含む必要があります。良好な結果を得るには、最低でも 100~500 個のサンプルを含めることをおすすめします。データセットに含まれているサンプルが多いほど、良い結果が得られます。

サンプル データセットについては、このページのサンプル データセットをご覧ください。

データセットのフォーマット

モデルのチューニング用データセットは、JSON Lines(JSONL)形式で、各行に 1 つのチューニング サンプルが含まれている必要があります。テキスト生成モデルのチューニングに使用されるデータセットのフォーマットは、テキスト チャットモデルのチューニングに使用されるデータセットのフォーマットとは異なります。モデルをチューニングする前に、データセットを Cloud Storage バケットにアップロードする必要があります。

テキスト

それぞれのサンプルは、モデルへのプロンプトを含む input_text フィールドと、チューニング済みのモデルで生成が期待されるレスポンスのサンプルを含む output_text フィールドで構成されます。構造化プロンプトからの追加フィールド(context など)は無視されます。

input_text の最大トークン長は 8,192 で、output_text の最大トークン長は 1,024 です。いずれかのフィールドがトークンの最大長を超えると、超過分のトークンは切り捨てられます。

テキスト生成モデル用のデータセットに含めることができるサンプルの最大数は 10,000 です。

データセットの例

{"input_text": "question: How many people live in Beijing? context:
With over 21 million residents, Beijing is the world's most populous national
capital city and is China's second largest city after Shanghai. It is
located in Northern China, and is governed as a municipality under the direct
administration of the State Council with 16 urban, suburban, and rural
districts.[14] Beijing is mostly surrounded by Hebei Province with the exception
of neighboring Tianjin to the southeast; together, the three divisions form the
Jingjinji megalopolis and the national capital region of China.",
"output_text": "over 21 million people"}

{"input_text": "question: How many parishes are there in Louisiana? context: The U.S. state of Louisiana is divided into 64 parishes (French: paroisses) in the same manner that 48 other states of the United States are divided into counties, and Alaska is divided into boroughs.", "output_text": "64"}

サンプルに手順を含める

分類などのタスクでは、手順を含まないサンプルのデータセットを作成できます。ただし、データセットのサンプルから手順を除外すると、特に小さなデータセットの場合、手順を含める場合よりもチューニング後のパフォーマンスが低下します。

手順を除外:

{"input_text": "5 stocks to buy now",
"output_text": "business"}

手順を含む:

{"input_text": "Classify the following text into one of the following classes:
[business, entertainment] Text: 5 stocks to buy now",
"output_text": "business"}

チャット

チャット チューニング用データセットの各会話のサンプルは、messages フィールド(必須)と context フィールド(省略可)で構成されています。

messages フィールドは、作成者とコンテンツのペアの配列で構成されます。author フィールドはメッセージの作成者を参照し、交互に user または assistant に設定されます。content フィールドはメッセージの内容です。各会話のサンプルには、ユーザーからのメッセージとモデルからのレスポンスを表す、2~3 のユーザー アシスタント メッセージのペアが必要です。

context フィールドでは、チャットのコンテキストを指定できます。サンプルのコンテキストを指定すると、default_context で指定された値がオーバーライドされます。

各会話のサンプルで、contextmessages を合わせたトークンの最大長は 8,192 トークンです。また、assistant の各 content フィールドは 1,024 トークンを超えないようにしてください。

テキスト チャットモデル用のデータセットのサンプルに含めることができる author フィールドの最大数は 10,000 です。この最大値は、すべてのサンプルのすべての messages に含まれている、すべての author フィールドの合計です。

{
  "context": "You are a pirate dog named Captain Barktholomew.",
  "messages": [
    {
      "author": "user",
      "content": "Hi"
    },
    {
      "author": "assistant",
      "content": "Argh! What brings ye to my ship?"
    },
    {
      "author": "user",
      "content": "What's your name?"
    },
    {
      "author": "assistant",
      "content": "I be Captain Barktholomew, the most feared pirate dog of the seven seas."
    }
  ]
}

サンプル データセット

サンプル データセットを使用して、text-bison@002 モデルのチューニングを開始できます。以下に示すのは、さまざまな医療専門分野向けの医療用音声文字変換のサンプルを含む、分類タスクのデータセットです。このデータは mtsamples.com からのもので、Kaggle で入手できます。

  • サンプル チューニング用データセットの URI:

    gs://cloud-samples-data/vertex-ai/model-evaluation/peft_train_sample.jsonl

  • サンプル評価用データセットの URI:

    gs://cloud-samples-data/vertex-ai/model-evaluation/peft_eval_sample.jsonl

これらのデータセットを使用するには、テキストモデルの教師ありチューニング ジョブの作成時に、該当するパラメータで URI を指定します。

例:

...
"dataset_uri": "gs://cloud-samples-data/vertex-ai/model-evaluation/peft_train_sample.jsonl",
...
"evaluation_data_uri": "gs://cloud-samples-data/vertex-ai/model-evaluation/peft_eval_sample.jsonl",
...

本番環境データとの整合性を維持する

データセットに含まれるサンプルは、想定される本番環境のトラフィックと一致していなければなりません。データセットに特定の書式、キーワード、指示、情報が含まれている場合は、本番環境のデータも同じ形式にし、同じ指示を含んでいる必要があります。

たとえば、データセットのサンプルに "question:""context:" が含まれている場合は、本番環境のトラフィックにも、データセットの例と同じ順序で "question:""context:" が含まれるように整形する必要があります。コンテキストを除外すると、データセット内のサンプルに同じ質問が含まれていても、モデルはパターンを認識しません。

チューニング用データセットを Cloud Storage にアップロードする

チューニング ジョブを実行するには、1 つ以上のデータセットを Cloud Storage バケットにアップロードする必要があります。新しい Cloud Storage バケットを作成するか、既存のバケットを使用してデータセット ファイルを保存できます。バケットのリージョンは重要ではありませんが、モデルをチューニングする Google Cloud プロジェクトのバケットを使用することをおすすめします。

バケットの準備ができたら、データセット ファイルをバケットにアップロードします。

教師ありチューニング リージョンの設定

教師ありチューニング ジョブを構成するときに、3 つの Google Cloud リージョン設定を指定できます。1 つのリージョンは、モデルをチューニングするパイプラインが実行される場所です。もう 1 つのリージョンは、モデル チューニング ジョブが実行され、チューニングされたモデルがアップロードされる場所です。

パイプライン ジョブ リージョン

パイプライン ジョブ リージョンは、パイプライン ジョブが実行されるリージョンです。オプションのモデル アップロード リージョンが指定されていない場合、モデルはパイプライン ジョブ リージョンにアップロード、デプロイされます。変換済みデータセットなどの中間データは、パイプライン ジョブ リージョンに保存されます。パイプライン ジョブ リージョンに使用できるリージョンについては、サポートされているパイプライン ジョブとモデル アップロード リージョンをご覧ください。パイプライン ジョブ リージョンは、次のいずれかの方法で指定する必要があります。

  • Vertex AI SDK を使用する場合は、チューニングするモデルを表すオブジェクトの tune_model メソッド(TextGenerationModel.tune_model メソッドなど)で tuning_job_location パラメータを使用して、パイプライン ジョブを実行するリージョンを指定できます。

  • pipelineJobs.create メソッドで POST リクエストを送信して教師ありチューニング ジョブを作成する場合は、URL を使用してパイプライン ジョブが実行されるリージョンを指定します。次の URL で、PIPELINE_JOB_REGION の両方のインスタンスをパイプラインが実行されるリージョンに置き換えます。

     https://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs
    
  • Google Cloud コンソールを使用して教師ありモデルのチューニング ジョブを作成する場合は、チューニング ジョブを作成する際に [リージョン] コントロールでパイプライン ジョブ リージョンを指定します。Google Cloud コンソールでは、[リージョン] コントロールでパイプライン ジョブ リージョンとモデル アップロード リージョンの両方を指定します。Google Cloud コンソールを使用して教師ありモデルのチューニング ジョブを作成する場合、両方のリージョンが常に同じです。

モデル アップロード リージョン

オプションの tuned_model_location パラメータを使用して、チューニングされたモデルのアップロード先を指定します。モデル アップロード リージョンが指定されていない場合、チューニングされたモデルは、パイプライン ジョブ リージョンにアップロードされます。モデル アップロード リージョンの場合は、サポートされているパイプライン ジョブ リージョンとモデル アップロード リージョンのいずれかを使用できます。モデル アップロード リージョンは、次のいずれかの方法で指定できます。

  • Vertex AI SDK を使用する場合は、tuned_model_location パラメータは、チューニングしているモデルを表すオブジェクトの tune_model メソッド(例: TextGenerationModel.tune_modelメソッド)で指定されます。

  • pipelineJobs メソッドで POST リクエストを送信して教師ありモデルのチューニング ジョブを作成する場合は、location パラメータを使用してモデル アップロード リージョンを指定します。

  • Google Cloud コンソールで教師ありモデルのチューニング ジョブを作成する場合は、チューニング ジョブを作成するときに [リージョン] コントロールでモデル アップロード リージョンを指定します。Google Cloud コンソールでは、[リージョン] コントロールでモデル アップロード リージョンとパイプライン ジョブ リージョンの両方を指定します。Google Cloud コンソールを使用して教師ありモデルのチューニング ジョブを作成する場合、両方のリージョンが常に同じです。

モデル チューニング リージョン

モデル チューニング リージョンは、モデル チューニングの計算が行われる場所です。このリージョンは、選択したアクセラレータ タイプによって決まります。アクセラレータ タイプに TPU を指定すると、モデル チューニングの計算は europe-west4 で行われます。アクセラレータ タイプに GPU を指定すると、モデル チューニングは us-central1 で行われます。

サポートされているパイプライン ジョブ リージョンとモデル アップロード リージョン

次のいずれかのリージョンを使用して、モデル アップロード リージョンとパイプライン ジョブ リージョンを指定できます。

  • us-central1
  • europe-west4
  • asia-southeast1
  • us-west1
  • europe-west3
  • europe-west2
  • asia-northeast1
  • us-east4
  • us-west4
  • northamerica-northeast1
  • europe-west9
  • europe-west1
  • asia-northeast3

テキストモデルの教師ありチューニング ジョブを作成する

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

REST

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

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

  • PIPELINEJOB_DISPLAYNAME: pipelineJob の表示名。
  • OUTPUT_DIR: パイプライン アーティファクトの出力先となるバケットの URI。
  • PROJECT_ID: 実際のプロジェクト ID
  • MODEL_DISPLAYNAME: pipelineJob によってアップロード(作成)されるモデルの表示名。
  • DATASET_URI: データセット ファイルの URI。
  • PIPELINE_JOB_REGION: パイプライン チューニング ジョブを実行するリージョン。これは、チューニング済みのモデルをアップロードするデフォルトのリージョンでもあります。モデルを別のリージョンにアップロードする場合は、location パラメータを使用して、チューニング済みのモデルをアップロードするリージョンを指定します。詳細については、モデル アップロードのリージョンをご覧ください。
  • MODEL_UPLOAD_REGION: (省略可)チューニング済みモデルがアップロードされるリージョン。モデルのアップロード リージョンを指定しない場合、チューニング済みのモデルは、パイプライン ジョブが実行されるリージョンにアップロードされます。詳細については、モデル アップロードのリージョンをご覧ください。
  • ACCELERATOR_TYPE: (省略可、デフォルト GPU)モデルのチューニングに使用するアクセラレータのタイプ。有効なオプションは次のとおりです。
    • GPU: チューニングに 8 個の A100 80 GB GPU を使用します。割り当てが十分にあることを確認してください。GPU を選択した場合、VPC‐SC がサポートされます。CMEK は、チューニングの場所とモデルのアップロード場所が us-centra1 の場合にサポートされます。詳しくは、管理対象のチューニング リージョンの設定をご覧ください。GPU を選択すると、モデル チューニングの計算は us-central1 リージョンで行われます。
    • TPU: チューニングに TPU v3 Pod の 64 コアを使用します。割り当てが十分にあることを確認してください。CMEK はサポートされていませんが、VPC‐SC はサポートされています。TPU を選択すると、モデル チューニングの計算は europe-west4 リージョンで行われます。
  • LARGE_MODEL_REFERENCE: チューニングする基盤モデルの名前。次のオプションがあります。
    • text-bison@002
    • chat-bison@002
  • DEFAULT_CONTEXT (chat only): チューニング データセット内のすべてのチューニング サンプルに適用されるコンテキスト。サンプルで context フィールドを設定すると、デフォルトのコンテキストがオーバーライドされます。
  • STEPS: モデルのチューニングで実行するステップ数。デフォルト値は 300 です。バッチサイズは、チューニングを行うロケーションとモデルサイズによって異なります。8k モデル(text-bison@002chat-bison@002code-bison@002codechat-bison@002 など)の場合:
    • us-central1 のバッチサイズは 8 です。
    • europe-west4 のバッチサイズは 24 です。
    32k モデル(text-bison-32kchat-bison-32kcode-bison-32kcodechat-bison-32k など)の場合:
    • us-central1 のバッチサイズは 8 です。
    • europe-west4 のバッチサイズは 8 です。

    たとえば、europe-west4text-bison@002 をトレーニングする場合、トレーニング データセットに 240 のサンプルがあり、steps を 20 に設定すると、トレーニングのサンプル数は、20 ステップとバッチサイズ 24 の積、つまり 480 トレーニング ステップになります。この場合、サンプルを 2 回実行するため、トレーニング プロセスにはエポックが 2 つあります。us-central1 では、トレーニング データセットに 240 のサンプルがあり、steps を 15 に設定した場合、トレーニング サンプル数は 15 ステップとバッチサイズ 8 の積、つまり 120 トレーニング ステップになります。この場合、トレーニング ステップ数がサンプルの半分であるため、エポックが 0.5 個になります。

  • LEARNING_RATE_MULTIPLIER: 推奨学習率に適用する乗数。推奨学習率を使用するには、1.0 を使用します。
  • EVAL_DATASET_URI (text only): (省略可)バッチ予測と評価用の評価データセットを含む JSONL ファイルの URI。chat-bison では、評価はサポートされていません。詳細については、コードモデルをチューニングするためのデータセット形式をご覧ください。評価データセットには 10~250 個のサンプルが必要です。
  • EVAL_INTERVAL (text only): (省略可、デフォルト 20)各評価間のチューニング ステップの数。評価間隔はチャットモデルではサポートされていません。評価は評価データセット全体で実行されるため、評価間隔が短いほどチューニング時間が長くなります。たとえば、steps が 200 で EVAL_INTERVAL が 100 の場合、評価指標のデータポイントは 2 つのみになります。このパラメータを使用するには、evaluation_data_uri を設定する必要があります。
  • ENABLE_EARLY_STOPPING (text only): (省略可、デフォルトは trueboolean で、true に設定すると、評価の実行間でモデルのパフォーマンス(予測されるトークンの正確性により評価されます)に十分な改善が見られなかった場合、すべてのチューニング ステップが完了する前にチューニングを停止します。false の場合、すべてのチューニング ステップが完了するまでチューニングが続行されます。このパラメータを使用するには、evaluation_data_uri を設定する必要があります。早期停止の有効化は、チャットモデルではサポートされていません。
  • TENSORBOARD_RESOURCE_ID:(省略可)Vertex AI TensorBoard インスタンスの ID。Vertex AI TensorBoard インスタンスは、チューニング ジョブの完了後にテストを作成するために使用されます。Vertex AI TensorBoard インスタンスは、チューニング パイプラインと同じリージョンに存在する必要があります。
  • ENCRYPTION_KEY_NAME:(省略可)データの暗号化に使用する顧客管理の暗号鍵(CMEK)の完全修飾名。CMEK は us-central1 でのみ使用できます。us-central1 を使用して CMEK を指定しない場合は、Google が管理する暗号鍵が使用されます。その他のすべての利用可能なリージョンでは、Google が管理する暗号鍵がデフォルトで使用されます。詳細については、CMEK の概要をご覧ください。
  • TEMPLATE_URI: 使用するチューニング テンプレートは、チューニングするモデルによって異なります。
    • テキストモデル: https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0
    • チャットモデル: https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-chat-model/v3.0.0
  • SERVICE_ACCOUNT: (省略可)Vertex AI がパイプライン ジョブの実行に使用するサービス アカウント。デフォルトでは、プロジェクトの Compute Engine のデフォルト サービス アカウント(PROJECT_NUMBER‑compute@developer.gserviceaccount.com)が使用されます。詳細については、カスタム サービス アカウントの接続をご覧ください。

HTTP メソッドと URL:

POST https://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs

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

{
  "displayName": "PIPELINEJOB_DISPLAYNAME",
  "runtimeConfig": {
    "gcsOutputDirectory": "gs://OUTPUT_DIR",
    "parameterValues": {
      "project": "PROJECT_ID",
      "model_display_name": "MODEL_DISPLAYNAME",
      "dataset_uri": "gs://DATASET_URI",
      "location": "MODEL_UPLOAD_REGION",
      "accelerator_type": "ACCELERATOR_TYPE",
      "large_model_reference": "LARGE_MODEL_REFERENCE",
      "default_context": "DEFAULT_CONTEXT (chat only)",
      "train_steps": STEPS,
      "learning_rate_multiplier": LEARNING_RATE_MULTIPLIER,
      "evaluation_data_uri": "gs://EVAL_DATASET_URI (text only)",
      "evaluation_interval": EVAL_INTERVAL (text only),
      "enable_early_stopping": ENABLE_EARLY_STOPPING (text only),
      "enable_checkpoint_selection": "ENABLE_CHECKPOINT_SELECTION (text only)",
      "tensorboard_resource_id": "TENSORBOARD_ID",
      "encryption_spec_key_name": "ENCRYPTION_KEY_NAME"
    }
  },
  "encryptionSpec": {
    "kmsKeyName": "ENCRYPTION_KEY_NAME"
  },
  "serviceAccount": "SERVICE_ACCOUNT",
  "templateUri": "TEMPLATE_URI"
}

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

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://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs"

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://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。容量を節約するために、pipelineSpec は切り捨てられています。

Python

Python をインストールまたは更新する方法については、Vertex AI SDK for Python をインストールするをご覧ください。詳細については、Python API リファレンス ドキュメントをご覧ください。

from __future__ import annotations

from typing import Optional

from google.auth import default
from google.cloud import aiplatform
import pandas as pd
import vertexai
from vertexai.language_models import TextGenerationModel
from vertexai.preview.language_models import TuningEvaluationSpec

credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])

def tuning(
    project_id: str,
    location: str,
    model_display_name: str,
    training_data: pd.DataFrame | str,
    train_steps: int = 10,
    evaluation_dataset: Optional[str] = None,
    tensorboard_instance_name: Optional[str] = None,
) -> TextGenerationModel:
    """Tune a new model, based on a prompt-response data.

    "training_data" can be either the GCS URI of a file formatted in JSONL format
    (for example: training_data=f'gs://{bucket}/{filename}.jsonl'), or a pandas
    DataFrame. Each training example should be JSONL record with two keys, for
    example:
      {
        "input_text": <input prompt>,
        "output_text": <associated output>
      },
    or the pandas DataFame should contain two columns:
      ['input_text', 'output_text']
    with rows for each training example.

    Args:
      project_id: GCP Project ID, used to initialize vertexai
      location: GCP Region, used to initialize vertexai
      model_display_name: Customized Tuned LLM model name.
      training_data: GCS URI of jsonl file or pandas dataframe of training data.
      train_steps: Number of training steps to use when tuning the model.
      evaluation_dataset: GCS URI of jsonl file of evaluation data.
      tensorboard_instance_name: The full name of the existing Vertex AI TensorBoard instance:
        projects/PROJECT_ID/locations/LOCATION_ID/tensorboards/TENSORBOARD_INSTANCE_ID
        Note that this instance must be in the same region as your tuning job.
    """
    vertexai.init(project=project_id, location=location, credentials=credentials)
    eval_spec = TuningEvaluationSpec(evaluation_data=evaluation_dataset)
    eval_spec.tensorboard = aiplatform.Tensorboard(
        tensorboard_name=tensorboard_instance_name
    )
    model = TextGenerationModel.from_pretrained("text-bison@002")

    model.tune_model(
        training_data=training_data,
        # Optional:
        model_display_name=model_display_name,
        train_steps=train_steps,
        tuning_job_location="europe-west4",
        tuned_model_location=location,
        tuning_evaluation_spec=eval_spec,
    )

    print(model._job.status)

    return model

Node.js

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Node.js の設定手順を完了してください。詳細については、Vertex AI Node.js API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';
const aiplatform = require('@google-cloud/aiplatform');
const {PipelineServiceClient} = aiplatform.v1;

// Import the helper module for converting arbitrary protobuf.Value objects.
const {helpers} = aiplatform;

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'europe-west4-aiplatform.googleapis.com',
};
const model = 'text-bison@001';

const pipelineClient = new PipelineServiceClient(clientOptions);

async function tuneLLM() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;

  const parameters = {
    train_steps: helpers.toValue(trainSteps),
    project: helpers.toValue(project),
    location: helpers.toValue('us-central1'),
    dataset_uri: helpers.toValue(datasetUri),
    large_model_reference: helpers.toValue(model),
    model_display_name: helpers.toValue(modelDisplayName),
    accelerator_type: helpers.toValue('GPU'), // Optional: GPU or TPU
  };

  const runtimeConfig = {
    gcsOutputDirectory,
    parameterValues: parameters,
  };

  const pipelineJob = {
    templateUri:
      'https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0',
    displayName: 'my-tuning-job',
    runtimeConfig,
  };

  const createPipelineRequest = {
    parent,
    pipelineJob,
    pipelineJobId,
  };
  await new Promise((resolve, reject) => {
    pipelineClient.createPipelineJob(createPipelineRequest).then(
      response => resolve(response),
      e => reject(e)
    );
  }).then(response => {
    const [result] = response;
    console.log('Tuning pipeline job:');
    console.log(`\tName: ${result.name}`);
    console.log(
      `\tCreate time: ${new Date(1970, 0, 1)
        .setSeconds(result.createTime.seconds)
        .toLocaleString()}`
    );
    console.log(`\tStatus: ${result.status}`);
  });
}

await tuneLLM();

Java

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Java の設定手順を完了してください。詳細については、Vertex AI Java API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

import com.google.cloud.aiplatform.v1beta1.CreatePipelineJobRequest;
import com.google.cloud.aiplatform.v1beta1.LocationName;
import com.google.cloud.aiplatform.v1beta1.PipelineJob;
import com.google.cloud.aiplatform.v1beta1.PipelineJob.RuntimeConfig;
import com.google.cloud.aiplatform.v1beta1.PipelineServiceClient;
import com.google.cloud.aiplatform.v1beta1.PipelineServiceSettings;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CreatePipelineJobModelTuningSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String location = "europe-west4"; // europe-west4 and us-central1 are the supported regions
    String pipelineJobDisplayName = "PIPELINE_JOB_DISPLAY_NAME";
    String modelDisplayName = "MODEL_DISPLAY_NAME";
    String outputDir = "OUTPUT_DIR";
    String datasetUri = "DATASET_URI";
    int trainingSteps = 300;

    createPipelineJobModelTuningSample(
        project,
        location,
        pipelineJobDisplayName,
        modelDisplayName,
        outputDir,
        datasetUri,
        trainingSteps);
  }

  // Create a model tuning job
  public static void createPipelineJobModelTuningSample(
      String project,
      String location,
      String pipelineJobDisplayName,
      String modelDisplayName,
      String outputDir,
      String datasetUri,
      int trainingSteps)
      throws IOException {
    final String endpoint = String.format("%s-aiplatform.googleapis.com:443", location);
    PipelineServiceSettings pipelineServiceSettings =
        PipelineServiceSettings.newBuilder().setEndpoint(endpoint).build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (PipelineServiceClient client = PipelineServiceClient.create(pipelineServiceSettings)) {
      Map<String, Value> parameterValues = new HashMap<>();
      parameterValues.put("project", stringToValue(project));
      parameterValues.put("model_display_name", stringToValue(modelDisplayName));
      parameterValues.put("dataset_uri", stringToValue(datasetUri));
      parameterValues.put(
          "location",
          stringToValue(
              "us-central1")); // Deployment is only supported in us-central1 for Public Preview
      parameterValues.put("large_model_reference", stringToValue("text-bison@001"));
      parameterValues.put("train_steps", numberToValue(trainingSteps));
      parameterValues.put("accelerator_type", stringToValue("GPU")); // Optional: GPU or TPU

      RuntimeConfig runtimeConfig =
          RuntimeConfig.newBuilder()
              .setGcsOutputDirectory(outputDir)
              .putAllParameterValues(parameterValues)
              .build();

      PipelineJob pipelineJob =
          PipelineJob.newBuilder()
              .setTemplateUri(
                  "https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0")
              .setDisplayName(pipelineJobDisplayName)
              .setRuntimeConfig(runtimeConfig)
              .build();

      LocationName parent = LocationName.of(project, location);
      CreatePipelineJobRequest request =
          CreatePipelineJobRequest.newBuilder()
              .setParent(parent.toString())
              .setPipelineJob(pipelineJob)
              .build();

      PipelineJob response = client.createPipelineJob(request);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }

  static Value stringToValue(String str) {
    return Value.newBuilder().setStringValue(str).build();
  }

  static Value numberToValue(int n) {
    return Value.newBuilder().setNumberValue(n).build();
  }
}

コンソール

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

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

    Vertex AI Studio に移動

  2. [チューニングと抽出] タブをクリックします。
  3. [ チューニング済みモデルを作成] をクリックします。
  4. [教師ありチューニング] をクリックします。
  5. モデルの詳細を構成します。
    • チューニング済みモデル名: チューニングされたモデルの名前を入力します。
    • ベースモデル: チューニングするモデルを選択します。
    • リージョン: パイプライン チューニング ジョブが実行されるリージョンとチューニングされたモデルがデプロイされるリージョンを選択します。
    • 作業ディレクトリ: モデルのチューニング時にアーティファクトが保存される Cloud Storage のロケーションを入力します。
  6. [詳細オプション] を開いて、詳細設定を構成します。
    • ステップをトレーニング: モデルのチューニングのために実行するステップ数を入力します。デフォルト値は 300 です。バッチサイズは、チューニングを行うロケーションとモデルサイズによって異なります。8k モデル(text-bison@002chat-bison@002code-bison@002codechat-bison@002 など)の場合:
      • us-central1 のバッチサイズは 8 です。
      • europe-west4 のバッチサイズは 24 です。
      32k モデル(text-bison-32kchat-bison-32kcode-bison-32kcodechat-bison-32k など)の場合:
      • us-central1 のバッチサイズは 8 です。
      • europe-west4 のバッチサイズは 8 です。

      たとえば、europe-west4text-bison@002 をトレーニングする場合、トレーニング データセットに 240 のサンプルがあり、steps を 20 に設定すると、トレーニングのサンプル数は、20 ステップとバッチサイズ 24 の積、つまり 480 トレーニング ステップになります。この場合、サンプルを 2 回実行するため、トレーニング プロセスにはエポックが 2 つあります。us-central1 では、トレーニング データセットに 240 のサンプルがあり、steps を 15 に設定した場合、トレーニング サンプル数は 15 ステップとバッチサイズ 8 の積、つまり 120 トレーニング ステップになります。この場合、トレーニング ステップ数がサンプルの半分であるため、エポックが 0.5 個になります。

    • 学習率の乗数: 各イテレーションのステップサイズを入力します。デフォルト値は 1 です。
    • アクセラレータ タイプ: (省略可)モデルのチューニングに使用するアクセラレータのタイプを入力します。有効なオプションは次のとおりです。
      • GPU: チューニングに 8 個の A100 80 GB GPU を使用します。割り当てが十分にあることを確認してください。GPU を選択した場合、VPC‐SC がサポートされます。CMEK は、チューニングの場所とモデルのアップロード場所が us-centra1 の場合にサポートされます。詳しくは、管理対象のチューニング リージョンの設定をご覧ください。GPU を選択すると、モデル チューニングの計算は us-central1 リージョンで行われます。
      • TPU: チューニングに TPU v3 Pod の 64 コアを使用します。割り当てが十分にあることを確認してください。CMEK はサポートされていませんが、VPC‐SC はサポートされています。TPU を選択すると、モデル チューニングの計算は europe-west4 リージョンで行われます。
    • TensorBoard インスタンスを追加する:(省略可)Vertex AI TensorBoard インスタンスの ID。Vertex AI TensorBoard インスタンスは、チューニング ジョブの完了後にテストを作成するために使用されます。Vertex AI TensorBoard インスタンスは、チューニング パイプラインと同じリージョンに存在する必要があります。
    • 暗号化: (省略可)Google が管理する暗号鍵または顧客管理の暗号鍵(CMEK)のいずれかを選択します。CMEK は us-central1 リージョンでのみ暗号化に利用できます。他のすべての使用可能なリージョンでは、Google が管理する暗号鍵が使用されます。詳細については、CMEK の概要をご覧ください。
    • サービス アカウント: (省略可)ユーザー管理のサービス アカウントを選択します。サービスコードがアクセスできる Google Cloud リソースはサービス アカウントにより決定されます。サービス アカウントを選択しない場合は、ほとんどのモデルに適した権限を含む Google 管理のサービス アカウントが使用されます。
  7. [続行] をクリックする
  8. データセット ファイルをアップロードする場合は、[ JSONL ファイルを Cloud Storage にアップロードする] を選択します。データセット ファイルがすでに Cloud Storage バケットにある場合、[Cloud Storage 上の既存の JSONL ファイル] を選択します。

    JSONL ファイルをアップロードする

    • [JSONL ファイルの選択] で [参照] をクリックし、データセット ファイルを選択します。
    • [データセットの場所] で [参照] をクリックし、データセット ファイルを保存する Cloud Storage バケットを選択します。

    既存の JSONL ファイルを使用する

    [Cloud Storage のファイルパス] で [参照] をクリックし、データセット ファイルがある Cloud Storage バケットを選択します。

  9. (省略可)チューニング済みモデルを評価するには、[モデル評価を有効にする] を選択して、モデル評価を構成します。
    • 評価データセット: (省略可)バッチ予測と評価用の評価データセットを含む JSONL ファイルの URI。chat-bison では、評価はサポートされていません。詳細については、コードモデルをチューニングするためのデータセット形式をご覧ください。評価データセットには 10~250 個のサンプルが必要です。
    • 評価間隔: (省略可、デフォルトは 20)各評価間のチューニング ステップの数。評価間隔はチャットモデルではサポートされていません。評価は評価データセット全体で実行されるため、評価間隔が短いほどチューニング時間が長くなります。たとえば、steps が 200 で EVAL_INTERVAL が 100 の場合、評価指標のデータポイントは 2 つのみになります。このパラメータを使用するには、evaluation_data_uri を設定する必要があります。
    • 早期停止を有効にする: (省略可、デフォルトは trueboolean で、true に設定すると、評価の実行間でモデルのパフォーマンス(予測されるトークンの正確性により測定されます)に十分な改善が見られなかった場合、すべてのチューニング ステップが完了する前にチューニングを停止します。false の場合、すべてのチューニング ステップが完了するまでチューニングが続行されます。このパラメータを使用するには、evaluation_data_uri を設定する必要があります。早期停止の有効化は、チャットモデルではサポートされていません。
    • チェックポイントの選択を有効にする: 有効にすると、Vertex AI はチューニング ジョブ中に作成されたすべてのチェックポイントから、最適なモデル評価パフォーマンスを持つチェックポイントを選択して返します。無効にすると、チューニング ジョブ中に作成された最後のチェックポイントが返されます。各チェックポイントは、チューニング ジョブ中のモデルのスナップショットを参照します。
    • TensorBoard インスタンス:(省略可)Vertex AI TensorBoard インスタンスの ID。Vertex AI TensorBoard インスタンスは、チューニング ジョブの完了後にテストを作成するために使用されます。Vertex AI TensorBoard インスタンスは、チューニング パイプラインと同じリージョンに存在する必要があります。
  10. [チューニングを開始] をクリックします。

curl コマンドの例

PROJECT_ID=myproject
DATASET_URI=gs://my-gcs-bucket-uri/dataset
OUTPUT_DIR=gs://my-gcs-bucket-uri/output
ACCELERATOR_TYPE=GPU
LOCATION=us-central1

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
"https://europe-west4-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/europe-west4/pipelineJobs?pipelineJobId=tune-large-model-$(date +%Y%m%d%H%M%S)" -d \
$'{
  "displayName": "tune-llm",
  "runtimeConfig": {
    "gcsOutputDirectory": "'${OUTPUT_DIR}'",
    "parameterValues": {
      "project": "'${PROJECT_ID}'",
      "model_display_name": "The display name for your model in the UI",
      "dataset_uri": "'${DATASET_URI}'",
      "location": "'${LOCATION}'",
      "accelerator_type:": "'${ACCELERATOR_TYPE}'",
      "large_model_reference": "text-bison@002",
      "train_steps": 300,
      "learning_rate_multiplier": 1,
      "encryption_spec_key_name": "projects/myproject/locations/us-central1/keyRings/sample-key/cryptoKeys/sample-key"
    }
  },
  "encryptionSpec": {
    "kmsKeyName": "projects/myproject/locations/us-central1/keyRings/sample-key/cryptoKeys/sample-key"
  },
  "templateUri": "https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0"
}'

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

タスク データセットのサンプル数 ステップをトレーニング
分類 100 以上 100~500
要約 100~500 以上 200~1,000
抽出型の QA 100 以上 100~500
チャット 200 以上 1,000

トレーニングのステップでは、特定のデータセットに対して最高のパフォーマンスを得るために、複数の値(100、200、500 など)を試すことができます。

チューニング済みモデルのリストを表示する

現在のプロジェクトに含まれるモデルのリスト(チューニング済みモデルを含む)を表示するには、Google Cloud コンソール、または Vertex AI SDK for Python を使用します。

Python

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Python の設定手順を完了してください。詳細については、Vertex AI Python API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。


import vertexai
from vertexai.language_models import TextGenerationModel

def list_tuned_models(
    project_id: str,
    location: str,
) -> None:
    """List tuned models."""

    vertexai.init(project=project_id, location=location)
    model = TextGenerationModel.from_pretrained("text-bison@002")
    tuned_model_names = model.list_tuned_model_names()
    print(tuned_model_names)

    return tuned_model_names

コンソール

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

Vertex AI Model Registry に移動

チューニング済みテキストモデルを読み込む

次のサンプルコードでは、Vertex AI SDK for Python を使用して、教師ありチューニングでチューニングされたテキスト生成モデルを読み込みます。

import vertexai
from vertexai.preview.language_models import TextGenerationModel

model = TextGenerationModel.get_tuned_model(TUNED_MODEL_NAME)

TUNED_MODEL_NAME は、チューニング済みモデルの修飾リソース名に置き換えます。この名前は、projects/PROJECT_ID/locations/LOCATION/models/MODEL_ID の形式です。チューニング済みモデルのモデル ID は、Vertex AI Model Registry で確認できます。

チューニングと評価の指標

モデルのチューニングとモデルの評価の指標を収集して報告するよう、モデルのチューニング ジョブを構成できます。その後で、Vertex AI TensorBoard を使用してこれらの指標を可視化できます。チューニング ジョブを Vertex AI TensorBoard に接続するには、Vertex AI TensorBoard インスタンス ID と評価データセットを指定します。

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

モデルのチューニング ジョブを構成して、chat-bisoncode-bisoncodechat-bisontext-bison のチューニング指標を収集できます。

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

モデル評価の指標:

モデルのチューニング ジョブを構成して、code-bisontext-bison について次の評価指標を収集できます。

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

指標の可視化は、モデルのチューニング ジョブの完了後に利用できます。チューニング ジョブの作成時に Vertex AI TensorBoard のインスタンス ID のみを指定し、評価データセットを指定しなかった場合、チューニング指標の可視化のみを使用できます。

トラブルシューティング

以下のトピックは、教師ありチューニングを使用した基盤テキストモデルのチューニングに関する問題の解決に役立ちます。

モデルをチューニングしようとすると、500 エラーまたは Internal error encountered が返される

モデルをチューニングしようとしたときにこの 500 エラーが発生した場合は、次の回避策を試してください。

次の cURL コマンドを実行して、空の Vertex AI データセットを作成します。コマンドの中でプロジェクト ID を構成していることを確認してください。

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://europe-west4-aiplatform.googleapis.com/ui/projects/$PROJECT_ID/locations/europe-west4/datasets \
-d '{
    "display_name": "test-name1",
    "metadata_schema_uri": "gs://google-cloud-aiplatform/schema/dataset/metadata/image_1.0.0.yaml",
    "saved_queries": [{"display_name": "saved_query_name", "problem_type": "IMAGE_CLASSIFICATION_MULTI_LABEL"}]
}'

コマンドが完了したら、5 分待ってから再度モデルのチューニングを試みます。

Error: Permission 'aiplatform.metadataStores.get' denied on resource '...europe-west4/metadataStores/default'.

Compute Engine API が有効で、デフォルトの Compute Engine サービス アカウント(PROJECT_NUM‑compute@developer.gserviceaccount.com)に aiplatform.admin ロールと storage.objectAdmin ロールが付与されていることを確認します。

aiplatform.admin ロールと storage.objectAdmin ロールを Compute Engine サービス アカウントに付与するには、次のコマンドを実行します。

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

    マシンのターミナルを使用する場合は、Google Cloud CLI をインストールして構成します。

  2. gcloud projects add-iam-policy-binding コマンドを使用して、aiplatform.admin ロールを Compute Engine サービス アカウントに追加します。

    次のように置き換えます。

    • PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
    • PROJECT_NUM は、Google Cloud プロジェクト番号に置き換えます。
    gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:PROJECT_NUM-compute@developer.gserviceaccount.com --role roles/aiplatform.admin
    
  3. gcloud projects add-iam-policy-binding コマンドを使用して、storage.objectAdmin ロールを Compute Engine サービス アカウントに追加します。

    • PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
    • PROJECT_NUM は、Google Cloud プロジェクト番号に置き換えます。
    gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:PROJECT_NUM-compute@developer.gserviceaccount.com  --role roles/storage.objectAdmin
    

Error: Vertex AI Service Agent service-{project-number}@gcp-sa-aiplatform.iam.gserviceaccount.com does not have permission to access Artifact Registry repository projects/vertex-ai-restricted/locations/us/repositories/llm.

この権限エラーは、伝播の遅延が原因です。再試行すると、このエラーは解決するはずです。

次のステップ