はじめに
はじめまして。エムスリー AI・機械学習チームの河合(@vaaaaanquish)です。
本記事投稿日と同日、エムスリーが開発しているOSSのうちの1つであるgokartのversion 1.0.0をリリースする運びとなりました。
本記事は、これまでのgokartの軌跡と成果を紹介しつつ、内情を含めながら、gokart 1.0.0に込めた想いを綴るものです。
gokartとは
gokartは、元チームリーダーであった西場さん@m_nishibaが、AI・機械学習チームを1人立ち上げた際、チームの基盤となるよう作成した、機械学習パイプラインを取り扱うPythonモジュールです。
機械学習のパイプラインを扱うライブラリは、既存でもいくつかありますが、他のライブラリに比べ、明確に以下2つの点を意識しています。
- オブジェクト指向プログラミングにおけるSOLID原則を尊重できること
- 機械学習プロジェクトにおいて必須な再現性を確実のものにすること
@m_nishibaが元々C++といった言語を愛用していた事もあり、比較的自由に*1データやコードを扱う事のできるPythonという言語をチームで利用する時、技術的負債になりにくく読み書きしやすいコードになるような設計思想をベースにしています。特にSOLID原則におけるSingle Responsibility Principle(単一責任の原則)を推す思想で、機械学習の処理タスクを1classとして書く事で、ステークホルダーを明確にし、パイプライン全体が複雑になりにくい事を目指したモジュールです。
また、機械学習プロジェクトにおける実験と再現性、プロダクションを見据えたTDD、実際に動くbatchの運用コスト削減などをサポートするモジュールにもなっています。
メジャーな機能について、過去にも本ブログだけでなく、他社ブログ、個人ブログやイベント登壇にて紹介されているので、参考にして頂ければと思います。
- gokartを作った話 - Speaker Deck
- 機械学習プロジェクト向けPipelineライブラリgokartを用いた開発と運用 - エムスリーテックブログ
- gokartを使ってみる - Re:ゼロから始めるML生活
- PythonのPipelineパッケージ比較:Airflow, Luigi, Gokart, Metaflow, Kedro, PipelineX - Qiita
- 【gokart】Pipelineライブラリによる機械学習ワークフローの開発|はやぶさの技術ノート
- Luigiで行うパイプライン処理をより円滑に!gokartについて紹介 - Qiita
- gokartの運用と課題について - Speaker Deck
また、今回ドキュメントを拡充し、チュートリアルも作成しましたので、そちらを見て頂く形でも良いかもしれません。
gokartは、実際にエムスリーで30近くのプロジェクトで運用され続けています。BigQueryやDB、各internal APIからの取得をタスクにまとめて共通化しているだけでなく、機械学習アルゴリズム部分のtaskをredshellsという形でOSS化したり、実験管理ツールを作成するなど開発も進んでいます。 また、手前味噌ではありますが、外部の機械学習コンペティションでもgokartを利用し入賞、コードと再現を提出した結果があり、品質、実用共に整ってきている状態です。
gokart 1.0.0
gokart 1.0.0では、大きく以下のような機能を追加しました。
- ドキュメントの拡充とロゴの追加
- jupyter notebookやipython上でtaskを走らせる事ができるgokart.build
もちろん、これら以外にもいくつかの機能を追加していますので、詳しくはリリースノートをご覧下さい。
ドキュメントの拡充とロゴの追加
gokartは、OSSとして2018年から開発されています。initial commitは2018/12/23の@m_nishibaのcommitです。年末を目前にした夜中に何をやっているんでしょうかこの人は。 さておき、OSSのドキュメントのメンテナンスというものは、かなり大変な作業です。実際、gokartも長らくドキュメントが整備されず、たまに小さなコンテンツが追加されたり、examplesが用意される程度でした。 これは、gokartに対して非常に大きな参入障壁になっているという課題感だけはありながらも、機能開発を優先していた側面がありました。 今回1.0.0を出すに当たって、一気にドキュメントを整備し、チュートリアルやロゴを用意しました。
本記事筆者である河合が殆どのドキュメントを書いたので、今なら間違いが沢山見つかるかもしれません。是非コントリビュートをお待ちしております。
ロゴは、社内のスーパーデザイナーである 川上さん (@pa_kids42) に依頼し、gokartのイメージを皆で言語化しながら作成しました。 taskを運ぶカート、luigiのwrapperである事を意識した赤色基調、エッジが効いているというよりは優しく忠実な犬のイメージ、といった言葉から生まれました。 2月頃からロゴ作成のプロジェクトで協力してもらい、最終的に2ヶ月程かけて出来上がったロゴです。可愛くて私は非常に気に入っています。
gokart.build
機能としては、大きな変更としてgokart.buildというメソッドを追加しました。
gokartは、長らくコマンドラインからの実行のみをサポートしてきました。機械学習エンジンの開発ではjupyter notebookなどを利用する開発者が多い事は理解していたものの、jupyter notebookは再現性の担保やコードレビューが難しく、基本的にAI・機械学習チームでは利用していなかったという背景がありました。
今回、社内でも分析系の業務が増えてきた事や、ユーザがより気軽に扱える事を目指し、gokart.buildを追加しました。gokart.buildを利用する事で、notebook上でもgokartの再現性に関する機能の恩恵を受けられるだけでなく、本番環境で動くようなbatchへの移行もスムーズになるでしょう。
以下のように利用してください。
import gokart class TaskA(gokart.TaskOnKart): def run(self): self.dump('Hello, world!') task = TaskA() result = gokart.build(task) print(result) # Hello, world!
より細かな機能については、ドキュメントの以下をご覧下さい。
Intro To Gokart — gokart documentation
gokartメジャーバージョンリリースに寄せて
さて、少し内輪の話にはなりますが、長らくAI・機械学習チームのリーダーを務めた@m_nishibaが退職する事になりました。
gokartのメジャーバージョンリリースは、「@m_nishibaと言えばなんだろう」と考えた結果、私が企画した送別の方法の1つです。 この日のために数ヶ月、ドキュメントを準備したり、2年間放置されていた@m_nishibaが起案したissueを何とか拾って改修したり、週一回開かれるgokart勉強会でOSSとして最も使われる形は何かを議論したりしてきました。
gokartは、エムスリー AI・機械学習チームのプロジェクトの殆どに使われており、@m_nishibaが開発の目的としても置いていた「SOLID原則」「再現性」が強く守られる文化になったと私も感じています。その良さを外部でも感じられるよう、最善を尽くしたつもりです。
実は@m_nishibaはしばらく前から、AI・機械学習チームから少しずつ離れており、他チームのプロジェクトのPdMやエンジニアリンググループ全体のマネジメントに業務内容を移行していました。チームから抜けた状態でもなお@m_nishibaの影響力は凄まじく、他のチームメンバーからも開発、ビジネス、コミュニケーションといった側面で「@m_nishibaだったらチームとしてプロジェクトを成功させるためにこうする」という意識がある事を感じる瞬間があります。
長く使われる制度や技術やビジネスみたいな形あるものを残せるのもすごいけど、後々まで引き継がれる良い思想や良い空気を会社に残せる人すごいよなあと昨日から考えてる。すごい。
— ばんくし🎃 (@vaaaaanquish) 2021年3月24日
その中でも、開発に関するスピードや思想を支えていたのがこのgokartでした。
今では、多くの社内基本タスクがモジュール化されておりプロジェクトもテンプレート化されているので、「BigQueryからデータを取ってきて加工して機械学習器にかけるタスク」のような簡易なbatchであれば、AI・機械学習チームメンバーであれば1日かからず本番のkubernetesに安全かつリーダブルなコードでデプロイできるでしょう。これは開発者にとってもビジネスにとっても素晴らしい事です。
もちろん他にもビジネス面や社内外のコミュニケーションで多くの腕力を使い、見せて伝えていた@m_nishibaの行動の結果でもあるのですが、gokartが無ければ、独りチームを設立し3年で10人以上に拡大させてビジネス面で大きく貢献することは在り得なかったと思います。@m_nishibaの「顧客が本当に必要だったもの*2」を考える力の1つのアウトプットとしてgokartが在るわけです。
そして、gokart自身が1つのOSSプロジェクトとしてやっと形になった事や関連プロジェクトであるluigi、pandas、gcs client等にメンバーがコントリビュートできた事実もまた、オープンに開発し、テックブログやイベントを代表として社外へのアウトプットを忘れないという文化を作った@m_nishibaの成果だなとも思うわけです。
@m_nishibaの最終出社日である今日に合わせて、@m_nishibaにリリースボタンを押させる事ができるよう、このgokart v1.0.0の準備に協力してくれたチームメンバーやデザイナー、そして外部のコントリビュータの皆様に感謝しつつ、gokartのOSSとしてのさらなる飛躍と、@m_nishibaの次のチャレンジに胸が躍るばかりです。
おわりに
私は、@m_nishibaの寄せ書き集めも主導したのですが、最終的に殆どのチームから何らかのメッセージを貰えただけでなく、役員陣からもコメント頂き、会社に与えた影響力の大きさを改めて感じました。@m_nishibaが築いてきた資産を上手く活用しながら、gokart、そしてAI・機械学習チームもまた更に上を目指し、ガツガツ進んでいきたい所です。
ちなみに新しいチームリーダーは、お酒と画像処理が大好きないつも笑顔のマネージャー大垣さん(@Hi_king)と、お酒とバスケと文字列が大好きなパワータイプのマネージャー笹川さん(@SassaHero)の二人体制です!
臨床AI分野に飛び込む上でのサーベイ(兼ビジネス向け営業資料)を公開しました!ちゃんとコンピュータビジョンも引き続きやってます :) / 臨床AIはなにができ、何が難しいか: 臨床AI研究開発の3類型 - エムスリーテックブログ https://t.co/LYa8tJgMbj
— K.Ogaki (@Hi_king) 2020年12月14日
最近Youtuberにもなったみたいです!
エムスリーでは、上記ツイートにもある通り、NLP、レコメンド、検索、医療データ分析のようなタスクから、診断AIといった大きな機械学習モデルまで、深く広くグローバルに働くギークな仲間を募集しています。
@Hi_kingに直接連絡、もしくは以下のリンクから、是非ご応募ください。