微調整 (Snowflake Cortex)¶
Snowflake Cortex Fine-tuning 関数は、特定のタスクのために大規模な言語モデルをカスタマイズする方法を提供します。このトピックでは、この機能がどのように機能するのか、また、独自の微調整モデルの作成を開始する方法について説明します。
概要¶
Cortex Fine-tuning を使用すると、パラメーター効率の良い微調整(PEFT)を活用して、より専門的なタスクで事前に訓練されたモデルを使用するためのカスタマイズされたアダプタを作成することができます。大規模なモデルをゼロからトレーニングする高いコストはかけたくないが、プロンプトエンジニアリングや検索拡張世代 (RAG) メソッドよりも優れたレイテンシーと結果が必要な場合、既存の大規模モデルを微調整することも選択肢の1つです。微調整では、例を使ってモデルの動作を調整し、ドメイン固有のタスクに関するモデルの知識を向上させることができます。
Cortex Fine-tuning はフルマネージドサービスであり、Snowflake内でお客様のデータを使用して人気のある LLMs を微調整することができます。
Cortex Fine-tuning 機能は、以下の引数を持つSnowflake Cortex関数、 FINETUNE として提供されます。
コストの考慮事項¶
Snowflake Cortex Snowflake Cortex Fine-tuning 関数は、処理されたトークンの数に基づいてコンピューティングコストが発生します。さらに、微調整されたモデルで AI_COMPLETE 関数を実行すると、処理されるトークン数に応じたコンピューティングコストが発生します。100万トークンあたりのクレジット単位での各コストについては、 Snowflakeサービス利用テーブル をご参照ください。
トークンとは、 Snowflake Cortex Fine-tuning 関数で処理されるテキストの最小単位のことで、およそ4文字のテキストに相当します。トークンに相当する生の入力または出力テキストは、モデルによって異なる場合があります。
レスポンスに新しいテキストを生成する COMPLETE 関数では、入力と出力の両方のトークンがカウントされます。
微調整されたトークンは次のように計算されます。
Fine-tuning trained tokens = number of input tokens * number of epochs trained
FINETUNE ('DESCRIBE') (SNOWFLAKE.CORTEX) を使用して、微調整ジョブのトレーニング済みトークンの数を確認します。
チューニングと推論料金に加えて、カスタマイズされたアダプターのストレージ と ウェアハウス の標準的なコストがかかり、 SQL コマンドを実行します。
微調整トレーニングのためのクレジット消費の追跡¶
トレーニングジョブの微調整に必要なクレジットとトークンの消費量を表示するには、 CORTEX_FINE_TUNING_USAGE_HISTORY ビュー をご利用ください。
SELECT *
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_FINE_TUNING_USAGE_HISTORY;
その他の考慮事項¶
微調整のジョブは、多くの場合、長時間実行され、ワークシートセッションには添付されません。
訓練/検証データセットの行数は、ベースモデルと訓練エポック数によって制限されます。次の表は、3エポックの限界値を示しています。
Effective row count limit = 1 epoch limit for base model / number of epochs trained
モデル
1エポック
3エポック(デフォルト)
llama3-8b186k
62k
llama3-70b21k
7k
llama3.1-8b150k
50k
llama3.1-70b13.5k
4.5k
mistral-7b45k
15k
mixtral-8x7b27k
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;
さらに、FINETUNE関数を使用するには、ACCOUNTADMINロールは、SNOWFLAKECORTEX_USERデータベースロールを関数を呼び出せるユーザーに付与する必要があります。詳細については、 LLM関数で必要な権限 のトピックをご参照ください。
他のロールに微調整されたモデルの使用権を与えるには、そのモデルに対して使用権を与えなければなりません。詳細については、 モデル権限 をご参照ください。
微調整が可能なモデル¶
微調整が可能なベースモデルは以下の通りです。微調整が可能なモデルは、今後追加または削除される可能性があります。
名前 |
説明 |
|---|---|
|
テキスト分類、要約、感情分析など、 |
|
チャットアプリケーション、コンテンツ作成、エンタープライズアプリケーションに理想的な最先端のパフォーマンスを提供するMetaのLLM。 |
|
低~中程度の推論を必要とするタスクに最適なMeta社の大規模な言語モデル。軽量で超高速のモデルで、コンテキストウィンドウは24Kです。 |
|
チャットアプリケーション、コンテンツ作成、エンタープライズアプリケーションに理想的な最先端のパフォーマンスを発揮するオープンソースモデル。多様なユースケースを可能にする、高いパフォーマンスとコスト効率を備えたモデルです。 |
|
Mistral AI が提供する70億パラメータの大規模言語モデルは、最も単純な要約、構造化、迅速に終わらせる必要がある質問応答タスクに最適です。32Kのコンテキストウィンドウにより、複数ページのテキストを低レイテンシで高スループットに処理します。 |
|
Mistral AIの大規模な言語モデルは、テキスト生成、分類、質問応答などに最適です。Mistralのモデルは、低レイテンシ、低メモリ要件に最適化されており、企業のユースケースにおいて高いスループットを実現します。 |
モデルを微調整する方法¶
モデル調整の全体的なワークフローは以下の通りです。
トレーニングが完了したら、 Cortex Fine-tuning によって提供されたモデル名を使って、モデルの推論を実行することができます。
微調整データの準備¶
微調整データは Snowflake テーブルまたはビューから取得する必要があり、クエリ結果には prompt および completion という名前の列が含まれている必要があります。テーブルやビューに必要な名前の列がない場合は、クエリで列エイリアスを使用して名前を付けます。このクエリはFINETUNE関数のパラメータとして渡されます。結果に prompt、 completion 列名が含まれていないとエラーになります。
注釈
プロンプト列と完了列以外の列は、FINETUNE関数によって無視されます。Snowflakeでは、必要な列のみを選択するクエリの使用を推奨しています。
以下のコードでは、 FINETUNE 関数を呼び出し、 SELECT ... AS 構文を使用して、クエリ結果の2つの列を prompt と completion に設定します。
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'
);
注釈
定義したスキーマに従った応答を得るには、構造化出力を使用して微調整データを生成します。構造化出力の詳細情報については、 AI_COMPLETE 構造化出力 を参照してください。
プロンプトはLLMへの入力であり、完了はLLMからの応答です。トレーニングデータには、特定のプロンプトに対してモデルがどのように反応するかを示すプロンプトと完了のペアを含める必要があります。
微調整することで最適なパフォーマンスを得るために、トレーニングデータに関する推奨事項と必要条件を以下に示します。
数百の例から始めてください。あまりに多くの例から始めると、調整にかかる時間が大幅に増加し、パフォーマンスの向上は最小限にとどまる可能性があります。
各例では、調整するベースモデルに割り当てられたコンテキストウィンドウの一部だけを使用する必要があります。コンテキストウィンドウはトークンで定義されます。トークンは、Snowflake Cortex関数で処理されるテキストの最小単位で、テキストの4文字とほぼ同じです。この制限を超えるプロンプトと完了のペアは切り捨てられ、トレーニング済みモデルの品質に悪影響を与える可能性があります。
各ベースモデルの
promptとcompletionに割り当てられるコンテキストウィンドウの部分は、以下のテーブルで定義されています。モデル
コンテキストウィンドウ
入力コンテキスト(プロンプト)
出力コンテキスト(完了)
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_data と my_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'
);
モデルやデータなどのデータベースオブジェクトごとに異なるデータベースやスキーマを使用したい場合は、それぞれに絶対パスを使用することができます。次の例では、 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'
);
SNOWFLAKE.CORTEX.FINETUNE関数の第一引数 に「CREATE」を指定すると、出力として微調整されたモデルIDを返します。SNOWFLAKE.CORTEX.FINETUNE関数を使用し、「DESCRIBE」を第一引数 として、ステータスやジョブの進捗状況を取得するには、このIDを使用します。
Snowsight を使用する¶
Snowsight で微調整ジョブを作成するには、以下の手順に従ってください。
Snowsight にサインインします。
SNOWFLAKE.CORTEX_USER データベースロールが付与されているロールを選択します。
ナビゲーションメニューで AI & ML » Studio を選択します。
Create Custom LLM ボックスから Fine-tune を選択します。
ドロップダウンメニューでベースモデルを選択します。
微調整ジョブを実行するロールと実行するウェアハウスを選択します。このロールには、 SNOWFLAKE.CORTEX_USER データベースロールが付与されていなければならなりません。
微調整したモデルを保存するデータベースを選択します。
微調整したモデルの名前を入力し、 Let's go を選択します。
トレーニングデータを含むテーブルまたはビューを選択し、 Next を選択します。トレーニングデータは、そのロールがアクセスできるデータベースやスキーマから得ることができます。
トレーニングデータのプロンプトを含む列を選択し、 Next を選択します。
トレーニングデータの完了を含む列を選択し、 Next を選択します。
検証データセットがある場合は、検証データを含むテーブルまたはビューを選択し、 Next を選択します。個別の検証データがない場合は、 Skip this option を選択します。
選択を認証し、 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'
);
以下は呼び出し例からの出力のスニペットです。
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 関数から削除された場合、微調整したモデルは機能しなくなります。
モデルの複製¶
クロスリージョン推論 は微調整モデルをサポートしていません。推論は、モデルオブジェクトがあるのと同じ領域で行われなければなりません。モデルが学習されたリージョンと異なる場合は、データベースの複製を使用して、推論を行いたいリージョンに微調整されたモデルオブジェクトを複製することができます。
たとえば、 AWS US 西部2リージョンのアカウントで、 mistral-7b に基づいて微調整されたモデルを作成した場合、データ共有を使用してこのリージョンの別のアカウントと共有したり、データベースレプリケーションを使用して、 AWS ヨーロッパ西部など、 mistral-7b モデルをサポートする別のリージョンにある組織の別のアカウントにモデルを複製したりすることができます。オブジェクトの複製に関する詳細は、 複数のアカウント間にわたるデータベースとアカウントオブジェクトの複製 をご参照ください。
法的通知¶
インプットとアウトプットのデータ分類は以下の表の通りです。
入力データの分類 |
出力データの分類 |
指定 |
|---|---|---|
Usage Data |
Customer Data |
一般的に利用可能な関数は、カバーされている AI 機能です。プレビュー関数は、 AI 機能をプレビューします。[1] |
詳細については、 Snowflake AI と ML をご参照ください。