Como PyTorch implementa Convolution Backward?
Eu li sobre o código-fonte do Pytorch e acho estranho que ele não implemente a convolution_backwardfunção. A única convolution_backward_overrideablefunção é gerar um erro diretamente e não deve cair aqui.
Então, me referi à implementação CuDNN / MKLDNN, ambos implementam funções como cudnn_convolution_backward.
Eu tenho a seguinte pergunta:
Quais são as implementações nativas de CUDA / CPU? Eu posso encontrar algo como
thnn_conv2d_backward_out, mas não consegui encontrar onde isso é chamado.Por que o PyTorch não colocou a
convolution_backwardfunção em Convolution.cpp ? Ele oferece uma_convolution_double_backward()função. Mas este é o duplo para trás, é o gradiente de gradiente. Por que eles não oferecem uma única função reversa?Se eu quiser chamar a função nativa convolution / convolution_backward para meu tensor de cpu / cuda puro, como devo escrever o código? Ou onde eu poderia me referir? Não consegui encontrar exemplo para isso.
Obrigado !
Respostas
1- A implementação pode ser diferente dependendo de qual backend você usa, pode usar implementação de convolução CUDA de alguma biblioteca, implementação de convolução de CPU de alguma outra biblioteca ou implementação customizada, veja aqui: pytorch - Onde “conv1d” está implementado? .
2- Não tenho certeza sobre a versão atual, mas o single backward foi calculado via autograd, por isso não havia uma função diferente explícita para ele. Eu não sei os detalhes subjacentes do autograd, mas você pode verificarhttps://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Essa função double_backward está lá apenas se você precisar de derivadas de ordem superior.
3- Se você quiser fazer isso em C, o arquivo vinculado (convolution.cpp) mostra como fazer isso (função em :: Tensor _convolution ...). Se você inspecionar a função, verá que ela apenas verifica qual implementação usar (params.use_something ...) e a usa. Se você quiser fazer isso em python, você deve começar a rastrear de conv até onde este arquivo convolution.cpp é chamado.
Eu descobri algo adicional à postagem de @ unlut.
- O método de convolução está em arquivos separados para diferentes implementações. Você pode encontrar cudnn_convoluton_backward ou mkldnn_convolution_backward facilmente. Uma coisa complicada é que a função de queda nativa final é difícil de encontrar. É porque atualmente as equipes Pytorch estão portando a função Thnn para ATen, você pode se referir a PR24507 .
A função nativa pode ser encontrada como thnn_con2d_backward .
A convolução para trás não é calculada via autograd, em vez disso, deve haver uma função conv_backward e isso deve ser registrado em derivados.yaml. Se você quiser encontrar uma função retrógrada específica, consulte esse arquivo é um bom começo.
Sobre este código, se você deseja chamar diretamente a função thnn_backward, você precisa construir explicitamente finput e fgrad_input. Estas são duas ofertas de tensores vazios como um buffer.
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);