nikkie-ftnextの日記

イベントレポートや読書メモを発信

登壇報告 | #stapy にて機械学習モデルをDockerでデプロイする方法について話しました

はじめに

いつも心は虹色に! nikkieです。
9月の「みんなのPython勉強会」(参加者100人規模)に登壇しました。
機械学習モデルをDockerでデプロイする方法について10分で話しました。
このエントリで登壇報告をします。

勉強会の概要

みんなのPython勉強会#38 - connpass

「Stapy秋祭り第1弾:秋の夜長のショートトーク会」
9/15~18にPyCon JP 2018が開催されます。年に一度のPythonのお祭りに合わせて、Stapyでも秋祭りを開催します!第1弾として、「秋の夜長のショートトーク会」と題し、Python好きなGeekのみなさんに、自分の好きなテーマについて自由に語ってもらうショートトークをしていただきます。LTよりは長いけど、通常の講演(GT: General Talk)より短いトークを7件、ご用意しました。秋の夜長の季節です。Pythonの楽しい話で盛り上がりましょう。

2月くらいから「LT駆動学習」に勤しんでいたところ、大変ありがたいことに、今回登壇の機会をいただきました。

登壇:Entrance of Docker for Pythonista 〜Dockerではじめる機械学習モデルのデプロイ〜

「好きなテーマで」と言っていただけたので、「大好きなDockerを他の方にも知ってもらおう」というモチベーションで登壇しました。
聞いた方にDockerを使ってみていただきたかったので、機械学習モデルをDockerでデプロイする流れを紹介しました。

伝えたかったこと

開発環境と本番環境の双方でDockerを用いることで、動作するアプリケーションを本番環境へ持ち運べるようになります。

Dockerを使って機械学習モデルをAPIとしてデプロイする流れは、次の通りです。

  1. モデルを用意する
  2. FlaskでAPI
  3. アプリケーションをコンテナ化(Dockerfileを書いてビルド)
  4. VM(またはPaaS)にデプロイ

あやめの分類器をGCPの仮装マシンにデプロイし、この手順(仮説)を得ました。
今後他のモデルでも検証し、必要に応じてアップデートします。

テーマに至った経緯

当初は環境構築の話をしようとしていたのですが、参加者の方が聞きたいトークにするため、機械学習を絡めました。
詳しくはこちらにあります:イベントレポート | Pythonもくもく自習室 #13 あやめの分類器をAPIに組み込み、Dockerイメージ作成 #rettypy - nikkie-ftnextの日記

テーマを決める上で、こんな図を作って整理しました。
f:id:nikkie-ftnext:20180921072300j:plain

質疑より

1週間ほど前の出来事を記憶ベースで書いているので、認識違いにはご容赦ください。

Dockerのメリットの体験談

私がDockerのメリットを体験したのは、環境構築のしやすさです。
協調フィルタリングをPySparkで行う際、Dockerを使ったところ、PySparkの環境構築が手短に済みました。1
他にもデータ分析環境構築に役立つノートブックが公開されています:https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html:html

会場では話していませんが、デプロイのしやすさもあります。
VPSにDockerをインストールして、docker-compose up -dでデプロイしたところ、手動デプロイに要していた時間が劇的に短縮されました。2

Dockerの普及について

主催の @akucchan_world さんから。
アカデミックな領域ではDockerの普及が進んでいないという情報共有がありました。

私の知っている以下の情報を共有しました。

  1. DockerはGUIで使えるようにアップデート予定
  2. Kubernetesは意識しなくてよくなる方向へ向かっている(Knative)

1点目は以下の情報をベースにしています。
[速報]次期Docker for Win/Mac、GUIの数クリックで簡単にアプリケーションのコンテナ化と実行が可能に。DockerCon 2018 - Publickey
3ヶ月毎にリリースされるので、10月リリース版からはGUIで使えると期待しています。

2点目ですが、Kubernetesとは本番環境でコンテナを動かす際に使う「オーケストレーションツール」のデファクトスタンダードです。
これがクラウドで抽象化されていき、デプロイする側はKubernetesを意識しなくてよくなると理解しています。

なお、Dockerの普及が進んでいないという点に関しては、時間的な制約もあるそうです。

宿題事項

興味を持った方向けに詳細な説明を用意したいと思っています。

また、Dockerfileやソースコードについては正常系で最低限動作する状態です。
以下のアップデート項目があります。

  • アプリケーション実行ユーザを用意する(現状rootユーザ)
  • POSTしたJSONにwidth, height両方のキーがないと、FlaskのAPIは実行中にエラーを吐き、500を返す点の修正
  • APIの動作確認ができるビューがあるとよかった
  • WebAppsで動かない件のデバッグ3

アウトプットしたことの周りを固めていくことが、PyCon登壇という目標につながるんじゃないかと、今の時点では考えています。

感想

ショートトークは、懇親会のLTと景色が違いました(皆さん着席されていてまさに「講義」という感じでした)。
登壇の機会を与えてくださった、@akucchan_world さんをはじめとするstapyスタッフの皆さまに感謝します。
また、聞いていただいた参加者の方、懇親会でフィードバックをくださった方々、ありがとうございました。

stapy LT王子4代目の称号をいただいたので、引き続きLT駆動で取り組んでいきます。

実は、今回の準備は全部Dockerでやりました。4
ここまでいくとやりすぎ感もありますが、さまざまな環境を立てられるDockerは本当に便利です。
皆さまがDockerで幸せになれることをお祈りしつつ、筆を置かせていただきます。
Happy Docker Life!

脚注


  1. HadoopやMesosなどDockerを使わずに環境構築できたか、あまり自信がありません。

  2. 手順に慣れる目的なのでdocker-composeを使いました。本番環境では、Kubernetesなどのオーケストレーションツールを使うべきである点にご注意ください

  3. ENTRYPOINTやCMDの組合せが問題ではないかとご指摘いただきました。ありがとうございます。ご指摘参考に切り分けてみます。

  4. あやめの分類器作成のjupyter環境、ローカルでのFlaskアプリ作成、本番環境(GCPVM)へのデプロイ、いずれもDockerを使っています。Dockerという金槌を気に入ったことで、なんでも釘に見えている状態かもしれません。持ち歩かないちょっとした環境なら、仮想環境を使ったほうがベターだと思います。(pypro3によると、仮想環境はファイルサイズが小さいそうです)