Memilih antara CPU dan GPU untuk melatih jaringan saraf

29

Saya telah melihat diskusi tentang 'overhead' GPU, dan untuk jaringan 'kecil', mungkin sebenarnya lebih cepat untuk berlatih menggunakan CPU (atau jaringan CPU) daripada GPU.

Apa yang dimaksud dengan 'kecil'?

Misalnya, apakah MLP satu-lapis dengan 100 unit tersembunyi akan 'kecil'?

Apakah definisi kami tentang 'kecil' berubah untuk arsitektur berulang?

Apakah ada kriteria lain yang harus dipertimbangkan ketika memutuskan apakah akan berlatih pada CPU atau GPU?

EDIT 1:

Saya baru saja menemukan posting blog (mungkin kedaluwarsa? Ini dari 2014):

"... Sebagian besar kartu jaringan hanya bekerja dengan memori yang terdaftar pada CPU dan dengan demikian transfer GPU ke GPU antara dua node akan seperti ini: GPU 1 ke CPU 1 ke Kartu Jaringan 1 ke Kartu Jaringan 2 ke CPU 2 hingga GPU 2. Artinya, jika seseorang memilih kartu jaringan yang lambat maka mungkin tidak ada speedup di satu komputer. Bahkan dengan kartu jaringan yang cepat, jika cluster besar, seseorang bahkan tidak mendapatkan speedup dari GPU jika dibandingkan ke CPU karena GPU hanya bekerja terlalu cepat untuk kartu jaringan untuk mengikutinya.

Ini adalah alasan mengapa banyak perusahaan besar seperti Google dan Microsoft menggunakan CPU daripada cluster GPU untuk melatih jaringan saraf besar mereka. "

Jadi pada titik tertentu, menurut posting ini, bisa lebih cepat menggunakan CPU. Apakah ini masih terjadi?

EDIT 2: Ya, posting blog itu mungkin sudah usang karena:

Sekarang tampaknya GPU dalam sebuah node terhubung melalui PCIe bus, sehingga komunikasi dapat terjadi pada sekitar 6GiB / s. (Misalnya: https://www.youtube.com/watch?v=el1iSlP1uOs , sekitar 35 menit dalam). Pembicara menyiratkan bahwa ini lebih cepat daripada pergi dari GPU1 ke CPU ke GPU2. Itu berarti kartu jaringan tidak lagi menjadi hambatan.

StorScerceress
sumber
Orang itu dengan posting blognya membawa poin bagus. Saya tidak mengerti semua pembenarannya. Namun, fakta bahwa Google, Facebook, Twitter, dan semua kelompok pembelajaran terdalam di dunia akademik menjalankan kode mereka terutama pada GPU menunjukkan bahwa itu adalah ide yang bagus. Meskipun bias: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Jawaban:

28

Tidak seperti beberapa jawaban lain, saya akan sangat menyarankan agar tidak selalu berlatih GPU tanpa berpikir panjang. Ini didorong oleh penggunaan metode pembelajaran mendalam pada gambar dan teks, di mana data sangat kaya (misalnya banyak piksel = banyak variabel) dan model yang sama memiliki jutaan parameter. Untuk domain lain, ini mungkin bukan masalahnya.

Apa yang dimaksud dengan 'kecil'? Misalnya, apakah MLP satu-lapis dengan 100 unit tersembunyi akan 'kecil'?

Ya, itu pasti sangat kecil menurut standar modern. Kecuali Anda memiliki GPU yang sangat cocok untuk pelatihan (mis. NVIDIA 1080 atau NVIDIA Titan), saya tidak akan terkejut mendapati bahwa CPU Anda lebih cepat.

Perhatikan bahwa kompleksitas jaringan saraf Anda juga tergantung pada jumlah fitur input Anda, bukan hanya jumlah unit di lapisan tersembunyi Anda. Jika lapisan tersembunyi Anda memiliki 100 unit dan setiap pengamatan dalam dataset Anda memiliki 4 fitur input, maka jaringan Anda kecil (~ 400 parameter). Jika setiap observasi memiliki fitur input 1M seperti dalam beberapa konteks medis / biotek, maka jaringan Anda cukup besar dalam hal jumlah parameter. Untuk sisa jawaban saya, saya berasumsi Anda memiliki beberapa fitur input pr. pengamatan.

Satu contoh bagus yang saya temukan untuk membandingkan kinerja CPU vs GPU adalah ketika saya melatih bot poker menggunakan pembelajaran penguatan. Untuk pembelajaran penguatan Anda sering tidak ingin banyak lapisan dalam jaringan saraf Anda dan kami menemukan bahwa kami hanya membutuhkan beberapa lapisan dengan beberapa parameter. Apalagi jumlah fitur inputnya cukup rendah. Awalnya saya berlatih menggunakan GPU (NVIDIA Titan), tetapi butuh waktu lama karena pembelajaran penguatan membutuhkan banyak iterasi. Untungnya, saya menemukan bahwa pelatihan pada CPU saya malah membuat pelatihan saya menjadi 10x lebih cepat! Ini hanya untuk mengatakan bahwa CPU terkadang lebih baik untuk pelatihan.

Apakah ada kriteria lain yang harus dipertimbangkan ketika memutuskan apakah akan berlatih pada CPU atau GPU?

Penting untuk dicatat bahwa pada GPU Anda selalu ingin mengisi seluruh memori GPU dengan meningkatkan ukuran batch Anda, itu tidak terjadi pada CPU. Pada CPU peningkatan ukuran batch akan meningkatkan waktu pr. batch Karena itu, jika penting bagi Anda untuk memiliki ukuran bets yang sangat besar (misalnya karena sinyal yang sangat bising), dapat bermanfaat untuk menggunakan GPU. Saya belum mengalami ini dalam prakteknya dan biasanya ukuran batch kecil lebih disukai.

pir
sumber
@Pir terima kasih! Apakah Anda memiliki referensi khusus di mana saya dapat membaca lebih lanjut?
StatsSorceress
Anda dapat dengan mudah menemukan jumlah parameter mis. VGG untuk membandingkan dan melihat bahwa jaringan Anda kecil dibandingkan.
pir
3
Saya belum pernah melihat banyak perbandingan CPU / GPU pada jaringan kecil karena itu bukan yang diminati perusahaan besar dan laboratorium penelitian.
pir
@StatsSorceress Jika Anda ingin mengujinya sendiri, mengapa tidak hanya memasang Keras MLP sederhana dan menguji kinerja pada GPU vs. CPU? Juga, lihat wrt jawaban saya yang diperbarui. ukuran jaringan Anda.
pir
5

CPU adalah manajer cabang, ia dapat melakukan sedikit dari segalanya, tetapi ia tidak hebat dalam banyak hal kecuali mendelegasikan tugas. Namun, GPU adalah ahli matematika khusus yang bersembunyi di mesin Anda. Jika Anda melakukan proses matematika yang berat maka Anda harus menggunakan GPU Anda. Selalu.

Jika Anda menggunakan bahasa pemrograman populer untuk pembelajaran mesin seperti python atau MATLAB, itu adalah kode satu baris untuk memberi tahu komputer Anda bahwa Anda ingin operasi dijalankan pada GPU Anda.

Anda juga harus memastikan untuk menggunakan semua inti mesin Anda. Ini berarti memanfaatkan komputasi paralel. Khusus untuk jaringan saraf di mana operasi dapat dilakukan secara independen, ini akan meningkatkan kecepatan Anda.

JahKnows
sumber
4
Saya telah menemukan bahwa kadang-kadang overhead mentransfer data ke dan dari GPU benar-benar menghapus peningkatan kecepatan dari paralelisme. Tidak selalu merupakan ide yang baik untuk pergi ke GPU.
Adrian Keister
1
Itu tergantung pada kompleksitas model Anda. Jika Anda melatih K-NN sederhana maka mungkin itu tidak berharga. Namun, jika Anda melatih model apa pun yang membutuhkan matriks terbalik atau jaringan saraf yang membutuhkan banyak operasi matriks konsekuensial, selalu merupakan ide bagus untuk memilih GPU.
JahKnows
1
@AdrianKeister saya setuju. Itulah yang saya coba sampaikan dalam jawaban saya. Untuk jaringan yang disebutkan oleh OP itu kemungkinan besar akan menjadi hambatan.
pir
1
100 unit tersembunyi lebih cepat pada GPU menggunakan mesin saya. Saya akan membutuhkan sejumlah kecil unit tersembunyi agar CPU menjadi lebih cepat. Selain itu, saya selalu cenderung melakukan pelatihan dalam batch. Dalam hal ini saya ragu CPU akan menjadi hambatan mengingat data yang cukup padat.
JahKnows
3

Pertama saya akan referensi beberapa kutipan dari pertanyaan serupa:

Ketika datang ke operasi matriks, Anda tidak berpikir dua kali, Anda selalu memilih GPU. sumber

Arsitektur paralel dalam GPU disesuaikan dengan baik untuk operasi vektor dan matriks. sumber

Jadi jika Anda membaca pertanyaan-pertanyaan ini, Anda akan melihat bahwa mereka menyarankan untuk menggunakan GPU terlepas dari kasusnya; itu akan selalu memberikan beberapa perbaikan.

Alasan Anda mungkin telah membaca bahwa jaringan 'kecil' harus dilatih dengan CPU, adalah karena menerapkan pelatihan GPU hanya untuk jaringan kecil mungkin membutuhkan waktu lebih lama daripada hanya pelatihan dengan CPU - itu tidak berarti GPU akan lebih lambat.

Jaringan unit 100-tersembunyi agak kecil , saya akan menyebutnya jaringan kecil relatif terhadap jaringan besar dalam di luar sana. Arsitektur berulang (kebanyakan) memiliki lebih banyak sinapsis dari jaringan umpan maju, sehingga unit 100-tersembunyi RNN 'lebih besar' daripada unit FFN 100-tersembunyi.

Thomas W
sumber
Bukankah benar bahwa jika Anda memiliki MLP dengan satu lapisan tersembunyi 100 unit, yang memiliki jumlah parameter yang sama dengan RNN standar dengan 100 unit tersembunyi karena pembagian berat? Ini memiliki lebih banyak 'sinapsis' - lebih banyak 'aktivasi' - tetapi jumlah parameter yang sama, kan?
StatsSorceress
Saya tidak terbiasa dengan istilah berbagi 'berat'. Ini memiliki jumlah aktivasi yang sama, tetapi lebih banyak koneksi sehingga lebih banyak parameter ...
Thomas W
Pembagian bobot berarti bahwa matriks bobot dari satu lapisan tersembunyi di RNN ke lapisan tersembunyi berikutnya adalah sama; itu adalah matriks 'U' yang sama, direplikasi dari waktu ke waktu. Juga, bobot dari input ke lapisan tersembunyi adalah sama sepanjang waktu.
StatsSorceress
@StSSorceress Saya tidak terbiasa bekerja dengan matriks. Ya, matriks bobot dari lapisan tersembunyi ke lapisan berikutnya adalah sama. Namun, ada lebih banyak koneksi secara total (karena sebuah layer juga dapat terhubung ke lapisan PREVIOUS). Saya tidak yakin bagaimana saya bisa menjelaskan, tetapi RNN akan selalu memiliki lebih banyak parameter karena ada lebih banyak lapisan yang terhubung ..
Thomas W
Ya, saya mengerti bahwa secara fisik ada lebih banyak parameter, tetapi banyak dari parameter tersebut mengambil nilai yang sama, yang berarti jumlah parameter efektif dalam MLP dan RNN dengan jumlah dimensi input yang sama dan jumlah dimensi tersembunyi yang sama akan menjadi sama.
StatsSorceress