PyTorch, Convolution Backward'ı nasıl uygular?

Nov 05 2020

Pytorch'un kaynak kodunu okudum ve bunun convolution_backwardişlevi uygulamaması garip buluyorum , Tek convolution_backward_overrideableişlev doğrudan bir hata veriyor ve buraya düşmemesi gerekiyor.

Bu yüzden CuDNN / MKLDNN uygulamasına atıfta bulundum, ikisi de gibi işlevleri yerine getiriyor cudnn_convolution_backward.

Şu soruyu aldım:

  1. CUDA / CPU'nun yerel uygulaması nedir? Gibi bir şey bulabilirim thnn_conv2d_backward_outama buna nerede denildiğini bulamadım.

  2. PyTorch neden convolution_backwardişlevi Convolution.cpp'ye koymadı ? Bir _convolution_double_backward()işlev sunar . Ama bu geriye doğru çifte, gradyan gradyanı. Neden geriye dönük tek bir işlev sunmuyorlar?

  3. Saf cpu / cuda tensörüm için native convolution / convolution_backward işlevini çağırmak istersem, nasıl kod yazmalıyım? Ya da nereye başvurabilirim? Buna örnek bulamadım.

Teşekkürler !

Yanıtlar

2 unlut Nov 05 2020 at 15:59

1- Uygulama, hangi arka ucu kullandığınıza bağlı olarak farklılık gösterebilir, bazı kitaplıklardan CUDA evrişim uygulamasını, başka bir kitaplıktan CPU evrişim uygulamasını veya özel uygulamayı kullanabilir, buraya bakın: pytorch - "conv1d" nerede uygulanır? .

2- Şu anki sürümden emin değilim, ancak tek bir geriye doğru autograd ile hesaplandı, bu yüzden onun için açık bir farklı işlev yoktu. Otomatik sınıflamanın temelindeki ayrıntıları bilmiyorum ama kontrol edebilirsinizhttps://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Bu double_backward işlevi yalnızca daha yüksek mertebeden türevlere ihtiyacınız varsa vardır.

3- Bunu C de yapmak istiyorsanız, bağladığınız dosya (convolution.cpp) size bunu nasıl yapacağınızı gösterir (function at :: Tensor _convolution ...). İşlevi incelerseniz, yalnızca hangi uygulamanın kullanılacağını (params.use_something ...) ve kullanacağını kontrol ettiğini görürsünüz. Bunu python'da yapmak istiyorsanız, convolution.cpp dosyasının çağrıldığı yere kadar conv izlemeye başlamalısınız.

1 Sut Nov 13 2020 at 15:57

@ Unlut'un gönderisine ek bir şey buldum.

  1. Evrişim yöntemi, farklı uygulamalar için ayrı dosyalardadır. Cudnn_convoluton_backward veya mkldnn_convolution_backward'ı kolayca bulabilirsiniz. Zor olan bir şey, son yerel düşme işlevini bulmanın zor olmasıdır. Bunun nedeni şu anda Pytorch Takımlarının Thnn işlevini ATen'e taşımasıdır, PR24507'ye başvurabilirsiniz .

Yerel işlev thnn_con2d_backward olarak bulunabilir .

  1. Geriye doğru evrişim autograd yoluyla hesaplanmaz, bunun yerine bir conv_backward işlevi olmalıdır ve bu, derivatives.yaml dosyasına kaydedilmelidir. Belirli bir geriye dönük işlev bulmak istiyorsanız, o dosyaya bakın, iyi bir başlangıçtır.

  2. Bu kodla ilgili olarak, thnn_backward işlevini doğrudan çağırmak istiyorsanız, finput ve fgrad_input'u açıkça yapılandırmanız gerekir. Bunlar, tampon olarak sunulan iki boş tensördür.

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);