3

У меня немного странная проблема с моими машинами:

Со временем производительность постоянно падает.

Я использую TensorFlow для обучения нейронной сети с использованием графического процессора. Мои данные представляют собой массивы float32 со сжатием xz, которые находятся на вращающемся диске на одном компьютере и на SSD на другом компьютере. Есть около 400.000 файлов данных. Файлы данных считываются непрерывно в фоновых потоках и помещаются в очередь длиной не более 1000 элементов.

В обучающей цепочке элементы выталкиваются с фронта очереди и передаются на тренировку партиями по 200.

После перезагрузки производительность начинается примерно с 4 секунд на пакет. После нескольких часов тренировок производительность падает до 16 секунд на одну партию.

Я рассчитал тренировку довольно подробно, и в начале это что-то вроде:

  • 0.05s, ожидая данных обучения, которые будут прочитаны
  • 3.8с для обработки партии на графическом процессоре
  • 0,3 с для записи сводных данных.

После тренировки время сильно варьируется:

  • 0,5 и 4 с для чтения данных
  • От 9 до 20 с для обработки партии
  • 0,3 с для записи сводных данных

Следует отметить, что во время пакетной обработки я отслеживал вывод nvidia-smi с довольно большим интервалом, и кажется, что использование GPU длится не более 1 секунды.

Эта плохая производительность сохраняется в течение нескольких вызовов процесса обучения, а также после выхода из системы и входа в систему. Перезагрузка машины возвращает время к исходному.

После этого вопроса я приобрел еще один графический процессор (GTX 1080) и установил практически идентичную систему. Замедление происходит и на новой машине.

Вещи, которые я пытался

Я проверил использование ЦП, и максимально 1 ЦП используется, и он всегда используется на 100%, большую часть времени это использование потоков ядра.

Я проверил использование памяти, и это 10 ГБ (из 11 ГБ). Это немного сложно, но система не начинает подкачку (своп остается на 30 МБ).

Я проверил использование диска, и кроме того, что мой код выполняет чтение данных, похоже, ничего странного не происходит.

Я проверил температуру GPU с помощью nvidia-smi, и она всегда остается ниже 60 ° C.

Я проверил температуру процессора и материнской платы, и они всегда остаются ниже 65 ° C.

У меня заканчиваются идеи, в чем может быть проблема. Есть идеи?

Спекуляции

Система 1:

  • Intel(R) Core(TM) i7 930 с частотой 2,80 ГГц, 4 ядра с гиперпоточностью
  • 11 ГБ ОЗУ
  • NVIDIA GeForce GTX 960 с 4 ГБ видеопамяти
  • Ubuntu 16.04.1 LTS Server, архитектура amd64
  • Проприетарный драйвер NVIDIA, версия 361.42
  • Версия ядра 4.4.0-31-generic
  • Python 3.5.2
  • TensorFlow 0.9.0

Система 2:

  • Intel(R) Core(TM) i7 930 с частотой 2,80 ГГц, 4 ядра с гиперпоточностью
  • 11 ГБ ОЗУ
  • NVIDIA GeForce GTX 1080 с 8 ГБ видеопамяти
  • Ubuntu 16.04.1 LTS Server, архитектура amd64
  • Проприетарный драйвер NVIDIA, версия 367.35
  • Версия ядра 4.4.0-31-generic
  • Python 3.5.2
  • TensorFlow 0.9.0

Обновить

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

I performed an strace on the process. The summary is this:
strace: Process 7351 attached
strace: Process 7351 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 95.40    0.674470         437      1545       126 futex
  4.37    0.030860        2572        12           munmap
  0.23    0.001627         814         2           madvise
  0.00    0.000000           0        13           write
  0.00    0.000000           0        10           mmap
  0.00    0.000000           0         1           access
------ ----------- ----------- --------- --------- ----------------
100.00    0.706957                  1583       126 total

Это, однако, выглядит очень похоже, когда все, кажется, работает нормально. Подробно я загрузил файл strace здесь:

https://drive.google.com/open?id=0B8TdHRNT7E-0X3F4eF9xWlRsb2s

Насколько я могу судить, почти все эти системные вызовы являются вызовами futex. Я не совсем уверен, что можно извлечь из этого.

1 ответ1

1

На данный момент моя проблема, кажется, смягчена.

Я сделал это, установив libgoogle-perftools-dev и начав каждый запуск с:

LD_PRELOAD="/usr/lib/libmalloc.so"

Это гарантировало гораздо более стабильную работу, и с тех пор у меня не было ни единого замедления.

Очевидно, что распределителю GLIBC трудно собирать мусор в течение продолжительного времени.

Что касается того, почему моя проблема, казалось, сохранялась при всех вызовах: я не знаю. Есть определенный шанс, что я неверно истолковал свои результаты и что процессы замедлились независимо друг от друга.

В любом случае, выполняя мой код более недели с новым распределителем и не имея ни одного замедления, я бы назвал эту проблему решенной.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .