Teknik untuk Melatih Jaringan Syaraf Besar Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Teknik untuk Melatih Jaringan Neural Besar

Teknik untuk Melatih Jaringan Neural Besar

Jaringan saraf besar adalah inti dari banyak kemajuan terbaru dalam AI, tetapi melatihnya adalah tantangan rekayasa dan penelitian yang sulit yang membutuhkan pengaturan sekelompok GPU untuk melakukan satu perhitungan tersinkronisasi. Seiring dengan berkembangnya ukuran klaster dan model, praktisi pembelajaran mesin telah mengembangkan berbagai teknik yang semakin meningkat untuk memparalelkan pelatihan model pada banyak GPU. Sekilas, memahami teknik paralelisme ini mungkin tampak menakutkan, tetapi dengan hanya beberapa asumsi tentang struktur komputasi, teknik ini menjadi jauh lebih jelasโ€”pada saat itu, Anda hanya berpindah-pindah bit buram dari A ke B seperti jaringan beralih angkutan di sekitar paket.

Paralelisme Data

Teknik untuk Melatih Jaringan Neural Besar

Paralelisme Pipa

Teknik untuk Melatih Jaringan Neural Besar

Paralelisme Tensor

Teknik untuk Melatih Jaringan Neural Besar

Paralelisme Ahli

Teknik untuk Melatih Jaringan Neural Besar

Paralelisme Data

Teknik untuk Melatih Jaringan Neural Besar

Paralelisme Pipa

Teknik untuk Melatih Jaringan Neural Besar

Paralelisme Tensor

Teknik untuk Melatih Jaringan Neural Besar

Paralelisme Ahli

Teknik untuk Melatih Jaringan Neural Besar

Ilustrasi berbagai strategi paralelisme pada model tiga lapis. Setiap warna mengacu pada satu lapisan dan garis putus-putus memisahkan GPU yang berbeda.

Tidak Ada Paralelisme

Pelatihan jaringan saraf adalah proses berulang. Dalam setiap iterasi, kami melakukan pass forward melalui model lapisan untuk menghitung output untuk setiap contoh pelatihan dalam kumpulan data. Kemudian pass lain berlanjut ke belakang melalui lapisan, menyebarkan seberapa besar setiap parameter mempengaruhi hasil akhir dengan menghitung a lereng sehubungan dengan setiap parameter. Gradien rata-rata untuk batch, parameter, dan beberapa status pengoptimalan per parameter diteruskan ke algoritme pengoptimalan, seperti Adam, yang menghitung parameter iterasi berikutnya (yang seharusnya memiliki performa yang sedikit lebih baik pada data Anda) dan status pengoptimalan per parameter baru. Saat pelatihan berulang pada kumpulan data, model berkembang untuk menghasilkan keluaran yang semakin akurat.

Berbagai teknik paralelisme mengiris proses pelatihan ini melintasi dimensi yang berbeda, termasuk:

  • Paralelisme dataโ€”jalankan subset batch yang berbeda pada GPU yang berbeda;
  • Paralelisme saluranโ€”jalankan lapisan model yang berbeda pada GPU yang berbeda;
  • Paralelisme tensorโ€”pecah matematika untuk satu operasi seperti perkalian matriks untuk dibagi di seluruh GPU;
  • Mixture-of-Expertsโ€”proses setiap contoh hanya dengan sebagian kecil dari setiap lapisan.

(Dalam posting ini, kami akan berasumsi bahwa Anda menggunakan GPU untuk melatih jaringan saraf Anda, tetapi ide yang sama berlaku untuk mereka yang menggunakan yang lain akselerator jaringan saraf.)

Paralelisme Data

Data Paralel pelatihan berarti menyalin parameter yang sama ke beberapa GPU (sering disebut "pekerja") dan memberikan contoh yang berbeda untuk masing-masing untuk diproses secara bersamaan. Paralelisme data saja masih mengharuskan model Anda masuk ke dalam satu memori GPU, tetapi memungkinkan Anda memanfaatkan komputasi banyak GPU dengan biaya menyimpan banyak salinan duplikat parameter Anda. Meskipun demikian, ada strategi untuk meningkatkan RAM efektif yang tersedia untuk GPU Anda, seperti melepas parameter sementara ke memori CPU di antara penggunaan.

