TensorFlow 0.8で、並列分散処理がサポートされるようになったとのことだ。元記事を読んでいてもふわっとしていていてよく分からないのだが、どうやら大規模分散環境で並列処理ができるようになったらしい。 あれ?というかもともとTensorFlowって並列処理は出来てたんだよね。そのあたりが、僕の中で非常にあいまいだった。 一応、TensorFlowが最新版でなくても、マルチコアの環境ならば十分に並列処理してくれることを確認したい。
TensorFlow 0.8RC0と0.7.1 をインストールした4コアの環境を用意する
といっても利用するのはVagrantだ。Vagrant上に、4コアを搭載したUbuntuでTensorFlow 0.8RC0とTensorFlow 0.7.1の環境を作成し、動作を確認、および実行速度の計測を行う。
TensorFlow 0.8でもTensorFlow 0.7でも、マルチコアによる並列処理は実現可能
別に大規模分散環境を持っていなくても悲観することはなく、TensorFlowはGPGPUでも実行できるし、マルチコア環境でも十分にCPU能力を使ってくれる。 利用したのは以下のチュートリアルなのだが実行するのに非常に時間がかかるので一分短縮して学習処理を行わせた。
一部学習処理を短縮している。あまりにも時間がかかりすぎるためだ。
import time start = time.time() for i in range(3000): # Change 20000 to 3000 batch = mnist.train.next_batch(50) if i%100 == 0: train_accuracy = accuracy.eval(feed_dict={ x:batch[0], y_: batch[1], keep_prob: 1.0}) print("step %d, training accuracy %g"%(i, train_accuracy)) train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) elapsed_time = time.time() - start
実行時間は0.8RC0で約500秒、0.7.1で約419秒だった。これも厳密に同じ環境とは言えないので、この程度ならばバージョンが変わったことによる影響で、分散環境をサポート可否とは無関係だ。
0.8.0RC0 >>> print("Elapsed-time:{0}".format(elapsed_time)) Elapsed-time:502.545868158 0.7.1 >>> print("Elapsed-time:{0}".format(elapsed_time)) Elapsed-time:419.51450491
ちなみに、4コアのCPUもマルチコアで使ってくれる。300%くらいしか到達していないけれども。topコマンドの結果:
top - 02:13:13 up 27 min, 2 users, load average: 3.32, 1.27, 0.50 Tasks: 103 total, 2 running, 101 sleeping, 0 stopped, 0 zombie %Cpu(s): 43.8 us, 33.6 sy, 0.0 ni, 22.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 4048000 total, 755432 used, 3292568 free, 20328 buffers KiB Swap: 0 total, 0 used, 0 free. 134596 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1929 vagrant 20 0 1113688 456748 27232 S 316.5 11.3 6:54.01 python 157 root 20 0 0 0 0 S 0.3 0.0 0:00.43 kworker/2:1 1 root 20 0 33584 2956 1496 S 0.0 0.1 0:00.83 init