Pembelajaran Teragih dengan Apache MXNet dan Horovod

Terjemahan artikel telah disediakan pada malam permulaan kursus "ML Industri pada Data Besar"

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

Apache MX Net ialah rangka kerja pembelajaran dalam sumber terbuka yang digunakan untuk mencipta, melatih dan menggunakan rangkaian saraf dalam. MXNet menguraikan kerumitan yang berkaitan dengan pelaksanaan rangkaian saraf, berprestasi tinggi dan berskala, serta menawarkan API untuk bahasa pengaturcaraan popular seperti Python, C + +, Clojure, Java, Julia, R, Scala dan lain-lain.

Latihan diedarkan dalam MXNet dengan pelayan parameter

Modul pembelajaran teragih standard dalam MXNet menggunakan pendekatan pelayan parameter. Ia menggunakan set pelayan parameter untuk mengumpul kecerunan daripada setiap pekerja, melaksanakan pengagregatan dan menghantar semula kecerunan yang dikemas kini kepada pekerja untuk lelaran pengoptimuman seterusnya. Menentukan nisbah pelayan yang betul kepada pekerja adalah kunci kepada penskalaan yang berkesan. Jika hanya terdapat satu pelayan parameter, ia mungkin menjadi halangan dalam pengiraan. Sebaliknya, jika terlalu banyak pelayan digunakan, komunikasi banyak-ke-banyak boleh menyumbat semua sambungan rangkaian.

Apa itu Horovod

Horovod ialah rangka kerja pembelajaran mendalam teragih terbuka yang dibangunkan di Uber. Ia memanfaatkan teknologi silang GPU dan silang nod yang cekap seperti NVIDIA Collective Communications Library (NCCL) dan Message Passing Interface (MPI) untuk mengedar dan mengagregat parameter model merentas vorecs. Ia mengoptimumkan penggunaan lebar jalur rangkaian dan berskala dengan baik apabila bekerja dengan model rangkaian saraf dalam. Ia kini menyokong beberapa rangka kerja pembelajaran mesin yang popular, iaitu MX Net, Tensorflow, Keras dan PyTorch.

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 oleh itu.

Pada akhirnya, muat turun skrip ujian mxnet_mnist.py oleh itu dan jalankan arahan berikut dalam terminal MacBook dalam direktori kerja:

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.

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

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

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 Amazon Deep Learning AMI, di mana perpustakaan ini telah pun diprapasang.

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

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 MXNeuntuk mula-mula membina MXNet. Kami juga amat mengesyorkan membaca artikel itu MXNet dalam masa 60 minituntuk memulakan.

Jika anda telah bekerja dengan MXNet dan ingin mencuba pembelajaran teragih dengan Horovod, sila lihat Halaman pemasangan Horovod, bina daripada MXNet dan ikuti contoh MNIST atau ImageNet.

*kos dikira berdasarkan kadar setiap jam AWS untuk Instans EC2

Ketahui lebih lanjut tentang kursus "ML Industri pada Data Besar"

Sumber: www.habr.com

Tambah komen