Karena setiap pekerja paralel data memperbarui salinan parameternya, mereka perlu berkoordinasi untuk memastikan bahwa setiap pekerja terus memiliki parameter yang serupa. Pendekatan paling sederhana adalah dengan memperkenalkan komunikasi pemblokiran antara pekerja: (1) menghitung gradien pada setiap pekerja secara independen; (2) rata-rata gradien di seluruh pekerja; dan (3) secara independen menghitung parameter baru yang sama pada setiap pekerja. Langkah (2) adalah rata-rata pemblokiran yang memerlukan transfer cukup banyak data (sebanding dengan jumlah pekerja dikalikan ukuran parameter Anda), yang dapat merusak hasil pelatihan Anda. Ada berbagai skema sinkronisasi asinkron untuk menghapus overhead ini, tetapi mereka merusak efisiensi pembelajaran; dalam praktiknya, orang pada umumnya tetap berpegang pada pendekatan sinkron.

Paralelisme Pipa

Dengan Pipa Paralel pelatihan, kami mempartisi potongan berurutan dari model di seluruh GPU. Setiap GPU hanya menampung sebagian kecil parameter, dan dengan demikian model yang sama mengkonsumsi lebih sedikit memori per GPU secara proporsional.

Sangat mudah untuk membagi model besar menjadi potongan-potongan lapisan berturut-turut. Namun, ada ketergantungan berurutan antara input dan output dari lapisan, sehingga implementasi naif dapat menyebabkan sejumlah besar waktu idle sementara seorang pekerja menunggu output dari mesin sebelumnya untuk digunakan sebagai inputnya. Potongan waktu tunggu ini dikenal sebagai โ€œgelembungโ€, membuang-buang perhitungan yang dapat dilakukan oleh mesin yang tidak bekerja.

Teknik untuk Melatih Jaringan Neural Besar Depan
Teknik untuk Melatih Jaringan Neural Besar Ke belakang
Teknik untuk Melatih Jaringan Neural Besar Pembaruan gradien
Teknik untuk Melatih Jaringan Neural Besar Siaga
Teknik untuk Melatih Jaringan Neural Besar

Ilustrasi pengaturan paralelisme pipa naif di mana model dibagi secara vertikal menjadi 4 partisi demi lapisan. Worker 1 menghosting parameter model lapisan pertama jaringan (paling dekat dengan input), sedangkan worker 4 menghosting layer 4 (yang paling dekat dengan output). "F", "B", dan "U" masing-masing mewakili operasi maju, mundur, dan pembaruan. Subskrip menunjukkan pekerja mana yang menjalankan operasi. Data diproses oleh satu pekerja pada satu waktu karena ketergantungan berurutan, yang mengarah ke "gelembung" besar waktu idle.

Kami dapat menggunakan kembali ide dari paralelisme data untuk mengurangi biaya gelembung dengan meminta setiap pekerja hanya memproses subset elemen data pada satu waktu, memungkinkan kami untuk secara cerdik tumpang tindih perhitungan baru dengan waktu tunggu. Ide intinya adalah untuk membagi satu batch menjadi beberapa microbatch; setiap microbatch harus secara proporsional lebih cepat untuk diproses dan setiap pekerja mulai mengerjakan microbatch berikutnya segera setelah tersedia, sehingga mempercepat eksekusi pipeline. Dengan microbatch yang cukup, pekerja dapat digunakan sebagian besar waktu dengan gelembung minimal di awal dan akhir langkah. Gradien dirata-ratakan di seluruh microbatch, dan pembaruan parameter hanya terjadi setelah semua microbatch selesai.

Jumlah pekerja yang dibagi model umumnya dikenal sebagai kedalaman pipa.

