EnsekiTT Blog

EnsekiTTが書くブログです。

DeepLearning界のHerokuと名高いFloydと遊んでみた話

つまりなにしたの?

Floyd Zero Setup Deep LearningというDeepLearningのサービスで自前のデータを使って学習できるようにした。

最初にやること

FloydにSignupする→メール認証まで通す
Floyd Zero Setup Deep Learning

環境を用意する

pyenv virtualenvでFloyd用の場所を作っておく。(ココは必須ではない)

pyenv install 3.5.2
pyenv virtualenv 3.5.2 floyd
mkdir floyd_env
cd floyd_env
pyenv local floyd

Floyd-cliをインストールする

$ pip install floyd-cli

Floyd loginすると

$ floyd login
Authentication token page will now open in your browser. Continue? [Y/n]:
Please paste the token here:
Login Successful

Floydが用意してくれた例で遊ぶ

f:id:ensekitt:20170509214438p:plain
動作確認できました。でも実行されたコードを良く見てみると、TensorFlowがよしなに揃えたデータセットだった。
データセットは手元にあるんだ!これをどうにかしたい!ってときのためにチュートリアルがこの記事の真の目的

新しいプロジェクトを作成する

ここからが本番

環境を用意する

$ cd first_project
$ floyd init first_proj
Project "first_proj" initialized in current directory

データセットの置き方

$ mkdir dataset
$ cd dataset
$ floyd data init MyDataSet
Data source "MyDataSet" initialized in current directory

    You can now upload your data to Floyd by:
        floyd data upload

これでdatasetディレクトリはデータセット置き場になった。
ここに、学習に使いたいデータ、教師データなどを普通にコピペなどで格納する。

データセットのアップロード

$ floyd data upload

これでfloydにアップロードされる。
とりあえず、Irisのデータセットをアップしてみることにした。
https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data

アップロードするデータセットを間違えちゃったとき

これでデータを確認する

$ floyd data status
DATA ID                 CREATED       DISK USAGE    NAME                                        VERSION
----------------------  ------------  ------------  ----------------------------------------  ---------
R5KrjnANiAkpXhNBe  1 weeks ago   1.34 MB       hogehoge/fugafufga-gan:1                            1
こんなんでてくるので消したいDATA IDメモっておく。

>|bash|
$ floyd data delete [DATA ID]

で消える。

学習用のコードを作る

floyd_requirements.txt

bunch==1.0.1
pandas==0.20.1

learn.py
ここはTensorFlowのチュートリアルからほとんどパクってきたけど、ローカルのデータセットを使うようにしてある。

from sklearn import model_selection

import pandas as pd
import numpy as np
from bunch import Bunch

import tensorflow as tf


def load_iris():
    """
    dataは[[a,b,c,d],[a,b,c,d],...,[a,b,c,d]]
    targetは[0,0,...,2]
    target_names = ["setosa", "versicolor", "virginica"]    
    """

    iris = pd.read_csv("/dataset/iris.data", header=None)
    iris = iris.replace({"Iris-setosa": 0, "Iris-versicolor": 1, "Iris-virginica": 2})
    dataset = Bunch()
    dataset.data = iris.as_matrix([0, 1, 2, 3]).astype(np.float32)
    dataset.target = np.array(iris[4])

    return dataset


def main(args):
    # Load dataset
    iris = load_iris()
    x_train, x_test, y_train, y_test = model_selection.train_test_split(
      iris.data, iris.target, test_size=0.2, random_state=42)

    # Build 3 layer DNN with 10, 20, 10 units respectively.
    feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]
    classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                                hidden_units=[10, 20, 10],
                                                n_classes=3,
                                                model_dir="/output")

    def get_train_inputs():
        x = tf.constant(x_train)
        y = tf.constant(y_train)
        return x, y

    # Fit and predict.
    classifier.fit(input_fn=get_train_inputs, steps=200)

    def get_test_inputs():
        x = tf.constant(x_test)
        y = tf.constant(y_test)
        return x, y

    score = classifier.evaluate(input_fn=get_test_inputs, steps=1)
    print("\nTest Accuracy: {0}\n".format(score['accuracy']))


if __name__ == '__main__':
    tf.app.run()

実行してみる

$ floyd run --data NqKttuToGDmXZXmmtDf8q5:dataset --env tensorflow-1.0 "python learn.py"

Creating project run. Total upload size: 34.2KiB
Syncing code ...
Done=============================] 37527/37527 - 00:00:00
RUN ID                  NAME                     VERSION
----------------------  ---------------------  ---------
V3eKUZckksHFas4Q2bv  ensekitt/first_proj:7          7


To view logs enter:
    floyd logs V3eKUZckksHFas4Q2bv

$ floyd logs -t V3eKUZckksHFas4Q2bv

ここで --dataで先程アップロードしたディレクトリの中身を/datasetという名前でマウントしたような状態にしてくれる。
そのため、実行するコードからは、/dataset/iris.dataなどとすることでファイルを開くことができる。

    • envでは実行する環境を指定できる。ココではTensorFlowの1.0系を指定している。

環境については、Environments - FloydHubから確認できる。

また、実行結果などは/outputという名前のディレクトリに出来上がるので、学習結果の保存などは/output/modelなどとすると良いみたい。
実行するとRUN IDを教えてくれるので、RUN IDを指定してログをみる。
logsに-tつけておくと勝手に終了しないので眺めている場合はおすすめ。
CTRL+Cで閉じられる。

止まらないコード書いちゃった気がする時

floyd stop V3eKUZckksHFas4Q2bv

RUN IDを指定して止められる

無事に終わって結果をダウンロードする

$ floyd data status
DATA ID                 CREATED         DISK USAGE    NAME                                        VERSION
----------------------  --------------  ------------  ----------------------------------------  ---------
RGmnbZfDrirG5UiX  3 minutes ago   1.1 MB        ensekitt/first_proj:7/output                      7
# DATA IDを確認して、outputするとブラウザが開いて結果をダウンロードできた。
$ floyd data output RGmnbDTLc2BZfDrirG5UiX

とりあえず、使うだけならこれで行けそう。

どうだったのか?

 無料枠だとCPUによる計算なので、効果を感じにくいかもしれないけど、ゲームもやらないのにGPU買ってDeepLearningをやってみようと思っている人にはいいかもしれない。
 毎回Dockerで環境を立ち上げているみたいなので、Numpyを用意されたモノ以外使いたいとか重いパッケージがあると依存関係の準備でかなり時間を食うし、ココはGPUで早くならないので単純に無駄。なるべくFloydの環境に近い状態を想定して開発して節約できる。
 Environments - FloydHubにあるDocker Imageを拾ってきて先に動かしてから、マシンパワーをFloydに借りるってワークフローをちゃんと守ればよかった。Docker Imageを拾ってきて使って見るところは今度やってみる。
 

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。