Cupy становятся медленнее при увеличении итераций
Я учусь использовать 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
Надеюсь на ответы. Большое вам спасибо!
Спасибо за Ваш ответ! Я напечатал использование памяти Cupy:
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 остается неизменным в течение итерации.
Кстати, есть ли способ избежать этого снижения скорости?
1 ответ
Это проблема очереди ядра CUDA.
Смотрите следующее:
Короткое выполнение, наблюдаемое в вашем коде, было фальшивым, потому что cupy возвращается немедленно, когда очередь не заполнена.
Фактическая производительность была последней строчкой.
Примечание: это НЕ было проблемой распределения памяти - как я изначально предлагал в своем первоначальном ответе - но я включаю оригинальный ответ для записи здесь.
Оригинальный (неверный) ответ
Может быть из-за перераспределения.
Когда ты import cupy
Cupy выделяет "некоторое крепление" памяти GPU. Когда Кьюби использовал их все, ему пришлось выделить больше памяти. Это увеличивает время выполнения.