post Image
【2018/9月更新!】学習済みの様々なディープラーニング・モデルをメチャ簡単に利用できる! Model Asset Exchange(MAX)をご紹介します

image

TL;DR

  • せっかくトレーニング済みの著名OSSディープラーニング・モデルがあっても、モデルだけじゃ専門家でないと再利用できないじゃん
  • MAXなら1コマンドでDLモデルをRESTサービス化してくれるので、ややこしいことを知らない初心者でもモデルを楽に再利用できますよ~

って話です。

:triangular_flag_on_post: この記事によると2018/9/21付でMAXが強化されたそうなので、記述をアップデートしました。(変更点は:bulb:を付けておきます)

  • 新しいモデルが5つ追加された
  • Docker Hubにイメージが登録された(=ローカルBuildが不要で一発デプロイ)
  • Dockerに加えKubernetes環境にもデプロイできるようになった

はじめに

こんにちわ!石田です。今日はModel Asset Exchange(MAX)というIBMが始めたオープンソース・プロジェクト1の紹介をさせていただきます。

TensorFlowやKerasなどのディープラーニングのフレームワークを使ったことがある方はご存知かと思いますが、これらフレームワークでトレーニングをしたモデルはストレージ上に保管・復元ができ、可搬性があります。またフレームワーク自体に(例えばImageNetの画像データセットを使ったVGG16などの)著名で実績のある学習済みモデル(Pre-Trained Model)が含まれていて、それらのモデルを誰でも無償で予測に再利用できたり、または転移学習に使うことまで可能になっています。すごい時代になったものですね。。
とはいえ、では「誰でも簡単に学習済みモデルの利点を享受できるか?」と言うとやはり難しく、それなりに高度なフレームワークの知識が無いとせっかくのモデルも使いこなせません。そこでMAXの出番です。MAXは「オープンな学習済みのディープラーニング・モデルの成果を誰でも2簡単に活用できるようにしよう!」ということで立ち上げられたプロジェクトです。

Model Asset Exchangeって何? 1分でご説明します

  • Model Asset Exchange(MAX)は2018/3月からIBMが始めたオープンソース・プロジェクトです
  • :bulb: 2018/9月現在、「Model Asset Exchange」のサイトには以下のような感じで22個のトレーニング済みのディープラーニング・モデルがリソース一式と共に無償で公開されています(OSSなのでもちろん誰でも使えます)
    image
  • 用意されているモデルの種類はディープラーニングに絡んだもので、画像、テキスト、音声などからお好きなものを選んで利用できます。(Watson APIには無い機能も多いです)
  • 単にネット上に学習済みモデルがカタログ的に置いてあるだけではありません。モデルを簡単に使うためのWebサービス化/Docker化の仕組みと共にGithub上にリソース一式が公開されています 
  • 各種ディープラーニング・フレームワークの知識やPython/Flaskを用いたWeb公開の仕組みなどはすべて準備済みで隠蔽されていますので、開発は一切不要です
  • :bulb: DockerHubにDockerイメージが登録されたので、いちいちBuildせずに(クラウドでもオンプレミスでも)お手持ちのDocker環境に簡単にデプロイして学習済みのモデルを利用できます
  • ローカルのDocker環境でビルドしたければ、わずか3-4コマンドで簡単にモデルをDockerビルド/デプロイすることも、できます
  • Docker上で稼動するので、オンプレ/クラウド問わずデプロイできます

:alarm_clock: 1分終了です。

どんなモデルがあるの? (2018/9時点で公開中のモデルのご紹介)

以下が:bulb: 2018/9月時点で公開中のモデル一覧です。ディープラーニングということでVision,Text, Audioなど様々な分野のものがあります。Text系は英語のみ:flag_us:なので日本のお客様ではそのままは使えないかもしれませんし、癌の検出のモデルって何に使うんかいな、という気もしますが、Vision系は「画像内の複数のオブジェクトを検出する」機能とか、「画風変換」「白黒・カラー変換」機能など、既存のWatson APIのVisual Recognitionに無い機能もありますので、日本のお客様でも使えるんじゃないかと思います。

