Help us understand the problem. What is going on with this article?

Google DatalabコンテナにElixirを入れてTensorflexを動かそう

More than 1 year has passed since last update.

(この記事は、「fukuoka.ex(その2) Elixir Advent Calendar 2017」の24日目、および「ディープラーニングのエンジニアリング Advent Calendar 2017」の6日目です)

昨日は、@tuchiroさんのElixirでSI開発入門 #9 Railsからのモデルの移行2(DDLをパースする)でした

前回までElixirからRustlerを経由して外部言語インターフェースのさまざまな可能性を探ってきました。
今回はGCPの公式コンテナである「Cloud Datalab」にElixirをインストールして、ElixirのTensorFlowバインディングである「Tensorflex」を試してみます。

前回までの記事は、以下になります
ElixirのGenStageに入門する #1
|> ElixirのGenStageに入門する#2 バックプレッシャーを理解する
|> Elixir並列処理「Flow」の2段ステージ構造を理解する
|> Elixirから簡単にRustを呼び出せるRustler #1 準備編
|> Elixirから簡単にRustを呼び出せるRustler #2 クレートを使ってみる
|> Elixirから簡単にRustを呼び出せるRustler #3 いろいろな型を呼び出す
|> Elixirから簡単にRustを呼び出せるRustler #4 SHIFT-JIS変換を行う
|> Elixirから簡単にRustを呼び出せるRustler #5 NIFからメッセージを返す


4/27から、44日間に渡り、毎日お届けしている「季節外れのfukuoka.ex Elixir Advent Calendar」「季節外れのfukuoka.ex(その2) Elixir Advent Calender」ですが、Qiitaトップページトレンドランキングに13回入賞、Elixirウィークリーランキングでは7週連続で1/2/3フィニッシュを飾り、各種ランキング通算で、トータル87回ものランクインを達成しています

みなさまの暖かい応援に励まされ、合計616件ものQiita「いいね」もいただき、fukuoka.exアドバイザーズとfukuoka.exキャストの一同、ますます季節外れのfukuoka.ex Advent Calendar、頑張っていきます:rocket:

image.png


オールインワン機械学習Dockerコンテナ

Googleによって提供されるColud DatalabはTensorFlowに加え、Python2/3+Jupytor Notebook+Python向け機械学習用プラグインが入ったオールインワンのコンテナです。TensorFlowは最新版にメンテされてます

既に環境構築が終わっている方でも、TensorFlowの新しめのAPIであるEstimator、KerasAPIや、Tensorfow-hubなどの機能を試すこともできます。

Elixirに興味がない方でも、のローカル環境へのDatalab1行構築は必見なので是非見て行ってください。

このコンテナはGCP上にデプロイすれば、煩雑なGPUドライバーのインストールも不必要なうえ、BigQueryやCloud Storageが統合された高度な環境をすぐに使い始めることができます。(参考:TensorFlowのGPU環境をGCPでさくっと作る方法)

このDatalab。実は、ローカルのDockerにもインストールできる優れものなんです。(今回GPUが使えるかどうかは不明)

一般的な開発に機械学習用の環境を整備しようとすると、まずPythonのバージョンが問題になってきます。PythonはNode.jsのCコンパイル環境で使われていたりするので、バージョン管理が必須となってきます。パッケージのアップデートも頻繁なので、迂闊にアップデートしてしまうと、pythonが起動しないなんてことも、多々あります。

Datalabを使えば、そのような煩雑な管理から解き放たれるのです。

お金がかからないローカルの環境にオールインワンの環境を作りましょう。

後半では、Elixir界隈で話題となったElixirのTensorFlow bindingsである「Tensorflex」をこのコンテナにインストールして動かしてみます。さて、いかなるものなのでしょうか?

Docker環境

まずは、Docker環境が必要です。
Dockerについてはここでは扱いませんので、各OSに合わせたインストールをお願いします。

ローカルインストール

以下長々と書いてはいますが、実際実行するのは1行のみです。安心して読み進めてください。

※筆者はWindows 10 Home EditionでDocker Toolboxを使用しています。
実はDocker Toolboxはサポート外なのですが、今回の使用範囲では問題がなかったことをご報告しておきます。

では、始めましょう。

まずはターミナルを立ち上げます。(Win10 Home Editionの方はDocker Quickstart Terminal)

以下のコマンドを入れます。<PROJECT_ID>はローカルにインストールする場合は、任意の英数字を入れて下さい。

docker run -it -p "127.0.0.1:8081:8080" -v "${HOME}:/content" \
  -e "PROJECT_ID=<PROJECT_ID>" \
  gcr.io/cloud-datalab/datalab:local

  • Win10 Home Edition (Docker Toolbox)利用の場合は
