Cześć, mam taki problem; moim zadaniem jest przeniesienie kodu z NumPy na PyTorch.
w wersji NumPy jest podwójna pętla for, i w wewnętrznej pętli jest:
for i in rangę(x):
b = a
a = np.ones(C)
// jakieś obliczenia na nowym a
// jakieś porównanie miedzy b ("starym a") i nowym a
Gdy te sama pętle napisałem w torchu,
po prostu piszac
a = torch.ones(C)
to kod nagle zaczął działać nieakceptowanie wolno (jest to powiązane z tym, ze działa on na GPU, i kod cały czas alokuje i inicjalizuje te zmienna od nowa na GPU)
początkowo rozwiązałem to w taki sposób, ze
przed pętla for stworzyłem zmienna a_pattern = torch.ones(C)
a w pętli for robiłem przypisanie a = a_pattern
I to działa bardzo szybko, bo zmienna jest inicjalizowana tylko raz, ale prowadzi do złych wyników, bo teraz b = a = a_pattern i b przyjmuje wartość a_pattern, bo tensorki się przekazują przez referencje (jak chyba wszystko w Pythonie)
Próbowałem funkcje .clone, .copy, .detach, .empty i .fill, przepisywanie w pętli for zamiast całej zmiennej od razu, - nic nie działa - wszystko albo działa wolno i daje dobry wynik (jak a = torch.ones()), albo działa szybko i daje zły wynik (jak a = a_pattern). Potrzebuje rozwiązania które działa szybko i dobrze. Kod jako calom jest przyspieszony w porównaniu do wersji numpy, wiec jak Wasze rozwiazanie będzie działać kilka % wolniej od wersji numpy to nie ma problemu, ale niestety w mojej sytuacji instrukcja a = torch.ones(C) to 99% czasu działania programu, co jest nie do przyjęcia.
Przepraszam ze nie załączam kodu ale i tak go nie odpalicie bo to wiele plików i duży dataset; ale zdiagnozowałem ze problemem jest tylko i aż ta jedna instrukcja.
Czy ktoś ma pomysł jak to rozwiązać?
Jakby co: przeniesienie kodu na GPU działa, nvtop pokazuje, ze zarówno pamięć jak i mcc obliczeniowa GPU jest mocno utylizowana