株式会社ZOZOテクノロジーズ / Research Engineer
画像検索基盤システム
# 概要 自社の商品を画像を元に似た商品をレコメンドするサービス(画像検索システム)を開発しました。 # やってきたことと技術選定 担当したのは - プロトタイプのweb - API - 機械学習基盤(GKE) - インフラ - ワークフロー です。機械学習以外の全部に携わりました。 ### プロトタイプ プロトタイプのweb画面を開発しました。現在最もモダンであるフレームワークの1つであるVue.jsを選択し、短い期間で実装しました。使い捨てのコードだったのでスピード重視で実装しました。 ### API WebAPIを開発しました。機械学習全般ではPythonが多く使われれておりAPIでも相性を良くするためPythonを使い、素早くAPI開発ができるFlaskを使いました。マイクロサービス間ではgRPCを使って高速に通信させました。開発当初からSwaggerを使ってAPIを社内に公開し、他のチームの方にもAPIを使ってもらってフィードバックをもらいながら開発を進めました。 モデルを実行するAPIの呼び出しはとても重い処理です。GPUも使っているため、あまり頻繁に使われたくありません。そのためキャッシュをいかに使うかが重要になりました。「短時間での同一の呼び出し」「同一パラメータでの呼び出し」「同じアイテムをキーにした呼び出し」など複数パターンでキャッシュの仕組みを構築しました。キャッシュにはRedisを使い高速化し、データはMessagePackを使い特定の言語やバージョンに依存しない仕組みを構築しました。 ### GKE クラウドはGCPを選びました。GCPを選んだのは後述するKubernatesを使う必要があり、当時最も安定していたGKEを使いたかったためです。 GKEでマイクロサービスを構築しました。MLエンジニアが開発したモデルは複数あり、それぞれ要求するリソースが異なっていました。(AモジュールはGPUを使う、Bモジュールはメモリを多く使うなど)それぞれのモデルの性能を効率的に稼働させるためマイクロサービスに分けリソースを分配し、効率的にスケールできるようにしました。 リソースが複数あり環境もdev,stg,prdがあるためyamlファイルをたくさん書く必要が出てきました。チームでKustomizeを採用しコードを共通して適用できるようにしていきました。 ### インフラ インフラはSREチームと共同で安定化に務めました。SREチーム担当分のインフラ作業も一緒にやることで、k8s, terraform などのインフラ、バックエンドの開発力がとても身につきました。 github circleci などを組み合わせ、CI/CDによる自動化を実現しました。デプロイはすべてPRのマージを起点として自動化しており、安定したリリースを行っています。 ### ワークフロー Composer(AIrFlow)を使って数百万画像を使った学習処理のワークフローを構築しました。大量の画像取得、特徴量計算、結果保存、プロダクションAPIへのスムーズな適用、は思ったよりも難しくテストも難しいため大変困難な刺激的な分野でした。 dev,stg,prdの環境で変数がことなるため環境ごとに情報を差し替える仕組み、開発を効率化するためにデプロイと実行をCLIから実行する仕組み、1回の実行が数時間から数日に及ぶので開発者のSlack宛にワークフローの状況を知らせる仕組みなどを構築し、チームで効率的な開発をできるように開発環境を整えていきました。 # 姿勢 MLエンジニアが全力で機械学習業務に取り組めるよう、可能な限り彼らが仕事しやすいようにしていきました。ファイルサーバーの構築、画像ダウンロードスクリプトの開発など、MLの知識がなくてもできる作業は率先的にタスクを受け取り、メンバー全員が最善を尽くせるようにしていきました。