Home Blog fairseq CLI docs (for me)
Fairseq cli docs (for me)
Cancel

fairseq CLI docs (for me)

はじめに

OSS を利用しといて「くそ!」とか言うのは、隣の家に勝手に上がり込んで上に出してもらったお菓子がまずいというようなもの。 利用者は八百万の OSS に感謝の気持ちを持って開発するのが大事。

この記事 (メモ) では fairseq のコマンドと引数の対応が正確ではないように感じたので、ソースコードを参照しながら確認していきます。

suppress crashes when training with the hydra_train entry point so that the main method can return a value (useful for sweeps)

(fairseq 初心者なので珍紛漢紛なことを言ってるかもしれません。気づいたらそっ閉じします)

fairseq-preprocess

コマンドライン引数が取得される流れ

  1. setup.pyconsole_scripts に指定された関数である fairseq_cli.preprocess:cli_main が呼び出される
  2. --user-dir が追加される
  3. 全コマンドに共通の引数 (CommonConfig) が追加される
  4. setup_registry により格納された 6 個の引数 (--criterion, --tokenizer, --bpe, --optimizer, --lr-scheduler, --scoring) が追加される
    • setup_registry は __init__.py で定義されているので fairseq のインポート時に実行される
  5. --task が追加される
  6. add_preprocess_args により preprocess 専用の引数が追加される

fairseq-train

ほぼ preprocess と同じなので雑に

  1. fairseq_cli.train:cli_main
  2. 同じく --user-dir
  3. 同じく CommonConfig
  4. 同じく registry
  5. 同じく --task
  6. add_dataset_args により DatasetConfig の引数が追加される
  7. add_distributed_training_args により DistributedTrainingConfig の引数が追加される
  8. add_model_args により引数 --arch が追加される
  9. add_optimization_args により OptimizationConfig が追加される
  10. add_checkpoint_args により CheckpointConfig が追加される
  11. add_ema_args により EMAConfig が追加される

疲れたのでここまで。

なぜコマンドと引数が対応していないのか

ここでコマンドの種類に関係なく、

1
4. setup_registry により格納された 6 個の引数 (`--criterion, --tokenizer, --bpe, --optimizer, --lr-scheduler, --scoring`) が追加される

が実行されてしまうのが原因と思われる。registry の 設計の都合でこうなってしまったのだろう。 例えば、optimizer は任意のコマンドで引数を渡せるが、実際に build_optimizer が実行されるのは Trainer 内のみだった。

ちなみに、公式ドキュメントは sphinx-argparse で自動生成されているため、--help と同じ情報が載っている。

おわりに

とりあえず、以下の 6 個については、引数を渡したからといってそれがどこかで使われる保証はない。

1
2
3
4
5
6
--criterion
--tokenizer
--bpe
--optimizer
--lr-scheduler
--scoring

自分のやらかしを紹介すると、--bpe, --tokenizer を見たとき data-preprocess の引数に指定すればトーカナイズしてくれるもんだと思っていた。もちろん、いろんな web サイトで「fairseq はトーカナイズをしてくれない」という話はたくさん見ていた。でも「公式ドキュメントの方が正しい」と信じていた。しかし、preprocess.py において args.bpe, args.tokenizer は参照されていない。

「ソースコードの方が正しい」のだ。

ICLR2024 の気になる論文一覧

NLP2024 参加記