微調整 (Snowflake Cortex)

Snowflake Cortex Fine-tuning 関数は、特定のタスクのために大規模な言語モデルをカスタマイズする方法を提供します。このトピックでは、この機能がどのように機能するのか、また、独自の微調整モデルの作成を開始する方法について説明します。

概要

Cortex Fine-tuning を使用すると、パラメーター効率の良い微調整(PEFT)を活用して、より専門的なタスクで事前に訓練されたモデルを使用するためのカスタマイズされたアダプタを作成することができます。大規模なモデルをゼロからトレーニングする高いコストはかけたくないが、プロンプトエンジニアリングや検索拡張世代 (RAG) メソッドよりも優れたレイテンシーと結果が必要な場合、既存の大規模モデルを微調整することも選択肢の1つです。微調整では、例を使ってモデルの動作を調整し、ドメイン固有のタスクに関するモデルの知識を向上させることができます。

Cortex Fine-tuning はフルマネージドサービスであり、Snowflake内でお客様のデータを使用して人気のある LLMs を微調整することができます。

Cortex Fine-tuning 機能は、以下の引数を持つSnowflake Cortex関数、 FINETUNE として提供されます。

  • CREATE: 与えられたトレーニングデータで微調整ジョブを作成します。

  • SHOW: 現在のアカウントにあるすべての微調整ジョブのリスト。

  • DESCRIBE: 特定の微調整ジョブの進行状況とステータスを説明します。

  • CANCEL: 指定された微調整ジョブをキャンセルします。

コストの考慮事項

Snowflake Cortex Snowflake Cortex Fine-tuning 関数は、処理されたトークンの数に基づいてコンピューティングコストが発生します。さらに、微調整されたモデルで AI_COMPLETE 関数を実行すると、処理されるトークン数に応じたコンピューティングコストが発生します。100万トークンあたりのクレジット単位での各コストについては、 Snowflakeサービス利用テーブル をご参照ください。

トークンとは、 Snowflake Cortex Fine-tuning 関数で処理されるテキストの最小単位のことで、およそ4文字のテキストに相当します。トークンに相当する生の入力または出力テキストは、モデルによって異なる場合があります。

微調整トレーニングのためのクレジット消費の追跡

トレーニングジョブの微調整に必要なクレジットとトークンの消費量を表示するには、 CORTEX_FINE_TUNING_USAGE_HISTORY ビュー をご利用ください。

SELECT *
  FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_FINE_TUNING_USAGE_HISTORY;
Copy

その他の考慮事項

  • 微調整のジョブは、多くの場合、長時間実行され、ワークシートセッションには添付されません。

  • 訓練/検証データセットの行数は、ベースモデルと訓練エポック数によって制限されます。次の表は、3エポックの限界値を示しています。

    Effective row count limit = 1 epoch limit for base model / number of epochs trained
    
    Copy

    モデル

    1エポック

    3エポック(デフォルト)

    llama3-8b

    186k

    62k

    llama3-70b

    21k

    7k

    llama3.1-8b

    150k

    50k

    llama3.1-70b

    13.5k

    4.5k

    mistral-7b

    45k

    15k

    mixtral-8x7b

    27k

    9k

アクセス制御の要件

微調整ジョブを実行するには、微調整ジョブを作成するロールに以下の権限が必要です。

権限

オブジェクト

注意

USAGE

DATABASE

トレーニング (および検証) データがクエリされるデータベース。

CREATE MODEL または OWNERSHIP

SCHEMA

モデルが保存されるスキーマ。

以下の SQL は、 my_schema 上のロール(my_role)に CREATE MODEL 権限を付与する例です。

GRANT CREATE MODEL ON SCHEMA my_schema TO ROLE my_role;
Copy

さらに、FINETUNE関数を使用するには、ACCOUNTADMINロールは、SNOWFLAKECORTEX_USERデータベースロールを関数を呼び出せるユーザーに付与する必要があります。詳細については、 LLM関数で必要な権限 のトピックをご参照ください。

