In che modo PyTorch implementa Convolution Backward?

Nov 05 2020

Ho letto del codice sorgente di Pytorch e trovo strano che non implementi la convolution_backwardfunzione, l'unica convolution_backward_overrideablefunzione è che solleva direttamente un errore e non dovrebbe cadere qui.

Quindi ho fatto riferimento all'implementazione di CuDNN / MKLDNN, entrambi implementano funzioni come cudnn_convolution_backward.

Ho la seguente domanda:

  1. Quali sono le implementazioni native di CUDA / CPU? Posso trovare qualcosa di simile thnn_conv2d_backward_out, ma non sono riuscito a trovare dove si chiama.

  2. Perché PyTorch non ha inserito la convolution_backwardfunzione in Convolution.cpp ? Offre una _convolution_double_backward()funzione. Ma questo è il doppio all'indietro, è il gradiente del gradiente. Perché non offrono un'unica funzione all'indietro?

  3. Se voglio chiamare la funzione nativa convolution / convolution_backward per il mio tensore cpu / cuda puro, come devo scrivere codice? O dove potrei riferirmi? Non sono riuscito a trovare un esempio per questo.

Grazie !

Risposte

2 unlut Nov 05 2020 at 15:59

1- L'implementazione può differire a seconda del backend utilizzato, potrebbe utilizzare l'implementazione della convoluzione CUDA da qualche libreria, l'implementazione della convoluzione della CPU da qualche altra libreria o l'implementazione personalizzata, vedere qui: pytorch - Dove viene implementato "conv1d"? .

2- Non sono sicuro della versione corrente, ma il singolo backward è stato calcolato tramite autograd, ecco perché non c'era una funzione diversa esplicita per esso. Non conosco i dettagli sottostanti di autograd ma puoi controllarehttps://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Quella funzione double_backward è disponibile solo se hai bisogno di derivati ​​di ordine superiore.

3- Se vuoi farlo in C, il file che hai collegato (convolution.cpp) mostra come farlo (funzione in :: Tensor _convolution ...). Se esamini la funzione, la vedi controlla solo quale implementazione usare (params.use_something ...) e usala. Se vuoi farlo in python dovresti iniziare a tracciare da conv fino a dove viene chiamato questo file convolution.cpp.

1 Sut Nov 13 2020 at 15:57

Ho pensato a qualcosa in aggiunta al post di @ unlut.

  1. Il metodo di convoluzione si trova in file separati per diverse implementazioni. Puoi trovare facilmente cudnn_convoluton_backward o mkldnn_convolution_backward. Una cosa complicata è che la funzione di caduta nativa finale è difficile da trovare. È perché attualmente i team Pytorch stanno portando la funzione Thnn su ATen, potresti fare riferimento a PR24507 .

La funzione nativa potrebbe essere trovata come thnn_con2d_backward .

  1. La convoluzione all'indietro non viene calcolata tramite autograd, piuttosto, deve esserci una funzione conv_backward e questa deve essere registrata in derivatives.yaml. Se vuoi trovare una specifica funzione all'indietro, fare riferimento a quel file è un buon inizio.

  2. Riguardo a questo codice, se vuoi chiamare direttamente la funzione thnn_backward, devi costruire esplicitamente finput e fgrad_input. Queste sono due offerte tensoriali vuote come 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);