はじめに
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 は参照されていない。
「ソースコードの方が正しい」のだ。