これは、EMNLP 2021ペーパー「パラメーター効率の高いプロンプトチューニングのためのスケールの力」(Lester et al。、2021)の実験を再現するコードです。
これらのモデルは、モデルとトレーニングループを定義するT5X上に構築されています。実際のモデル計算を定義するFlaxformer。低レベルのモデル層を定義する亜麻。およびJaxは、実際の実行を提供します。実装の詳細はこちらをご覧ください。
gs://{bucket-name}/path/to/item/in/bucketようなフォーマットされたURIを使用して、このバケットにデータを読み取り、書き込みます。ここで、キャッシュされたデータセットとモデルのチェックポイントと結果を保存します。参照のために、TPU VMと対話するための最も一般的なクラウドコマンドのいくつかは # Create a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-8
--version v2-alpha
# SSH into a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --zone ${ZONE}
# Delete a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm delete ${TPU_NAME} --zone ${ZONE}git clone --branch=main https://github.com/google-research/prompt-tuning
cd prompt-tuningpython3 -m pip install .[tpu] -f https://storage.googleapis.com/jax-releases/libtpu_releases.html PIPがバージョン0.0.0をインストールしようとするまで依存関係の前述とEarlilerバージョンの依存関係(Tensorflow)のインストールを試みてから--use-deprecated=legacy-resolverインストールコマンドに追加しようとするエラーが発生した場合。このエラーは、必要なバージョンに関連しており、Betweensの依存関係があり、動作はしばしばバックトラッキングと呼ばれます。フラグを使用する場合、互換性のないバージョンのライブラリがインストールされ、インストールコマンドの出力の不一致に関する警告を調べる必要があります。
注:プロンプトチューニングの内部をハッキングする場合、編集可能なインストールが必要な場合(トレーニングを実行するときにクローンコードの変更が使用されます)、 -eフラグでpipを実行し、インストール中にエラーが発生している場合はpyproject.tomlファイルを削除する必要があります。
テストを実行するには、 [test] ( python3 -m pip install .[test] ... )オプションでパッケージをインストールし、クローン化されたリポジトリのルートからpython3 -m pytestを実行します。
プロンプトのトレーニングは、T5Xでモデルを微調整することに似ています。主な違いは、使用するプロンプトチューニング構成ファイルのセットが独自のセットがあることです。
プロンプトをトレーニングするために必要なすべてのパーツを備えたデモスクリプト( prompt_tuning/scripts/sst2-demo.sh )を提供します。これを出発点として使用するか、Googleクラウドストレージバケットへのパスを備えたMODEL_DIRおよびTFDS_DATA_DIR環境変数を設定して、このスクリプトを直接実行します。
./prompt-tuning/prompt_tuning/scripts/sst2-demo.shイテレーション速度を支援するために、すべての構成を単一のGINファイルにバンド化するのではなく、コマンドラインをより多くのオプションを指定する傾向があります。いくつかの注意事項:
--gin_search_paths ::ジンファイルのパスプレフィックスとして使用するディレクトリのコンマ分離リスト。 prompt_tuning.scripts.find_module ${module}を使用して、構成をバンドルするライブラリのインストール場所を見つけることができます。--gin_file :: ginファイルを読み込みます。インストールされているライブラリから始まるパス間のパスを使用する傾向があります。つまり、IE prompt_tuning/configs/models/t5_1_1_base_prompt.gin Over models/t5_1_1_base_prompt.gin混乱を避けます。フラグを複数回使用すると、マージされる複数のGINファイルを指定することができます。複数のファイルで設定された構成オプションは、リスト内の最後のファイルの値を使用します。--gin.{PARAM}={VALUE} ::この一般的なオーバーライドフラグは、 PARAMをVALUEに設定します。これを使用して、実際のコマンドライン引数にする必要なく、構成オプションを簡単に設定できます。例えば。 --gin.utils.SaveCheckpointConfig.keep=20最後の20のチェックポイントを保存します。たとえば、モデルが大きくなると、XLとXXLが大きくなると、単一のTPU VMが付属する8つのTPUには適合しません。これらの場合、TPUポッドのスライスが必要になります(TPUアーキテクチャと利用可能な構成の詳細については、こちらをご覧ください)。単一のTPU VMとポッドスライスでプロンプトをトレーニングすることの主な違いは、複数のTPU VMがあり、各VMと同じSPMD JAXを実行することです。このページには、マルチホストJAXプログラムに関する詳細情報があります。このガイドは、TPUポッドスライスでJAXプログラムを実行するための簡単な紹介を提供しますが、ここでメインポイントをヒットします。
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-32
--version v2-alpha--worker=all 、 --command= Flagで実行するコマンドを指定するために使用できます。 $ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " git clone --branch=main https://github.com/google-research/prompt-tuning && cd prompt-tuning && "
python3 -m pip install . -f https://storage.googleapis.com/jax-releases/libtpu_releases.htmlプロンプトをトレーニングするためにスクリプトを書きます。 DEMOスクリプト( /prompt_tuning/scripts/sst2-xxl-demo.sh )を含めて、T5 1.1 LM100K XXLを使用してSST2データセットを解決するプロンプトを列車にしました。これを出発点として使用するか、Googleクラウドストレージバケットへのパスを入力して、結果を保存する場所( MODEL_DIR )とTFDSデータ( TFDS_DATA_DIR )をキャッシュする場所を指定するか、環境変数として設定する場所を指定できます。
各ワーカーをトレーニングスクリプトにコピーします。これがscp初めて実行した場合は、エラーが発生する可能性があります。SSH ssh-add /.../.ssh/google_compute_engineコマンドをエラーメッセージから実行して、再試行してください。
$ gcloud alpha compute tpus tpu-vm scp sst2-xxl-demo.sh ${TPU_NAME} :
--zone= ${ZONE}
--worker=all$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " ./sst2-xxl-demo.sh "労働者の1人がトレーニング中にエラーを持っている場合、他の労働者にTPUを使用しているプロセスが残ります。これにより、これらのプロセスが終了してTPUをリリースするまで、仕事を再開することが妨げられます。次のコマンドは、これらすべてのプロセスを終了する必要があります。 kill Command Manページが、最初のエラーがあったワーカーから戻ってくるのを見るかもしれません。
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " sudo lsof -t /dev/accel0 | xargs kill -9 "独自のデータセットなどのカスタムパーツを使用してプロンプトをトレーニングするには、カスタムコンポーネントのT5X命令に従ってください
コードをPIP -InStallable Pythonパッケージとしてパッケージ化する場合、単一のディレクトリにバインドされ、 python3 -m prompt_tuning.scripts.find_module {your_module}を使用して、 gin_search_pathsを設定して、ライブラリにバンドルされるようにGin search_pathsを設定できます。注:インストール可能なパッケージでジン構成をバンドルする計画を立てる場合は、ginにはファイルがpythonパッケージであるため、構成ファイルを含むディレクトリに__init__.pyがあることを確認してください。
カスタムコンポーネントの一部がGIN構成可能な場合、GINファイルに明示的にインポートする必要があります。 GINファイルが解析された後にインポートされると、エラーが発生します。依存関係がGIN Configurablesが含まれていない場合、渡すことでジンファイル--gin.MIXTURE_OR_TASK_MODULE="'path.to.your.module'書き込みを避けることができます。
プロンプトで推論を行うための推奨される方法は、モデルの初期化に使用される元のチェックポイントと、ファイルからプロンプトをロードすることです。このセクションで説明されているように、部分的な読み込みについては、T5Xが他のパラメーターをゼロから初期化しながら、いくつかのモデルパラメーターの読み込みをサポートしています。これをfrom_arrayプロンプトIniveryizerと組み合わせて使用して、元のチェックポイントから凍結パラメーターをリロードし、プロンプトファイルをファイルにリロードします。 configs/runs/prompt_eval.ginこの構成をセットアップします。 PROMPT_FILEを提供する必要があります。モデルがprompts/構成ファイルのいずれかでトレーニングされている場合は、引数から評価スクリプトにそれらを削除できます。
含まれているsst2-demo-eval.shスクリプトは、この方法で評価を行う例を示しています。必要なのは、評価の出力とTensorflow Datasetsのキャッシュを尊重するために、 EVAL_DIRおよびTFDS_DATA_DIR環境変数をパスに設定することです。
T5xでは、評価スクリプトは、データセットにラベルがあり、データセットのメトリック関数から最終結果を出力することを想定しています。推論スクリプトはラベルを必要とせず、代わりにモデルの予測を出力します。推論スクリプトで使用する類似のprompt_infer.ginファイルを含めます。
プロンプトチューニングトレーニングの実行から生成されたT5Xチェックポイントで推論または評価を行う場合は、T5Xから(eval|infer).gin構成を直接使用できます。ただし、 utils.RestoreChekcpointConfigを更新する必要があります。新しいチェックポイント、 assignment_map=()およびfallback_to_scratch=Falseへのpathを設定する必要があります。
すべてのモデル、トレーニング、評価、保存、復元など。構成はGINを介して行われます。ジンとこのプライマーの一般的な紹介については、Gin-Configリポジトリをご覧ください
T5X構成レイアウトに従います。
runs/ ::モデルの実際のトレーニング用の構成を含みます。これは、データセットや評価構成などのものです。architectures/ ::モデルの仕組みの構成が含まれています。これは、エンコーダーデコーダー対デコーダーのみや埋め込み共有のようなものが構成されている場所です。models/ ::レイヤー数や埋め込みテーブルのサイズなどのモデル固有のパラメーターを設定する構成を含む。また、使用されているT5Xモデルラッパーのようなものも構成します。models/decoding/ ::使用しやすい構成を含むには、推論中にモデルがテキストを生成する方法を交換し、ビーム検索と核サンプリングの構成を含みます。models/sizes/ ::さまざまなサイズのモデルを作成するさまざまな設定が含まれています。これらはデフォルトバージョンと組み合わせてサイズのバージョンを作成します。たとえば、 t5_1_1_prompt.gin + sizes/large.gin 。右のGINファイルとしてすでに利用可能ないくつかの一般的な組み合わせには、上記の例のために( t5_1_1_large_prompt.gin )が含まれます。注:これらのサイズファイルは、メインモデルファイルの後に来る必要があります。prompts/ ::追加のディレクトリには、 PROMPT GIN変数を設定する構成が含まれており、プロンプトファイルが--gin_file引数( models/ ginファイルの後に来る必要がある)として追加されるプロンプトの初期化ベースを簡単に切り替えることができます。コマンドラインで--gin_file引数を指定する場合、順序が重要です。ジンファイルを指定する必要がある一般順序は次のとおりです。
models/*.ginprompts/*.ginmodels/sizes/*.gin*models/decoding/*.ginruns/*.ginT5xには、 MIXTURE_OR_TASK_NAMEやTASK_FEATURE_LENGTHSなどの必要なフィールドがいくつかあります。さらに2つ追加します。
PROMPT_LENGTH ::使用しているプロンプトの長さ、これはいくつかの異なる場所で使用され、複数の場所で参照し、値が同期していることを確認できます。PROMPT ::これは、Flaxformer PromptXサブクラスで使用される実際のプロンプトモジュールの構成です。注:迅速なチューニングでは、現在、例の梱包をサポートしていません。これは、最大目標の長さが、各例のターゲットに適合するのに十分な長さである必要があることを意味します。これは、 TASK_FEATURE_LENGTHSマッピングのtargetsキーがはるかに短くなる可能性があることを意味します。たとえば、多くのスーパーグルー(Wang et al。、2019)のタスクでは、P5Xデフォルトの62と比較して約4つです。
プロンプトパラメーターの初期化にはいくつかのオプションがあります。セクション3.2のさまざまな方法と、ファイルからの初期化をサポートしています。後者は、MNLIで学んだプロンプトから始まるブールクでトレーニングのようなことをすることができます。
すべての初期化剤は、初期化関数で閉鎖を返すパラメーター化された関数であるというFlax Initializer APIに従います。実際の初期化関数には常に署名があります
def initializer ( rng : Array , shape : Sequence [ int ]) -> Array :
...各初期化スキームはconfigs/promptsディレクトリのGIN構成ファイルとして提供します。それらは、ジンファイルを--gin_file=path/to/configs/prompts/scheme.ginに含めることによって使用できます。このファイルはメインモデルファイルの後に来る必要があります。そうしないと、デフォルト(ランダム均一)メソッドが選択したファイルを上書きします。これらの初期化方法のいくつかは、ジンファイルの1つにオーバーライドするフラグを立てている場合でも、追加のジン値を設定する必要があります。
ランダムユニフォーム
初期化の埋め込みに人々が使用したものと同様の標準的なランダムな初期化。これはデフォルトであり、ジンファイルは必要ありません。ランダム値のスケールはprompt_init/linen.initializers.uniform.scale=Nオーバーリッドすることで調整できます。
サンプリングされた音声
from_sample_of_embeddings initializerを使用して、各プロンプト位置の初期化として使用するためのトークン埋め込みサンプル。 samplingを最初のn埋め込みに制限することができますprompt_init/prompts.from_samples_of_embeddings.population_sizeパラメーターを使用できます。
これは--gin_file=prompt_tuning/configs/prompts/from_sampled_vocab.ginで使用できます。この方法では、初期モデルチェックポイントから抽出された埋め込みテーブルを使用します。また、 --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab_numpy.ginを使用して、独自の埋め込みファイルを提供することもできます。この方法では、モデルの埋め込みテーブルのnumpy配列であるEMBEDDING_FILEの値を提供する必要があります。これは、prompt_tuning.scripts.extract_variableを使用して、モデルチェックポイントから抽出できます。
クラスラベル
from_embedded_list initializerを介してクラスラベル(別名Verbalizers )の埋め込みでプロンプトタイムステップの初期化をサポートします。使用する単語(クラスラベル)のリストを提供するユーザー。各単語は、提供されたボキャブによってトークン化されます。提供されたVocabテーブルが埋め込まれています。必要に応じて、サブトークン全体で集約されます。プロンプトのタイムステップを初期化するために使用されます。提供されたトークンが完全なプロンプトの長さをカバーしない場合、欠落しているトークンは、提供されたフォールバックイニシャルイザーを使用して初期化されます。
埋め込みテーブルからサンプリングすることにより、この初期化を上記のもので作成することにより、埋められていないプロンプトトークンが満たされている論文と一致させることができます。 --gin_file=prompt_tuning/configs/prompts/from_class_labels.ginで使用できます。これには、 CLASS_LABELS設定する必要があります。これは、迅速な初期化として埋め込みたい単語のリストです。また、 --gin_file=prompt_tuning/configs/prompts/from_class_labels_numpy.ginを使用して、独自の埋め込みファイル(上記と同じ)を提供することもできます。これには、 EMBEDDING_FILEを設定する必要があります。
文字列から
また、個別のプロンプトまたはタスクの説明から開始するためによく使用される文字列の埋め込みでプロンプトを初期化することもサポートしています。これは、 from_embedded_string initializerを使用します。文字列は、提供された語彙によってトークン化され、各トークンは提供された埋め込みテーブルで見上げられ、ストリングの埋め込まれた表現はプロンプトの初期化として使用されます。提供されたトークンが完全なプロンプトの長さをカバーしない場合、欠落しているトークンは、提供されたフォールバックイニシャルイザーを使用して初期化されます。
注:語彙は、文字列を一連のIDSに変換するだけで、文字列がSeqioタスクが行うテキストのフォーマット(句読点などのスペースなど)の結果と一致するようにする必要があります。
ファイルから
また、 from_array Initializerを使用したファイルからプロンプトをロードして、タスク間の転送を有効にすることもできます。これは--gin_file=prompt_tuning/configs/prompts/from_file.ginで行われます。これには、numpyファイルへのパスを備えたprompt_fileをロードするPROMPT_FILEを設定する必要があります。プロンプトのnumpyバージョンは、トレーニング時にデフォルトで放出されますが、プロンプトは上記のスクリプトで抽出することもできます。
言語モデルの適応に10万ステップのT5 1.1チェックポイントのT5Xネイティブチェックポイントをリリースしました。
これらは、パブリックメッシュテンソルフローチェックポイントから変換されます。
私たちはさまざまなタスクで前提条件のプロンプトをリリースし、時間の経過とともにそれらに追加する予定です。
プロンプトは、 pretrained_promptsディレクトリにあります。そこから、各サブディレクトリグループは、訓練されたモデルによってプロンプトされます。図書館にバンドルされているこれらのプロンプトを参照する最も簡単な方法は、次のとおりです。
--PROMPT_FILE= ` python3 -m prompt_tuning.scripts.find_module prompt_tuning ` /pretrained_prompts/{MODEL_SIZE}/{PROMPT}.npy並列計算の固有のランダム性により、まったく同じ数値を取得するには、トレーニングと評価を一致させる必要がある設定がいくつかあります。各モデルサブディレクトリにはREADME.mdがあります。これらの設定がどうあるべきかを指定します。一致する最も重要な設定は、バッチサイズ、TPUトポロジ、およびモデルの並列処理です。テーブルには、これらのプロンプトをt5x.evalで使用するかどうかを確認する必要があるスコアが含まれています
これは、迅速な調整に関する追加のリソースのコレクションです。
この作業をオフポイントのジャンプとして使用する場合は、引用してください
@inproceedings { lester-etal-2021-power ,
title = " The Power of Scale for Parameter-Efficient Prompt Tuning " ,
author = " Lester, Brian and
Al-Rfou, Rami and
Constant, Noah " ,
booktitle = " Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing " ,
month = nov,
year = " 2021 " ,
address = " Online and Punta Cana, Dominican Republic " ,
publisher = " Association for Computational Linguistics " ,
url = " https://aclanthology.org/2021.emnlp-main.243 " ,
doi = " 10.18653/v1/2021.emnlp-main.243 " ,
pages = " 3045--3059 " ,
}これは、公式にサポートされているGoogle製品ではありません。