Ограничить память GPU в Юлии с помощью CuArrays
Я довольно новичок в Джулии, и в настоящее время я пробую некоторые сети с глубокими свертками с повторяющимися структурами. Я тренирую сети на GPU с использованием CuArrays(CUDA Version 9.0).
Имея два отдельных GPU, я запустил два экземпляра с разными наборами данных. Вскоре после некоторого обучения оба экземпляра julia распределили всю доступную память (2 x 11 ГБ), и я даже не смог запустить другой экземпляр самостоятельно, используя CuArrays (Ошибка выделения памяти). Это стало большой проблемой, так как работает на сервере, который используется многими людьми.
Я предполагаю, что это нормальное поведение - использовать всю доступную память для максимально быстрой тренировки. Но в этих обстоятельствах я хотел бы ограничить память, которая может быть выделена для запуска двух экземпляров одновременно, и не мешать мне или другим людям использовать GPU. К моему удивлению, я нашел очень, очень мало информации об этом.
Мне известна опция CUDA_VISIBLE_DEVICES, но это не помогает, поскольку я хочу тренироваться одновременно на обоих устройствах. Другой предложил вызвать GC.gc() и CuArrays.clearpool(). Второй вызов выдает неизвестную ошибку функции и, похоже, больше не находится в пакете CuArray. Первый, который я сейчас тестирую, но не совсем то, что мне нужно. Есть ли возможность ограничить выделение ОЗУ на GPU с помощью CuArrays и Julia? Заранее спасибо Мой размер пакета составляет 100, и одна партия должна иметь менее 1 МБ...
1 ответ
На данный момент такой функциональности нет. Я быстро что-то набрал, см. https://github.com/JuliaGPU/CuArrays.jl/pull/379, вы можете использовать его для определения CUARRAYS_MEMORY_LIMIT
и установите для него количество байтов, которое распределитель не выйдет за пределы. Обратите внимание, что это может значительно увеличить нагрузку на память, ситуация, для которой распределитель памяти CuArrays.jl в настоящее время не оптимизирован (хотя это один из моих главных приоритетов для инфраструктуры графического процессора Julia).