Apache MXNet - Pelatihan Terdistribusi
Bab ini membahas tentang pelatihan terdistribusi di Apache MXNet. Mari kita mulai dengan memahami apa saja mode komputasi di MXNet.
Mode Komputasi
MXNet, pustaka ML multi-bahasa, menawarkan kepada penggunanya dua mode komputasi berikut -
Mode imperatif
Mode komputasi ini memperlihatkan antarmuka seperti NumPy API. Misalnya, di MXNet, gunakan kode imperatif berikut untuk membuat tensor nol pada CPU serta GPU -
import mxnet as mx
tensor_cpu = mx.nd.zeros((100,), ctx=mx.cpu())
tensor_gpu= mx.nd.zeros((100,), ctx=mx.gpu(0))
Seperti yang kita lihat pada kode di atas, MXNets menentukan lokasi tempat menyimpan tensor, baik di perangkat CPU atau GPU. Dalam contoh di atas, ini berada di lokasi 0. MXNet mencapai pemanfaatan perangkat yang luar biasa, karena semua komputasi terjadi secara malas, bukan secara instan.
Mode simbolik
Meskipun mode imperatif cukup berguna, namun salah satu kelemahan mode ini adalah kekakuannya, yaitu semua perhitungan perlu diketahui sebelumnya bersama dengan struktur data yang telah ditentukan sebelumnya.
Di sisi lain, mode Simbolik menampilkan grafik komputasi seperti TensorFlow. Ini menghilangkan kelemahan API imperatif dengan mengizinkan MXNet untuk bekerja dengan simbol atau variabel alih-alih struktur data tetap / yang telah ditentukan sebelumnya. Setelah itu, simbol dapat diartikan sebagai satu set operasi sebagai berikut -
import mxnet as mx
x = mx.sym.Variable(“X”)
y = mx.sym.Variable(“Y”)
z = (x+y)
m = z/100
Macam-Macam Paralelisme
Apache MXNet mendukung pelatihan terdistribusi. Ini memungkinkan kami memanfaatkan banyak mesin untuk pelatihan yang lebih cepat dan efektif.
Berikut adalah dua cara di mana, kami dapat mendistribusikan beban kerja pelatihan NN di beberapa perangkat, CPU atau perangkat GPU -
Paralelisme Data
Dalam jenis paralelisme ini, setiap perangkat menyimpan salinan lengkap model dan bekerja dengan bagian berbeda dari kumpulan data. Perangkat juga memperbarui model bersama secara kolektif. Kami dapat menemukan semua perangkat di satu mesin atau di beberapa mesin.
Model Paralelisme
Ini adalah jenis paralelisme lain, yang berguna saat model terlalu besar sehingga tidak cocok dengan memori perangkat. Dalam model paralelisme, perangkat yang berbeda ditugaskan untuk mempelajari bagian-bagian model yang berbeda. Hal penting yang perlu diperhatikan di sini adalah bahwa saat ini Apache MXNet mendukung paralelisme model hanya dalam satu mesin.
Kerja pelatihan terdistribusi
Konsep yang diberikan di bawah ini adalah kunci untuk memahami cara kerja pelatihan terdistribusi di Apache MXNet -
Jenis proses
Proses berkomunikasi satu sama lain untuk menyelesaikan pelatihan model. Apache MXNet memiliki tiga proses berikut -
Pekerja
Tugas node pekerja adalah melakukan pelatihan pada sekumpulan sampel pelatihan. Node Pekerja akan menarik bobot dari server sebelum memproses setiap kelompok. Node Pekerja akan mengirim gradien ke server, setelah batch diproses.
Server
MXNet dapat memiliki beberapa server untuk menyimpan parameter model dan untuk berkomunikasi dengan node pekerja.
Penjadwal
Peran penjadwal adalah menyiapkan cluster, yang mencakup menunggu pesan yang setiap node telah muncul dan port mana yang didengarkan node. Setelah menyiapkan cluster, penjadwal memungkinkan semua proses mengetahui tentang setiap node lain di cluster. Itu karena proses dapat berkomunikasi satu sama lain. Hanya ada satu penjadwal.
Toko KV
Toko KV adalah singkatan dari Key-Valuetoko. Ini adalah komponen penting yang digunakan untuk pelatihan multi-perangkat. Ini penting karena, komunikasi parameter di seluruh perangkat pada satu atau beberapa mesin ditransmisikan melalui satu atau lebih server dengan KVStore untuk parameter. Mari kita pahami cara kerja KVStore dengan bantuan poin-poin berikut -
Setiap nilai di KVStore diwakili oleh a key dan a value.
Setiap larik parameter dalam jaringan diberikan a key dan bobot dari parameter array tersebut dirujuk oleh value.
Setelah itu, node pekerja pushgradien setelah memproses batch. Mereka jugapull memperbarui bobot sebelum memproses kelompok baru.
Gagasan server KVStore hanya ada selama pelatihan terdistribusi dan mode terdistribusi itu diaktifkan dengan memanggil mxnet.kvstore.create berfungsi dengan argumen string yang berisi kata dist -
kv = mxnet.kvstore.create(‘dist_sync’)
Distribusi Kunci
Tidak perlu bahwa, semua server menyimpan semua larik parameter atau kunci, tetapi mereka didistribusikan ke server yang berbeda. Distribusi kunci semacam itu di berbagai server ditangani secara transparan oleh KVStore dan keputusan server mana yang menyimpan kunci tertentu dibuat secara acak.
KVStore, seperti yang dibahas di atas, memastikan bahwa setiap kali kunci ditarik, permintaannya dikirim ke server itu, yang memiliki nilai yang sesuai. Bagaimana jika nilai beberapa kunci besar? Dalam hal ini, ini mungkin dibagikan ke server yang berbeda.
Pisahkan data pelatihan
Sebagai pengguna, kami ingin setiap mesin bekerja pada bagian yang berbeda dari kumpulan data, terutama saat menjalankan pelatihan terdistribusi dalam mode paralel data. Kita tahu bahwa, untuk membagi sekumpulan sampel yang disediakan oleh iterator data untuk pelatihan paralel data pada satu pekerja, kita dapat menggunakanmxnet.gluon.utils.split_and_load lalu, muat setiap bagian dari kelompok tersebut pada perangkat yang akan memprosesnya lebih lanjut.
Di sisi lain, dalam kasus pelatihan terdistribusi, pada awalnya kita perlu membagi dataset menjadi nbagian yang berbeda sehingga setiap pekerja mendapatkan bagian yang berbeda. Setelah didapat, setiap pekerja kemudian dapat menggunakansplit_and_loaduntuk sekali lagi membagi bagian dari kumpulan data tersebut ke berbagai perangkat pada satu mesin. Semua ini terjadi melalui iterator data.mxnet.io.MNISTIterator dan mxnet.io.ImageRecordIter adalah dua iterator di MXNet yang mendukung fitur ini.
Pembaruan bobot
Untuk memperbarui bobot, KVStore mendukung dua mode berikut -
Metode pertama menggabungkan gradien dan memperbarui bobot dengan menggunakan gradien tersebut.
Dalam metode kedua, server hanya menggabungkan gradien.
Jika Anda menggunakan Gluon, ada opsi untuk memilih di antara metode yang disebutkan di atas dengan meneruskan update_on_kvstorevariabel. Mari kita pahami dengan membuat filetrainer objek sebagai berikut -
trainer = gluon.Trainer(net.collect_params(), optimizer='sgd',
optimizer_params={'learning_rate': opt.lr,
'wd': opt.wd,
'momentum': opt.momentum,
'multi_precision': True},
kvstore=kv,
update_on_kvstore=True)
Mode Pelatihan Terdistribusi
Jika string pembuatan KVStore berisi kata dist, itu berarti pelatihan terdistribusi diaktifkan. Berikut ini adalah berbagai mode pelatihan terdistribusi yang dapat diaktifkan dengan menggunakan berbagai jenis KVStore -
dist_sync
Seperti namanya, ini menunjukkan pelatihan terdistribusi sinkron. Dalam hal ini, semua pekerja menggunakan set parameter model tersinkronisasi yang sama di awal setiap batch.
Kekurangan dari mode ini adalah, setelah setiap kelompok server harus menunggu untuk menerima gradien dari setiap pekerja sebelum memperbarui parameter model. Ini berarti bahwa jika seorang pekerja mengalami kecelakaan, itu akan menghentikan kemajuan semua pekerja.
dist_async
Seperti namanya, ini menunjukkan pelatihan terdistribusi sinkron. Dalam hal ini, server menerima gradien dari satu pekerja dan segera memperbarui penyimpanannya. Server menggunakan toko yang diperbarui untuk menanggapi tarikan lebih lanjut.
Keuntungannya, dibandingkan dist_sync mode, adalah bahwa seorang pekerja yang menyelesaikan pemrosesan batch dapat menarik parameter saat ini dari server dan memulai batch berikutnya. Pekerja bisa melakukannya, meskipun pekerja lain belum selesai memproses kelompok sebelumnya. Ini juga lebih cepat daripada mode dist_sync karena, diperlukan waktu lebih lama untuk berkumpul tanpa biaya sinkronisasi.
dist_sync_device
Mode ini sama dengan dist_syncmode. Satu-satunya perbedaan adalah, ketika ada beberapa GPU yang digunakan pada setiap nodedist_sync_device menggabungkan gradien dan memperbarui bobot pada GPU sedangkan, dist_sync menggabungkan gradien dan memperbarui bobot pada memori CPU.
Ini mengurangi komunikasi mahal antara GPU dan CPU. Itulah mengapa, ini lebih cepat daridist_sync. Kekurangannya adalah meningkatkan penggunaan memori pada GPU.
dist_async_device
Mode ini bekerja sama dengan dist_sync_device mode, tetapi dalam mode asynchronous.