barefoot

技術のことを書いていく

Machine Learning Production Pitch #5に参加しました

f:id:tenajima:20191212212204j:plain

[更新] (12/13) 中川さんの資料追加しました

概要

2日前に続きMachine Learning Production Pitchに参加してきたので、その備忘録です。 資料追加されましたら順次更新したいと思っています。

machine-learning-pitch.connpass.com

イントロ

  • 発表したかったらtwitterとかでつぶやくと見つけてくれるとのこと

gokartの紹介とgokartで失敗した事例

レポジトリはこちら

github.com

自分メモ

  • いつも使ってます!
  • データエンジニアとして機械学習以外全部やってるとのこと
  • luigiをwrapしたもの
  • エムスリーの機械学習バッチは全てこれにしたがって書いている
  • 1つのタスクはrequires output run を実装するだけ
  • タスクが終わることにファイルを吐くという思想
  • 再実行時などは中間ファイルが再利用される
  • ワークフローが失敗した場合そこから利用できる
  • MLエンジニアが余計なことを考えなくてすむ
    • ログ、ジョブのslack通知など本質的でないけど重要な部分をライブラリ側でサポートしている
  • レビューが楽になる
    • 型にはまったコードになり、レビューする側も楽になる
  • AIチームでは全員が全員のコードをレビューしている
  • 以下失敗事例
  • 開発時に起こりがち
  • computer scienceで難しい2つのことは「キャッシュの無効化」と「名前付け」
  • コードが新しくなってるのにキャッシュが使われてジョブが失敗することが多数
  • MLエンジニアとDataエンジニアの境目に落ちる部分
  • 早い段階ですり合わせることが大切
  • そもそもキャッシュは人類には早すぎる
  • 以下質疑応答
  • なぜluigiベース?
    • DigdagはJVM依存だからやめる
    • airflowはcloud composerのバグを踏んで重厚すぎてやめた
    • 薄い感じで自分たちも触れる点でluigiにした
    • metaflowも触ってみている
  • luigiにプルリク出さないの?
    • dynamoまわりのやつ書いたけど、置いておいたら色々変わってそのままになってしまった
  • luigiとgokartの思想の違いは?
    • outputを省略できるとか
    • 詳しくはtwitter

フリーランスだらけのML基盤開発

自分メモ

  • 最近使っているプロダクトの構成

    • 1API-1レポジトリ
    • devデプロイはcircleCIで自動化
    • なるべくシンプルな作りにしている
      • ジョインコスト低減
      • 本質的な開発に専念
    • 一方でなるべくモダンにしている
      • 新しい仲間に来てもらうための環境づくり
  • フリーランスが多いプロジェクトの悩み

    • 人材サイクルの速さ
      • 3ヶ月、6ヶ月でいなくなることも
      • キャッチアップ中にエンジニアがいなくなることも...
    • 専門領域の違い
      • 必ずしもML/サーバーサイドの両方の知識があるわけではない
      • 機械学習エンジニアにAPIの実装や並列化を任せるのはむずい
      • サーバーサイドに性能指標などを任せるのはむずい...
      • 非専門領域に積極的とは限らない
      • コミュニケーションコストがつらい
    • 残されたMLコード管理
      • 前提とされるディレクトリ構造/正解ラベル形式
      • 単一の数字化しづらい性能評価
  • 講じた解決策

  • 関心外に関与してもらわなくても良い構造
  • 異なる専門間でのコミュニケーションを削減し負担を減らす

  • 質疑応答

    • フリーランスの情報の管理はどうしている?
      • 個人情報はマスクしている
      • properから提供されない
    • type hintで制御しきれなかった例は?
      • type hintだけでなくisinstanceで見に行っている

楽しむために楽するアーキテクチャ

www.slideshare.net

自分メモ

  • リサーチャーとキャッチアップして最新の技術をプロダクトに活かせないか考えている
  • プロダクトにフィットするアーキテクチャの考察
  • 忙しい仕事内容の中で楽しく仕事するために楽するアーキテクチャを構成したい
  • statefullとstatelessが混在しているのが特徴
  • 平日と土日では負荷状況が変わる
  • 土日に負荷が大きいが、サラリーマンなので土日は遊びたい
  • 気づいたらサービスが成長しているぜって安心してみてられる開発状況を保ちたい
  • サービスの形態に応じて変更を容易にする
  • 負荷に対してエラスティックにスケールする
  • 障害が起きても勝手に回復する
  • 変更性、拡張性、回復性
  • 動画解析をマイクロサービスのDAGとして実装している
  • DAGを組み替えれば変更も容易
  • それぞれのタスクをオートスケールできるようにする
  • 冪等性を保ちつつリトライする
  • statefullなやつが厄介
  • データの層とロジックの層を分けて、SearchとUpdateのみでやりとりさせる
  • 楽しむために楽をしよう

クックパッドでの機械学習デプロイ&データフロー

自分メモ

  • 材料名や手順の正規化後ほど
  • まずはjupyeter notebookをスクリプトにする
  • 実験フローの構造化
  • Dockerで動かせるようにする
  • 最低限のテストは書く
  • 教師データを継続的に管理する
  • 大量のデータを安全に取得する(サービスに負荷をかけないようにする)
  • Redshiftに安全にクエリをするような社内ツールを使っている(サービスに負荷をかけないようにする)
  • Queury
  • HTTP APIでクエリを発行できる内製ツール
  • 機械学習エンジニア自身でデプロイまでやる
  • Hakoというデプロイツールを使っている
  • ECS上で動作する
  • 機械学習はバッチで実行している
  • dmemoを使ってDB・スキーマにメモを書いている
  • 推論結果をちゃんと使ってもらえるようにしている(使ってもらわなきゃ意味がない)
  • 機械学習エンジニアが最後まで面倒をみる
  • マイクロサービス化されているので他に迷惑をかけない

  • 質疑応答

    • 社内ツールを運用するチームがあるの?
      • SREチームなどが担当してるOSSにしてるのでPRきたりする
    • ライブラリのバージョン違いで死ぬことを管理してます?
      • pipのバージョンをちゃんと指定しておく

まとめ

普段使っているgokartの失敗事例を聞けたのはすごく貴重でした。キャッシュ、注意します。
いかに機械学習部分に集中できる環境づくりをするかというのは本当に重要だなと感じる今週となりました。