Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
機械学習関連の開発を 効率化した話 エムスリー株式会社 西場正浩(@m_nishiba) MLPP #2 会場&フードスポンサー: SmartNews
Slide 2
Slide 2 text
自己紹介 ● エムスリー株式 ● AI・機械学習チーム ● 機械学習エンジニア ● SNS ○ https://twitter.com/m_nishiba ○ https://note.mu/nishiba ● 興味あるキーワード ○ 自然言語処理、推薦システム、開発効率化、チームマネジメント、 PdM ● 資料は公開済み。手元でも確認しながら聞いてください ~
Slide 3
Slide 3 text
今日話すこと ● エムスリーの開発体制。 ○ 1アルゴリズム、1MLエンジニア ○ 1MLエンジニア、複数アルゴリズム ● 開発で感じた難しさ。 ○ データ取得のための SQL ○ クラス設計 ○ コードレビュー ○ パラメータとモデル・データの紐づけ管理 ○ 前処理後データの再利用 ○ データのバージョニング ● 行った解決方法。 ○ luigiをラップしたgokart(GitHubで公開。pip install gokart) ○ データ取得タスク群の m3mushroom(非公開)
Slide 4
Slide 4 text
エムスリーの機械学習チームの開発体制 ● 状況 ○ MLエンジニアは3人程度 ○ 設立2年弱 ○ プロダクト・プロジェクト数は 19程度 ○ 自然言語処理、推薦がメイン ● 基本は1アルゴリズム、1MLエンジニア ○ 相談や議論はする ○ 責任を持つ人、実装する人は基本的に 1人 ● 1MLエンジニア、複数アルゴリズム ○ 同時に複数のアルゴリズムの改善や開発を行うこともある。 ○ 新規開発中に他のプロジェクトが ABテスト中&要改善
Slide 5
Slide 5 text
プロダクトの開発順序 ● なるべく共通部分が多くなるようにプロダクトを作る。 ○ やらない例: 機械翻訳+非テキスト系のリコメンド +画像診断 ○ やる例: テキスト系のリコメンド、テキストの類似度、テキストのタグ付け
Slide 6
Slide 6 text
開発で感じた難しさ
Slide 7
Slide 7 text
データ取得が大変 ● データが色んなところにある ○ オラクル、Postgres、BigQuey、社内API ○ 2000年創業で20サービス以上あるので・・・ ● 色々Joinやfilterしないとモデル開発上意味のあるデータにならない。 ● サービス横断で分析するためにはフォーマットが揃っておらず色々加工する必要がある。 ○ すごいSQLを書かないと・・・
Slide 8
Slide 8 text
● そもそも設計難しい・・・ ● 他のプロジェクトでも使えるようにしたい。 ● システム開発よりMLに強みがある新卒も入社後すぐに開発する (本番で動く) ○ 1アルゴリズム、1MLエンジニア ● おれおれクラス群のコードレビュー &保守は辛い・・・ ● ログ設計難しい、解読辛い。 設計が難しい
Slide 9
Slide 9 text
パラメータとデータ/モデルの管理が大変 ● pickleを作ったときのパラメータ等を一緒に管理するのが大変 ○ e.g. 極端の話、雑なナンバリングになる ■ data/some_data.pkl ■ data/some_data_1.pkl ■ data/some_data_20190530.pkl ● (試行錯誤中)昨日、めっちゃ良いスコアが出たけど再現できない !!(パラメータが分からない ) ● ちょっと前に他のプロジェクトで作った word2vecを使いたいけど大丈夫だよね ?? ● 本番でエラーがでたけど再現できない ! DB変わっている??
Slide 10
Slide 10 text
解決方法
Slide 11
Slide 11 text
パイプラインのためのパッケージ Luigi を使う ● バッチ処理のためのパイプラインを構築するためのパッケージ ○ Spotifyが作っているOSS ○ https://github.com/spotify/luigi Task BiqQuey API DB S3
Slide 12
Slide 12 text
● Luigiを使うことのメリット ○ classの設計から解放される ! ■ requires, output, runの3つの関数を書けば良い ! ○ 設計が統一される!! ■ 新しいメンバーもすぐにキャッチアップできる !! ■ コードレビューが楽々 ○ ログがすごく読みやすい ! ■ どのタスクが成功したか ?失敗したかが一目瞭然 ○ 修正後の再実行が簡単 ■ 途中のタスクが失敗 → コードを修正 → 落ちたところから実行される。
Slide 13
Slide 13 text
さらにgokartを開発 ● Luigiをラップしたパッケージ ○ エムスリーが作っている OSS ○ https://github.com/m3dev/gokart ● gokartを使うことのメリット ○ 更にコード量が減らせる ■ 保守コスト等も減少 ■ 特にファイルの入出力周り ○ (中間)出力ファイルの管理が楽 ■ タスクのパラメータによりユニークなファイル名になる ■ ファイルが生成されたときのパラメータが保持される ○ 各タスクの実行時間を確認できる。 ○ 出力をs3にするかローカルにするかをパラメータ一つで切り替え ○ ジョブ終了時にslackに通知。
Slide 14
Slide 14 text
データ取得を共通タスク化 ● gokartを使ってデータ取得を共通タスク化した。 ○ e.g. DownloadNewsItems( from_date=date(2019, 1, 1), to_date=date(2019, 1, 31)) ○ SQL等を意識する必要がない。 ○ Pandas.DataFrameとして出力される。 Task BiqQuey API DB
Slide 15
Slide 15 text
質問どうぞ〜