ymlファイルでのコンフィグの入力
機械学習モデルの学習・推論時のコンフィグ情報の入力にはyamlファイルを使うのではないかと思います。
ただし個人的には、yamlでは変数が使えないのが歯がゆい点ですね。一応アンカーとエイリアスという変数っぽいものはあるのですが、それは行ごとの値の保持なので、例えば親ディレクトリが共通な時とかに部分的な共通点を保持できないです。
例えば、
image: "/path/to/dataset_name/data_version/Images"
label: "/path/to/dataset_name/data_version/Csv"
を
shared_dir = "/path/to/dataset_name/data_version/"
image: shared_dir + "Images"
label: shared_dir + "Csv"
みたいに書けないので、編集がしにくく、使いまわしがしにくいと感じるのです。
人によってはそういう時に、デフォルトのkeyとvalのプレースホルダだけ作っておいて、後はテンプレートジェネレータで動的に値を与えて所要のymlファイルを動的につくってそれをロードするかもしれないですね1。私としては、処理の工程が1つ増えて面倒くさいと思ってしまうのです。
pythonファイルでのコンフィグの入力
なので、pythonファイルを直接食わせる方法を取ったらいいんじゃないか、と思いつきました。ここでいう食わせるというのはfrom config import cfg
とするのではなく、
pythonで書いたコンフィグファイル
# config.py
path_root = '/path/to/'
cfg = {
'key1': path_root + 'val1',
'key2':path_root + 'val2',
'some_number': 1+ 3,
}
を、
import importlib
cfg_filepath = './config.py'
hoge = importlib.machinery.SourceFileLoader('hoge_module_name', cfg_filepath).load_module()
cfg = hoge.cfg
print(cfg) # {'key1': '/path/to/val1', 'key2': '/path/to/val2', 'some_number': 4}
のように、ローダーにファイルパスで渡してコンフィグの中身を読むことを指してます。
これなら、いちいちimport文でconfigのロード先を変えなくても、引数で読ませたいコンフィグファイルを切り替えることができます。また、式の評価とか、pythonで扱うオブジェクトが扱えます。
もちろんpython以外では使えないとかの欠点はあるのですが、変数によってコンフィグファイルがすっきりした感じになります。
本当に使える?
書いておいてなんですが、yamlにせよpythonファイルにせよ、コンフィグファイル中のパラメータを人が直接編集して実験って普通はやらない気がしてきました。
コマンドライン越しならば引数で変更したいパラメータだけ変えたり、あるいはAIプラットフォームのGUI越しに変えたり、そもそも実験はjupyterでやっていてパラメータはセルにまとめる(実行時yamlをログとして吐く)、みたいなケースが大半を占めてそうで、コンフィグファイルを直接いじる機会はほとんどないという印象です。
本記事のようにpythonファイルの方法は使えるか、というと、「使うこともできるけど、別の与え方を考えた方がいい」というのが正直な所です。本記事の方法で有用なケースがあったら後日追記します。
読んでいただきありがとうございました。
参考文献
-
yamlの例は知らないが、caffeのprototxtで見たことがある。背景としては、caffeのpython APIのsolver(optimizerに該当)クラスはsetterメソッドを持ってないので、パラメータはファイル経由で与えなければならないためだったと思う。 ↩