Я использую cupy
в функции, которая получает массив numpy
, помещает его в графический процессор, выполняет с ним некоторые операции и возвращает копию cp.asnumpy
.
Проблема : память не освобождается после функции (как видно из ndidia-smi
).
Я знаю о кешировании и повторном использовании памяти, выполненном cupy
.Однако, похоже, это работает только для каждого пользователя.Когда несколько пользователей работают на одном GPU-сервере, они ограничены кэшированной памятью других пользователей.
Я также пытался вызвать cp._default_memory_pool.free_all_blocks()
внутри функции в конце.Это, кажется, не имеет никакого эффекта.Импорт cupy
в основной код и вызов free_all_blocks
«вручную» работает, но я бы хотел инкапсулировать содержимое GPU в функцию, невидимую для пользователя.
Можете ли вы полностьювысвободить память графического процессора, используемую внутри функции, чтобы ее могли использовать другие пользователи?
Минимальный пример:
Основной модуль:
# dont import cupy here, only numpy
import numpy as np
# module in which cupy is imported and used
from memory_test_module import test_function
# host array
arr = np.arange(1000000)
# out is also on host, gpu stuff happens in test_function
out = test_function(arr)
# GPU memory is not released here, unless manually:
import cupy as cp
cp._default_memory_pool.free_all_blocks()
Функциональный модуль:
import cupy as cp
def test_function(arr):
arr_gpu = cp.array(arr)
arr_gpu += 1
out_host = cp.asnumpy(arr_gpu)
# this has no effect
cp._default_memory_pool.free_all_blocks()
return out_host