他のロールに微調整されたモデルの使用権を与えるには、そのモデルに対して使用権を与えなければなりません。詳細については、 モデル権限 をご参照ください。

微調整が可能なモデル

微調整が可能なベースモデルは以下の通りです。微調整が可能なモデルは、今後追加または削除される可能性があります。

名前

説明

llama3-8b

テキスト分類、要約、感情分析など、 llama2-70b-chat モデルよりも精度が高く、低~中程度の推論を必要とするタスクに最適なMetaの大規模言語モデル。

llama3-70b

チャットアプリケーション、コンテンツ作成、エンタープライズアプリケーションに理想的な最先端のパフォーマンスを提供するMetaのLLM。

llama3.1-8b

低~中程度の推論を必要とするタスクに最適なMeta社の大規模な言語モデル。軽量で超高速のモデルで、コンテキストウィンドウは24Kです。

llama3.1-70b

チャットアプリケーション、コンテンツ作成、エンタープライズアプリケーションに理想的な最先端のパフォーマンスを発揮するオープンソースモデル。多様なユースケースを可能にする、高いパフォーマンスとコスト効率を備えたモデルです。

mistral-7b

Mistral AI が提供する70億パラメータの大規模言語モデルは、最も単純な要約、構造化、迅速に終わらせる必要がある質問応答タスクに最適です。32Kのコンテキストウィンドウにより、複数ページのテキストを低レイテンシで高スループットに処理します。

mixtral-8x7b

Mistral AIの大規模な言語モデルは、テキスト生成、分類、質問応答などに最適です。Mistralのモデルは、低レイテンシ、低メモリ要件に最適化されており、企業のユースケースにおいて高いスループットを実現します。

モデルを微調整する方法

モデル調整の全体的なワークフローは以下の通りです。

  1. トレーニングデータを準備します

  2. 必要なパラメータを指定して微調整ジョブを開始します

  3. トレーニングのモニタリングをします

トレーニングが完了したら、 Cortex Fine-tuning によって提供されたモデル名を使って、モデルの推論を実行することができます。

微調整データの準備

微調整データは Snowflake テーブルまたはビューから取得する必要があり、クエリ結果には prompt および completion という名前の列が含まれている必要があります。テーブルやビューに必要な名前の列がない場合は、クエリで列エイリアスを使用して名前を付けます。このクエリはFINETUNE関数のパラメータとして渡されます。結果に promptcompletion 列名が含まれていないとエラーになります。

注釈

プロンプト列と完了列以外の列は、FINETUNE関数によって無視されます。Snowflakeでは、必要な列のみを選択するクエリの使用を推奨しています。

以下のコードでは、 FINETUNE 関数を呼び出し、 SELECT ... AS 構文を使用して、クエリ結果の2つの列を promptcompletion に設定します。

SELECT SNOWFLAKE.CORTEX.FINETUNE(
  'CREATE',
  'my_tuned_model',
  'mistral-7b',
  'SELECT a AS prompt, d AS completion FROM train',
  'SELECT a AS prompt, d AS completion FROM validation'
);
Copy

注釈

定義したスキーマに従った応答を得るには、構造化出力を使用して微調整データを生成します。構造化出力の詳細情報については、 AI_COMPLETE 構造化出力 を参照してください。

プロンプトはLLMへの入力であり、完了はLLMからの応答です。トレーニングデータには、特定のプロンプトに対してモデルがどのように反応するかを示すプロンプトと完了のペアを含める必要があります。

