きっちーの日記

へっぽこエンジニアの日々の記録

【IT エンジニア日記】CTC segmentationの存在を知った。

今日知ったこと

最近、機械学習のハイパーパラメータのために、学習スクリプトの引数を大量に作らなければ行けないことが多々ある。

例えば、pythonのargparseを使うと以下のように引数が膨大になる

python train.py --batch_size 10 --larning_rate 0.0000001 ......

そんなことをすれば毎回学習を回すたびにshell scriptを作って指定するなど、よくわからないことが発生する....

そこで、よく使われるのが OmegaConfやそれのラッパーとなるHydra Trainである

今回は、その2つの利点と欠点を今日自分で気づいたぶんだけ共有する

Hydra の便利なところ

Hydraは、yamlファイルをディレクトリ構造を持って作ることができる。

こんなふうに、ディレクトリ構造を持ってyamlを持てるので、default値とかが設定できる。

├── conf
│   ├── config.yaml
│   ├── db
│   │   ├── mysql.yaml
│   │   └── postgresql.yaml
│   └── __init__.py
└── my_app.py

Hydraの使いにくいところ

個人的に使いづらかったのは、コーディングしているときに、補完が効かなくなっているところである。そのため、大規模なモデルの開発や複数人でモデルを作るときは向いていないと感じた。

Omegaconfのいいところ

逆に、Hydraの問題点を解決できるのがomegaconfである(hydraでもできるのかもしれないですが、Hydraの設計思考的に、やる意味がないと思います。)

例えば以下のようなdataclassがあったとします

from omegaconf import OmegaConf
from dataclasses import dataclass

@dataclass
class SampleConfig:
    sample_no: int = 1000
    batch_size: int = 10

これを設定しておけば、structを作ってくれます

sample_conf = OmegaConf.strucured(SampleConfig)

後は、yamlから読み込んだり、yamlとして書き出したりすると、再度使えたりします。

最後に

Hydraは例えばfairseqに使われていたり、omegaconfはNeMoやCoquiなどに使われていたりします。両方使ってみた感じ、個人的にはomegaconfのほうが好きだし、コーディングもしやすいかなと思いました。

個人的に、これから趣味としてコーディングするときは、OmegaConfの方を使うと思います。

それでは