Terjemahan artikel disiapkan pada malam dimulainya kursus
Pelatihan terdistribusi pada beberapa contoh komputasi berkinerja tinggi dapat mengurangi waktu pelatihan jaringan saraf dalam modern pada sejumlah besar data dari minggu ke jam atau bahkan menit, menjadikan teknik pelatihan ini lazim dalam aplikasi praktis pembelajaran mendalam. Pengguna harus memahami cara berbagi dan menyinkronkan data di beberapa instance, yang pada gilirannya berdampak besar pada efisiensi penskalaan. Selain itu, pengguna juga harus mengetahui cara menyebarkan skrip pelatihan yang berjalan pada satu instance ke beberapa instance.
Pada artikel ini kita akan membahas cara cepat dan mudah untuk mendistribusikan pembelajaran menggunakan perpustakaan pembelajaran mendalam terbuka Apache MXNet dan kerangka pembelajaran terdistribusi Horovod. Kami akan mendemonstrasikan dengan jelas manfaat kinerja kerangka Horovod dan mendemonstrasikan cara menulis skrip pelatihan MXNet sehingga dapat berfungsi secara terdistribusi dengan Horovod.
Apa itu Apache MXNet
Pelatihan terdistribusi di MXNet dengan server parameter
Apa itu Horovod
Integrasi MXNet dan Horovod
MXNet terintegrasi dengan Horovod melalui API Pembelajaran Terdistribusi yang ditentukan di Horovod. API komunikasi Horovod horovod.siaran(), horovod.allgather() ΠΈ horovod.allreduce() diimplementasikan menggunakan callback asinkron dari mesin MXNet, sebagai bagian dari grafik tugasnya. Dengan cara ini, ketergantungan data antara komunikasi dan komputasi dengan mudah ditangani oleh mesin MXNet untuk menghindari hilangnya kinerja akibat sinkronisasi. Objek pengoptimal terdistribusi ditentukan di Horovod horovod.DistributedOptimizer mengembang Pengoptimal di MXNet sehingga memanggil API Horovod yang sesuai untuk pembaruan parameter terdistribusi. Semua detail implementasi ini transparan bagi pengguna akhir.
Mulai cepat
Anda dapat dengan cepat mulai melatih jaringan neural konvolusional kecil pada kumpulan data MNIST menggunakan MXNet dan Horovod di MacBook Anda.
Pertama, instal mxnet dan horovod dari PyPI:
pip install mxnet
pip install horovod
Catatan: Jika Anda mengalami kesalahan saat pip instal horovodmungkin Anda perlu menambahkan variabel MACOSX_DEPLOYMENT_TARGET=10.vvDimana vv β ini adalah versi versi MacOS Anda, misalnya untuk MacOSX Sierra Anda perlu menulis MACOSX_DEPLOYMENT_TARGET=10.12 pip instal horovod
Kemudian instal OpenMPI
Terakhir, unduh skrip pengujian mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
Ini akan menjalankan pelatihan pada dua inti prosesor Anda. Outputnya adalah sebagai berikut:
INFO:root:Epoch[0] Batch [0-50] Speed: 2248.71 samples/sec accuracy=0.583640
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.89 samples/sec accuracy=0.882812
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.39 samples/sec accuracy=0.870000
Demo Kinerja
Saat melatih model ResNet50-v1 pada kumpulan data ImageNet pada 64 GPU dengan delapan instans p3.16xbesar EC2, masing-masing berisi 8 GPU NVIDIA Tesla V100 di AWS cloud, kami mencapai throughput pelatihan sebesar 45000 gambar/detik (yaitu, jumlah sampel terlatih per detik). Pelatihan selesai dalam 44 menit setelah 90 epoch dengan akurasi terbaik 75.7%.
Kami membandingkannya dengan pendekatan pelatihan terdistribusi MXNet yang menggunakan server parameter pada 8, 16, 32, dan 64 GPU dengan server parameter tunggal dan rasio server terhadap pekerja masing-masing 1 banding 1 dan 2 banding 1. Anda dapat melihat hasilnya pada Gambar 1 di bawah ini. Pada sumbu y di sebelah kiri, batang mewakili jumlah gambar yang akan dilatih per detik, garis mencerminkan efisiensi penskalaan (yaitu, rasio throughput aktual dan ideal) pada sumbu y di sebelah kanan. Seperti yang Anda lihat, pilihan jumlah server mempengaruhi efisiensi penskalaan. Jika hanya ada satu server parameter, efisiensi penskalaan turun menjadi 38% pada 64 GPU. Untuk mencapai efisiensi penskalaan yang sama seperti Horovod, Anda perlu menggandakan jumlah server dibandingkan dengan jumlah pekerja.
Gambar 1. Perbandingan pembelajaran terdistribusi menggunakan MXNet dengan Horovod dan dengan server parameter
Pada Tabel 1 di bawah, kami membandingkan biaya akhir per instans saat menjalankan eksperimen pada 64 GPU. Menggunakan MXNet dengan Horovod memberikan throughput terbaik dengan biaya terendah.
Tabel 1. Perbandingan biaya antara Horovod dan Parameter Server dengan rasio server terhadap pekerja 2 banding 1.
Langkah-langkah untuk mereproduksi
Pada langkah selanjutnya, kami akan menunjukkan cara mereproduksi hasil pelatihan terdistribusi menggunakan MXNet dan Horovod. Untuk mempelajari lebih lanjut tentang pembelajaran terdistribusi dengan MXNet, baca
Langkah 1
Buat cluster instance homogen dengan MXNet versi 1.4.0 atau lebih tinggi dan Horovod versi 0.16.0 atau lebih tinggi untuk menggunakan pembelajaran terdistribusi. Anda juga perlu menginstal perpustakaan untuk pelatihan GPU. Untuk contoh kami, kami memilih Ubuntu 16.04 Linux, dengan Driver GPU 396.44, CUDA 9.2, perpustakaan cuDNN 7.2.1, komunikator NCCL 2.2.13 dan OpenMPI 3.1.1. Anda juga dapat menggunakan
Langkah 2
Tambahkan kemampuan untuk bekerja dengan Horovod API ke skrip pelatihan MXNet Anda. Skrip di bawah ini berdasarkan MXNet Gluon API dapat digunakan sebagai templat sederhana. Baris yang dicetak tebal diperlukan jika Anda sudah memiliki skrip pelatihan yang sesuai. Berikut adalah beberapa perubahan penting yang perlu Anda lakukan untuk belajar dengan Horovod:
- Tetapkan konteks sesuai dengan peringkat Horovod lokal (baris 8) untuk memahami bahwa pelatihan dilakukan pada inti grafis yang benar.
- Meneruskan parameter awal dari satu pekerja ke semua (baris 18) untuk memastikan bahwa semua pekerja memulai dengan parameter awal yang sama.
- Buat Horovod Pengoptimal Terdistribusi (baris 25) untuk memperbarui parameter secara terdistribusi.
Untuk mendapatkan skrip lengkapnya, silakan lihat contoh Horovod-MXNet
1 import mxnet as mx
2 import horovod.mxnet as hvd
3
4 # Horovod: initialize Horovod
5 hvd.init()
6
7 # Horovod: pin a GPU to be used to local rank
8 context = mx.gpu(hvd.local_rank())
9
10 # Build model
11 model = ...
12
13 # Initialize parameters
14 model.initialize(initializer, ctx=context)
15 params = model.collect_params()
16
17 # Horovod: broadcast parameters
18 hvd.broadcast_parameters(params, root_rank=0)
19
20 # Create optimizer
21 optimizer_params = ...
22 opt = mx.optimizer.create('sgd', **optimizer_params)
23
24 # Horovod: wrap optimizer with DistributedOptimizer
25 opt = hvd.DistributedOptimizer(opt)
26
27 # Create trainer and loss function
28 trainer = mx.gluon.Trainer(params, opt, kvstore=None)
29 loss_fn = ...
30
31 # Train model
32 for epoch in range(num_epoch):
33 ...
Langkah 3
Masuk ke salah satu pekerja untuk memulai pelatihan terdistribusi menggunakan arahan MPI. Dalam contoh ini, pelatihan terdistribusi berjalan pada empat instans dengan masing-masing 4 GPU, dan total 16 GPU dalam cluster. Pengoptimal Stochastic Gradient Descent (SGD) akan digunakan dengan hyperparameter berikut:
- ukuran tumpukan mini: 256
- kecepatan pembelajaran: 0.1
- momentumnya: 0.9
- penurunan berat badan: 0.0001
Saat kami menskalakan dari satu GPU menjadi 64 GPU, kami menskalakan laju pelatihan secara linier sesuai dengan jumlah GPU (dari 0,1 untuk 1 GPU menjadi 6,4 untuk 64 GPU), sekaligus mempertahankan jumlah gambar per GPU pada 256 (dari kumpulan 256 gambar untuk 1 GPU hingga 16 untuk 384 GPU). Parameter peluruhan bobot dan momentum berubah seiring bertambahnya jumlah GPU. Kami menggunakan pelatihan presisi campuran dengan tipe data float64 untuk forward pass dan float16 untuk gradien guna mempercepat penghitungan float32 yang didukung oleh GPU NVIDIA Tesla.
$ mpirun -np 16
-H server1:4,server2:4,server3:4,server4:4
-bind-to none -map-by slot
-mca pml ob1 -mca btl ^openib
python mxnet_imagenet_resnet50.py
Kesimpulan
Dalam artikel ini, kita melihat pendekatan terukur untuk pelatihan model terdistribusi menggunakan Apache MXNet dan Horovod. Kami mendemonstrasikan efisiensi penskalaan dan efektivitas biaya dibandingkan dengan pendekatan server parameter pada kumpulan data ImageNet tempat model ResNet50-v1 dilatih. Kami juga menyertakan langkah-langkah yang dapat Anda gunakan untuk memodifikasi skrip yang ada untuk menjalankan pelatihan multi-instance menggunakan Horovod.
Jika Anda baru memulai MXNet dan pembelajaran mendalam, buka halaman instalasi
Jika Anda sudah bekerja dengan MXNet dan ingin mencoba pembelajaran terdistribusi dengan Horovod, lihatlah
*biaya dihitung berdasarkan
Pelajari lebih lanjut tentang kursus ini
Sumber: www.habr.com