T5xは、JaxとFlaxのT5(およびその他)の新しい改良された実装です。 Meshtfを使用したTensorflowのT5は、積極的に開発されなくなりました。 T5を初めて使用する場合は、T5Xから始めることをお勧めします。
t5
ライブラリは、主に、統一されたテキストツーテキスト変圧器を使用して転送学習の限界を調査する際の実験を再現するためのコードとして機能します。論文では、大きなテキストコーパスで事前に訓練されたテキストからテキストのトランスを使用して、複数のNLPタスクで最先端の結果を達成する方法を示します。
このリポジトリのコードの大部分は、データセットの読み込み、前処理、混合、評価に使用されます。また、出版物と一緒にリリースされた事前に訓練されたモデルを微調整する方法も提供します。
t5
ライブラリは、テキストからテキストへのタスクの混合に関するトレーニングと微調整(潜在的に巨大な)モデルに役立つモジュールを提供することにより、将来のモデル開発に使用できます。
図書館
使用法
C4
データセットの準備
インストール
GCPでTPUをセットアップします
トレーニング
微調整
評価します
デコード
輸出
GPU使用
実験を再現します
便利なオプション
モデルチェックポイントをリリースしました
引用する方法
t5.data
、 tf.data.Dataset
sを提供するTask
オブジェクトを定義するためのパッケージです。
各Task
は次のように構成されています:
データソース
テキストプリプロセッサ関数
文章モデル
メトリック関数
さらに、オプションで提供できます。
トークンプリプロセッサ機能
ポストプロセス機能
データソースは、 tf.data.Dataset
を提供する任意の関数にすることができますが、Tensorflowデータセット(TFDS)( TfdsTask
)で利用可能なデータセットのよりシンプルなラッパーも提供するか、1行あたりの例( TextLineTask
)のテキストファイルとして保存されます。 。
テキストプリプロセッサは、ソースデータセットの例を、 inputs
とtargets
のフィールドを使用したテキストからテキストモデルの適切な形式に変換します。 たとえば、事前定義されたt5.data.preprocessors.translate
preprocessorは、フォームで入力を変換します
{'de': 'das ist gut。'、 'en': 'それは良い。'}
フォームに
{'inputs': 'ドイツ語を英語に翻訳:das ist gut。'、 'ターゲット': 'それは良い。'}
テキストの前処理に加えて、1つ以上のトークン前処理を使用して、トークン化後の入力を変更することもできます。これらのトークン前処理を使用して、監視されていない訓練前の目標を実装しました。
t5.data.preprocessors
で多くの事前に定義されたプリプロセッサを提供しますが、あなた自身を定義することもできます。
TentePieceモデルは、入力文字列をトークン化し、出力トークンをデコードするために使用されます。 Google/CentePieceライブラリを使用して独自のモデルを作成するか、 t5.data.DEFAULT_SPM_PATH
でデフォルトのモデルを使用できます。独自に作成する場合は、フラグ--pad_id=0 --eos_id=1 --unk_id=2 --bos_id=-1
を使用する必要があります。SPM_TRAIN spm_train
使用して、モデルコードと互換性があります。
メトリック関数は、ターゲットとモデルの予測を与えられたスコアを返します。また、メトリックを呼び出す前に、ターゲットと予測テキストを別の形式に変換するポストプロセス関数を定義することもできます。 t5.evaluation.metrics
でいくつかの事前定義されたメトリックを提供します。
最後に、 t5.data
は、混合速度を指定するためのさまざまな機能を使用して、マルチタスクトレーニング用の複数のTask
データセットを組み合わせてインスタンス化できるMixture
クラスが含まれています。
t5.evaluation
には、2つのコアコンポーネントが含まれています。
評価中に使用されるメトリック
評価時にこれらのメトリックを適用するためのユーティリティ
t5.models
T5 Tasks
とMixtures
トレーニング、評価、推論のためのモデル実装に接続するためのシムが含まれています。
現在、2つのシムがあります。1つは、ペーパーで使用したメッシュTensorflowトランス用、もう1つはハグするフェイストランスライブラリ用です。抱きしめるフェイスAPIは現在実験的であり、変更される可能性がありますが、単一のGPUでPytorchを使用して、事前に訓練されたモデルをロード、微調整、評価する簡単で簡単な方法を提供します。 TPUで最大のモデルを使用したり、ペーパーで結果を再現したりする場合は、MTFModel APIとt5_mesh_transformer
バイナリを使用する必要があります。 PytorchのGPUでモデルを微調整することに興味がある場合は、HFPYTORCHMODEL APIを試してみてください。 hfpytorchmodelは実験的であるため、このreadmeの残りの部分は、mtfmodelとそれに関連するバイナリの使用を想定しています。 hfpytorchmodelの使用例はこちらから入手できます。
T5を試す最も簡単な方法は、Colabチュートリアルで無料のTPUを使用することです。
以下に、コードベースを使用してコマンドラインからモデルから訓練、微調整、評価、デコードの方法の例を示します。これらの指示を使用して結果を再現したり、リリースされたチェックポイントの1つを独自のデータやハイパーパラメーターで微調整したり、モデルをゼロから事前に引き出したりできます。
新しいまたは既存のTask
を使用するか、前処理されたTSVファイルから例をロードすることもできます。
Task
を使用しますデータソース(上記参照)に応じて、データを適切に準備する必要があります。
Task
バニラタスクを使用している場合は、 dataset_fn
によってロードされたファイルがTPUにアクセスできることを確認してください(つまり、GCSバケットに入っています)。
TfdsTask
事前定義されたTask
のほとんどは、データソースとしてTensorflowデータセット(TFDS)を使用しています。 TfdsTask
を使用してトレーニングバイナリ(以下の手順を参照)を実行すると、データセットは自動的にダウンロードされ、最初の使用時に準備されます。準備が完了した後、データセットは将来の実行でこのオーバーヘッドを回避するためにローカルストレージにキャッシュされます。 クラウドで作業する場合は、 --t5_tfds_data_dir
フラグを設定して、GCSバケットなどの永続的なストレージの場所を指すことをお勧めします。これは、TPUでトレーニングする際の要件です。
監視されていない事前トレーニング用に作成したC4データセットは、Tensorflowデータセットで利用できますが、生の一般的なクロールスクレイプ(〜7 TB)をダウンロードし、準備のために計算するためにかなりの量の帯域幅が必要です。 TFDSのApacheビームサポートを利用することをお勧めします。これにより、データセットの分散前処理が可能になり、Google Cloud Dataflowで実行できます。 500人の労働者がいると、仕事は約16時間で完了する必要があります。
MY_PROJECT
とMY_BUCKET
適切に定義した後、次のコマンドを使用してGCPからデータフローでデータセットを構築できます。
PIPインストールtfds-nightly [c4] echo 'tfds-nightly [c4]'> /tmp/beam_requirements.txt python -m tensorflow_datasets.scripts.download_and_prepare -datasets = c4/en -data_dir = gs:// $ my_bucket/tensorflow_datasets -beam_pipeline_options = "project = $ my_project、job_name = c4、staging_location = gs:// $ my_bucket/binaries、temp_location = gs://$my_bucket/temp,runner = dataflowrunner、 = shuffle_mode = service、region = $ my_region "
詳細については、TFDSビームの指示をご覧ください。
TextLineTask
TextLineTask
、データソースが1行ごとに1つの例を持つテキストファイル(またはファイル)である場合に役立ちます。その後、テキストプリプロセッサを使用して、各行を入力とターゲットの辞書に変換できます。
ファイルがTPUにアクセスできることを確認してください(つまり、GCSバケットに入っています)。
新しいTask
を定義する代わりに、各行が<input>t<target>
>としてフォーマットされているTSVファイル(またはファイル)をデータセットとして直接使用できます。
ただし、いくつかの注意事項があります。
テキストプロセッサを定義する方法はないため、TSVは前処理された形式でデータを封じ込める必要があります。
また、TSVファイルを直接使用する場合、評価のためのトークン前処理器、ポストプロセス関数、またはメトリック関数を設定する方法もありません。
これらの機能が必要な場合は、新しいTask
、 TfdsTask
、またはTextLineTask
を定義する必要があります。
上記のケースと同様に、TSVファイルはTPUにアクセスできる必要があります(つまり、GCSバケットに入っています)。
T5パッケージをインストールするには、単純に実行します。
ピップインストールT5 [GCP]
最初にGoogle Cloudで仮想マシン(VM)を起動する必要があります。 VMの起動に関する詳細は、Google Cloudドキュメントをご覧ください。
クラウドTPUでトレーニングを実行したり評価したりするには、プロジェクト、ゾーン、GCSバケットに基づいて次の変数を適切に設定する必要があります。詳細については、クラウドTPU QuickStartガイドを参照してください。
エクスポートプロジェクト= your_project_nameexportゾーン= your_project_zoneexport bucket = gs:// yourbucket/export tpu_name = t5-tpuexport tpu_size = v3-8export data_dir = "$ {bucket}/your _data_dir" $ model_dir = "$"
次のコマンドを使用して、クラウドVMにTPUデバイスを作成してください。
ctpu up - name = $ tpu_name - project = $ project -zone = $ zone - tpu-size = $ tpu_size -tpuのみ - noconf
以下のコマンドでは、接着剤ベンチマークMRPCタスクのモデルをゼロからトレーニングします。 MIXTURE_NAME
ginパラメーターを変更して、パッケージに記載されているタスクまたは混合物を使用できます。
T5_MESH_TRANSFORMER -tpu = "$ {tpu_name}" -gcp_project = "$ {project}" -TPU_ZONE = "$ {ZONE}" -model_dir = "$ {model_dir}" -t5_tfds_data_dir = "$ {data_dir}" -gin_file = "dataset.gin" -gin_file = "models/bi_v1.gin" -gin_param = "utils.tpu_mesh_shape.model_parallelism = 1" -gin_param = "utils.tpu_mesh_shape.tpu_topology = '$ {tpu_size}'" -gin_param = "mixture_name = 'glue_mrpc_v002'"
タスクと混合物の完全なリストは、実行することで取得できます。
python -c "import t5; print(t5.data.mixtureregistry.names())"
また、新しいファイルに追加のタスクと混合物を定義し、 --module_import
フラグを使用してインポートすることもできます。
または、各行が<input>t<target>
>としてフォーマットされているTSVファイルでトレーニングすることもできます(上記参照)。
事前に訓練されたモデルの1つを微調整するには、事前に訓練されたモデルの操作設定をトレーニングスクリプトに渡す必要があります。操作設定は、 gin_file
フラグとして渡す必要があります。モデルアーキテクチャとその他のハイパーパラメーターを指定します。さらに、微調整する混合物を指定する必要があります。たとえば、 glue_mrpc_v002
混合物のt5-smallモデルを微調整するには、実行してください。
T5_MESH_TRANSFORMER -tpu = "$ {tpu_name}" -gcp_project = "$ {project}" -TPU_ZONE = "$ {ZONE}" -model_dir = "$ {model_dir}" -t5_tfds_data_dir = "$ {data_dir}" -gin_file = "dataset.gin" -gin_param = "utils.tpu_mesh_shape.model_parallelism = 1" -gin_param = "utils.tpu_mesh_shape.tpu_topology = '$ {tpu_size}'" -gin_param = "mixture_name = 'glue_mrpc_v002'" -gin_file = "gs://t5-data/pretrained_models/small/operative_config.gin"
正しい訓練を受けたチェックポイントパスは、動作設定に含まれています。
また、新しいファイルに追加のタスクと混合物を定義し、 --module_import
フラグを使用してインポートすることもできます。
または、各行が<input>t<target>
としてフォーマットされているTSVファイルで微調整することもできます(上記参照)。たとえば、WMT '19 News Commentary 14トレーニングセット(たとえば、英語とフランス)のペアリングされた翻訳データセットの1つを試すことができます。 TSVファイルを使用する場合、 MIXTURE_NAME
フラグを次のように置き換えます。
-gin_param = "utils.run.train_dataset_fn = @t5.models.mesh_transformer.tsv_dataset_fn" -gin_param = "tsv_dataset_fn.filename = 'gs:/path/to/tsv' ''
紙で使用したのと同じハイパーパラメーター(0.001の一定の学習率を使用)で微調整するには、T5パッケージに含まれるこのジンファイルに渡すことができます。
--gin_file="learning_rate_schedules/constant_0_001.gin"
事前に訓練されたモデルの運用設定は設定されているため、列車の数に効果的に制限がありません。特定の数のステップでトレーニングしたい場合は、それを渡す必要があります。事前に訓練されたモデルはすでに1,000,000段階でトレーニングされているため、トレーニング前の総ステップ数を指定する必要があります。微調整。たとえば、さらに10,000ステップを微調整したい場合は、合格する必要があります
--gin_param="run.train_steps = 1010000"
微調整には別のバッチサイズを使用することもできます。バッチ内のトークンの総数に従ってバッチサイズを設定します。デフォルトでは、バッチは512のシーケンス長を使用します。バッチにトークンの数を設定するには、設定する必要があります
--gin_param = "tokens_per_batch=1048576"
T5フレームワークのモデルを評価するには、 eval.gin
ファイルを使用し、モデルディレクトリ、デコード方法、および評価するチェックポイントステップを指定する必要があります。したがって、すべてのチェックポイントでビーム検索を使用して接着剤MRPCタスクで評価するには、次のコマンドを使用します。
T5_MESH_TRANSFORMER -tpu = "$ {tpu_name}" -gcp_project = "$ {project}" -TPU_ZONE = "$ {ZONE}" -model_dir = "$ {model_dir}" -gin_file = "$ {model_dir}/operative_config.gin" -t5_tfds_data_dir = $ {data_dir} -gin_file = "eval.gin" -gin_file = "beam_search.gin" -gin_param = "run.dataset_split = 'validation'" -gin_param = "utils.tpu_mesh_shape.tpu_topology = '$ {tpu_size}'" -gin_param = "mixture_name = 'glue_mrpc_v002'" -gin_param = "eval_checkpoint_step = 'all'"
特定のチェックポイントを評価するには、 eval_checkpoint_step
パラメーターを適切なチェックポイントに設定するだけです。
--gin_param="eval_checkpoint_step = 100000"
上記のコマンドでbeam_search.gin
の代わりに、 greedy_decode.gin
またはsample_decode.gin
を使用することもできます。
T5フレームワークのモデルからの予測を作成するには、モデルディレクトリ、デコード方法、およびデコードに使用するチェックポイントステップを指定する必要があります。 at/path/ /path/to/inputs.txt
で保存されている入力シーケンスのテキストファイルがあると仮定すると、例のコマンドは次のとおりです。
T5_MESH_TRANSFORMER -tpu = "$ {tpu_name}" -gcp_project = "$ {project}" -TPU_ZONE = "$ {ZONE}" -model_dir = "$ {model_dir}" -gin_file = "$ {model_dir}/operative_config.gin" -gin_file = "demper.gin" -gin_file = "sample_decode.gin" -gin_param = "input_filename = '/path/to/inputs.txt'" -gin_param = "output_filename = '/tmp/outputs.txt'" -gin_param = "utils.tpu_mesh_shape.tpu_topology = '$ {tpu_size}'" -gin_param = "yems_checkpoint_step = 'all'"
特定のチェックポイントで予測するには、 infer_checkpoint_step
パラメーターを適切なチェックポイントに設定するだけです。
--gin_param="infer_checkpoint_step = 100000"
上記のコマンドでsample_decode.gin
の代わりに、 beam_search.gin
またはgreedy_decode.gin
を使用することもできます。
また、 SavedModel
エクスポートすることもできます。これは、訓練されたモデルを提供するのに役立ちます(たとえば、MLエンジンで展開するときやDocker画像で展開する場合)。
T5_MESH_TRANSFORMER -gcp_project = "$ {project}" -TPU_ZONE = "$ {ZONE}" -model_dir = "$ {model_dir}" -use_model_api -mode = "export_predict" -export_dir = "/path/to/export/dir"
上記のコマンドは、モデルディレクトリの最新のチェックポイントをエクスポートします。特定のチェックポイントをエクスポートするには、次のフラグを追加します。
-checkpoint_mode = "特定" -checkpoint_steps = 1000000
T5-Deployノートブックは、 SavedModel
をエクスポートし、サービングのためにDocker画像にパッケージ化することを示しています。
TPUの代わりにGPUを使用したい場合は、TPU固有のフラグ( --tpu
、 --tpu_zone
、 --gcp_project
)を削除し、目的のセットアップに基づいてmesh_shape
およびmesh_devices
のGINパラメーションを設定して、上記のコマンドを変更できます。 。
たとえば、マシンが6つのGPUにアクセスし、3ウェイモデルの並列性と2ウェイデータの並列性を実行したい場合、上記の微調整コマンドは次のようになります。
T5_MESH_TRANSFORMER -model_dir = "$ {model_dir}" -t5_tfds_data_dir = "$ {data_dir}" -gin_file = "dataset.gin" -gin_param = "utils.run.mesh_shape = 'モデル:3、batch:2'" -gin_param = "utils.run.mesh_devices = ['gpu:0'、 'gpu:1'、 'gpu:2'、 'gpu:3'、 'gpu:4'、 'gpu:5']" -gin_param = "mixture_name = 'glue_mrpc_v002'" -gin_file = "gs://t5-data/pretrained_models/small/operative_config.gin"
単一のGPUを使用すると、コマンドは次のとおりです。
T5_MESH_TRANSFORMER -model_dir = "$ {model_dir}" -t5_tfds_data_dir = "$ {data_dir}" -gin_file = "dataset.gin" -gin_param = "utils.run.mesh_shape = 'モデル:1、batch:1'" -gin_param = "utils.run.mesh_devices = ['gpu:0']" -gin_param = "mixture_name = 'glue_mrpc_v002'" -gin_file = "gs://t5-data/pretrained_models/small/operative_config.gin"
gs:// t5-data/実験の論文のすべての実験の動作構成を提供します。 experiments
フォルダーには、論文の異なるセクションに対応する異なるサブディレクトリがあります。たとえば、gs:// t5-data/実験/目的には、セクション3.3(「監視されていない目的」)の実験が含まれています。 objectives
フォルダーの各サブディレクトリには、特定の実験用の動作構成が含まれています(「実験」を大まかに話すことは、論文のテーブルの1つの行の1つです)。
「プレフィックス言語モデリング」目的(表4の最初の行)の結果を再現したいとします。その実験の動作構成は、gs:// t5-data/experiments/objectives/obj-prefix_lmに住んでいます。ベースディレクトリには、モデル(gs://t5-data/experiments/objectives/obj-prefix_lm/operative_config.gin)を事前トレーニングするための動作構成があります。次に、私たちが検討する下流の微調整混合物ごとにサブディレクトリがあり、それぞれに独自の動作設定があります(たとえば、gs://t5-data/experiments/obj-prefix_lm/cnn_dailymail_v002/operative_config.gingin )。この実験を実行するには、最初にトレーニング前の運用構成を使用してモデルを前に事前に訓練します。
export pretrain_model_dir = "$ {bucket}/obj-prefix_lm" t5_mesh_transformer -tpu = "$ {tpu_name}" -gcp_project = "$ {project}" -TPU_ZONE = "$ {ZONE}" -model_dir = "$ {pretrain_model_dir}" -gin_file = "gs://t5-data/experiments/objectives/obj-prefix_lm/operative_config.gin" -gin_param = "utils.tpu_mesh_shape.model_parallelism = 1" -gin_param = "utils.tpu_mesh_shape.tpu_topology = '$ {tpu_size}'"
次に、CNN/Daily Mailで事前に訓練されたモデルを微調整できます。
Export Finetune_model_dir = "$ {bucket}/obj-prefix_lm/cnn_dailymail_v002" t5_mesh_transformer -tpu = "$ {tpu_name}" -gcp_project = "$ {project}" -TPU_ZONE = "$ {ZONE}" -model_dir = "$ {finetune_model_dir}" -gin_file = "gs://t5-data/experiments/objectives/obj-prefix_lm/cnn_dailymail_v002/operative_config.gin" -gin_param = "init_checkpoint = '$ {pretrain_model_dir} /model.ckpt-524288'" -gin_param = "utils.tpu_mesh_shape.model_parallelism = 1" -gin_param = "utils.tpu_mesh_shape.tpu_topology = '$ {tpu_size}'"
一部のトレーニングバリアントは、複数のフラグを同時に設定する必要があります。以下のバリエーションのそれぞれについて、フラグのグループを./third_party/py/t5/google/scripts/run_finetune.sh
に追加します。
決定論的トレーニング
-train_gin_param = "mesh_train_dataset_fn.seed = $ {seed}" -train_gin_param = "utils.run.skip_seen_data = true"
言語モデル
-Objective = "lm" -train_gin_param = "utils.run.model_type =" lm ""
私たちの論文で説明されている事前に訓練されたモデルの次のチェックポイントをリリースしました。
T5-SMALL (6,000万パラメーター):gs:// t5-data/pretrained_models/small
T5ベース(2億2,000万のパラメーター):gs:// t5-data/pretrained_models/base
T5-Large (7億7000万のパラメーター):gs:// t5-data/pretrained_models/arge
T5-3b (30億パラメーター):gs:// t5-data/pretrained_models/3b
T5-11B (110億パラメーター):gs:// t5-data/pretrained_models/11b
追加の実験的な事前訓練を受けたモデルチェックポイントのリストについては、こちらをご覧ください。
この作業を拡張または使用する場合は、紹介された論文を引用してください。
@article {2020t5、著者= {Colin Raffel and Noam Shazeer、Adam Roberts、Katherine Lee、Sharan Narang、Michael Zhou and Yanqi Zhou and Wei LiとPeter J. Liuテキストツーテキストトランス}、Journal = {Journal of Machine Learning Research}、year = {2020}、volume = {21}、number = {140}、pages = {1-67}、url = {http:/ /jmlr.org/papers/v21/20-074.html}}