Wie implementiert PyTorch Convolution Backward?
Ich habe über den Quellcode des Pytorch gelesen und finde es seltsam, dass er die convolution_backwardFunktion nicht implementiert . Die einzige convolution_backward_overrideableFunktion ist, dass sie direkt einen Fehler auslöst und nicht hierher fallen soll.
Also habe ich mich auf die CuDNN / MKLDNN-Implementierung bezogen, beide implementieren Funktionen wie cudnn_convolution_backward.
Ich habe folgende Frage:
Was ist die native Implementierung von CUDA / CPU? Ich kann so etwas finden
thnn_conv2d_backward_out, aber ich konnte nicht finden, wo das heißt.Warum hat PyTorch die
convolution_backwardFunktion nicht in Convolution.cpp eingefügt ? Es bietet eine_convolution_double_backward()Funktion. Aber dies ist das Doppelte rückwärts, es ist der Gradient des Gradienten. Warum bieten sie keine einzige Rückwärtsfunktion?Wie soll ich Code schreiben, wenn ich die native Funktion convolution / convolution_backward für meinen reinen CPU / Cuda-Tensor aufrufen möchte? Oder wo könnte ich mich beziehen? Ich konnte kein Beispiel dafür finden.
Vielen Dank !
Antworten
1- Die Implementierung kann je nach verwendetem Backend unterschiedlich sein. Möglicherweise wird die CUDA-Faltungsimplementierung aus einer Bibliothek, die CPU-Faltungsimplementierung aus einer anderen Bibliothek oder die benutzerdefinierte Implementierung verwendet. Siehe hier: pytorch - Wo ist "conv1d" implementiert? .
2- Ich bin mir über die aktuelle Version nicht sicher, aber Single Backward wurde über Autograd berechnet, weshalb es keine explizit andere Funktion dafür gab. Ich kenne die zugrunde liegenden Details von Autograd nicht, aber Sie können dies überprüfenhttps://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Diese double_backward-Funktion ist nur verfügbar, wenn Sie Ableitungen höherer Ordnung benötigen.
3- Wenn Sie dies in C tun möchten, zeigt Ihnen die von Ihnen verknüpfte Datei (convolution.cpp), wie dies zu tun ist (Funktion unter :: Tensor _convolution ...). Wenn Sie die Funktion überprüfen, sehen Sie, dass nur die zu verwendende Implementierung (params.use_something ...) überprüft und verwendet wird. Wenn Sie dies in Python tun möchten, sollten Sie mit der Ablaufverfolgung von conv bis zum Aufruf dieser Datei convolution.cpp beginnen.
Ich habe mir eine Ergänzung zu @ unluts Beitrag ausgedacht.
- Die Faltungsmethode befindet sich in separaten Dateien für verschiedene Implementierungen. Sie können cudnn_convoluton_backward oder mkldnn_convolution_backward leicht finden. Eine schwierige Sache ist, dass die endgültige native Fallfunktion schwer zu finden ist. Da derzeit Pytorch-Teams die Thnn-Funktion auf ATen portieren, können Sie sich auf PR24507 beziehen .
Die native Funktion könnte als thnn_con2d_backward gefunden werden .
Die Rückfaltung wird nicht über Autograd berechnet, sondern es muss eine Funktion conv_backward vorhanden sein, die in derivatives.yaml aufgezeichnet werden muss. Wenn Sie eine bestimmte Rückwärtsfunktion suchen möchten, ist die Verwendung dieser Datei ein guter Anfang.
Wenn Sie zu diesem Code die Funktion thnn_backward direkt aufrufen möchten, müssen Sie finput und fgrad_input explizit erstellen. Dies sind zwei leere Tensorangebote als Puffer.
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);