微調整することで最適なパフォーマンスを得るために、トレーニングデータに関する推奨事項と必要条件を以下に示します。

  • 数百の例から始めてください。あまりに多くの例から始めると、調整にかかる時間が大幅に増加し、パフォーマンスの向上は最小限にとどまる可能性があります。

  • 各例では、調整するベースモデルに割り当てられたコンテキストウィンドウの一部だけを使用する必要があります。コンテキストウィンドウはトークンで定義されます。トークンは、Snowflake Cortex関数で処理されるテキストの最小単位で、テキストの4文字とほぼ同じです。この制限を超えるプロンプトと完了のペアは切り捨てられ、トレーニング済みモデルの品質に悪影響を与える可能性があります。

  • 各ベースモデルの promptcompletion に割り当てられるコンテキストウィンドウの部分は、以下のテーブルで定義されています。

    モデル

    コンテキストウィンドウ

    入力コンテキスト(プロンプト)

    出力コンテキスト(完了)

    llama3-8b

    8k

    6k

    2k

    llama3-70b

    8k

    6k

    2k

    llama3.1-8b

    24k

    20k

    4k

    llama3.1-70b

    8k

    6k

    2k

    mistral-7b

    32k

    28k

    4k

    mixtral-8x7b

    32k

    28k

    4k

微調整ジョブの開始

SNOWFLAKE.CORTEX.FINETUNE 関数を呼び出して、 「CREATE」 を最初の引数として渡すか、 Snowsight を使用して微調整ジョブを開始できます。

SQL を使用する

この例では、 mistral-7b モデルをベースモデルとして使用し、 my_tuned_model というモデル出力名と、 my_training_datamy_validation_data のテーブルからそれぞれトレーニングデータと検証データをクエリするジョブを作成します。

USE DATABASE mydb;
USE SCHEMA myschema;

SELECT SNOWFLAKE.CORTEX.FINETUNE(
  'CREATE',
  'my_tuned_model',
  'mistral-7b',
  'SELECT prompt, completion FROM my_training_data',
  'SELECT prompt, completion FROM my_validation_data'
);
Copy

モデルやデータなどのデータベースオブジェクトごとに異なるデータベースやスキーマを使用したい場合は、それぞれに絶対パスを使用することができます。次の例では、 mydb2.myschema2 データベースとスキーマからデータを使用して微調整ジョブを作成し、微調整されたモデルを mydb.myschema データベースとスキーマに保存しています。

SELECT SNOWFLAKE.CORTEX.FINETUNE(
  'CREATE',
  'mydb.myschema.my_tuned_model',
  'mistral-7b',
  'SELECT prompt, completion FROM mydb2.myschema2.my_training_data',
  'SELECT prompt, completion FROM mydb2.myschema2.my_validation_data'
);
Copy

SNOWFLAKE.CORTEX.FINETUNE関数の第一引数 に「CREATE」を指定すると、出力として微調整されたモデルIDを返します。 SNOWFLAKE.CORTEX.FINETUNE関数を使用し、「DESCRIBE」を第一引数 として、ステータスやジョブの進捗状況を取得するには、このIDを使用します。

Snowsight を使用する

Snowsight で微調整ジョブを作成するには、以下の手順に従ってください。

  1. Snowsight にサインインします。

  2. SNOWFLAKE.CORTEX_USER データベースロールが付与されているロールを選択します。

  3. ナビゲーションメニューで AI & ML » Studio を選択します。

  4. Create Custom LLM ボックスから Fine-tune を選択します。

  5. ドロップダウンメニューでベースモデルを選択します。

  6. 微調整ジョブを実行するロールと実行するウェアハウスを選択します。このロールには、 SNOWFLAKE.CORTEX_USER データベースロールが付与されていなければならなりません。

  7. 微調整したモデルを保存するデータベースを選択します。

  8. 微調整したモデルの名前を入力し、 Let's go を選択します。

  9. トレーニングデータを含むテーブルまたはビューを選択し、 Next を選択します。トレーニングデータは、そのロールがアクセスできるデータベースやスキーマから得ることができます。

  10. トレーニングデータのプロンプトを含む列を選択し、 Next を選択します。

  11. トレーニングデータの完了を含む列を選択し、 Next を選択します。

  12. 検証データセットがある場合は、検証データを含むテーブルまたはビューを選択し、 Next を選択します。個別の検証データがない場合は、 Skip this option を選択します。

  13. 選択を認証し、 Start training を選択します。

