Как полностью освободить память GPU, используемую в функции - PullRequest
0 голосов
/ 29 ноября 2018

Я использую 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

1 Ответ

0 голосов
/ 29 ноября 2018

CuPy использует счетчик ссылок Python для отслеживания используемых массивов.В этом случае вы должны del arr_gpu перед вызовом free_all_blocks в test_function.

Подробнее см. Здесь: https://docs -cupy.chainer.org / en / latest / reference /memory.html

...