# 名称 説明 Domain Framework Application
1 Inception-ResNet-v2 第3世代のResNetを使用して画像内のオブジェクトを識別します Vision Keras Image Classification
2 Scene Classifier Places365データセットの場所/場所ラベルに従って画像を分類します Vision Pytorch Image Classification
3 Image Caption Generator 画像の内容を記述するキャプションを生成します Vision TensorFlow Image Caption Generatorv
4 Review Text Generator (レストラン評価サイトである)Yelpレビューデータセットのテキストに似た英語テキストを生成します Text/NLP Keras Language Modeling
5 Sports Video Classifier ビデオに含まれるスポーツの種類を分類します Vision TensorFlow Video Classification
6 Adversarial Cryptography3 敵対的な暗号のニューラル・ネットワークにより通信を保護します Text ? ?
7 Object Detector 単一のイメージ内の複数のオブジェクトの位置を特定し、識別します Vision TensorFlow Object Detection
8 ResNet-50 第1世代のResNetを使用して画像内のオブジェクトを識別します Vision Keras Image Classification
9 Fast Neural Style Transfer ソースイメージのコンテンツと別のイメージのスタイルを混在させた新しいイメージを生成します(画風変換) Vision Pytorch Style Transfer
10 News Text Generator One Billion Wordsデータセットのニュース記事に似た英語のテキストを生成します Text TensorFlow Text generation
11 Spatial Transformer Network3 イメージの変換や回転などの空間変換を大きなモデルに追加できるニューラルネットワークコンポーネントを学習します Vision ? ?
12 Image Segmenter イメージ内のオブジェクトを識別し、特定のオブジェクトにイメージの各ピクセルを割り当てます(≒塗り絵) Image & Video Tensorflow Semantic image segmentation
13 Audio Classifier 短いオーディオクリップ中のサウンドを特定します(≒「何の音?」) Audio Keras/TensorFlow Classification
14 Word Embedding Generator3 テキストファイルから埋め込みベクトルを生成します Text ? ?
15 Breast Cancer Mitosis Detector 有糸分裂腫瘍細胞の画像に有糸分裂が存在するかどうかを検出します Vision Keras Cancer Classification
16 Image Colorizer 白黒画像をカラー化します Vision TensorFlow Image Coloring
17 Audio Embedding Generator オーディオファイルから埋め込みベクトルを生成します Audio TensorFlow Embeddings
18 :bulb: Facial Age Estimator  顔のイメージから年齢を推測します Vision Keras & TensorFlow Facial Recognition
19 :bulb: Facial Recognizer  イメージから顔を識別します Vision TensorFlow Face Detection
20 :bulb: Weather Forecaster  過去のデータから天候を予想します Weather TensorFlow / Keras Time Series Prediction
21 :bulb: Name Generator 3 Kaggle US Baby Namesをベースに名前を生成します Text TensorFlow Text generation
22 :bulb: Audio Sample Generator  up, downなどの簡単な命令について、指示する音声のバリエーションを生成します Audio TensorFlow Audio Modeling

MAXの裏の仕組み(結局、何やってんの? )

以下が仕組み面のイメージ図です。MAXを使わない場合はフレームワーク毎の「学習済みモデル」(図の右上に相当)があるだけですが、MAXを使えばそのモデルを使ったRESTのエンドポイントを自動的に生成してくれるのでクライアントからのモデルの利用(Consume)がとても楽4になります。(Tensorflow, Kerasなどフレームワーク毎のお作法の違いを吸収して統一的なアクセス方法を提供できる利点も見逃せません)

:bulb: Docker Hubを使う場合(1コマンドで完了=楽!)

image
:one: すでにDocket Hub上にイメージ一式が置いてあります。
:two: 動かしたい環境に対してデプロイします( docker run or kubectl apply -f )
:three: デプロイの過程で、自動的にクラウド上に公開されている学習済みモデルをwgetして起動時にロードしてくれます。さらにFlaskを使ってRESTのエンドポイントも準備してくれます。(要は「終わるのを待ってればいい」だけです。)
:four: 起動したらあとはRESTのエンドポイントを叩いて使うだけ、です。

自分でDockerイメージをローカル・ビルドしたい場合

イメージをカスタマイズしたい、などの場合はこちらの方法を。

image

:one: まずは使いたいモデルのGithubリポジトリをクローンします( git clone )
:two: Dockerファイルをビルドします( docker build )
:three: ビルドの過程で、自動的にクラウド上に公開されている学習済みモデルをwgetして起動時にロードしてくれます。さらにFlaskを使ってRESTのエンドポイントも準備してくれます。(要は「終わるのを待ってればいい」だけです。)
:four: イメージのビルドが終わったら起動します( docker run )
:five: あとはRESTのエンドポイントを叩いて使うだけ、です。