Selama forward pass, pekerja hanya perlu mengirim output (disebut aktivasi) dari potongan lapisannya ke pekerja berikutnya; selama lintasan mundur, ia hanya mengirimkan gradien pada aktivasi tersebut ke pekerja sebelumnya. Ada ruang desain besar tentang cara menjadwalkan lintasan ini dan cara menggabungkan gradien di seluruh mikrobatch. pipa GP memiliki setiap proses pekerja maju dan mundur secara berurutan dan kemudian mengumpulkan gradien dari beberapa mikrobatch secara sinkron di akhir. PipaMimpi alih-alih menjadwalkan setiap pekerja untuk memproses umpan maju dan mundur secara alternatif.

Teknik untuk Melatih Jaringan Neural Besar Depan
Teknik untuk Melatih Jaringan Neural Besar Ke belakang
Teknik untuk Melatih Jaringan Neural Besar Memperbarui
Teknik untuk Melatih Jaringan Neural Besar Siaga
pipa GP

Teknik untuk Melatih Jaringan Neural Besar

PipaMimpi

Teknik untuk Melatih Jaringan Neural Besar

Perbandingan skema pipelining GPipe dan PipeDream, menggunakan 4 microbatch per batch. Microbatch 1-8 sesuai dengan dua batch data berturut-turut. Pada gambar, "(angka)" menunjukkan mikrobatch mana operasi dilakukan dan subskrip menandai ID pekerja. Perhatikan bahwa PipeDream mendapatkan lebih banyak efisiensi dengan melakukan beberapa perhitungan dengan parameter basi.

Paralelisme Tensor

Paralelisme saluran pipa membagi model โ€œsecara vertikalโ€ demi lapisan. Ini juga memungkinkan untuk "secara horizontal" membagi operasi tertentu dalam sebuah lapisan, yang biasanya disebut Tensor Paralel pelatihan. Untuk banyak model modern (seperti Transformator), kemacetan komputasi adalah mengalikan matriks batch aktivasi dengan matriks bobot besar. perkalian matriks dapat dianggap sebagai produk titik antara pasangan baris dan kolom; dimungkinkan untuk menghitung produk titik independen pada GPU yang berbeda, atau untuk menghitung bagian dari setiap produk titik pada GPU yang berbeda dan menjumlahkan hasilnya. Dengan salah satu strategi, kita dapat mengiris matriks bobot menjadi "pecahan" berukuran genap, menghosting setiap pecahan pada GPU yang berbeda, dan menggunakan pecahan itu untuk menghitung bagian yang relevan dari keseluruhan produk matriks sebelum kemudian berkomunikasi untuk menggabungkan hasilnya.

Salah satu contoh adalah Megatron-LM, yang memparalelkan perkalian matriks dalam lapisan self-attention dan MLP Transformer. PTD-P menggunakan tensor, data, dan paralelisme pipeline; jadwal pipanya menetapkan beberapa lapisan yang tidak berurutan ke setiap perangkat, mengurangi overhead gelembung dengan biaya lebih banyak komunikasi jaringan.

Terkadang input ke jaringan dapat diparalelkan melintasi dimensi dengan komputasi paralel tingkat tinggi relatif terhadap komunikasi silang. Paralelisme urutan adalah salah satu ide tersebut, di mana urutan input dibagi sepanjang waktu menjadi beberapa sub-contoh, secara proporsional mengurangi konsumsi memori puncak dengan memungkinkan komputasi untuk melanjutkan dengan contoh berukuran lebih granular.

Campuran Pakar (MoE)

Dengan Campuran Pakar (MoE) pendekatan, hanya sebagian kecil dari jaringan yang digunakan untuk menghitung output untuk satu input. Salah satu contoh pendekatan adalah memiliki banyak set bobot dan jaringan dapat memilih set mana yang akan digunakan melalui mekanisme gating pada waktu inferensi. Hal ini memungkinkan lebih banyak parameter tanpa peningkatan biaya komputasi. Setiap rangkaian bobot disebut sebagai "ahli", dengan harapan bahwa jaringan akan belajar untuk menetapkan perhitungan dan keterampilan khusus untuk setiap ahli. Pakar yang berbeda dapat dihosting di GPU yang berbeda, memberikan cara yang jelas untuk meningkatkan jumlah GPU yang digunakan untuk suatu model.

