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

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

  • レスポンスに新しいテキストを生成する COMPLETE 関数では、入力と出力の両方のトークンがカウントされます。

  • 微調整されたトークンは次のように計算されます。

    Fine-tuning trained tokens = number of input tokens * number of epochs trained
    
    Copy

    FINETUNE ('DESCRIBE') (SNOWFLAKE.CORTEX) を使用して、微調整ジョブのトレーニング済みトークンの数を確認します。

その他の考慮事項

  • 調整と推論に発生する費用に加えて、出力されたカスタマイズされたアダプターを保管し、および SQL コマンドを実行するための通常の ストレージウェアハウス コストが発生します。

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

  • 各モデルのトレーニング/検証データセットサイズには、以下の制限が適用されます。

    モデル

    トレーニングデータの制限

    llama3-8b

    1 GB

    llama3-70b

    250 MB

    llama3.1-8b

    1 GB

    llama3.1-70b

    250 MB

    mistral-7b

    1 GB

    mixtral-8x7b

    250 MB

アクセス制御の要件

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

権限

オブジェクト

メモ

USAGE

DATABASE

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

(CREATEMODELおよびUSAGE) または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社の大規模な言語モデル。軽量で超高速のモデルで、コンテキストウィンドウは128Kです。

llama3.1-70b

チャットアプリケーション、コンテンツ作成、エンタープライズアプリケーションに理想的な最先端のパフォーマンスを発揮するオープンソースモデル。128Kのコンテキストウィンドウで多様なユースケースを可能にする、高いパフォーマンスとコスト効率を備えたモデルです。 llama3-70b は現在もサポートされており、コンテキストウィンドウは8Kです。

mistral-7b

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

mixtral-8x7b

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

モデルを微調整する方法

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

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

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

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

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

トレーニングデータを準備する

トレーニングデータはSnowflakeテーブルまたは表示から取得する必要があり、クエリ結果には promptcompletion という名前の列が含まれている必要があります。テーブルやビューに必要な名前の列がない場合は、クエリで列エイリアスを使用して名前を付けます。このクエリは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

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

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

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

  • 各例では、調整するベースモデルに割り当てられたコンテキストウィンドウの一部だけを使用する必要があります。コンテキストウィンドウはトークンで定義されます。トークンは、Snowflake Cortex関数で処理されるテキストの最小単位で、テキストの4文字とほぼ同じです。

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

    モデル

    コンテキストウィンドウ

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

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

    llama3-8b

    8k

    6k

    2k

    llama3-70b

    8k

    6k

    2k

    llama3.1-8b

    128k

    120k

    8k

    llama3.1-70b

    128k

    120k

    8k

    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を使用します。

微調整されたモデルの管理

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

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

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

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 モデルをサポートする別のリージョンにある組織の別のアカウントにモデルを複製したりすることができます。オブジェクトの複製に関する詳細は、 複数のアカウント間にわたるデータベースとアカウントオブジェクトの複製 をご参照ください。