▮ 背景
モデルの開発時では、ただでさえたくさんの情報を管理しないといけないのにかかわらず、ものすごい量の実験を繰り返す必要がある時があるので、それらの情報がすぐ訳わからなくなってくることが個人的に多々あります。
理想としては、時間が経ったとしても(例えば半年後とか)すぐに結果の再現ができるように情報を管理することだと思うので、今回は(個人的に思う)、モデル開発時に管理した方が良い項目8つを共有します。
1. モデル定義
トップバッターとしては、モデルの骨格についての情報となります。これは使用した損失関数とかも含みます。もしNeural Networkを使用しているのであれば、何層存在して、各層で何個パラメータを持っているかなどの情報が含まれます。
2. 重み情報
①で定義した骨格にこの重み情報を載せることで、ようやく意味のある推論ができるようになります。保存方法によっては、骨格と重みの両方が一つのファイルに保存されることもあります。
3. 特徴量抽出パイプライン
モデルにデータを入力する前に、モデルが予測しやすくなるように事前に入力データに対して何かしらの処理を施すことを「前処理」といいますが、そのパイプラインのことを指します。モデル開発時は、このパイプラインが結構変わったりするので、各実験別に保管しておくのが良いです。
4. 依存関係
使用するライブラリの各バージョンについての情報です。
- python
- Deep Learning Framework(Pytorch/ Tensorflow)等
基本的には、仮想環境もしくはドッカーイメージファイルを控えておくのが良いと思います。
5. データ
モデル開発時に、データセットを振り分けて(Training/Validation/Test Set)検証を行うと思いますが、この振り分けも変わることがあります。どの実験に対して、どの画像を、どのデータセットとして割り振ったのかを記憶しておくのはほぼ不可能なので、データセットの振り分けに変更がある都度、バージョンを分けて管理することがとても大切になります。各実験でどのデータバージョンを使用したかを何かしらの方法で記録しておくとよいと思います。
6. 実装コード
下記のような情報を指します。
- 学習用のコード
- 推論用のコード
- データセットを振り分けるために使用したコード
これはjupyter notebookだったりシンプルなpythonファイルとなります。
個人的には、普段VSCODEを使用していて、notebookだとdebugがうまくいかないケースが多々発生したのでpythonファイルを使っています。
7. 実験時の成果物
これはLoss Curveだったり、行いたいタスクに特化した指標をプロットしたもの等が含まれます。
例①Loss Curve
例②可視化した推論結果
例③最終的に行いタスクの出力値
⇓の例だと、「モデルは断面の輪郭を予測し、その輪郭情報から別のアルゴリズムで角度を算出する」というようなことをしています。
8. 設定パラメータ
これもかなりごちゃごちゃになりがちなので、各実験時にどのパラメータを使用したのかを管理することはとても大切だと思います。(一番大事かも?)
例①ファイル名に書き込む
一番気楽にできておすすめな方法は、各実験ごとのディレクトリを自動作成するようにして、⇓の画像のように、そのファイル名に各パラメータ情報が自動的に入るようにする方法です。
再現したいモデルを探しに行く際に、ファイル名にその情報が書いてあるので見つけやすいです。
例②configファイルを作成する
もう一つの方法は、YAMLファイルを使用するパターンです。
こっちの方が前の例よりきれいな気がしますが、パラメータ内容を確認するために、一個一個yamlファイルを開く必要があるので、探すのに若干めんどくさい面もあります。
MLOpsに取り組むようなフェーズになった場合は、こっちの方が良いかもしれません。
OUTPUT_DIR: 'multi_class_results'
LOG_NAME: 'log'
PRINT_FREQ: 1
DATASET:
ROOT_DIR: 'kaggle_data'
TRAIN_SET_DIR: 'Train'
VAL_SET_DIR: 'Val'
MODEL:
NETWORK: 'LRASPP'
BACKBONE: 'mobilenet_v3_large'
PRETRAINED: 'True'
NUM_OUTPUTS: 12
COMMON:
BATCH_SIZE: 4
EPOCHS: 1
NUM_OF_WORKERS: 8
LOSS: 'CrossEntropyLoss'
METRICS:
IOU: False
mIOU: True
F1SCORE: False
TRAIN:
PREPROCESS_PIPELINE:
IMAGE_SIZE:
IMG_HEIGHT: 512
IMG_WIDTH: 512
RANDOM_VFLIP: False
RANDOM_HFLIP: False
RANDOM_AFFINE: False
OPTIMIZER:
AlGORITHM: 'SGD'
BASE_LR: 0.0001
MOMENTUM: 0.9
WEIGHT_DECAY: 0.05
NESTROV: False
VAL:
PREPROCESS_PIPELINE:
IMAGE_SIZE:
IMG_HEIGHT: 512
IMG_WIDTH: 512
RANDOM_VFLIP: False
RANDOM_HFLIP: False
Writed by F.K(20代/入社3年目)