つまりなにしたの?
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 loginすると
$ floyd login Authentication token page will now open in your browser. Continue? [Y/n]: Please paste the token here: Login Successful
新しいプロジェクトを作成する
ここからが本番
環境を用意する
$ 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を拾ってきて使って見るところは今度やってみる。