具体的な使い方

使いたいモデルの「Get the model」ボタンを押すと対応するGithubのページに飛ぶので、そこに書いてあるビルド/デプロイ手順を実行するだけ、です。以下の3通りの方法が書かれています。

① Docker Hub上のイメージを使ってDockerへデプロイ
② Docker Hub上のイメージを使ってKubernetesへデプロイ
③ 自分でイメージをローカルビルドしてデプロイ

image

Image Colorizer(白黒写真をカラー化)を使ってみた

ということで、わかりやすい例としてImage Colorizerを使って白黒写真をカラーに着色してみます。結果、ローカルビルドでも数分でモデルをRESTを介して使えました。めちゃ簡単すぎるやん!

0. 前提環境

Dockerが動くこと。私はUbuntu 16.4上のDocker 17.12を使いました。

1.githubのクローン

git clone https://github.com/IBM/MAX-Image-Colorizer.git

root@ubuntu:~# git clone https://github.com/IBM/MAX-Image-Colorizer.git
Cloning into 'MAX-Image-Colorizer'...
remote: Counting objects: 35, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 35 (delta 8), reused 26 (delta 5), pack-reused 0
Unpacking objects: 100% (35/35), done.
Checking connectivity... done.
root@ubuntu:~# cd MAX-Image-Colorizer
root@ubuntu:~/MAX-Image-Colorizer# ls
api  app.py  assets  config.py  core  Dockerfile  docs  LICENSE  README.md

2.Dockerイメージのビルド

docker build -t max-image-colorizer .

root@ubuntu:~/MAX-Image-Colorizer# docker build -t max-image-colorizer .
Sending build context to Docker daemon  1.561MB
Step 1/12 : FROM continuumio/miniconda3
latest: Pulling from continuumio/miniconda3
cc1a78bfd46b: Pull complete
c9741e205978: Pull complete
(途中省略..)
Successfully built 4721133808e2
Successfully tagged max-image-colorizer:latest

3.Dockerの起動

docker run -it -p 5000:5000 max-image-colorizer

root@ubuntu:~/MAX-Image-Colorizer# docker run -it -p 5000:5000 max-image-colorizer
2018-07-23 08:36:30.212096: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

4.使ってみる

ブラウザーでホスト名:5000番ポートにアクセスするとUIが開きます。
image

こんな感じでswaggerも見られます
image

modelのPOSTで/predictを選択し「Try it out」ボタンを押すとイメージ選択ボタンが表示されます。

image

ボタンで任意の白黒の画像ファイルを選択して「Execute
image

すると以下のようにカラー彩色されたPNGファイルが戻ります。
image

いくつかやってみましたが、こんな感じでした。めっちゃ簡単やん!
image

:bulb: Docker Hubのイメージを使うと、もっと簡単!

2018/9月の拡張でDocker Hubにイメージが登録されたので、コマンド一発でデプロイできるようになりました。実際、まっさらなDocker環境で docker run -it -p 5000:5000 codait/max-image-colorizerを一発打って数分放置してたら最後まで動きました。簡単すぎて、まじ、達成感無いっす(←褒めてます)。

root@ubuntu:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              f2a91732366c        10 months ago       1.85kB
root@ubuntu:~# docker run -it -p 5000:5000 codait/max-image-colorizer
Unable to find image 'codait/max-image-colorizer:latest' locally
latest: Pulling from codait/max-image-colorizer
cc1a78bfd46b: Pull complete
<<途中割愛>>
46ce75ca6fb7: Pull complete
Digest: sha256:adf6dcf9c10e80faa0f81f9fe4f7e3af5153dade9a49c644554894ff101b7a5a
Status: Downloaded newer image for codait/max-image-colorizer:latest
2018-09-28 02:47:35.265659: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

画面等は前述と同じなので割愛します。

クライアント側のアプリのサンプルもあります

前述の通り、事前に準備されたディープラーニングのモデルを「お試し」で使ってみるだけなら、生成されたSwaggerのUIを使って簡単に確認できます。業務で使う場合のクライアント側のアプリケーションのサンプルも以下の2つが公開されています。(っても難しい/プロプラエタリな知識は不要です。オープンなので、要はUIがあってRESTでリクエスト出してレスポンスを何らかの方法で描画できればいいんです)

