はじめに
OSS を利用しといて「くそ!」とか言うのは、隣の家に勝手に上がり込んで上に出してもらったお菓子がまずいというようなもの。 利用者は八百万の OSS に感謝の気持ちを持って開発するのが大事。
この記事 (メモ) では fairseq のコマンドと引数の対応が正確ではないように感じたので、ソースコードを参照しながら確認していきます。
(fairseq 初心者なので珍紛漢紛なことを言ってるかもしれません。気づいたらそっ閉じします)
fairseq-preprocess
コマンドライン引数が取得される流れ
setup.py
のconsole_scripts
に指定された関数であるfairseq_cli.preprocess:cli_main
が呼び出される--user-dir
が追加される- 全コマンドに共通の引数 (
CommonConfig
) が追加される setup_registry
により格納された 6 個の引数 (--criterion, --tokenizer, --bpe, --optimizer, --lr-scheduler, --scoring
) が追加される- setup_registry は
__init__.py
で定義されているので fairseq のインポート時に実行される
- setup_registry は
--task
が追加されるadd_preprocess_args
により preprocess 専用の引数が追加される
fairseq-train
ほぼ preprocess と同じなので雑に
fairseq_cli.train:cli_main
- 同じく
--user-dir
- 同じく
CommonConfig
- 同じく
registry
- 同じく
--task
add_dataset_args
によりDatasetConfig
の引数が追加されるadd_distributed_training_args
によりDistributedTrainingConfig
の引数が追加されるadd_model_args
により引数--arch
が追加されるadd_optimization_args
によりOptimizationConfig
が追加されるadd_checkpoint_args
によりCheckpointConfig
が追加される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
は参照されていない。
「ソースコードの方が正しい」のだ。