Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

機械学習システムの設計パターンを公開します。

English here

メルカリで写真検索とEdge AIチームに所属している澁井(しぶい)です。機械学習のモデルを本番サービスに組み込むための設計やワークフローをパターンにして公開しました。 GithubでOSSとして公開しているので、興味ある方はぜひご笑覧ください! PRやIssueも受け付けています。私の作ったパターン以外にも、有用なパターンやアンチパターンがあれば共有してみてください!

なぜ機械学習システムのデザインパターンが必要なのか

機械学習モデルが価値を発揮するためには本番サービスや社内システムで利用される必要があります。そのためには機械学習のワークフローおよび関連ソフトウェアと運用を設計し、ソフトウェアに組み込むのですが、これらの開発には機械学習以外のスキルや知見が用いられます。たとえば、設計にもデータ取得、前処理、モデルによる推論、後処理、エンドユーザへの見せ方やUI/UX、学習パイプライン、リリース判定基準、監視通報など様々な知見が必要になります。 機械学習エンジニアや研究者がImageNetを使って正解率の高い画像認識モデルを開発していていても、ソフトウェアエンジニアリングのスキルを身につけることは難しいでしょう。中にはシステム開発やソフトウェアエンジニアリングに興味がない方もいるでしょうし、職務上不要な場合もあるかもしれません。他方でソフトウェアエンジニア(アプリエンジニア、バックエンドエンジニア、SRE含む)が機械学習に詳しいと限りませんし、機械学習とシステム開発の両方でスキルや経験を持ったエンジニアは至極稀でしょう。

f:id:shibui-yusuke:20200422172511p:plain
猫か犬か判定する機械学習システム全体像の例

機械学習システムデザインパターンでは機械学習エンジニアとソフトウェアエンジニアの間のスキルギャップを埋め、機械学習の作法とシステム開発の作法を統合するためのノウハウを整理します。機械学習を用いたシステムを開発するゴールは、多くの場合、機械学習モデルを本番システムで稼働させてビジネスに貢献するというものになると思います。そのためには機械学習独特の技術やワークフローを理解し、事業運営できる形でシステムに組み込む必要があります。「機械学習のモデルやワークフローを本番システムで稼働させる」作法をパターン化して説明するのが機械学習システムデザインパターンの目的です。

“Hidden Technical Debt in Machine Learning Systems” という論文に以下の図が掲載されています。機械学習をシステムとして動かすために必要なコンポーネントと規模の概念図になります。機械学習のコア部分は小さな黒四角で、その他のシステムが周囲に大きく描かれていることがわかると思います。

f:id:shibui-yusuke:20200422172657p:plain
機械学習システムの隠された技術的負債

本論文は、機械学習を有益に使うためには機械学習以外の部分を開発し運用する必要がある、ということを説いています。機械学習自体が重要ではないと主張したいのではなく、機械学習の効果を発揮するためには機械学習以外の要素が必要になる、ということです。ビジネスで機械学習を使うためには、機械学習のロジックをWebサービスやシステムに組み込まれなければなりません。全てのシステムにはビジネス評価と運用が必要になります。システム一般として、リソース管理やインフラが必要になりますが、これに加えて監視通報やバックアップがあると良いでしょう。機械学習システムには、機械学習モデルを稼働させる推論システムと推論システムへのアクセスが必要になります。更にデータロギングと分析、可視化、学習パイプライン基盤があると、より高度な開発、運用が可能になるでしょう。全てを揃える必要はありませんが、機械学習モデルを本番システムで稼働させるために、どのリソースをどう組み込むか、コスト対効果や関連システムとともに設計して構築することが肝要です。

機械学習システムデザインパターンの構成

機械学習システムデザインパターンは以下のカテゴリに分類して執筆しています。

  • 学習パターン:学習パイプラインの作り方

  • QAパターン:テストやQAの方法

  • サービングパターン:推論器を本番システムに組み込むパターン集

  • 運用パターン:モデルやシステムの運用方法

  • ライフサイクルパターン:上記各パターンを組み合わせた機械学習システムの全体構成

各カテゴリではシステムとしての機械学習のライフサイクル(学習、品質検証、サービング、運用)を実現する構成を説明しています。加えてライフサイクルパターンでは学習、QA、サービング、運用を組み合わせた機械学習システムの全体設計例を説明します。

各パターンを以下の項目で説明します。

  • ユースケース:パターンの使いどころ

  • アーキテクチャー:パターンが解決しようとしている課題や説明および設計方法

  • 図:パターンの全体像を図解

  • 利点:パターンによって得られるメリット

  • 難点:パターンによって発生するデメリット

  • 検討項目:パターンを使う際に気をつけるべき項目

本番システムで機械学習を使うために必要な情報を使いどころから設計指針、メリット・デメリット含めて整理しました。加えて、各カテゴリにアンチパターンを用意しています。

機械学習システムのデザインパターンが目指しているもの

機械学習システムデザインパターンではプラットフォームや言語、ライブラリにとらわれず、一般的なクラウドサービスまたはKubernetesクラスターで機械学習システムを構成することを想定したパターンを用意しました。クラウドサービスやKubernetesクラスター、または社内環境によって選択するリソースは異なるでしょうが、どの基盤でも可能な限り基本的なアーキテクチャは変わらないようにパターン化することを目指しています。

私はメルカリに2018年7月に入社し、MLOpsエンジニア(またはSysMLエンジニア)として働き始めて以降、多様な機械学習のシステム開発と運用に携わってきました。約2年弱でメルカリで稼働している機械学習システム(モデリングおよびインフラ含む)のほとんどに、何らかの形で参加してきています。企画段階から携わっているプロダクトもあれば、リリース後に運用から参加したシステムもあります。いきなり障害対応から入ったプロダクトもあります(笑)。そうした経験から得てきた知見をドキュメント化したのが機械学習システムデザインパターンです。メルカリというWebサービスビジネスで、基盤にはクラウドサービスとKubernetesを使うという条件に特化した知見になっている箇所も多くあるでしょう。今後は各クラウドサービス(AWS、GCP、MS Azure…)を使った構成パターンやKubeFlowを使った場合のワークフローを整理し、より汎用的かつ実用的なパターンを揃え、機械学習界隈を盛り上げていきたいと思います!