Pembelajaran Terdistribusi dengan Apache MXNet dan Horovod

Terjemahan artikel disiapkan pada malam dimulainya kursus "ML Industri pada Big Data"

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

Apache MX Net adalah kerangka pembelajaran mendalam sumber terbuka yang digunakan untuk membuat, melatih, dan menyebarkan jaringan saraf dalam. MXNet mengabstraksi kompleksitas yang terkait dengan penerapan jaringan saraf, memiliki kinerja tinggi dan skalabel, serta menawarkan API untuk bahasa pemrograman populer seperti Ular sanca, C + +, Clojure, Jawa, Julia, R, Scala dan lain-lain.

Pelatihan terdistribusi di MXNet dengan server parameter

Modul pembelajaran terdistribusi standar di MXNet menggunakan pendekatan server parameter. Ia menggunakan sekumpulan server parameter untuk mengumpulkan gradien dari setiap pekerja, melakukan agregasi, dan mengirim kembali gradien yang diperbarui ke pekerja untuk iterasi pengoptimalan berikutnya. Menentukan rasio server dan pekerja yang tepat adalah kunci penskalaan yang efektif. Jika hanya ada satu server parameter, hal ini mungkin akan menjadi hambatan dalam penghitungan. Sebaliknya, jika terlalu banyak server yang digunakan, komunikasi banyak-ke-banyak dapat menyumbat semua koneksi jaringan.

Apa itu Horovod

Horovod adalah kerangka pembelajaran mendalam terdistribusi terbuka yang dikembangkan di Uber. Ini memanfaatkan teknologi lintas GPU dan lintas node yang efisien seperti NVIDIA Collective Communications Library (NCCL) dan Message Passing Interface (MPI) untuk mendistribusikan dan menggabungkan parameter model di seluruh vorec. Ini mengoptimalkan penggunaan bandwidth jaringan dan menskalakan dengan baik saat bekerja dengan model jaringan neural dalam. Saat ini mendukung beberapa kerangka pembelajaran mesin yang populer, yaitu MX Net, Tensorflow, Keras, dan PyTorch.

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 karenanya.

Terakhir, unduh skrip pengujian mxnet_mnist.py karenanya dan jalankan perintah berikut di terminal MacBook di direktori kerja:

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.

Pembelajaran Terdistribusi dengan Apache MXNet dan Horovod
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.

Pembelajaran Terdistribusi dengan Apache MXNet dan Horovod
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 posting ini.

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 AMI Pembelajaran Mendalam Amazon, dimana perpustakaan ini sudah diinstal sebelumnya.

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 MNIST ΠΈ IMAGEnet.

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 MXNeuntuk pertama kali membangun MXNet. Kami juga sangat menyarankan membaca artikel tersebut MXNet dalam 60 menituntuk memulai.

Jika Anda sudah bekerja dengan MXNet dan ingin mencoba pembelajaran terdistribusi dengan Horovod, lihatlah Halaman instalasi Horovod, buat dari MXNet dan ikuti contohnya MNIST ΠΈΠ»ΠΈ IMAGEnet.

*biaya dihitung berdasarkan tarif per jam AWS untuk Instans EC2

Pelajari lebih lanjut tentang kursus ini "ML Industri pada Big Data"

Sumber: www.habr.com

Tambah komentar