最後のステップは、微調整ジョブの開始を確認し、 Job ID を表示します。 SNOWFLAKE.CORTEX.FINETUNE関数を使用し、「DESCRIBE」を第一引数 として、ステータスやジョブの進捗状況を取得するには、このIDを使用します。

細かいジョブの管理

微調整ジョブは長時間実行されるため、ワークシートセッションに関連付けられません。あなたは SNOWFLAKE.CORTEX.FINETUNE 関数を使用して、 SHOW または 'DESCRIBE' を第一引数として調整ジョブのステータスを確認できます。

微調整ジョブが不要になった場合は、 SNOWFLAKE.CORTEX.FINETUNE 関数を使用し、最初の引数として CANCEL とともに、2 番目の引数をジョブ ID として、ジョブを終了することができます。

微調整されたモデルの分析

ファインチューニング・ジョブが完了すると、ファインチューニングされたモデルの成果物を調べることで、トレーニング・プロセスの結果を分析することができます。微調整されたモデルの成果物にアクセスするためには、モデルの OWNERSHIP 権限が必要です。詳細は、 モデル権限 を参照してください。

成果物には training_results.csv ファイルが含まれます。この CSV ファイルには、ヘッダー行が1行あり、その後に微調整ジョブによって記録された各トレーニングステップの行が続きます。ファイルには以下の列が含まれます。

列名

説明

step

トレーニングプロセス全体で完了したトレーニングステップの数。1で開始。

epoch

トレーニング過程におけるエポック。1で開始。

training_loss

トレーニングバッチでの損失。数値が低いほど、モデルとデータの適合度が高いことを示します。

validation_loss

検証データセットでの損失。これは各エポックの最後のステップでのみ利用可能。

training_results.csv ファイルはSnowsight の Modeling Registry UI にあり、 SQL またはPython API から直接アクセスできます。詳細については、 モデルアーティファクトの操作 をご参照ください。

微調整したモデルを推論に使用します。

COMPLETE LLM関数 を、微調整したモデルの名前と一緒に使って推論してください。

この例では、微調整したモデルの名前で COMPLETE 関数を呼び出しています。

SELECT SNOWFLAKE.CORTEX.COMPLETE(
  'my_tuned_model',
  'How to fine-tune mistral models'
);
Copy

以下は呼び出し例からの出力のスニペットです。

Mistral models are a type of deep learning model used for image recognition and classification. Fine-tuning a Mistral model involves adjusting the model's parameters to ...

制限事項と既知の問題

  • 微調整ジョブはアカウントレベルでのみリスト可能です。

  • FINETUNE ('SHOW') (SNOWFLAKE.CORTEX) から返される微調整ジョブは永続的なものではなく、定期的に廃棄処分される可能性があります。

  • ベースモデルがCortex LLM 関数から削除された場合、微調整したモデルは機能しなくなります。

モデルの共有

微調整したモデルは、 データ共有 を介して、 USAGE 権限を持つ他のアカウントと共有することができます。

モデルの複製

クロスリージョン推論 は微調整モデルをサポートしていません。推論は、モデルオブジェクトがあるのと同じ領域で行われなければなりません。モデルが学習されたリージョンと異なる場合は、データベースの複製を使用して、推論を行いたいリージョンに微調整されたモデルオブジェクトを複製することができます。

たとえば、 AWS US 西部2リージョンのアカウントで、 mistral-7b に基づいて微調整されたモデルを作成した場合、データ共有を使用してこのリージョンの別のアカウントと共有したり、データベースレプリケーションを使用して、 AWS ヨーロッパ西部など、 mistral-7b モデルをサポートする別のリージョンにある組織の別のアカウントにモデルを複製したりすることができます。オブジェクトの複製に関する詳細は、 複数のアカウント間にわたるデータベースとアカウントオブジェクトの複製 をご参照ください。