こんにちは、Analyticsグループの田中です。 以前は主にデータ分析基盤を開発・運用していましたが、現在は機械学習基盤の開発に携わっています。
今回はレコメンドエンジンを題材に、コンテナ技術を活用した機械学習システムのアーキテクチャをご紹介します。
リブセンスでのレコメンドエンジン開発
リブセンスでは以前から機械学習を利用したレコメンドエンジン開発に力を入れています。 このブログの初回の記事でも社内で利用しているBPMFアルゴリズムについて解説しています。
この記事にもあるのですが、社内のレコメンドをとりまく状況は次のような点が特徴です。
- 複数のサービスでそれぞれのニーズに合わせたレコメンドエンジンを開発・運用している
- マッハバイト・転職ナビ・転職会議などの各メディアでそれぞれ独自のレコメンドエンジンが稼働している
- 主な事業領域である求人・不動産サービスでは、アイテムの件数は多くないがアイテムあたりのCV単価が高い傾向がある
- アイテムが求人や物件であるため、(Web広告等に比べれば)比較的扱いやすい件数である
データの性質からアルゴリズムにはスケーラビリティよりも精度が求められることが多く、最近では論文などからフルスクラッチでアルゴリズムを実装することも増えています。
アルゴリズムの実装は機械学習エンジニアが担当しますが、それを各サービスのアプリケーションで利用する際にはアプリケーションエンジニアの手が必要となるため、開発体制は概ね次のようになります。
- Analyticsグループの機械学習エンジニア
- データ分析とそれに基づくアルゴリズムの選定
- アルゴリズムの実装や実環境でのテスト結果に基づくチューニング
- 各サービスのアプリケーションエンジニア
- 機械学習ライブラリなどを含む実行環境の整備
- アルゴリズム実装のアプリケーションへの組み込み
以前のシステム構成の課題
このような体制のもとで、以前は各サービスのインフラ環境やアプリケーション設計に合わせてレコメンドエンジンを開発してきました。 この結果、アプリケーションのコードベースがアルゴリズムを内包するようなシステム構成となっていました。
この構成にはサービスのニーズに合わせて設計やアルゴリズムのチューニングを柔軟に変えられるメリットがあります。 とはいえ密結合した構成の常として、システムに手を加えれば加えるほど複雑化によりメンテナビリティは下がってしまいます。 実際に社内でも次のような課題が顕在化していました。
- アルゴリズム実装の再利用性・可搬性が低い
- あるサービスで利用しているアルゴリズムをそのまま別のサービスに移植しにくい
- 結果的に似たようなアルゴリズムの実装が複数のアプリケーションのコードベースに散在する
- アルゴリズム実装に利用できる技術がアプリケーションの実行環境に制約される
- 新しい技術を導入する際はアプリケーションの動作に影響がないかを慎重に検証する必要がある
- 運用負担を考えると、例えば実験的にJuliaを使いたいといった要望に簡単には応えにくい
アルゴリズムとアプリケーションの疎結合化
今回のテーマは、これらの課題を解決するために密結合しているアプリケーションとアルゴリズムを分離し、それぞれを独立して開発できるようにすることです。
実現したいのは次のようなことです。
- ひとつのアルゴリズムを実装すれば複数のサービスで利用できる
- アルゴリズムとアプリケーションの実行環境を独立化し、それぞれで利用する技術を自由に選択できる
- 機械学習エンジニアとアプリケーションエンジニアが担う運用上の役割を分担し、それぞれの得意な領域に集中できる
マルチコンテナ化による実行環境の分離
単純にアルゴリズムを共通化したければライブラリ化すればよいのですが、それだけでは実行環境の独立化までは達成できません。 例えばアプリケーションをRubyやPHP・アルゴリズムをPythonやJuliaで実装したいときに、それらがひとつの環境に同居すると依存関係などの問題が発生しやすくなります。
また機械学習ではしばしば複雑なビルド工程を要する外部ライブラリを利用しますが、これによりプロビジョニングステップが肥大化し運用負担が増大することも懸念されます。
こういった問題を回避すべく、中核となるアルゴリズムと、アルゴリズム・アプリケーション間の仲立ちをする部分とを実行環境ごと独立させたいと考えました。 具体的には、新しい構成はアルゴリズムコンテナとオーガナイザコンテナと呼ぶ複数のコンテナからなるシステムとして開発しています。
各コンテナでは次のような処理を行います。
- オーガナイザコンテナ
- アプリケーションのDBや分析基盤からデータを取得する
- 取得したデータをアルゴリズムコンテナで処理するフォーマットに合わせて整形する
- 必要に応じて生成されたレコメンド結果をフィルタリングする
- アプリケーションで利用可能な形式でデータをエクスポートする
- アルゴリズムコンテナ
- オーガナイザコンテナから渡されたデータと設定をもとにレコメンド結果を生成する
- 必要に応じてオフライン評価による精度検証なども同時に行う
コンテナ間でのデータの受け渡しはマウントされた共有ボリュームを介して行います。 データのフォーマットを決めておくことで、アルゴリズムコンテナのイメージの可搬性・再利用性を高めることができます。
オーガナイザコンテナはアプリケーション毎に実装する必要がありますが、アルゴリズムコンテナは複数のアプリケーション間で共通化できます。 このような構成にすれば、次のように目標としていた要件は実現できそうです。
- アルゴリズムの実行環境がポータブルになり、複数のサービスでの利用が簡単になる
- アルゴリズム実装のための技術を機械学習エンジニアが自由に選択できる
- 機械学習エンジニアとアプリケーションエンジニアがそれぞれの役割に集中できる
加えてコンテナ技術を採用することで次のようなメリットも生まれます。
- 機械学習系のライブラリのビルドを含むプロビジョニング・デプロイフローが単純化できる
- コンテナイメージがバージョン管理でき、サービスごとに別のバージョンのアルゴリズムを利用できる
実現可能性と今後の展望
マルチコンテナ構成のシステムを実行するには、Docker ComposeやKubernetesのようなコンテナ管理・オーケストレーションツールが必要です。 これに関して社内の新しい機械学習基盤はGCP上で開発・運用しており、バッチの実行基盤にはKubernetes/GKEを利用しているため、こういった構成を実現する上でのハードルは低くなっています。
実は今回紹介した取り組みは、この新しい機械学習基盤の開発プロジェクトの一環として行っているものです。 この中ではレコメンドエンジンの他に、Webテスト・最適化システムなどの開発も行っており、一部ですでに実証実験を始めています。 またこの記事の内容は主にバッチジョブを対象としたものでしたが、チーム内ではオンラインでの学習・予測を想定したシステム構成についての調査・検証も進めています。
プロジェクト自体はまだまだ始まったばかりですが、機械学習エンジニアにとっての自由度向上のメリットは徐々に現れてきています。 一例として、従来はアルゴリズムの実装言語をPythonに限定していましたが、最近では要件に合わせてJuliaを試験的に導入するといった試みも行っています。 そういった話も今後このブログでご紹介できればと思います。