Как полностью освободить память GPU, используемую в функции

Я использую cupy в функции, которая получает numpy массив, пихает его на графический процессор, делает некоторые операции с ним и возвращает cp.asnumpy копия этого.

Проблема: память не освобождается после функции (как видно на ndidia-smi).

Я знаю о кешировании и повторном использовании памяти cupy, Однако, похоже, что это работает только для каждого пользователя. Когда несколько пользователей работают на одном GPU-сервере, они ограничены кэшированной памятью других пользователей.

Я тоже пробовал звонить cp._default_memory_pool.free_all_blocks() внутри функции в конце. Это, кажется, не имеет никакого эффекта. Импорт cupy в основном коде и вызове free_all_blocks "Вручную" работает, но я бы хотел включить в функцию содержимое GPU, невидимое для пользователя.

Можете ли вы полностью освободить память 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 ответ

Решение

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

Смотрите здесь для получения более подробной информации: https://docs-cupy.chainer.org/en/stable/upgrade.html

Другие вопросы по тегам