如何在hadoop上加速tensorflow的执行?

8nuwlpux  于 2021-06-01  发布在  Hadoop
关注(0)|答案(5)|浏览(534)

下面的脚本执行得非常慢。我只想计算twitter follower图(约26gb的文本文件)中的总行数。
我需要执行一个机器学习任务。这只是一个通过tensorflow从hdfs访问数据的测试。

import tensorflow as tf
import time

filename_queue = tf.train.string_input_producer(["hdfs://default/twitter/twitter_rv.net"], num_epochs=1, shuffle=False)

def read_filename_queue(filename_queue):
    reader = tf.TextLineReader()
    _, line = reader.read(filename_queue)
    return line

line = read_filename_queue(filename_queue)

session_conf = tf.ConfigProto(intra_op_parallelism_threads=1500,inter_op_parallelism_threads=1500)

with tf.Session(config=session_conf) as sess:
    sess.run(tf.initialize_local_variables())
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)

    start = time.time()
    i = 0
    while True:
        i = i + 1
        if i%100000 == 0:
            print(i)
            print(time.time() - start)

        try:
            sess.run([line])
        except tf.errors.OutOfRangeError:
            print('end of file')
            break
    print('total number of lines = ' + str(i))
    print(time.time() - start)

这一过程需要大约40秒的前100000行。我试着 intra_op_parallelism_threads 以及 inter_op_parallelism_threads 到0、4、8、40、400和1500。但对执行时间影响不大。。。
你能帮助我吗?
系统规格:
16 gb内存
4个cpu核

pgpifvop

pgpifvop1#

你可以把大文件分成小文件,这可能会有帮助。将线程内并行度和线程间并行度设置为0;
对于许多系统来说,用多个进程读取单个原始文本文件并不容易,tensorflow只能用一个线程读取一个文件,因此调整tensorflow线程没有帮助。spark可以用多个线程来处理文件,因为它将文件划分为块,每个线程读取它的块中的行内容,而忽略第一个线程之前的字符 \n 因为它们属于最后一个街区的最后一行。对于批量数据处理,spark是较好的选择,而tensorflow是较好的机器学习/深度学习任务;

b1zrtrql

b1zrtrql2#

试试这个,它会改善你的时间安排:

session_conf = tf.ConfigProto   
(intra_op_parallelism_threads=0,inter_op_parallelism_threads=0)

当您不知道什么是最佳值时,将配置掌握在自己手中是不好的。

monwx1rj

monwx1rj3#

https://github.com/linkedin/tony
使用tony,您可以提交一个tensorflow作业,并指定worker的数量以及它们是需要cpu还是gpu。
使用tony在多台服务器上运行时,我们能够获得几乎线性的加速(inception v3模型):

下面是如何使用自述文件中的示例:
tony 目录还有一个 tony.xml 它包含了所有的作业配置。例如:

$ cat tony/tony.xml
<configuration>
  <property>
    <name>tony.worker.instances</name>
    <value>4</value>
  </property>
  <property>
    <name>tony.worker.memory</name>
    <value>4g</value>
  </property>
  <property>
    <name>tony.worker.gpus</name>
    <value>1</value>
  </property>
  <property>
    <name>tony.ps.memory</name>
    <value>3g</value>
  </property>
</configuration>

有关配置的完整列表,请参阅wiki。
型号代码

$ ls src/models/ | grep mnist_distributed
  mnist_distributed.py

然后你就可以开始你的工作了:

$ java -cp "`hadoop classpath --glob`:tony/*:tony" \
            com.linkedin.tony.cli.ClusterSubmitter \
            -executes src/models/mnist_distributed.py \
            -task_params '--input_dir /path/to/hdfs/input --output_dir /path/to/hdfs/output --steps 2500 --batch_size 64' \
            -python_venv my-venv.zip \
            -python_binary_path Python/bin/python \
            -src_dir src \
            -shell_env LD_LIBRARY_PATH=/usr/java/latest/jre/lib/amd64/server

命令行参数如下:* executes 描述培训代码入口点的位置。* task_params 描述将传递给入口点的命令行参数。* python_venv 描述本地调用python脚本的zip的名称。* python_binary_path 描述python虚拟环境中包含python二进制文件的相对路径,或使用已安装在所有工作节点上的python二进制文件的绝对路径。* src_dir 指定本地根目录的名称,其中包含所有python模型源代码。此目录将复制到所有工作节点。* shell_env 为将在python worker/ps进程中设置的环境变量指定键值对。

suzh9iv8

suzh9iv84#

我也是tensorflow的初学者,但由于您要求从可靠和/或官方来源获得答案,以下是我的发现,可能会有所帮助:
从源代码生成和安装
利用队列读取数据
cpu上的预处理
使用nchw图像数据格式
在gpu上放置共享参数
使用熔合批次标准
注:以上列出的要点在tensorflow性能指南中有更详细的解释
另一件你可能想研究的是量化:
它可以解释如何在存储和运行时使用量化来减小模型大小。量化可以提高性能,特别是在移动硬件上。

siv3szwd

siv3szwd5#

我绕过了这个性能问题,改用spark。

相关问题