Как ускорить выполнение tensorflow на hadoop?

следующий скрипт выполняется очень медленно. Я просто хочу подсчитать общее количество строк в twitter-follwer-graph (textfile с ~26 GB).

мне нужно выполнить задачу машинного обучения. Это просто тест на доступ к данным из hdfs с помощью tensorflow.

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 ГБ ОЗУ
  • 4 ядер ЦП

5 ответов


вы можете разделить большой файл на более мелкие, это может помочь. И установите intra_op_parallelism_threads и inter_op_parallelism_threads в 0;

для многих систем чтение одного необработанного текстового файла с несколькими процессами непросто, tensorflow читает один файл только с одним потоком, поэтому настройка потоков tensorflow не поможет. Spark может обрабатывать файл с несколькими потоками для него разделить файл на блоки и каждый поток, считывающий содержимое в строках его блока и игнорирующий символы перед первым \n ибо они принадлежат к последней строке последнего блока. Для пакетной обработки данных Spark-лучший выбор, в то время как tensorflow лучше подходит для задач машинного обучения/глубокого обучения;


Я также новичок, работающий с tensorflow, но так как вы спрашивали для ответов, полученных из надежных и / или официальных источников, вот что я нашел и мог бы помочь:

  1. сборка и установка из исходников
  2. использовать очереди для чтения данных
  3. предварительная обработка на CPU
  4. используйте формат данных изображения NCHW
  5. разместить общие параметры на GPU
  6. использовать плавленый партии норма!--6-->

Примечание: пункты перечисленные выше объяснены более подробно здесь в руководство по производительности tensorflow

еще одна вещь, которую вы можете захотеть изучить, это квантования:

что может объяснить, как использовать квантование для уменьшения размера модели, как в хранилище, так и во время выполнения. Квантование может повысить производительность, особенно на мобильных устройств.


Я обошел эту проблему производительности, используя spark вместо этого.


https://github.com/linkedin/TonY

С Тони вы можете отправить задание TensorFlow и указать количество рабочих и требуется ли им процессоры или графические процессоры.

мы смогли получить почти линейное ускорение при работе на нескольких серверах с TonY (модель Inception v3): enter image description here

Ниже приведен пример того, как использовать его из README:

на 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 описывает имя zip локально, который будет вызывать ваш скрипт Python. * python_binary_path описывает относительный путь в виртуальной среде python, который содержит двоичный файл python, или абсолютный путь для использования двоичного файла python, уже установленного на всех рабочих узлах. * src_dir задает имя корневого каталога локально, который содержит весь исходный код модели python. Этот каталог будет скопирован на все рабочие узлы. * shell_env задает пары ключ-значение для переменных среды, которые будут установлены в вашем python worker / ps процессы.


попробовать это, и это должно улучшить ваше время:

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

нехорошо брать конфиг в свои руки, когда вы не знаете, что такое оптимальное значение.