:newspaper: Use an open source image caption generator deep learning model to filter images based on their content in a web application – Imageのキャプションを生成するImage-Caption-Generatorを呼び出すクライアント・アプリケーションのサンプル。(:octocat:コード付き) :warning: サンプルアプリはImage-Caption-Generatorとは別にデプロイする必要があります

image

:octocat: Object-Detector – こちらは一枚のイメージの中に写っている複数のオブジェクトを識別するもの。RESTで呼び出すだけだと、生のJSONが返るだけ(左側)でぜんぜん面白くありません。そこでサンプルアプリで場所(枠)を描画しています(右側):warning: 当サンプルアプリはObject-Detector本体に含まれていますので、http://your-host:5000/app からアクセスできます。上のサンプルと違って、別途アプリをデプロイする必要はありません、

image 

Kubernetes環境(CaaS) へのデプロイ (2018-08-13 追記)

:newspaper: 記事「Deploying Deep-Learning Models to Kubernetes on IBM Cloud」でMAXのモデルをKubernetes Service on IBM Cloudにデプロイする方法も公開されています。要はKubeにデプロイするためのyamlファイルもGithub上に準備してあるから、あとはkubectl apply -f ./max-object-detector.yamlてな感じでデプロイするだけ、です。標準的なものなので、中身を書き換えれば他社のCaaSにもデプロイできるはず。

最後に

Github上で提供されているDockerFileやPythonのソースを見るとわかりますが、「中でやってること」は難しいことやアクロバティックなことは特にしてません。フツーのことをフツーにやってる印象なので、同じようなことは自作でもがんばればできそうです。もしMAXに登録されていないモデルをお持ちであれば、同様の処理方式で包んでサービス化することも比較的容易ではないかと思います。(要はデザイン面の参考/雛形としての用途) いずれにせよ、MAXのエントリは今後も拡充していくそうなので、お楽しみに!

またCODAITチームは他にも様々な啓蒙活動をしています。ご興味のある方は下記などご参照くださいませ。

:newspaper: CODAITチームのページ(Center for Open-Source Data & AI Technologies)
:file_folder: SlideShare – Open Source AI – News and examples – CODAITチームの活動の全容紹介プレゼンチャート

参考文献

IBM Code
IBM Code – Model Asset Exchange

:newspaper: ブログ記事

:newspaper: 2018/3/20 Igniting a community around deep learning models with Model Asset eXchange (MAX) – MAXのお披露目ブログ
:newspaper: Creating a center of gravity around open source data and AI technologies
:newspaper: 2018/06/25 Deploy a Deep Learning model in seconds with the IBM Code Model Asset Exchange
:newspaper: 2018/06/29 Deploying Models from IBM’s Model Exchange to Kubernetes – おなじみNickさんのブログ。MAXのイメージをKubernetesにデプロイする方法
:newspaper: 2018/07/12 Using a model from the Model Asset eXchange (MAX) in a web application – MAX上のモデルを使ったWebアプリケーションの例として、画像のイメージ・キャプションを生成するサンプルアプリケーションをソース付きで紹介
:newspaper: 2018/07/16 Announcing newly released models in the IBM Code Model Asset eXchange – MAXに新しく追加されたモデルの紹介や使い方など
:newspaper: 2018/08/01 Reusing Open Source Models in AI Applications – Nickさんのブログ。MAX以外にも有名なモデル・エクスチェンジをいくつか紹介してます


  1. ご参考までに当プロジェクトはIBMのCODAITという専門チームがリードしています。このチームは以前「Spark_Technlogy_Center」という名前でApach_Sparkの啓蒙活動やSystemMLの開発などやっていたのですが、「これからはAIだ!」ってことで本年3月に同チームが発展的に解消してできたのがCODAITチームです。 

  2. 「誰でも」は、言葉のあやで、正確には「IT系のスキルをお持ちのデベロッパーなら誰でも」ですね。さすがにITのことを一切知らない方には無理っす。。 

  3. これらのサービスは追加でWatson_Studioでトレーニング可能です 

  4. 「モデルの利用を楽に」という意味では、様々なディープラーニング・フレームワーク間のモデルの互換性・可搬性を確保するための共通フォーマットONNXが思い浮かびますが、あれは絵で言えば右上のDLフレームワーク群と学習済みモデルのあたり(:three:周辺)の形式を共通化するお話です。MAXはさらに広くモデルのサービス化やConsumeの部分も対象領域にしています。(要は課題感は似てますが、カバーする領域が違います) 


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。