※2021年8月現在、コードのメンテナンスは終了しております。引き続き使用したい人のために、アーカイブ形式でここに保存されます。
? 1T それともバストしますか?
メッシュ テンソルフロー ライブラリを使用した、モデルとデータの並列 GPT3 のようなモデルの実装。
事前トレーニングされたモデルを試したいだけの場合は、HuggingFace Transformer の統合を試してみることを強くお勧めします。
トレーニングと推論は TPU で正式にサポートされており、GPU でも同様に動作するはずです。このリポジトリは、GPU 固有のリポジトリである GPT-NeoX に焦点を移すため、(ほとんど) アーカイブされます。
GPT-3 が提供する機能に加えて、次の機能も提供します。
注意: neo は技術的には200B 以上のパラメータでトレーニング ステップを実行できますが、そのような規模では非常に非効率的です。このことと、特に多くの GPU が利用可能になったことにより、開発を GPT-NeoX に移行することになりました。
2021 年 3 月 21 日更新:
私たちは、The Pile でトレーニングされた 2 つの事前トレーニング済み GPT-Neo モデルをリリースできることを誇りに思います。重みと構成は the-eye.eu から自由にダウンロードできます。
1.3B: https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_XL/
2.7B: https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_2-7B/
これらの設定方法の詳細については、colab ノートブックを参照するか、readme の残りの部分を読んでください。
モデルとサイズ | パイルBPB | パイルPPL | ウィキテキスト PPL | ランバダPPL | ランバダACC | ウィノグランデ | ヘラスワグ |
---|---|---|---|---|---|---|---|
GPT-ネオ125M | ----- | ----- | 32.285 | 30.266 | 37.36% | 50.43% | 28.67% |
GPT-3 125M | ----- | ----- | ----- | 18.6 | 42.7% | 52.0% | 33.7% |
GPT-ネオ350M | ----- | ----- | 22.5657 | 13.876 | 47.27% | 51.14% | 32.16% |
GPT-3 350M | ----- | ----- | ----- | 9.09 | 54.3% | 52.1% | 43.6% |
GPT-3 エイダ | 0.9631 | ----- | ----- | 9.954 | 51.60% | 52.90% | 35.93% |
GPT-ネオ 1.3B | 0.7527 | 6.159 | 13.10 | 7.498 | 57.23% | 55.01% | 38.66% |
GPT-3 1.3B | ----- | ----- | ----- | 5.44 | 63.6% | 58.7% | 54.7% |
GPT-2 1.5B | 1.0468 | ----- | 17.48 | 10.634 | 51.21% | 59.40% | 40.03% |
GPT-ネオ 2.7B | 0.7165 | 5.646 | 11.39 | 5.626 | 62.22% | 56.50% | 42.73% |
GPT-3 2.7B | ----- | ----- | ----- | 4.60 | 67.1% | 62.3% | 62.8% |
モデルとサイズ | 数学QA | PubMedQA | ピカ |
---|---|---|---|
GPT-ネオ125M | 22.78% | 55.10% | 63.06% |
GPT-3 125M | ----- | ----- | 64.6% |
GPT-ネオ350M | 23.45% | 53.80% | 65.07% |
GPT-3 350M | ----- | ----- | 70.2% |
GPT-3 エイダ | 24.29% | 52.80% | 68.88% |
GPT-ネオ 1.3B | 24.05% | 54.40% | 71.11% |
GPT-3 1.3B | ----- | ----- | 75.1% |
GPT-2 1.5B | 23.64% | 58.33% | 70.78% |
GPT-ネオ 2.7B | 24.72% | 57.54% | 72.14% |
GPT-3 2.7B | ----- | ----- | 75.6% |
注:すべての評価は、当社の評価ハーネスを使用して行われました。 GPT-2 および GPT-3 の一部の結果は、それぞれの論文で報告されている値と一致しません。現在、その理由を調査中です。フィードバックと評価ハーネスのさらなるテストをいただければ幸いです。
git clone https://github.com/EleutherAI/GPTNeo
cd GPTNeo
pip3 install -r requirements.txt
Google Cloud Platform にサインアップし、ストレージ バケットを作成します。
Google シェル ( https://ssh.cloud.google.com/
) でctpu up --vm-only
を使用して VM を作成し、Google バケットと TPU に接続し、pip で要件をインストールできるようにします (上記を参照)。 。
Google colab は tpu-v8s を無料で提供しています。これはモデルを GPT3XL (1.5B パラメーター) サイズまで微調整するには十分です。クリックして colab ノートブックの例を実行します。
詳しい手順については、以下のトレーニング ガイドを参照してください。
GPTNeo を GPU 上でローカルにトレーニングすることも選択できます。これを行うには、上記の Google クラウドのセットアップ手順を省略し、リポジトリをローカルで git clone します。以下のトレーニング ガイドを実行してから、main.py を実行するときに、 tpu
フラグを省略し、代わりに GPU ID を渡すだけです。
注: 一部のユーザーは、MTF に GPU を認識させるのが難しいと報告しています。詳細と修正方法については、ここを参照してください。
トレーニング済みモデルを取得するか、事前トレーニング済みモデルの 1 つをダウンロードしたら、 --predict
フラグをオンにして main.py スクリプトを実行するだけでテキストを生成できます。次のように--prompt
フラグを使用してプロンプト txt ファイルへのパスを渡すことができます。
python3 main.py --predict --prompt < example_prompt.txt > --tpu < tpu_name > --model < config_name >
または、GPU を使用している場合:
python3 main.py --predict --prompt < example_prompt.txt > --gpu_ids < device:GPU:0 device:GPU: 1> --model < config_name >
Huggingface の事前トレーニング済み GPT2 トークナイザーをリポジトリで使用することをお勧めします (手順は以下に示されています)。ただし、異なる語彙サイズでモデルをトレーニングしたい場合は、次のような独自のトークナイザーをトレーニングする機能が提供されています。
python data/train_tokenizer.py
--base_dir ./path/to/your/txt/files
--output_dir ./output/path
--file_type txt
--vocab_size 50257
# if it succeeded, you should see the message
# 'tokenizer saved at ./output/path/byte-level-bpe.tokenizer.json'
トレーニングをテストしたいだけの場合は、このステップをスキップして、次のようにダミー データをダウンロードできます。
wget https://storage.googleapis.com/connors-datasets/bundestag/bundestag_0.tfrecords
次に、データをバケットにコピーするか、GPU を使用している場合はローカル ディレクトリにコピーします。
gsutil cp bundestag_0.tfrecords gs://<your bucket>/
独自のデータを使用してトレーニングする場合は、 data/create_tfrecords.py
スクリプトを使用してテキスト データを tfrecord にエンコードできます。
データは、多数の通常の .txt ファイル (ファイルごとに 1 つのドキュメント) の形式、または lm_dataformat でサポートされている形式のいずれかである必要があります。
パラメーターを指定せずにスクリプトを実行すると、すべてのオプションのヘルプが表示されます。
ドキュメント モードの場合 tfrecord 内の各例は、1 つの (可変サイズの) ドキュメントです。これは、 documents_fixed
およびdocuments_random
サンプリング モードで使用されます (詳細については、パラメーターのリファレンス セクションを参照してください)。ドキュメント モードがデフォルトのモードです。
以下のコマンドは、gpt2 トークナイザーを使用して、 base_dir内のすべてのファイルを許容可能な形式でトークン化し、 output_dirに保存します。
python3 create_tfrecords.py --mode documents --input_dir <base> --name <name> --output_dir <output> --use_gpt2_tokenizer --minimum_size <min>
input_dir
: データが配置されるフォルダーを定義します。スクリプトは、このフォルダーに存在するすべてのファイルをエンコードします。name
: 出力ファイルの名前はname_i.tfrecords
になります。i はファイルの番号です。output_dir
: tfrecord の保存先use_gpt2_tokenizer
: 事前トレーニングされた HuggingFace GPT2 トークナイザーを使用するかどうか。この場合、セパレーターは [50256] に設定されます。encoder_path
: 事前トレーニングされた gpt2 トークナイザーを使用しない場合は、このフラグを使用して、生成されたトークナイザー json へのパスを指定します。separator
: リスト形式で記述され、ドキュメント間に挿入する区切り文字トークン (例: "[0]")。エンコーダによって異なります。minimum_size
: ドキュメントに必要な最小サイズ (トークン単位)。それ以外の場合は破棄されます。これは、後でstitch
パラメータを決定するものです。 stitch * minimum_size
、常にn_ctx
以上である必要があります (詳細については、パラメータのリファレンス セクションを参照してください)。 モデルでデータセットを使用するには、まずそのデータセットを./configs/dataset_configs
フォルダーに登録する必要があります。まず、 .json
拡張子の付いたファイル名を選択します。そのファイル名はデータセットの識別として機能します。設定は次の方法で入力する必要があります。
事前トレーニングされた gpt2 トークナイザーを使用してエンコードされたデータセットがある場合は、次のように指定できます。
{
"n_vocab" : 50257 ,
"path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"eval_path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"tokenizer_is_pretrained" : true ,
"tokenizer_path" : " gpt2 "
}
または、次のようにカスタム トークナイザーをトレーニングした場合:
{
"n_vocab" : 32768 ,
"path" : " ./path/to/your/*.tfrecords " ,
"eval_path" : " ./path/to/your/eval/*.tfrecords " ,
"tokenizer_path" : " ./path/to/your/byte-level-bpe.tokenizer.json "
}
最後に、モデル構成で、上で作成したファイル名をdatasets
配列に追加します。
<dataset id>
は、上で作成した.json
を除いたファイル名になります。
"datasets": [[<dataset id>, <stitch>, <datatype>, <weight>]] # datasets key defines at run time how each dataset is processed for training
データセットを設定したら、 /configs
で適切な構成を見つけます。
ここでは例として GPT3-XL サイズのモデルを使用しますが、 ./configs
には他にも多くのモデルがあり、そのすべての短い概要が「Available Configs」セクションにあります。
必要なのは、上記のようにデータセット ID を編集し、書き込みアクセス権のあるクラウド バケット (GPU を使用している場合はローカル パス) を指すようにmodel_path
(ログとチェックポイントが保存される場所) を編集することだけです。
{
"n_head" : 32 ,
"n_vocab" : 50257 ,
"embed_dropout" : 0.1 ,
"lr" : 0.0002 ,
"lr_decay" : " cosine " ,
"warmup_steps" : 3000 ,
"beta1" : 0.9 ,
"beta2" : 0.95 ,
"epsilon" : 1e-8 ,
"opt_name" : " adam " ,
"weight_decay" : 0.1 ,
"train_batch_size" : 512 ,
"attn_dropout" : 0.1 ,
"train_steps" : 286150 ,
"eval_steps" : 0 ,
"predict_steps" : 1 ,
"res_dropout" : 0.1 ,
"eval_batch_size" : 128 ,
"predict_batch_size" : 1 ,
"iterations" : 2500 ,
"n_embd" : 2048 ,
"datasets" : [[ " your_dataset_name " , 25 , " documents_random " , 1.0 ]],
"model_path" : " gs://neo-models/GPT3_XL " ,
"n_ctx" : 2048 ,
"n_layer" : 24 ,
"scale_by_depth" : true ,
"scale_by_in" : false ,
"attention_types" : [[[ " global " ], 24 ]],
"mesh_shape" : " x:128,y:2 " ,
"layout" : " batch:x,memory_length:y,embd:y " ,
"activation_function" : " gelu " ,
"recompute_grad" : true ,
"gradient_clipping" : 1.0 ,
"tokens_per_mb_per_replica" : 2048
}
python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --tpu <tpu-name>
tpu
: 使用する TPU の名前。steps_per_checkpoint
: チェックポイントを保存するステップの頻度。--auto_layout
および--auto_layout_and_mesh_shape
(オプション): トレーニングを無効にし、代わりにメモリ効率の高いlayout
(およびmesh_shape
) を自動生成します。gpu_ids
: GPU を使用してトレーニングする場合は、 tpu
フラグを省略し、GPU の ID を渡します。以下の例では、スペースで区切られたデバイス ID を指定して、3 つの GPU でトレーニングします。 python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --gpu_ids <device:GPU:0 device:GPU:1>
利用可能なモデル サイズはいくつかありますが、一部の構成には大きな TPU が必要であり、小型のマシンまたは GPU で実行するには調整が必要になります。以下は、configs ディレクトリ内の各モデルの短いガイドです。
TODO
Sacred は実験の追跡に役立ち、テンソルボードよりもはるかに使いやすいです。
セットアップするには:
Docker と Docker-compose をインストールする
docker-compose up
実行する
使用するには:
model_dir にメトリクス ログが含まれていないことを確認してください (既存の実行の継続であると想定している tensorboard のメトリクスがトリップします)。 gsutil rm -r ...
を使用してモデル ディレクトリを削除できます
python3 run_experiment.py --tpu sometpuhere --model someconfig.json
を実行します。 オプションはmain.py
と同じです。
http://server_ip_goes_here:8081/ にアクセスすると、オムニボードの概要が表示されます。テンソルボードを表示したい場合は、スクリプトによってテンソルボードも起動され、自動的にポートが割り当てられます。スクリプトは、ログの先頭近くにテンソルボード ポートを出力する必要があります。
特定の構成ファイルのデータセットに混乱した場合は、1 つのコマンドで最小および最大のトークン ID を簡単に確認できます。これは、モデルの語彙サイズが少なくとも最大トークン ID と同じ大きさであることを確認するのに役立ちます。 Tensorflow は、範囲外のインデックスを含む行列で収集しようとしてもエラーにならないため、語彙サイズが十分に大きいことを確認する必要があります。
python main --model {config_name} --check_dataset
このリポジトリでは、大規模な GPT をトレーニングできることに加えて、マスクされた言語モデリング (BERT、RoBERTa) を簡単に実行することもできます。これを行うには、さらに 2 つの手順に従う必要があります。
データセットをトークン化するときは、 [mask]
トークン用の特別な ID を予約する必要があります。
構成では、2 つの追加フィールドを定義する必要があります
"mlm_training" : true , # must be set to true
"mlm_mask_id" : < mask id > # the mask id that you reserved from above
MLM の目的でモデルをトレーニングするために必要なのはこれだけで、適切にエンコードされたあらゆる種類のデータに適しています。他の関連するハイパーパラメータを調整したい場合は、読み続けてください。
"mlm_cls_token_id" : < cls token id > , # auto append specified CLS token id on the left
"mlm_mask_prob" : 0.15 , # the probability of masking a token, defaults to 15%
"mlm_same_token_prob" : 0.10 , # probability of keeping the token the same, defaults to 10%
"mlm_random_token_prob" : 0.10 , # probability of tokens that are replaced with random tokens, 10% was recommended by the BERT paper
"mlm_mask_ignore_ids" : [ < cls token > , < sep token > ] # ignore masking other special tokens, if any
/configs
から有効な構成を選択し、必要に応じてパラメータを調整します。
n_heads
: アテンションヘッドの数。n_embd
: 隠れ層のサイズ。 n_heads
で割り切れる必要があります。n_vocab
: 語彙のサイズ。embed_dropout
、 res_dropout
、 attn_dropout
: 単語の埋め込み/残差/注意のドロップアウト確率lr
: 学習率warmup_steps
: 完全な学習率に達するまでのステップ数 ( 0
からlr
までの線形ランプ)。lr_decay
: cosine
またはlinear
。opt_name
: adam
またはadafactor
。beta1
、 beta2
およびepsilon
: adam
オプティマイザーのパラメータ。beta1
、 ada_epsilon1
およびada_epsilon2
: adafactor
オプティマイザー パラメーター。weight_decay
: 重み減衰パラメータ。存在しない場合、重み減衰は使用されません (Adam の重み減衰修正が使用されます) (デフォルト: 0.01) (オプション)。train_batch_size
: トレーニング中のバッチ サイズ。train_steps
: トレーニング ステップ (バッチ) の数。現時点ではおよそ ~1 エポックに設定します (データセット内のトークンの総数 / バッチごとのトークン数 (= train_batch_size
/ n_ctx
))。eval_steps
: 各評価で実行するステップの数。評価しない場合は0
に設定します。つまり、チェックポイントごとにモデルのeval_steps
がテストされます。iterations
: TPU のキューに入れられるステップの数は、 steps_per_checkpoint
より小さくなければなりません。 (デフォルト: 500)datasets
: 使用する tfrecords データセットのリスト。各データセットは、パラメータ[train glob , eval glob, stitch, sampling_mode, weight]
を含むリストです。たとえば、単一のデータセットの場合 (リストが 2 つあることに注意してください): [["bundestag_*.tfrecords", "", 10, "random_sample", 1.0]]
dataset_id
: ./configs/dataset_configs
内のデータセット構成ファイルの名前stitch
: sampling_mode
random_sample
が使用されている場合、入力パイプラインはこの量のテキストを 1 つにサンプリングしてサンプリングします。 stitch * minimum_document_length >= n_ctx
となるようにステッチを選択する必要があります。sampling_mode
: chunks
(tfrecord が正しい長さに前処理され、順番に読み取られます) またはdocuments_random
(ドキュメントのstitch
量が連結され、 n_ctx
チャンクがランダムにサブサンプリングされます)weights
: このデータセットが他のデータセットと比較してどれだけの相対的な重みを持つべきかmodel
: どのモデルをトレーニングするか。現在、 GPT
のみがサポートされており、存在しない場合はデフォルトでこれがサポートされます。model_path
: モデルのチェックポイントとログを保存するための Google ストレージ バケットの場所 (GPU を使用している場合はローカル パス)。n_ctx
: コンテキスト ウィンドウのサイズ。デフォルトは2048ですn_layer
: モデル内のレイヤー (ブロック) の数。scale_by_depth
: true の場合、レイヤーの重みの初期化は、GPT2 論文と同様に深度によってスケーリングされます。scale_by_in
: true の場合、レイヤーの重みの初期化は、GPT2 論文と同様に、入力の数によってスケーリングされます。mesh_shape
: メッシュは、メッシュ テンソルフロー ライブラリで並列処理に使用される名前付き次元を持つプロセッサの n 次元配列です。各 Tensor は、レイアウトに従ってメッシュ次元全体に均等に分割されます (下記を参照)。 「mesh_shape」はこの配列の形状であり、プロセッサの数と等しくなければなりません。たとえば、v3-128 TPU の場合、「mesh_shape」: 「x:16,y:8」。layout
: Tensor は、各プロセッサ上に 1 つのスライスを備えたメッシュ上にレイアウトされます。テンソルの「レイアウト」は、テンソルのどの次元がメッシュのどの次元にわたって (均等に) 分割されるかを指定する単射部分マップです。テンソルのどの次元もそのメッシュの 2 つの次元にわたって分割することはできません。また、テンソルの 2 つの次元をそのメッシュの同じ次元にわたって分割することもできません。ユーザーは、(tensor-dimension-name、mesh-dimension-name) ペアの形式でレイアウト ルールのグローバル セットを定義します。一致するルールがある場合、テンソルの次元はそのメッシュの次元全体に分割されます。たとえば (上記の例では、mesh_shape: "layout":"batch:x,heads:y")activation_function
: selu
(自己正規化) またはgelu
(OA によって使用)、フィードフォワード パスで使用される活性化関数。 (デフォルト: ゲル)attention_types
: [[["attention_type"], n_layers]] の形式のリスト内の各レイヤーの注意のタイプ。たとえば、12 層ネットの場合は [[["global"], 12]] または [[["local"], 10], [["global"], 2]] です。linear
、 global
、 local
、またnone
から選択します。 global
とlinear
の 50/50 の組み合わせがうまく機能することがわかりました。 none
と、より効率的な PAR Transformer モデル用のフィードフォワード専用レイヤーを作成できます。precision
: float32
またはbfloat16
。tokens_per_mb_per_replica
: None でない場合は、バッチをtokens_per_mb_per_replica
トークンを含む小さなマイクロバッチに分割して、OOM を回避します。勾配はローカルに蓄積され、一度減少します。重要: ここでの mb はメガバイトではなくミニバッチを指します。専門家の混合
moe_layers
: エキスパートの混合レイヤーを追加するレイヤー番号のリスト。例: [2,4,6,8,10,12]
。私たちは、2 つの自己注意層ごとに萌え層がうまく機能することを実験的に発見しました。moe_params
: moe レイヤーに渡す追加の kwargs の辞書。 EG {"moe_dropout_rate": 0.0 }
実験的な機能
axial_pos_emb_
: true の場合、[軸位置埋め込み](https://arxiv.org/abs/1912.12180.mlp_glu
: true の場合、フィードフォワード層のゲート線形ユニットバリアントを使用します。scalenorm
: true の場合、layernorm の代わりにscalenorm を使用します。rezero
: true の場合、layernorm の代わりに rezero を使用します。num_mem_kv
: 全注意ペーパーからメモリ/キー値を追加します。 Param は、必要な mem/key 値の数を含む int です。macaron
: true の場合、各レイヤー ブロックにマカロン トランスフォーマーを使用します。 GPT-Neo が自分の仕事に役立つと感じた場合は、このリポジトリを次のように引用できます。
@software{gpt-neo,
author = {Black, Sid and
Gao, Leo and
Wang, Phil and
Leahy, Connor and
Biderman, Stella},
title = {{GPT-Neo: Large Scale Autoregressive Language
Modeling with Mesh-Tensorflow}},
month = mar,
year = 2021,
note = {{If you use this software, please cite it using
these metadata.}},
publisher = {Zenodo},
version = {1.0},
doi = {10.5281/zenodo.5297715},
url = {https://doi.org/10.5281/zenodo.5297715}
}
バージョン番号は使用しているバージョン番号に置き換える必要があり、年はプロジェクトのオープンソース リリースに対応します。
Pile でトレーニングされた GPT-Neo モデルの引用に特に興味がある場合は、以下も引用していただければ幸いです。
@article{gao2020pile,
title={The Pile: An 800GB Dataset of Diverse Text for Language Modeling},
author={Gao, Leo and Biderman, Stella and Black, Sid and Golding, Laurence and Hoppe, Travis and Foster, Charles and Phang, Jason and He, Horace and Thite, Anish and Nabeshima, Noa and others},
journal={arXiv preprint arXiv:2101.00027},
year={2020}
}