¿Cómo PyTorch implementa Convolution Backward?
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:
¿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.¿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?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
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.
He descubierto algo adicional a la publicación de @ unlut.
- 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 .
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.
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);