W jaki sposób PyTorch implementuje Convolution Backward?

Nov 05 2020

Czytałem o kodzie źródłowym Pytorcha i uważam, że to dziwne, że nie implementuje convolution_backwardfunkcji, jedyna convolution_backward_overrideablefunkcja bezpośrednio wywołuje błąd i ma tu nie spaść.

Odniosłem się więc do implementacji CuDNN / MKLDNN, oba implementują funkcje takie jak cudnn_convolution_backward.

Otrzymałem następujące pytanie:

  1. Jaka jest natywna implementacja CUDA / CPU? Mogę znaleźć coś takiego thnn_conv2d_backward_out, ale nie mogłem znaleźć, gdzie to się nazywa.

  2. Dlaczego PyTorch nie umieścił tej convolution_backwardfunkcji w Convolution.cpp ? Oferuje _convolution_double_backward()funkcję. Ale to jest podwójne do tyłu, to gradient gradientu. Dlaczego nie oferują pojedynczej funkcji wstecznej?

  3. Jeśli chcę wywołać natywną funkcję convolution / convolution_backward dla mojego czystego tensora cpu / cuda, jak mam napisać kod? Albo gdzie mogę się odnieść? Nie mogłem znaleźć na to przykładu.

Dzięki !

Odpowiedzi

2 unlut Nov 05 2020 at 15:59

1- Implementacja może się różnić w zależności od używanego zaplecza, może korzystać z implementacji konwolucji CUDA z jakiejś biblioteki, implementacji konwolucji procesora z innej biblioteki lub implementacji niestandardowej, zobacz tutaj: pytorch - Gdzie jest zaimplementowany „conv1d”? .

2- Nie jestem pewien co do aktualnej wersji, ale pojedynczy backward został obliczony przez autograd, dlatego nie było dla niego wyraźnej innej funkcji. Nie znam podstawowych szczegółów autogradu, ale możesz to sprawdzićhttps://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Ta funkcja double_backward jest dostępna tylko wtedy, gdy potrzebujesz pochodnych wyższego rzędu.

3- Jeśli chcesz to zrobić w C, dowiązany plik (convolution.cpp) pokazuje, jak to zrobić (funkcja w :: Tensor _convolution ...). Jeśli sprawdzisz funkcję, zobaczysz, że po prostu sprawdza, której implementacji użyć (params.use_something ...) i jej używa. Jeśli chcesz to zrobić w Pythonie, powinieneś rozpocząć śledzenie od convolution.cpp do miejsca, w którym zostanie wywołany ten plik convolution.cpp.

1 Sut Nov 13 2020 at 15:57

Wymyśliłem coś dodatkowego do posta @ unlut.

  1. Metoda konwolucji znajduje się w osobnych plikach dla różnych implementacji. Możesz łatwo znaleźć cudnn_convoluton_backward lub mkldnn_convolution_backward. Jedną z trudnych rzeczy jest to, że ostateczna natywna funkcja upadku jest trudna do znalezienia. To dlatego, że obecnie Pytorch Teams przenoszą funkcję Thnn na ATen, możesz odwołać się do PR24507 .

Natywną funkcję można znaleźć jako thnn_con2d_backward .

  1. Konwolucja wstecz nie jest obliczana przez autograd, raczej musi istnieć funkcja conv_backward, która musi być zapisana w plikach pochodnych. Yaml. Jeśli chcesz znaleźć konkretną funkcję wsteczną, skorzystaj z tego pliku to dobry początek.

  2. O tym kodzie, jeśli chcesz bezpośrednio wywołać funkcję thnn_backward, musisz jawnie skonstruować finput i fgrad_input. To są dwie puste oferty tensorów jako bufor.

at::Tensor finput = at::empty({0},input.options()); 
at::Tensor fgrad_input = at::empty({0}, input.options());
auto kernel_size = weight.sizes().slice(2);
auto &&result = at::thnn_conv2d_backward(grad_output, input, weight,kernel_size , stride, padding, 
finput, fgrad_input, output_mask);