docker run -it -p "8081:8080" -v "${HOME}:/content" \
  -e "PROJECT_ID=<PROJECT_ID>" \
  gcr.io/cloud-datalab/datalab:local

Datalab公式のローカルインストール方法はこちらになります

フォルダーの指定について(Windowsの場合)

Windowsでマイドキュメントの配下をコンテナと共有したい方だけ、ここをお読み下さい。

Windowsでマイドキュメントの内にdatalabフォルダを作って、コンテナと共有したい場合は次のようにします。共有フォルダの場所は、作業効率に地味に影響しますので、Dockerに慣れたら吟味しましょう。

export MYFOLDER=${HOME}/My\ Documents/datalab

Dockerのオプション

-v "${MYFOLDER}:/content"

Jupytor NoteBookにつないでみる

しばらく待って、以下のようなメッセージが出たら、コンテナの起動完了です。

Open your browser to http://localhost:8081/ to connect to Datalab.

次のような画面が現れたら、インストール成功です!
Dockerだと、1行で終了ですね!

このまま、Jupytor notebook(IPython)としてお使いいただけます。

Notebookの内容も、共有フォルダに書き込まれるので、コンテナを終了しても作業内容は残りますので、ご安心下さい。

ブラウザからhttp://localhost:8081/でつないでみてください。
(Docker toolboxの場合はhttp://192.168.99.100:8081/)

datalab-init.png

うまく、つながったでしょうか?
次のセクションからは、Elixirのインストールになるので、ご興味がない方は最終章をご覧ください。


Datalabコンテナに侵入する

コンテナが無事起動できたところで、今度はElixirをインストールすべく、コンテナに侵入します。

  • 通常の環境の場合

Ctrl+p を押して Ctrl+q を押す

  • Docker Toolboxの場合

Toolboxで上記Ctrl+pqをやると、ターミナルが固まってしまいます。
 Docker Quickstart Terminalで別のシェルを立ち上げます。

docker psコマンドで、datalabコンテナが確認できます。

docker ps

Datalab Docker PS .png

DatalabのコンテナIDの2桁(他のIDと区別できる最小文字数)を控えて、次のコマンドを実行して下さい。上記コンテナでは9bなので、以下のようにします。

docker exec -it 9b bash

これは、コンテナの中に新たにbashを立ち上げて、コンソールで操作を行うという意味です。

コンテナへの侵入が成功すると、次のようになります。
Docker exec entered.png

「/contentフォルダ以外の変更はpipやapt-getを含めコンテナを終了したら無効になりますよ」という親切な案内です。


コンテナ探索

DatalabコンテナのOSはubuntu 16.04です。
anacondaが入っているので、環境を見てみましょう。

/content> conda env list
# conda environments:
#
base                  *  /usr/local
py2env                   /usr/local/envs/py2env
py3env                   /usr/local/envs/py3env

pyenv2pyenv3で環境の切り替えが可能なことがわかります。
sourceコマンドで環境を有効化できます。

/content> source activate py3env
(py3env) /content> pip3 freeze

以下抜粋ですが、メジャーどころのパッケージはほぼ入ってます。

matplotlib==2.1.2
numpy==1.14.0
pandas==0.22.0
scipy==1.0.0
scikit-learn==0.19.1
seaborn==0.7.0
tensorflow==1.8.0

Elixirをインストールする

Elixir公式サイトの手順どおりでubuntu用のelixirをインストールします。ルートユーザーなのでsudoは外す必要があります。

インストールの手順は以下の通り、コマンドを流すだけです。
esl-erlangのインストールで追加で359MBストレージを使う確認が出てきますが、大文字で「Y」を入力してください。

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && dpkg -i erlang-solutions_1.0_all.deb

apt-get update
apt-get install esl-erlang
apt-get install elixir

iexでこのように表示されれば、インストール成功です。Ctrl+\で抜けましょう。

(py3env) /content> iex
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.6.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>

Tensorflow C bindingsのインストール

次は、Tensorflexを動かすためにTensorflow C bindingsを入れます。
以下はsudoを取り除いてあります。

TF_TYPE="cpu"
OS="linux"
TARGET_DIRECTORY="/usr/local"
curl -L \
  "https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-${TF_TYPE}-${OS}-x86_64-1.8.0.tar.gz" |
  tar -C $TARGET_DIRECTORY -xz

インストールが成功したら、ldconfigを実行しておきましょう。

ldconfig

公式サイトのインストール手順はこちら

Tensorflexのインストール

TensorflexはTensorFlowをElixirから使うライブラリとして、あるカンファレンスのスライドで取り上げられたものです。ここでは、Tensorflexの実行環境を作ります。

※ Tensorflex version 0.1.2現在

mix.exsのdepsに書きを追加してください。
elixir:mix.exs
{:tensorflex, "~> 0.1.2"}

シェルから次のコマンドを実行すれば、インストール完了です。

mix deps.get

※ 以前のやり方

まず、tensorflexのリポジトリをクローンします。

git clone https://github.com/anshuman23/tensorflex.git

cd tensorflex

Makefile内のERLANG_PATHがデフォルトでは7.3になっています。

ERLANG_PATH = /usr/lib/erlang/erts-7.3/include

sedで9.3に書き換えます

sed -i -e 's/erts-7.3/erts-9.3/' Makefile

あとは

mix deps.get
mix compile

でインストール完了です。

動かしてみる

早速対話環境で実行してみましょう。

$ iex -S mix

Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]

