In che modo PyTorch implementa Convolution Backward?
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:
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.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?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
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.
Ho pensato a qualcosa in aggiunta al post di @ unlut.
- 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 .
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.
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);