Skip to the content.

Training code in serving pattern

Case

Situation

機械学習の開発(学習や検証、評価等、本番の推論器にリリースする前の段階)で書くロジックやコードが推論器で使うロジックやコードと異なることは多いと思います。コードが違えば依存するライブラリが違うこともあるでしょう。例えば学習であればデータ分割やバッチ学習、パラメータチューニング等のコードを実装しますが、推論でこれらのコードを使うことは稀です。学習と推論で違ったロジックやコードを使う点は機械学習をシステムに組み込む際の課題の一つです。本番システムの開発では、可能な限り不要なコードを含めない(リリースしない)ことで、更新範囲の決定や障害対応の切り分けが簡単になります。機械学習の推論器開発では、学習や検証、評価でしか使わないコードやライブラリは推論器に含めないほうが無難でしょう。
学習で使うリソース(CPU、GPU、RAM、ネットワーク、ストレージ等)が推論器で使うリソースと違うことがあります。Webサービスであれば、おそらくネットワークとストレージは学習環境(社内)と推論環境(Web向け)で全く異なる構成になるでしょう。また、ディープラーニングの場合、学習でGPUを活用しつつ、推論ではCPUを使う(または学習で学習用GPUを活用しつつ、推論では推論用GPUを使う)ということもあります。こうした理由により、学習環境で使うリソースの設定値は推論器では不要(または害悪)になることがあります。推論器で無効な設定値であれば良いですが、有効に使える設定値の場合、本番稼働する推論器で障害を起こす原因になることがあり、注意が必要です。
機械学習では学習と推論で異なる環境が使われることが一般的です。他方で、モデルを正常に稼働させるために(学習、評価時と同等のパフォーマンスを推論で発揮するために)、学習と推論でOSや言語、ライブラリ、前処理等を共通化する必要があります。学習と推論で共通化する部分と環境固有になる部分は区別することが重要です。

Diagram

diagram

Pros

Cons

Work around