Стратегии распределения памяти CPU против GPU при глубоком обучении (cuda, tensorflow, pytorch,…)

#tensorflow #memory #gpu #cpu

Вопрос:

Я пытаюсь запустить несколько процессов (например, 10) обучения с помощью tensorflow 2. Я все еще использую несколько сеансов и так далее tf.compat.v1 во всей своей кодовой базе.

  • Когда я работаю с процессором, процессы занимают каждый около 500 мб памяти процессора. htop выход :
    работает при использовании памяти процессора
  • Когда я работаю с графическим процессором, процессы занимают каждый гораздо больше памяти процессора (например, 3Go каждый) и почти столько же (в реальности больше) памяти графического процессора. nvtop вывод (память GPU слева, память процессора (ХОСТА) справа) :
    работает при использовании памяти gpu

Я могу уменьшить отпечатки пальцев процесса обработки памяти GPU, используя переменную среды TF_CUDNN_USE_AUTOTUNE=0 (1,5 GPU Go, не более 3 Go CPU). Но это все равно намного больше потребления памяти, чем выполнение процесса только на процессоре. Я много чего пробовал, например TF_GPU_ALLOCATOR=cuda_malloc_async , с ночным выпуском tf, но это все то же самое. Это вызывает ошибки OOM, если я хотел бы сохранить 10 процессов на GPU, как на CPU.
Я обнаружил, что фрагментация памяти может быть подсказкой, путем профилирования одного процесса. Вы можете найти скриншоты здесь.

TL;DR
При запуске процесса tf только на процессоре он использует некоторое количество памяти (сопоставимое с размером данных). При запуске одного и того же процесса tf только на GPU он использует гораздо больше памяти (~x16 без какой-либо оптимизации тензорного потока).

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

К вашему сведению -> Текущая настройка : tf 2.6, cuda 11.4 (или 11.2, или 11.1, или 11.0), ubuntu 20.04, драйвер nvidia 370

РЕДАКТИРОВАТЬ : Я попытался преобразовать свой код tensorflow / tflearn в pytorch. У меня такое же поведение (низкий объем памяти на процессоре, и все взрывается при работе на GPU)

EDIT2 : Часть памяти, выделенной на GPU, должна быть предназначена для выполнения CUDA. На пыторхе. У меня выделено 300 мб памяти при запуске процессора. У меня есть 2 гб памяти GPU и почти 5 гб памяти процессора, используемой при работе на GPU. Возможно, основная проблема заключается в памяти процессора/системы, выделенной для этого процесса, когда я работаю на GPU, так как кажется, что время выполнения CUDA может занять почти 2 гб памяти GPU (это огромно…). Похоже, это связано с инициализацией CUDA.

EDIT3 : Это определенно проблема с CUDA. Даже если я попытаюсь создать тензор 1,1 с помощью pytorch, для этого потребуется 2 гб графического процессора и почти 5 гб памяти процессора. Это можно объяснить тем, что pytorch загружает в память огромное количество ядер, даже если основная программа их не использует.