Cupy становится медленнее при увеличении количества итераций

Я учусь использовать купи. Но я обнаружил, что проблема действительно сбивает с толку. Кажется, что Купи хорошо выполняет программу сначала. Когда он работает какое-то время, Cupy кажется намного медленнее. Вот код:

import cupy as np
from line_profiler import LineProfiler

def test(ary):
    for i in range(1000):
        ary**6

def main():
    rand=np.random.rand(1024,1024)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)

lp = LineProfiler()
lp_wrapper = lp(main)
lp_wrapper()
lp.print_stats()

а вот временная характеристика:

Timer unit: 2.85103e-07 s

Total time: 16.3308 s
File: E:\Desktop\test.py
Function: main at line 8

Line #      Hits         Time    Per Hit   % Time  Line Contents
==============================================================
     8                                             def main():
     9         1    1528817.0  1528817.0      2.7      rand=np.random.rand(1024,1024)
    10         1     111014.0   111014.0      0.2      test(rand)
    11         1      94528.0    94528.0      0.2      test(rand)
    12         1      95636.0    95636.0      0.2      test(rand)
    13         1      94892.0    94892.0      0.2      test(rand)
    14         1    7728318.0  7728318.0     13.5      test(rand)
    15         1   23872383.0 23872383.0     41.7      test(rand)
    16         1   23754666.0 23754666.0     41.5      test(rand)

Когда Cupy завершил 5000 раз силовых открытий, он становится очень медленным.

Я запускал этот код в Windows, а версия cuda - 10.0

Надеюсь на ответы. Спасибо большое!


Спасибо за Ваш ответ! Я распечатал использование памяти Купи:

import cupy as np

def test(ary):
    mempool = cupy.get_default_memory_pool()
    pinned_mempool = cupy.get_default_pinned_memory_pool()
    for i in range(1000):
        ary**6
    print("used bytes: %s"%mempool.used_bytes())
    print("total bytes: %s\n"%mempool.total_bytes())

def main():
    rand=np.random.rand(1024,1024)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)

и вот результат:

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

Похоже, что использование памяти GPU во время итерации осталось прежним.

Кстати, есть ли способ избежать этого снижения скорости?


person Colin    schedule 26.01.2019    source источник


Ответы (1)


Это проблема очереди ядра CUDA.

См. Следующее:

Короткое выполнение, наблюдаемое в вашем коде, было фальшивым, потому что cupy возвращает немедленно, когда очередь не заполнена.

Фактическое выступление было последней строчкой.

Примечание. Это НЕ была проблема выделения памяти - как я изначально предлагал в своем первоначальном ответе, - но я включаю здесь исходный ответ для записи.


Оригинальный (неправильный) ответ

Может быть из-за перераспределения.

Когда вы import cupy, cupy выделяет "некоторое количество" памяти GPU. Когда Cupy использует их все, ему приходится выделять больше памяти. Это увеличивает время выполнения.

person Yuki Hashimoto    schedule 01.02.2019
comment
Большое спасибо! Предлагает ли Cupy способ очистить память? - person Colin; 03.02.2019
comment
@Colin Пожалуйста, посмотрите мои почтовые скрипты. Мне жаль, что я запутала вас. - person Yuki Hashimoto; 04.02.2019
comment
Спасибо! Моя проблема аналогична проблеме 1294. Я очень признателен за вашу помощь! - person Colin; 07.02.2019