Teknik untuk Melatih Jaringan Neural Besar

Ilustrasi lapisan campuran ahli (MoE). Hanya 2 dari n ahli dipilih oleh jaringan gating. (Gambar diadaptasi dari: Shazeer dkk., 2017)

keras menskalakan Transformer MoE hingga 600 miliar parameter dengan skema di mana hanya lapisan MoE yang dibagi di beberapa perangkat TPU dan lapisan lain sepenuhnya diduplikasi. Beralih Transformator menskalakan ukuran model hingga triliunan parameter dengan ketersebaran yang lebih tinggi lagi dengan merutekan satu input ke satu pakar.

Desain Penghematan Memori Lainnya

Ada banyak strategi komputasi lain untuk membuat pelatihan jaringan saraf yang semakin besar menjadi lebih mudah dikendalikan. Sebagai contoh:

  • Untuk menghitung gradien, Anda harus menyimpan aktivasi asli, yang dapat menghabiskan banyak RAM perangkat. Pos pemeriksaan (juga dikenal sebagai penghitungan ulang aktivasi) menyimpan subset aktivasi apa pun, dan menghitung ulang subset antara tepat waktu selama lintasan mundur. Ini menghemat banyak memori dengan biaya komputasi paling banyak satu umpan maju penuh tambahan. Seseorang juga dapat terus menukar antara biaya komputasi dan memori dengan perhitungan ulang aktivasi selektif, yang merupakan subset pos pemeriksaan dari aktivasi yang relatif lebih mahal untuk disimpan tetapi lebih murah untuk dihitung.

  • Pelatihan Presisi Campuran adalah melatih model menggunakan angka presisi rendah (paling sering FP16). Akselerator modern dapat mencapai jumlah FLOP yang jauh lebih tinggi dengan angka presisi yang lebih rendah, dan Anda juga menghemat RAM perangkat. Dengan perawatan yang tepat, model yang dihasilkan hampir tidak kehilangan akurasi.

  • Menurunkan adalah untuk sementara membongkar data yang tidak terpakai ke CPU atau di antara perangkat yang berbeda dan kemudian membacanya kembali saat dibutuhkan. Implementasi naif akan sangat memperlambat pelatihan, tetapi implementasi yang canggih akan mengambil data terlebih dahulu sehingga perangkat tidak perlu menunggunya. Salah satu implementasi dari ide ini adalah Nol yang membagi parameter, gradien, dan status pengoptimal di semua perangkat keras yang tersedia dan mewujudkannya sesuai kebutuhan.

  • Pengoptimal Memori Efisien telah diusulkan untuk mengurangi jejak memori dari status berjalan yang dikelola oleh pengoptimal, Seperti Adafaktor.

  • Kompresi juga dapat digunakan untuk menyimpan hasil antara dalam jaringan. Sebagai contoh, Inti kompres aktivasi yang disimpan untuk back pass; DALL ยท E kompres gradien sebelum menyinkronkannya.


Di OpenAI, kami melatih dan meningkatkan model besar dari infrastruktur yang mendasarinya hingga menerapkannya untuk masalah dunia nyata. Jika Anda ingin menerapkan ide-ide dari pos iniโ€”khususnya relevan untuk tim Scaling and Applied Research kamiโ€”kami mempekerjakan!


Ucapan Terima Kasih
Terima kasih kepada Nikolas Tezak, Sam Altman, Daniel Gackle, Ilya Sutskever, dan Steven Adler untuk umpan balik tentang draf. Terima kasih kepada Justin Jay Wang, Bianca Martin, dan Steve Dowling untuk komunikasi dan desain.

Stempel Waktu:

Lebih dari OpenAI