¿Cómo PyTorch implementa Convolution Backward?

Nov 05 2020

Leí sobre el código fuente de Pytorch y me parece extraño que no implemente la convolution_backwardfunción. La única convolution_backward_overrideablefunción es que genera directamente un error y se supone que no debe caer aquí.

Entonces me referí a la implementación de CuDNN / MKLDNN, ambos implementan funciones como cudnn_convolution_backward.

Tengo la siguiente pregunta:

  1. ¿Cuáles son la implementación nativa de CUDA / CPU? Puedo encontrar algo como thnn_conv2d_backward_out, pero no pude encontrar dónde se llama esto.

  2. ¿Por qué PyTorch no puso la convolution_backwardfunción en Convolution.cpp ? Ofrece una _convolution_double_backward()función. Pero este es el doble al revés, es el gradiente del gradiente. ¿Por qué no ofrecen una única función hacia atrás?

  3. Si quiero llamar a la función nativa convolution / convolution_backward para mi tensor cpu / cuda puro, ¿cómo debo escribir código? ¿O a dónde podría referirme? No pude encontrar un ejemplo para esto.

Gracias !

Respuestas

2 unlut Nov 05 2020 at 15:59

1- La implementación puede diferir dependiendo del backend que use, puede usar la implementación de convolución CUDA de alguna biblioteca, la implementación de convolución de CPU de alguna otra biblioteca o la implementación personalizada, consulte aquí: pytorch - ¿Dónde se implementa “conv1d”? .

2- No estoy seguro de la versión actual, pero se calculó el retroceso simple a través de autograd, es por eso que no había una función diferente explícita para él. No conozco los detalles subyacentes del autogrado, pero puedes comprobarlo.https://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Esa función double_backward solo está ahí si necesita derivadas de orden superior.

3- Si desea hacer esto en C, el archivo que vinculó (convolution.cpp) le muestra cómo hacerlo (función en :: Tensor _convolution ...). Si inspecciona la función, ve que solo verifica qué implementación usar (params.use_something ...) y la usa. Si desea hacer esto en Python, debe comenzar a rastrear desde conv hasta donde se llama este archivo convolution.cpp.

1 Sut Nov 13 2020 at 15:57

He descubierto algo adicional a la publicación de @ unlut.

  1. El método de convolución está en archivos separados para diferentes implementaciones. Puede encontrar cudnn_convoluton_backward o mkldnn_convolution_backward fácilmente. Algo complicado es que la función de caída nativa final es difícil de encontrar. Es debido a que actualmente Pytorch Teams está transfiriendo la función Thnn a ATen, puede consultar PR24507 .

La función nativa se puede encontrar como thnn_con2d_backward .

  1. La convolución hacia atrás no se calcula a través de autograd, más bien, debe haber una función conv_backward y esto debe registrarse en derivatives.yaml. Si desea encontrar una función específica hacia atrás, consulte ese archivo es un buen comienzo.

  2. Acerca de este código, si desea llamar directamente a la función thnn_backward, debe construir explícitamente finput y fgrad_input. Estos son dos tensores vacíos que se ofrecen como búfer.

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