У меня немного странная проблема с моими машинами:
Со временем производительность постоянно падает.
Я использую 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. Я не совсем уверен, что можно извлечь из этого.