事の発端
ディープラーニング試したいけど、実験のためだけにAWS使うのは高いしなぁ…。
おや、手元にRaspberryPIがあるぞ
RaspberryPIでTensorflow動くかな
+
Tensolflowってマルチノードので動くかな
||
RaspberryPIでTensorflowのマルチノード動くんじゃね?
環境構築
samjabrahams/tensorflow-on-raspberry-pi
https://github.com/samjabrahams/tensorflow-on-raspberry-pi
Githubでパッケージと手順が公開されているので、こちらを参考に作っていきます。
現時点(2016/12/11)の最新版は0.11版です。
マルチノードで使おうとすると複数台にインストールしないといけないです。
手動で構築するのが面倒なのでAnsible使いましょう
roleは載せておくので、inventoryとplaybookは難しくないので自作してください。
role/rpi-tensorflow/tasks/main.yml
---
- name: apt-get install python-pip python-dev
apt:
name: "{{ item }}"
update_cache: yes
with_items:
- python-pip
- python-dev
- name: wget tensorflow package
get_url:
url: "https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v0.11.0/tensorflow-0.11.0-cp27-none-linux_armv7l.whl"
dest: /opt/tensorflow-0.11.0-cp27-none-linux_armv7l.whl
- name: pip install tensorflow
pip:
name: "file://opt/tensorflow-0.11.0-cp27-none-linux_armv7l.whl"
Tensorflowを動かしてみましょう
分散TensorFlowでロジスティック回帰 -Distributed TensorFlow- その2
http://x1.inkenkun.com/archives/5487
こちらの方の「並列実行版ソースコード」を試してみます
psノード2台、workerノード2台で実行してみます
各ノードで以下のコマンドを実行します
ノードごとに--job_nameと--task_indexが異なりますので注意してください
raspberryPI 1号機
python trainer.py --ps_hosts=192.168.12.111:2222,192.168.12.112:2222 --worker_hosts=192.168.12.113:2222,192.168.12.114:2222 --job_name=ps --task_index=0
raspberryPI 2号機
python trainer.py --ps_hosts=192.168.12.111:2222,192.168.12.112:2222 --worker_hosts=192.168.12.113:2222,192.168.12.114:2222 --job_name=ps --task_index=0
raspberryPI 3号機
python trainer.py --ps_hosts=192.168.12.111:2222,192.168.12.112:2222 --worker_hosts=192.168.12.113:2222,192.168.12.114:2222 --job_name=worker --task_index=0
raspberryPI 4号機
python trainer.py --ps_hosts=192.168.12.111:2222,192.168.12.112:2222 --worker_hosts=192.168.12.113:2222,192.168.12.114:2222 --job_name=worker --task_index=1
結果
raspberryPI3号機
(中略)
Step: 2402, Epoch: 9, Batch: 400 of 550, Cost: 30.9763, AvgTime: 29.30ms
Step: 2477, Epoch: 9, Batch: 550 of 550, Cost: 36.5495, AvgTime: 26.74ms
Step: 2577, Epoch: 10, Batch: 200 of 550, Cost: 31.5500, AvgTime: 34.01ms
Step: 2677, Epoch: 10, Batch: 400 of 550, Cost: 36.4854, AvgTime: 29.63ms
あれ・・・終わらない・・・。
raspberryPI4号機
(中略)
Step: 2242, Epoch: 9, Batch: 199 of 550, Cost: 10.8887, AvgTime: 62.20ms
Step: 2342, Epoch: 9, Batch: 399 of 550, Cost: 44.7798, AvgTime: 29.66ms
Step: 2517, Epoch: 10, Batch: 199 of 550, Cost: 33.3699, AvgTime: 60.06ms
Step: 2617, Epoch: 10, Batch: 399 of 550, Cost: 70.1540, AvgTime: 30.21ms
Test-Accuracy: 0.92
Total Time: 144.51s
Final Cost: 20.0725
done
workerの片方が処理終わると、もう片方は処理終わらないぞ。。。
最後に
ちょっと挙動がおかしいけど、コードそのままでraspberryPIでも動くって素晴らしい