■ 発表カテゴリ
・Case Studies: 実際の導入事例や失敗談
■ 発表概要(400字程度)
Sansanの機械学習アプリは高い専門性を要するものが多く、主に少数の研究員で開発される。
そのため、レポジトリの管理や運用が限られたメンバー間でのみ共有されており、積極的なドキュメント整備やパッケージ管理ツールの導入が見送られていた。
これにより、過去の開発者以外がプロジェクトに参加する際の環境構築のリードタイムが長くなる、モダンな開発環境を導入するリソースが確保できないなどの課題が発生していた。
解決方法としてDev Containerの導入が挙げられるが、新規プロジェクト立ち上げ時やベストプラクティスに沿ったレポジトリへの導入例などが多く、アンチパターンが含まれるレポジトリにはそのまま適用できないケースが多い。
この課題を解決するため、開発着手までが10分となるよう考案したDev Containerの設計を紹介する。合わせて、CookieCutterでの雛形化による研究員のみでの開発標準化も紹介する。
■ 発表の詳細(1000字程度)
本発表では、開発環境の属人化や本番との差分といった課題に対し、Dev Containerによる標準化とCookiecutterでの横展開により解決する方法について説明する。
Sansanは数多くの機械学習のプロジェクトを抱えている。それらに用いられている技術は専門性が高いものが多いため、プロジェクトへの参加人数が少なくなり、開発環境の属人化が進みやすい。また、弊社では多くのサービスでマイクロサービスアーキテクチャを取っている。そのため、複数サービスを稼働させるコンテナを用いたデバッグを行うことができるが、ポートの衝突を回避するために一時的にポート設定を書き換えたり、ローカルのユーザ権限が本番環境より強いなど、開発環境と本番環境での差分が発生する。このような状況は多くのプロジェクトで発生している。
さらには、障害対応や要件の変更などにより素早いリリースが必要になった際、過去の開発者を必ずしもアサインできるとは限らない。この時、新規参画における開発着手までのリードタイムの長さや、環境の差分がプロダクトにも影響すると言った問題が発生していた。
そこで、我々はDev ContainerとDocker outside of Docker (DooD)を用いた開発標準化とCookiecutterによる配布によってこの課題を解決した。Dev Containerは、コンテナで開発環境を提供するサービスである。Dockerコンテナに開発用パッケージや拡張機能を追加することで、本番環境のDockerfileを元に開発環境を構築できる。また複数のContainerをする際の手間を解消する方法としてDocker outside of Docker(DooD)を用いた。DooDでは、開発中のコンテナから複数のアプリケーション用コンテナを起動することができる。開発したいサービスのDev Containerから他のサービスを通常のdocker CLIで操作できるため、Docker Composeや結合テスト用のMakefileが用意されていれば、そのまま用いることができる。そのため、既存のコードに大幅な修正を加えることなくDev Containerを導入できる。
さらに、多数のプロジェクトに容易に導入できるように、これらの設定をCookiecutterとして横展開できるように整備した。
これらの効果を測るため、あるリポジトリに対して、過去に参画していないエンジニアがREADMEを読むだけでAPIとWorkerの起動、結合テストを行えるかの調査を行った。これまでこの作業には1営業日かかっていたが、10分程度に短縮できた。また、Dev Container導入後のサービスにおいて障害が発生した際、数年メンテナンスされていないサービスについても数時間でリリースできることを確認した。
さらに、Cookiecutterを用いることで1サービスに対して数時間でDev Containerを導入できた。
以上のことから、属人化による新規参画のコストを下げることができ、この仕組みを複数のプロジェクトに横展開できた。
■ 対象聴衆とその人たちが得られるもの
対象聴衆:MLE、Pythonista
得られるもの:開発標準、プロジェクト参画時のリードタイム削減、開発環境と本番環境の差分の解消
■ なぜこのトピックについて話したいのか(モチベーション)
AI時代においてMLプロジェクトのPoCサイクル、デプロイ頻度の向上や容易なデリバリーが重要になっている。また、エンジニアリングを背景に持たない研究員のみでも開発できることは、研究員・アーキテクトが互いに意識しなくて良いことを意識しない文化を作るために必要なことである。
これらの観点において、機械学習系プロジェクト参画時のリードタイムを削減でき、本番と同等の環境で動作することが保証されたコードをアーキテクトが受け取ることができるDev Containerは取り上げるべきトピックである。