Bagaimana PyTorch mengimplementasikan Convolution Backward?

Nov 05 2020

Saya membaca tentang kode sumber Pytorch, dan saya merasa aneh bahwa itu tidak menerapkan convolution_backwardfungsi, Satu-satunya convolution_backward_overrideablefungsi adalah secara langsung menimbulkan kesalahan dan seharusnya tidak jatuh di sini.

Jadi saya mengacu pada implementasi CuDNN / MKLDNN, keduanya mengimplementasikan fungsi seperti cudnn_convolution_backward.

Saya mendapat pertanyaan berikut:

  1. Apa implementasi asli CUDA / CPU? Saya dapat menemukan sesuatu seperti thnn_conv2d_backward_out, tetapi saya tidak dapat menemukan di mana ini disebut.

  2. Mengapa PyTorch tidak menempatkan convolution_backwardfungsi di Convolution.cpp ? Ini menawarkan suatu _convolution_double_backward()fungsi. Tapi ini adalah dua kali lipat kebelakang, ini adalah gradien dari gradien. Mengapa mereka tidak menawarkan satu fungsi mundur?

  3. Jika saya ingin memanggil fungsi convolution / convolution_backward asli untuk tensor cpu / cuda murni saya, bagaimana cara menulis kode? Atau di mana saya bisa merujuk? Saya tidak dapat menemukan contoh untuk ini.

Terima kasih!

Jawaban

2 unlut Nov 05 2020 at 15:59

1- Implementasi mungkin berbeda tergantung pada backend yang Anda gunakan, mungkin menggunakan implementasi konvolusi CUDA dari beberapa perpustakaan, implementasi konvolusi CPU dari beberapa perpustakaan lain, atau implementasi khusus, lihat di sini: pytorch - Di mana "konv1d" diimplementasikan? .

2- Saya tidak yakin tentang versi saat ini, tetapi satu mundur dihitung melalui autograd, itulah sebabnya tidak ada fungsi yang berbeda secara eksplisit untuk itu. Saya tidak tahu detail yang mendasari autograd tetapi Anda dapat memeriksanyahttps://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Fungsi double_backward itu hanya ada jika Anda membutuhkan turunan dengan urutan yang lebih tinggi.

3- Jika Anda ingin melakukan ini di C, file yang Anda tautkan (convolution.cpp) menunjukkan cara melakukannya (berfungsi di :: Tensor _convolution ...). Jika Anda memeriksa fungsi, Anda akan melihatnya hanya memeriksa implementasi mana yang akan digunakan (params.use_something ...) dan menggunakannya. Jika Anda ingin melakukan ini dengan python, Anda harus mulai menelusuri dari konv hingga di mana file convolution.cpp ini dipanggil.

1 Sut Nov 13 2020 at 15:57

Saya telah menemukan sesuatu tambahan untuk postingan @ unlut.

  1. Metode konvolusi berada dalam file terpisah untuk implementasi yang berbeda. Anda dapat menemukan cudnn_convoluton_backward atau mkldnn_convolution_backward dengan mudah. Satu hal yang rumit adalah bahwa fungsi akhir musim gugur asli sulit ditemukan. Itu karena saat ini Tim Pytorch mem-porting fungsi Thnn ke ATen, Anda bisa merujuk ke PR24507 .

Fungsi asli dapat ditemukan sebagai thnn_con2d_backward .

  1. Konvolusi mundur tidak dihitung melalui autograd, melainkan harus ada fungsi konv_balik dan ini harus dicatat dalam derivatives.yaml. Jika Anda ingin mencari fungsi mundur tertentu, lihat file itu adalah permulaan yang baik.

  2. Tentang kode ini, jika Anda ingin langsung memanggil fungsi thnn_backward, Anda perlu secara eksplisit membuat finput dan fgrad_input. Ini adalah dua penawaran tensor kosong sebagai 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);