make: 'priv/Tensorflex.so' is up to date.
Interactive Elixir (1.6.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> m = Tensorflex.create_matrix(2,3,[[2.2,1.3,44.5],[5.5,6.1,3.333]])
#Reference<0.343416744.1264451585.214396>
iex(2)> Tensorflex.matrix_pos(m,2,1)
5.5
iex(3)> Tensorflex.size_of_matrix m
{2, 3}
iex(4)>

無事実行できました。

※ 実行時に以下のエラーが出る場合は、
deps\priv\Tensorflex.soを削除してcd deps\tensorflexでディレクトリ移動後makeを実行して、soファイルを再ビルドして下さい。

21:49:42.478 [warn] The on_load function for module Elixir.Tensorflex.NIFs returned:
{:error, {:bad_lib, 'Library version (2.14) not compatible (with 2.13).'}}

Tensorflexのソースをひと通り眺めたところ、現在出来ることは、README.mdに書いてあることが全てのようです。つい数日前にSessionが実装されました。もともと、静的グラフデータのロードは出来ていたのでSessionが走るのは大きな進歩でしょう。 低レベルのAPIを中心に着実に機能が増えつつあります。

Elixirの作者José Valimさんとも頻繁にコミュニケーションを取ってるようで、今後の機能充実に期待です。

2018/8/21追記 - v0.1.2では、jpgファイルのロードが可能になり、Inception-v3を使った分類が可能になっています。

ElixirのGPU対応といえば、fukuoka.exコアメンバーの @zacky1972 氏こと、北九州市立大学の山崎進准教授のOpenCL対応も忘れてはいけません。ElixirからRustでGPU駆動した記事を改めてご紹介しておきます。
「ZEAM開発ログv0.1.6 Elixir から Rustler で GPU を駆動しよう〜ElixirでAI/MLを高速化」


コンテナのElixir環境を保存する

Elixirの作業環境を保存しておきたい方は、以下を進めてください。
Ctrl+\でElixirを抜け、exitでコンテナから抜けます。

下記のコマンドで、「datalab-elixir:latest」をタグ名を付けてDocker Imageを保存することができます。 ※コンテナのhashは上記の例でいけば9bとなります。

docker commit [コンテナのhashの一部] datalab-elixir:latest

次回からは、以下のコマンドでElixir入りの機械学習環境を楽しむことができます。

docker run -it -p "8081:8080" -v "${HOME}:/content" \
  -e "PROJECT_ID=<PROJECT_ID>" \
  datalab-elixir:latest

コンテナの終了

Elixirのインストールをしてない場合は、Open your browserの表示のところでCtrl+Cを押すとコンテナ終了が終了します。

Docker Toolbox利用の場合は、exitでdocker execを行ったコンテナを抜けてから、上記を行ってください。

今回の設定の場合、コンテナは使い終わっても破棄されないため、docker ps -aで止まっているコンテナを確認して、docker rmで削除しておきましょう。

docker ps -a
docker rm 9b

終わりに

Datalabでの環境構築いかがだったでしょうか。皆様の開発にお役にたてれば幸いです。

明日は @takasehideki さんの「ElixirでIoT#5:関数型言語からGroveモジュールを使ってみた」になります。

twinbee
フリーランスエンジニア Fukuoka.exでelixir強力推し 自社販売管理EPRパッケージによる基幹系ソリューションを手掛けてます Delphi / Oracle 案件納入歴 20年 フロントエンド vue.js / vuex / typescript サーバーサイドは Oracle / dot netcore C# / Elixir / Node.js
fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ
https://fukuokaex.fun/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした