nokoのブログ

こちらは暫定のメモ置き場ですので悪しからず

機械学習基盤(推論環境)の設計・構築フェーズで考えること

はじめに

  • AIな案件で、データサイエンティストによるPoCに目処がつき、機械学習エンジニア?データエンジニア?ソフトウェアエンジニア?により実システムに落とし込んでいくぞ!という段階でやったこと・気を付けるべきことのメモです。
  • モデリングはなんとなく終わっていて、インフラ構築して、APIバックエンド構築して、モデルをデプロイして、テストしていく感じを想定しています。(推論環境にフォーカスしています。)

フェーズの大まかな流れ

フェーズ別のやったこと・気を付けるべきこと

01_PJ独自要件確認

  • 環境について
    • オンプレで作るのかクラウドで作るのか。相乗りするのか新規に作るのか。
    • 既存環境のリソースの余り具合、構築期間(アカウント発行に掛かる期間等)、セキュリティ要件、結局GPUどこで使えるんだ、あたりを考慮して決める。
    • 運用基盤(リリース、監視、バックアップ、改廃)は既存の仕組みを使えるか新規に構築するか。
  • データ連携
    • オンライン処理かバッチ処理か。(連携頻度、サイズも確認)
    • APIで連携するのかファイルで連携するのか。
    • 転移学習どうするのか。(個人情報とかあればデータの保存期間に注意)
  • 役割分担
    • レイヤ(モデル・インフラ・バックエンド・フロントエンド)×フェーズ(設計・構築・運用) ※他ベンダが絡むときは特に
    • 特に、運用ベンダと認識を合わせておく(保守運用費、引継ぎ可能か、モジュールの受け渡し)
    • 費用の分担(開発環境のインフラコスト、ライセンス利用料等)

02_アーキテクチャ検討(サービス選定、ミドルウェア選定)、構築

  • 「(上記の)PJ独自要件」「動作可否」「性能(TAT、スループット)」「ランニングコスト」「運用コスト(デプロイ、監視等)」あたりを考慮して比較検討する。
    • 通常のアプリケーションと比較して、枯れていないパッケージを使いがちなので、きちんと早めの段階で動作確認しておく。(以外と相性とかある。パッケージとAPサーバの相性とか)
    • 通常のアプリケーションと同様だが、「負荷が重そうな処理だけ先行して簡易性能テストをしたが、後から他の処理の方が重かった」はあるあるなので気を付ける。
    • CIに「モデル精度のテスト」も組み込む。前モデルとの比較なり、ベースラインとの比較なり。

03_パラメータチューニング

  • 性能要件を満たす[インスタンスタイプ×台数]の内、最もランニングコストが低い構成を探す
  • インスタンスタイプ
    • 特にCPU使用率、メモリ使用率、GPU使用率、GPUメモリ使用率
      • 例えばAWSだと、CPU負荷とGPU負荷のバランス的にp2系よりg3系など
  • 起動プロセス数
    • 起動プロセス数に比例して確保するGPUメモリ使用率が増えたりするのでちょうどいいところを探す
    • GPUメモリの挙動は注意。プロセスがGPUを利用する際に多めにメモリを使用し、その後少し下がったところで落ち着くから、アプリ起動時にウォームアップさせよう、など。

まとめ

  • 「重い処理に絞って事前性能検証をしたが残りに重いのが、」はよくやりがち。早く全部やってみる。
  • 早く本番の構成、ライブラリバージョンを固めて動作確認する。意外と相性とかあったりする。
  • GPUの挙動をよく見ておく。起動時に一気に確保しにかかったりする。(制御できたりするが。)

おわりに

  • 基本的に通常のシステム構築と同じですが、AIシステム独特な部分もあるので、実務を通してナレッジを貯めていきたいと思います。