Arxivのコードベース:2405.17767、GPT-NEOおよびTINYSTORIESに基づいています。
Pythonの依存関係は、 requirements.txtにあります。使用したディレクトリ構造は、データセット、モデルチェックポイント、および分析アーティファクトを1つの未使用スペースを備えた単一の$SCRATCHディレクトリに配置することでした。分析アーティファクト(埋め込み)を$SCRATCH/statsおよびモデルチェックポイントに$SCRATCH/TS (「tinystories」の立場)に保存することを選択しました。
私たちのスクリプトの一部は、Python環境を開始し、速記のシェル関数を定義し、ホーム変数をインポートする環境ファイルenv-hを参照しています。
コードベースは、シングルGPU実行用に構成されたSluRM環境と最も互換性がありますが、スクリプトのほとんど(名前のbatchのないもの)は、シェルで直接実行できます。
トレーニング用のモデルを準備するには、フォルダー(おそらく$SCRATCH )を作成し、 config.jsonをコピーします。必要に応じて、そのファイルのアーキテクチャの詳細とハイパーパラメーターを適応させます。
Huggingfaceの比較的標準的なスクリプトを使用して、CLMSを訓練しました。コードはrun_clm.pyで軽く適応し、フォーマットされました。このスクリプトは、A100 GPUのトレーニングモデルの例を提供するtrain.shによって呼び出されます。
これが公開された205mモデルの例です:https://huggingface.co/rhubarbwu/tinystories-12x1024_10l
batch-train.shを使用しますが、 launch()関数宣言の前後に設定する変数に注意してください。
目的のアーキテクチャ用にconfig.json既に設定していると仮定すると、 batch-train.shに簡単なbashループを追加できます。これは、実験用に書いたループです。 $SCRATCH一時的なチェックポイントを保存するディレクトリです。
for SEED in {10..19} ; do
new_dir= $SCRATCH /TS/TinyStories-02x0768_01d $SEED
mkdir $new_dir
cp $SCRATCH /TS/TinyStories-02x0768_01d/config.json $new_dir
launch 02 0768 2 16 $SEED
doneEleutheraiが開発したGPT-Neoを使用しています。また、セットアップをGPT-Neoxまたはその他の因果アーキテクチャに適応させることもできます。
また、独自のLLMを個別にトレーニングすることも簡単です。トレーニングと分析のための平均と分散の収集との間に、まったく同じ列車セット構成(セットアップでは、Tinystoriesのバージョンと前処理労働者の数に注意してください)を使用するように注意してください。
モデルがトレーニングされた後、評価を実行できます。これにより、そのモデルディレクトリ(またはその中のチェックポイント)にeval_results.jsonが追加されます。
python run_clm.py --model_name_or_path $MODEL_DIR --output_dir $CKPT_DIR --tokenizer_name EleutherAI/gpt-neo-125M --do_eval --per_device_eval_batch_size $BATCH_SIZE --cache_dir $SCRATCH --dataset_name $DATASET --dataloader_num_workers 2 --preprocessing_num_workers 2 --run_name $CKPT --trust_remote_code --model_ckpt_idx $IDX --report_to nonetrain.shとconfig.jsonに似たスタイルで、 coll-clm.shとbatch-coll.shを使用して埋め込みコレクションを実行できます。 coll-clm.shからrun_clm.pyへの--stage引数は、 means 、 vars 、またはdecsを取り、平均、分散、およびNCCの決定のコレクションを指します。 varsとdecs段階はどちらもmeans段階の完了時に依存関係であることに注意してください。 batch-coll.shでlaunch()にslurm依存関係の引数として、 means $5のIDを使用できます。
収集段階の進捗状況を確認するには、 analyze $@ -prog 。これが例です:
analyze -prog -i $SCRATCH /stats/ * / * 02x0768_01d0 * @ *出力は次のように見えるはずです:
-------------------------------------------------------------------------------
model means vars decs unique
02x0768_01d00@0 229367 229367 2303 29233
02x0768_01d01@0 229367 229367 2303 29233
02x0768_01d02@0 229367 229367 2303 29233
02x0768_01d03@0 229367 229367 2303 29233
02x0768_01d04@0 229367 229367 2303 29233
02x0768_01d05@0 229367 229367 2303 29233
02x0768_01d06@0 229367 229367 2303 29233
02x0768_01d07@0 229367 229367 2303 29233
02x0768_01d08@0 229367 229367 2303 29233
02x0768_01d09@0 229367 229367 2303 29233
total (10) 229367 229367 2303 29233
------------------------------------------------------------------------------さまざまな測定の分析は、 analyze.pyで行われます。どの測定を行っているかに応じて、GPU( ENV=GPU )、チェックポイント( ENV=CKPT )、分散( -snr )または決定( -decs )を必要とする場合と必要になる場合があります。
これがbatch-analyze.shからのスニペットです。
case $ENV in
GPU)
# require large parallel tensor operations on the GPU
analyze -etf -kern log -snr -o $OUTPUT -i $FILES
;;
CKPT)
# require the trained model checkpoints but no GPU
analyze -dual -loss -o $OUTPUT -i $FILES
;;
CPU)
# do not require checkpoints nor GPUs
analyze -decs -nor -o $OUTPUT -i $FILES
;;
esac| 測定 | フラグ | 前提条件 |
|---|---|---|
| クラス内のばらつき( | -snr | 意味、分散 |
| 規範( | -nor | 手段 |
| 干渉 ( | -etf | 手段 |
| hyperspherical均一性( | -kern log | 手段 |
| 自己/均一な二重性( | -dual | 手段、チェックポイント |
| 合意 ( | -decs | 手段、決定 |
| 一般化(およびその他のモデル情報) | -loss | チェックポイント |
すべてがうまくいけば、CSV形式のデータフレームを生成する必要があります。タイムスタンプの例については、./artifacts/を参照してください。
データフレームに簡単にアクセスしてアクセスして視覚化することができますが、現在、ノートブック(独自の分析アーティファクトに基づいて)を共有しています。
コードにバグや非効率性、またはその他の質問があれば、喜んで見てみましょう。このリポジトリで問題を開くことをお勧めしますが、対応する著者は[email protected]にアクセスできます。また、プルリクエストを確認します。
@misc{wu2024linguisticcollapse,
title={Linguistic Collapse: Neural Collapse in (Large) Language Models},
author={Robert Wu and Vardan Papyan},
year={2024},
eprint={2405.17767},
archivePrefix={arXiv},
primaryClass={cs.LG},
url={https://arxiv.org/abs/2405.17767},
}