
7. 機械学習の基本
7.10 モデル保存・再利用
一度学習して手に入れたモデルは、時間や計算資源をかけた資産である。これを「保存」しておけば、次に使うときにゼロから学習し直す必要がなく、結果の再現や比較、共有が容易になる。保存には、モデルの中身(重みや構造)をファイル化する「シリアライズ」という手法を使い、あとで読み込んで「再利用」する。フレームワークは保存と読み込みの機能を用意しており、適切な形式を選ぶことで、別環境や将来の検証でも安定して同じモデルを呼び出せる。[1]
まず、保存形式の基本を整理する。- フレームワーク固有の形式: 例として、Keras/TensorFlowはモデル全体(構造・重み・訓練設定)を含むSavedModel形式やHDF5形式での保存を備え、後でそのまま復元できる。- Pythonオブジェクト直列化: scikit-learnなどの学習器はpickleやjoblibで保存・読み込みでき、joblibは圧縮によりファイルサイズを小さくしやすい(速度はpickleが有利なことが多い)。- 交換用の共通形式: ONNXのような中立フォーマットに変換すれば、異なる推論エンジンや言語・環境でもモデルを動かしやすい(企業の実務解説でもONNXは一般的な選択肢として挙げられる)。保存形式の選択は、再利用先(Pythonのみか、クラウド/モバイル/エッジか)と、将来の互換性を考えて決めるのがよい。[2][3][1]
保存のやり方は、大きく2通りある。- モデル全体の保存: 構造・重み・最適化設定を一式で保存し、読み込むだけで同じモデルが復元できる。Kerasではmodel.save()で対応でき、SavedModel形式やHDF5形式を選べる。- 重みのみの保存: モデルの構造はコードで再定義し、重みだけ別ファイルから読み込む。構造を自前で管理したいときや、重みだけを更新したい場合に向く。また、学習中に性能の良い時点の重みだけ自動保存する「チェックポイント」も有用で、訓練の中断や早期終了と併用して最良モデルを残せる。[1]
Pythonでの一般的な保存・読み込みについても触れる。scikit-learnのモデルはpickleやjoblibで簡単にシリアライズできる。速度重視ならpickle、サイズ重視なら圧縮付きjoblibを使う選択が実務例で示される(同じモデルなら精度は同一)。ただし、pickle/joblibは任意コード実行のリスクがあるため「信頼できる由来のファイルのみを読み込む」運用が原則であり、このセキュリティ注意は解説記事でも強調されている。[3][4][5]
再利用を成功させるカギは「再現性」と「バージョン管理」である。- 再現性の確保: 同じ入力から同じ出力を得るには、モデルだけでなく、特徴量の作り方、前処理の統計(平均や分散)、乱数シード、学習時のハイパーパラメータ、使用したライブラリのバージョンを記録し、推論でも同じ手順・同じ値を使う必要がある、というMLOpsの基礎が整理されている。- モデルのバージョニング: どのデータ・どのコード・どの設定で得られたモデルかを紐づけ、比較・ロールバックできるようにする。クラウドや各プラットフォームの「モデルレジストリ」を使えば、モデルに版番号を付け、系統(どの学習から生まれたか)を追跡する運用がしやすい。この体系的管理により、監査や再評価、過去版への復帰が可能になる。[6][7][8][9][10]
保存前後のベストプラクティスを具体化する。- 学習中の自動保存: 検証損失が改善したときだけ重みを保存するチェックポイントを設定し、最良モデルを確実に残す。- 前処理を含めた保存: 推論時も同じスケーリング・特徴抽出を適用できるよう、学習済みのスケーラーやパイプライン(例: scikit-learnのPipeline)ごと保存する、あるいは推論側に同じ処理を組み込む。Googleのルール集でも「学習時の特徴量をログし、同じ変換を本番で再現する」重要性が述べられている。- 形式の適合: フレームワークが推奨を変更する場合があるため(例: ライブラリによってはpickleからJSON/独自形式を推奨することがある)、公式推奨を確認し、将来の互換とセキュリティを優先して保存形式を選ぶ。- 配布と展開: 本番・他環境で動かす場合は、ONNXやクラウドのモデルレジストリ、推論サービスのベストプラクティスに従い、コンテナ化やCI/CDと組み合わせて再現性と安全性を確保する。[11][12][13][2][1]
保守運用の観点も重要だ。モデルは時間とともに性能が変化する(データ漂移)。そのため、モデル・特徴量・データの変更履歴を追える設計(リネージ追跡)や、PITR(ある時点での状態に戻す)に近い運用が推奨される。また、成果物(モデルファイル)は共有ストレージに集約し、学習の一時データと推論で使う保存先を使い分ける運用の知見も紹介されている(学習成果物は共有ファイルシステムへ置く構成)。さらに、組織内での再利用と監査性を高めるため、共通のパイプライン/インフラを整え、クリーンでスケーラブルなコード・自動化・CI/CDを適用するのがMLOpsの要点とされる。[7][8][14][15]
最後に、実務で役立つ最小手順をまとめる。1) 学習時に、パイプライン(前処理→モデル)をひとまとまりで作る。2) 最良エポックの重みを自動保存(チェックポイント)し、最良モデルをエクスポートする。3) 再利用先に合わせた形式で保存(Python内ならjoblib/pickle、他環境も視野ならONNXやSavedModelなど)し、読み込み手順を検証する。4) モデルレジストリやストレージでバージョン管理し、学習条件(データ版、特徴手順、乱数シード、ハイパーパラメータ、依存ライブラリ)を記録する。5) セキュリティのため、pickle/joblibは信頼できる由来のファイルのみ扱い、外部配布には適切な形式・署名・アクセス制御を用いる。6) 本番展開はプラットフォームのベストプラクティス(推論エンドポイント、スケール、監視、ロールバック)に従い、継続的に性能とドリフトを監視して再学習計画を回す。[8][4][9][5][13][6][2][3][1]
このように、モデル保存・再利用は「適切な保存形式の選択」「前処理を含む再現性の担保」「バージョン管理と系統追跡」「安全な読み込みと配布」「運用の継続監視」という柱で設計すると、研究から本番まで一貫して活用できる。とくに、最良モデルの自動保存、レジストリでの管理、前処理の再現、ONNX等の相互運用フォーマット、セキュアな取り扱いは、現場で繰り返し有効性が確認されている実践要点である。[4][2][8][1] [1] https://service.ai-prompt.jp/article/ai365-230/
[2] https://ops-in.com/blog/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E9%96%8B%E7%99%BA%E3%81%A8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88/ [3] https://www.salesanalytics.co.jp/datascience/datascience044/ [4] https://qiita.com/mk-mokumoku/items/36e8f191199ba15fcaca [5] https://omomuki-tech.com/archives/1811 [6] https://qiita.com/Life-tech/items/53cbe5adb79d7e5e4892 [7] https://qiita.com/zumax/items/7dcd23806e4bcb287ea4 [8] https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/mlops-checklist/mlops-checklist.pdf [9] https://speakerdeck.com/oracle4engineer/mlops-getting-started [10] https://www.m3tech.blog/entry/2024/12/02/170000 [11] https://qiita.com/GushiSnow/items/4f2e54510d6c682e02be [12] https://note.com/kiyo_ai_note/n/n403abc46747d [13] https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/best-practices.html [14] https://www.databricks.com/jp/blog/mlops-best-practices-mlops-gym-crawl [15] https://logmi.jp/main/technology/323477 [16] https://www.netattest.com/fine-tuning-2024_mkt_tst [17] https://ainow.ai/2022/02/14/262548/ [18] https://docs.oracle.com/ja-jp/iaas/Content/data-science/using/save-python-sdk.htm [19] https://zenn.dev/pn8128/articles/a7ccd96a433d16 [20] https://ipsj.ixsq.nii.ac.jp/record/217304/files/IPSJ-SE22210018.pdf※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。
※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。