FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

TensorFlow 0.8で並列分散処理がサポートされたけどマルチコア環境ではすでに並列処理で動いている

TensorFlow 0.8で、並列分散処理がサポートされるようになったとのことだ。元記事を読んでいてもふわっとしていていてよく分からないのだが、どうやら大規模分散環境で並列処理ができるようになったらしい。 あれ?というかもともとTensorFlowって並列処理は出来てたんだよね。そのあたりが、僕の中で非常にあいまいだった。 一応、TensorFlowが最新版でなくても、マルチコアの環境ならば十分に並列処理してくれることを確認したい。

TensorFlow 0.8RC0と0.7.1 をインストールした4コアの環境を用意する

といっても利用するのはVagrantだ。Vagrant上に、4コアを搭載したUbuntuでTensorFlow 0.8RC0とTensorFlow 0.7.1の環境を作成し、動作を確認、および実行速度の計測を行う。

github.com

github.com

TensorFlow 0.8でもTensorFlow 0.7でも、マルチコアによる並列処理は実現可能

別に大規模分散環境を持っていなくても悲観することはなく、TensorFlowはGPGPUでも実行できるし、マルチコア環境でも十分にCPU能力を使ってくれる。 利用したのは以下のチュートリアルなのだが実行するのに非常に時間がかかるので一分短縮して学習処理を行わせた。

Deep MNIST for Experts

一部学習処理を短縮している。あまりにも時間がかかりすぎるためだ。

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

趣味で動かす程度ならば0.8のアップデートで劇的に性能が改善することはない

それよりも、GPGPUを買ってGPGPU対応のTensorFlowを動かしたほうが、よっぽど効率的かもね。