Terjemahan artikel telah disediakan pada malam permulaan kursus
Latihan yang diedarkan pada berbilang contoh pengkomputeran berprestasi tinggi boleh mengurangkan masa latihan rangkaian saraf dalam moden pada sejumlah besar data dari minggu ke jam atau bahkan minit, menjadikan teknik latihan ini lazim dalam aplikasi praktikal pembelajaran mendalam. Pengguna mesti memahami cara berkongsi dan menyegerakkan data merentas berbilang kejadian, yang seterusnya memberi kesan besar pada kecekapan penskalaan. Di samping itu, pengguna juga harus tahu cara menggunakan skrip latihan yang dijalankan pada satu kejadian kepada berbilang kejadian.
Dalam artikel ini kita akan bercakap tentang cara cepat dan mudah untuk mengedarkan pembelajaran menggunakan perpustakaan pembelajaran mendalam terbuka Apache MXNet dan rangka kerja pembelajaran teragih Horovod. Kami akan menunjukkan dengan jelas manfaat prestasi rangka kerja Horovod dan menunjukkan cara menulis skrip latihan MXNet supaya ia berfungsi dengan cara yang diedarkan dengan Horovod.
Apa itu Apache MXNet
Latihan diedarkan dalam MXNet dengan pelayan parameter
Apa itu Horovod
Penyepaduan MXNet dan Horovod
MXNet berintegrasi dengan Horovod melalui API Pembelajaran Teragih yang ditakrifkan dalam Horovod. API komunikasi Horovod horovod.broadcast(), horovod.allgather() ΠΈ horovod.allreduce() dilaksanakan menggunakan panggilan balik tak segerak bagi enjin MXNet, sebagai sebahagian daripada graf tugasnya. Dengan cara ini, kebergantungan data antara komunikasi dan pengiraan mudah dikendalikan oleh enjin MXNet untuk mengelakkan kehilangan prestasi akibat penyegerakan. Objek pengoptimum teragih ditakrifkan dalam Horovod horovod.DistributedOptimizer mengembang Pengoptimal dalam MXNet supaya ia memanggil API Horovod yang sepadan untuk kemas kini parameter yang diedarkan. Semua butiran pelaksanaan ini adalah telus kepada pengguna akhir.
Permulaan yang cepat
Anda boleh mula melatih rangkaian saraf konvolusi dengan cepat pada set data MNIST menggunakan MXNet dan Horovod pada MacBook anda.
Pertama, pasang mxnet dan horovod dari PyPI:
pip install mxnet
pip install horovod
Nota: Jika anda menghadapi ralat semasa pip pasang horovodmungkin anda perlu menambah pembolehubah MACOSX_DEPLOYMENT_TARGET=10.vvJika vv β ini ialah versi versi MacOS anda, sebagai contoh, untuk MacOSX Sierra anda perlu menulis MACOSX_DEPLOYMENT_TARGET=10.12 pip pemasangan horovod
Kemudian pasang OpenMPI
Pada akhirnya, muat turun skrip ujian mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
Ini akan menjalankan latihan pada dua teras pemproses anda. Outputnya adalah seperti 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 Prestasi
Apabila melatih model ResNet50-v1 pada set data ImageNet pada 64 GPU dengan lapan kejadian p3.16x besar EC2, setiap satunya mengandungi 8 GPU NVIDIA Tesla V100 pada awan AWS, kami mencapai hasil latihan sebanyak 45000 imej/saat (iaitu, bilangan sampel terlatih sesaat). Latihan selesai dalam masa 44 minit selepas 90 zaman dengan ketepatan terbaik 75.7%.
Kami membandingkan ini dengan pendekatan latihan teragih MXNet menggunakan pelayan parameter pada 8, 16, 32 dan 64 GPU dengan pelayan parameter tunggal dan nisbah pelayan kepada pekerja masing-masing 1 kepada 1 dan 2 kepada 1. Anda boleh lihat hasilnya dalam Rajah 1 di bawah. Pada paksi-y di sebelah kiri, bar mewakili bilangan imej untuk dilatih sesaat, garisan mencerminkan kecekapan penskalaan (iaitu nisbah daya pemprosesan sebenar kepada ideal) pada paksi-y di sebelah kanan. Seperti yang anda lihat, pilihan bilangan pelayan mempengaruhi kecekapan penskalaan. Jika hanya terdapat satu pelayan parameter, kecekapan penskalaan menurun kepada 38% pada 64 GPU. Untuk mencapai kecekapan penskalaan yang sama seperti Horovod, anda perlu menggandakan bilangan pelayan berbanding dengan bilangan pekerja.
Rajah 1. Perbandingan pembelajaran teragih menggunakan MXNet dengan Horovod dan dengan pelayan parameter
Dalam Jadual 1 di bawah, kami membandingkan kos akhir setiap contoh apabila menjalankan percubaan pada 64 GPU. Menggunakan MXNet dengan Horovod memberikan hasil terbaik pada kos terendah.
Jadual 1. Perbandingan kos antara Horovod dan Pelayan Parameter dengan nisbah pelayan kepada pekerja 2 hingga 1.
langkah untuk membiak
Dalam langkah seterusnya, kami akan menunjukkan kepada anda cara menghasilkan semula hasil latihan yang diedarkan menggunakan MXNet dan Horovod. Untuk mengetahui lebih lanjut tentang pembelajaran teragih dengan MXNet baca
Langkah 1
Buat gugusan kejadian homogen dengan MXNet versi 1.4.0 atau lebih tinggi dan Horovod versi 0.16.0 atau lebih tinggi untuk menggunakan pembelajaran teragih. Anda juga perlu memasang perpustakaan untuk latihan GPU. Untuk contoh kami, kami memilih Ubuntu 16.04 Linux, dengan Pemacu GPU 396.44, CUDA 9.2, perpustakaan cuDNN 7.2.1, komunikator NCCL 2.2.13 dan OpenMPI 3.1.1. Anda juga boleh menggunakan
Langkah 2
Tambahkan keupayaan untuk bekerja dengan API Horovod pada skrip latihan MXNet anda. Skrip di bawah berdasarkan API MXNet Gluon boleh digunakan sebagai templat mudah. Garis dalam huruf tebal diperlukan jika anda sudah mempunyai skrip latihan yang sepadan. Berikut ialah beberapa perubahan penting yang perlu anda lakukan untuk belajar dengan Horovod:
- Tetapkan konteks mengikut kedudukan Horovod tempatan (baris 8) untuk memahami bahawa latihan dilakukan pada teras grafik yang betul.
- Lulus parameter awal daripada seorang pekerja kepada semua (baris 18) untuk memastikan semua pekerja bermula dengan parameter awal yang sama.
- Buat Horovod DistributedOptimizer (baris 25) untuk mengemas kini parameter dalam cara yang diedarkan.
Untuk mendapatkan skrip penuh, sila rujuk kepada 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
Log masuk ke salah seorang pekerja untuk memulakan latihan yang diedarkan menggunakan arahan MPI. Dalam contoh ini, latihan teragih dijalankan pada empat kejadian dengan 4 GPU setiap satu dan sejumlah 16 GPU dalam kelompok. Pengoptimum Stochastic Gradient Descent (SGD) akan digunakan dengan hiperparameter berikut:
- saiz kumpulan mini: 256
- kadar pembelajaran: 0.1
- momentum: 0.9
- pereputan berat: 0.0001
Semasa kami menskalakan daripada satu GPU kepada 64 GPU, kami menskalakan kadar latihan secara linear mengikut bilangan GPU (daripada 0,1 untuk 1 GPU kepada 6,4 untuk 64 GPU), sambil mengekalkan bilangan imej bagi setiap GPU pada 256 (dari kumpulan 256 imej untuk 1 GPU kepada 16 untuk 384 GPU). Parameter pereputan berat dan momentum berubah apabila bilangan GPU meningkat. Kami menggunakan latihan ketepatan bercampur dengan jenis data float64 untuk pas ke hadapan dan float16 untuk kecerunan untuk mempercepatkan pengiraan float32 yang disokong 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, kami melihat pendekatan berskala untuk latihan model teragih menggunakan Apache MXNet dan Horovod. Kami menunjukkan kecekapan penskalaan dan keberkesanan kos berbanding pendekatan pelayan parameter pada dataset ImageNet yang model ResNet50-v1 dilatih. Kami juga telah menyertakan langkah yang boleh anda gunakan untuk mengubah suai skrip sedia ada untuk menjalankan latihan berbilang contoh menggunakan Horovod.
Jika anda baru bermula dengan MXNet dan pembelajaran mendalam, pergi ke halaman pemasangan
Jika anda telah bekerja dengan MXNet dan ingin mencuba pembelajaran teragih dengan Horovod, sila lihat
*kos dikira berdasarkan
Ketahui lebih lanjut tentang kursus
Sumber: www.habr.com