Closed7
ML学習パイプラインにおける中間生成物のバージョン管理と再現について

やりたいこと
パラメータをコンフィグで管理しながら中間生成物のキャッシュを適切に管理したい。
具体的なユースケースとしては、
- preprocess
- feature_extract
- train
というプロセスがあり、各プロセスで中間生成物を生成するケースを考える。
中間生成物を生成することのメリットは、各処理で同じ処理(結果が同じになる処理)を複数回実行しないことで計算コストが削減できることである。
各プロセスにおける処理は入力データとコンフィグの値のみに依存するとする(つまり、再現性がある)。
この前提であれば、各プロセスの中間生成物の生成結果に違いが生じるのは入力データかコンフィグのパラメータが変更された場合のみである。
したがって、以下の3つをバージョン管理することになる。
- 入力データ
- 処理のコード
- コンフィグパラメータ(一種のデータ?)
なお、追加の要件として、試行錯誤の過程でコミットした全てのバージョンを再現できるようにしたい。動機としては、Kaggleなどのコンペを想定した場合、なるべく生成プロセスの広い範囲にわたって多様性を確保したいことがある。

要件
- 中間生成物にバージョンを付与して同一の生成物を生成する処理を1度のみ行えること
- 試行錯誤の過程でコミットした全てのバージョンの最終生成物を再現できること
必要なこと
- 最終成果物に影響する全てのアーティファクトをバージョン管理すること:
i. 各プロセスにおけるコード
ii. 入力データ
iii. コードのコンフィグパラメータ

既存でできていること
- 「中間生成物のキャッシュ」さえ無視すればhydraで行える。
- 推論データの生成にさほど時間を要しないのであれば重複して生成してもさほど問題にはならない(むしろパイプラインが複雑になることのデメリットの方が重要?)。

単純にやろうと思えば、「中間生成物の生成に影響するパラメータのまとまりを定義し、それらのキーと値から一意なハッシュ値を生成し、そのハッシュ値を保存する」ことで同じデータを生成済みかどうかを判断できる。

コンペに限れば、多くの場合は「パラメータからキャッシュが存在するかを自動的に判別」までは必要でなく、中間生成物のバージョンを人間が手動で管理できれば十分。
このスクラップは2023/11/14にクローズされました