属人化しがちなR&Dをチーム開発するためのJX通信社での工夫

こんにちは!JX通信社でMLエンジニアのファンヨンテです。私は自分だけでなくMLチームの成果を最大化するために日々全力を尽くしています!

JX通信社のMLチームでは人的リソースを最大限活用するため "力を使うべき所にのみ注力しよう!" をスローガンに徹底的に効率化しています。 今回はちゅらでーた様と弊社の共同勉強会で私が発表した内容をより掘り下げてお伝えできればと思います。

本内容については

ちゅらデータさんとの共同勉強会にて発表しております!

speakerdeck.com

動画を見たい方はこちら

を御覧ください〜

R&Dタスクの属人化について

f:id:yoooongtae:20211015004452j:plain
図1 アプリ開発におけるチーム開発(左)とR&Dチームで発生しがちな属人化した、タスクの進め方

弊社はNewsDigestを始めとしたアプリを開発しており、アプリ開発の場ではチームの皆が一丸となり、アプリ開発という一つの目標に向かって協力し合いながら進めていきます。(図1左)

一方、R&Dのタスクでは、1タスクを一人が担当しているといったケースが多いのではないでしょうか?(図1右)

f:id:yoooongtae:20211015004718p:plain
図2 R&Dチームが属人化する理由と問題点

R&Dタスクが属人化してしまう理由は様々あると思いますが、その問題点はメンバー間の協力が非常に難しいことにあります。

それゆえに、だれかと同じ苦労を違う人が繰り返す。。。といったことが頻発してしまいます。これでは、 "力を使うべき所にのみ注力しよう!"という我々の信念からずれてしまいます。

個人の能力をフルに発揮しながらも、チームの協力を最大化し無駄な所に時間を割かないための我々JX通信社での工夫を紹介します。

R&Dをチームで行うためのJX通信社の工夫

コードのテンプレート化

f:id:yoooongtae:20211015004824j:plain

f:id:yoooongtae:20211015004829j:plain
図3 コードのテンプレート化について

R&Dのチーム内で協力が生まれにくい大きな原因は、他メンバーのコードを読み理解することが面倒なことだと思います。個々のメンバーが規則なく、自由にコーディングを行うとこの面倒さが発生します。この状況を回避するためにJX通信社では、機械学習モデルの学習時とデプロイ時にそれぞれ利用できるテンプレートを開発し利用しています。

テンプレートを作成した目的は以下のとおりです。

  1. コードの書き方に適度な矯正をすることで、可読性を増やすこと
  2. Poetryを用いて学習環境を管理することで、学習を引き継ぐ時などに学習環境を気にしなくても良くなること
  3. 後述するMLflow等の便利系のTipsを予め仕込むことで、初学者でも"いい感じに"学習できること

テンプレートには我々の信念である "力を使うべき所にのみ注力しよう!"と同じコンセプトで作られたPytorch Lightningを用いて開発されています。(私がPytorch Lightningヘビーユーザーであり2021年11月17日のMLOps勉強会にてPytorch Lightningについて発表します。もしよろしければ、来てください!)

このテンプレートコードはJXの社員・インターンにより随時アップデートされており、誰かが一度体験した苦労を他メンバーが体験しないようにしています。

MLflow + App Engineを用いた実験の一元管理

f:id:yoooongtae:20211015005604j:plain
図4 JX通信社におけるmlflowの使い方

実験した結果を実験者本人しか知らない状況を作ってしまうと、実験の引き継いだ後に同じ実験をしてしまったり、実験の工夫が結果に及ぼす影響を定量的に共有ができなかったりと、"力を使うべき所にのみ注力しよう!"ができません! そこでJX通信社では皆が行った実験結果を1元管理できる仕組みを作成しました。Pytorch Lightningを用いたテンプレートを用いて学習しているので、実験管理は数行のコードの追加で行うことができます。弊社では実験管理のOSSとして有名なMLflowを用いて行っています。

App EngineにMLflowサーバーを構築しており、学習時に結果とモデルがアップロードされるようテンプレートコードに組み込んであります。したがって、テンプレートコードを利用すると、(実験者は意識しなくても、google colabを含む)どのサーバーで学習しても学習状況とモデルがGCSにアップロードされ、JX通信社のすべてのメンバーがすべての実験内容を把握できるようになっています。

学習状況がSlackに通知されるシステム

f:id:yoooongtae:20211015004216j:plain
図5 Slackに学習状況が通知されるシステムについて

学習の引き継ぎや、"モデルA →モデルB"のようなパイプライン状のモデルの学習を複数メンバーで分担して行う場合、他メンバーの学習の進捗状況を知りたい時が頻繁にあります。直接、進捗状況をメンバーに聞くのもありですが、そのメンバーの集中を妨げることになります。

そこでJX通信社では学習の進捗情報と精度などの結果をSlackに自動で投稿してくれる昨日を開発しテンプレートに仕込んでます。

したがって、JXの皆がテンプレートを利用し学習してくれると、自動でSlackに学習状況が共有されることになります!

まとめ

今回の記事では、MLチームにおいて"力を使うべき所にのみ注力しよう!"を達成するにチームメンバーが互いに協力しあえる環境・システム構築についてお話しました。

"力を使うべき所にのみ注力しよう!"を達成するためにはシステムで解決できる部分と解決できない部分があると思います。今回は、システムで解決できると思った部分にフォーカスしてお話しましたが、システムで解決できない部分(価値のAIをそもそも作っているのか?メンバー間のコミュニケーションはうまく取れているのか?等)についても様々な工夫をとっており、これについてもいつか記事を書ければと思ってます!

JX通信社のMLチームは、ML以外のチームとも連携し合いながら、これからもどんどん成長していきたいと思ってます!

我々とともに挑戦する仲間を求めています

我々とともに成長しながら、より良い社会のためのMLを開発したい仲間を社員・インターン問わず積極的に募集しています!また、MLエンジニアはもちろん、あらゆる職種のエンジニアを求めています!

正社員、インターン、おためし入社などなど!ほんの少しでも興味を持たれた方はこちらを覗いてみてください!