Makalenin çevirisi kursun başlamasının arifesinde hazırlanmıştır.
Çoklu yüksek performanslı bilgi işlem örnekleri üzerinde dağıtılmış eğitim, modern derin sinir ağlarının büyük miktarda veri üzerindeki eğitim süresini haftalardan saatlere, hatta dakikalara düşürebilir ve bu eğitim tekniğini derin öğrenmenin pratik uygulamalarında yaygın hale getirebilir. Kullanıcıların birden fazla örnekte verileri nasıl paylaşacaklarını ve senkronize edeceklerini anlamaları gerekir; bu da ölçeklendirme verimliliği üzerinde önemli bir etkiye sahiptir. Ayrıca kullanıcılar, tek bir örnek üzerinde çalışan bir eğitim betiğini birden çok örneğe nasıl dağıtacaklarını da bilmelidir.
Bu makalede açık derin öğrenme kütüphanesi Apache MXNet ve Horovod dağıtılmış öğrenme çerçevesini kullanarak öğrenmeyi dağıtmanın hızlı ve kolay bir yolundan bahsedeceğiz. Horovod çerçevesinin performans avantajlarını açıkça göstereceğiz ve Horovod ile dağıtılmış bir şekilde çalışacak şekilde bir MXNet eğitim komut dosyasının nasıl yazılacağını göstereceğiz.
Apache MXNet Nedir?
derin sinir ağlarını oluşturmak, eğitmek ve dağıtmak için kullanılan açık kaynaklı bir derin öğrenme çerçevesidir. MXNet, sinir ağlarının uygulanmasıyla ilgili karmaşıklıkları ortadan kaldırır, yüksek performanslı ve ölçeklenebilirdir ve aşağıdakiler gibi popüler programlama dilleri için API'ler sunar: , , , , , , ve diğerleri.
MXNet'te parametre sunucusuyla dağıtılmış eğitim
parametre sunucusu yaklaşımını kullanır. Her çalışandan degradeleri toplamak, toplamayı gerçekleştirmek ve güncellenmiş degradeleri bir sonraki optimizasyon yinelemesi için çalışanlara geri göndermek için bir dizi parametre sunucusu kullanır. Sunucuların çalışanlara doğru oranının belirlenmesi etkili ölçeklendirmenin anahtarıdır. Eğer tek bir parametre sunucusu varsa hesaplamalarda darboğaz ortaya çıkabilir. Tersine, eğer çok fazla sunucu kullanılırsa çoktan çoğa iletişim tüm ağ bağlantılarını tıkayabilir.
Horovod nedir?
Uber'de geliştirilen açık, dağıtılmış bir derin öğrenme çerçevesidir. Model parametrelerini vorec'ler arasında dağıtmak ve toplamak için NVIDIA Toplu İletişim Kütüphanesi (NCCL) ve Mesaj Aktarma Arayüzü (MPI) gibi verimli GPU'lar arası ve düğümler arası teknolojilerden yararlanır. Ağ bant genişliği kullanımını optimize eder ve derin sinir ağı modelleriyle çalışırken iyi bir şekilde ölçeklenir. Şu anda birkaç popüler makine öğrenimi çerçevesini desteklemektedir: , Tensorflow, Keras ve PyTorch.
MXNet ve Horovod entegrasyonu
MXNet, Horovod'da tanımlanan Dağıtılmış Öğrenme API'leri aracılığıyla Horovod ile entegre olur. Horovod iletişim API'leri horovod.broadcast(), horovod.allgather() и horovod.allreduce() görev grafiğinin bir parçası olarak MXNet motorunun eşzamansız geri aramaları kullanılarak uygulanır. Bu şekilde, senkronizasyondan kaynaklanan performans kayıplarını önlemek için iletişim ve hesaplama arasındaki veri bağımlılıkları MXNet motoru tarafından kolayca yönetilir. Horovod'da tanımlanan dağıtılmış optimize edici nesnesi horovod.DistributedOptimizer genişler Doktoru dağıtılmış parametre güncellemeleri için ilgili Horovod API'lerini çağıracak şekilde MXNet'te. Tüm bu uygulama ayrıntıları son kullanıcılar için şeffaftır.
Hızlı başlangıç
MacBook'unuzda MXNet ve Horovod'u kullanarak MNIST veri kümesi üzerinde küçük bir evrişimli sinir ağını eğitmeye hızlı bir şekilde başlayabilirsiniz.
İlk önce PyPI'den mxnet ve horovod'u yükleyin:
pip install mxnet
pip install horovodNot: sırasında bir hatayla karşılaşırsanız pip horovod'u yüklebelki bir değişken eklemeniz gerekir MACOSX_DEPLOYMENT_TARGET=10.vvNerede vv – bu, MacOS sürümünüzün sürümüdür; örneğin, MacOSX Sierra için şunu yazmanız gerekir: MACOSX_DEPLOYMENT_TARGET=10.12 pip kurulum horovodu
Ardından OpenMPI'yi yükleyin .
Sonunda test komut dosyasını indirin mxnet_mnist.py ve çalışma dizinindeki MacBook terminalinde aşağıdaki komutları çalıştırın:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyBu, işlemcinizin iki çekirdeği üzerinde eğitim çalıştıracaktır. Çıktı aşağıdaki gibi olacaktır:
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.870000Performans Demosu
ResNet50-v1 modelini sekiz örnekli 64 GPU'daki ImageNet veri kümesinde eğitirken s3.16xlarge Her biri AWS bulut üzerinde 2 NVIDIA Tesla V8 GPU içeren EC100 ile 45000 görüntü/sn'lik (yani saniyede eğitilen örnek sayısı) bir eğitim verimi elde ettik. Eğitim, %44'lik en iyi doğruluk oranıyla 90 dönemden sonra 75.7 dakikada tamamlandı.
Bunu MXNet'in 8, 16, 32 ve 64 GPU'larda parametre sunucularını tek bir parametre sunucusuyla ve sırasıyla 1'e 1 ve 2'ye 1 sunucu-çalışan oranıyla kullanma şeklindeki dağıtılmış eğitim yaklaşımıyla karşılaştırdık. Sonucu aşağıdaki Şekil 1'de görebilirsiniz. Soldaki y eksenindeki çubuklar saniyede eğitilecek görüntü sayısını temsil eder, çizgiler ise sağdaki y eksenindeki ölçeklendirme verimliliğini (yani gerçek çıktının ideal çıktıya oranı) yansıtır. Gördüğünüz gibi sunucu sayısı seçimi ölçeklendirme verimliliğini etkiliyor. Yalnızca bir parametre sunucusu varsa ölçeklendirme verimliliği 38 GPU'da %64'e düşer. Horovod ile aynı ölçeklendirme verimliliğini elde etmek için sunucu sayısını çalışan sayısına göre ikiye katlamanız gerekir.

Şekil 1. Horovod ve parametre sunucusu ile MXNet kullanan dağıtılmış öğrenmenin karşılaştırılması
Aşağıdaki Tablo 1'de, 64 GPU üzerinde denemeler çalıştırırken örnek başına nihai maliyeti karşılaştırıyoruz. MXNet'i Horovod ile kullanmak, en düşük maliyetle en iyi verimi sağlar.

Tablo 1. Horovod ile Parameter Server arasındaki sunucu/çalışan oranının 2'ye 1 olduğu maliyet karşılaştırması.
Yeniden oluşturma adımları
Sonraki adımlarda, MXNet ve Horovod kullanarak dağıtılmış eğitimin sonucunu nasıl yeniden oluşturacağınızı göstereceğiz. MXNet ile dağıtılmış öğrenme hakkında daha fazla bilgi edinmek için okuyun .
1 Adım
Dağıtılmış eğitim kullanmak için MXNet sürüm 1.4.0 veya üzeri ve Horovod sürüm 0.16.0 veya üzeri ile homojen örneklerden oluşan bir küme oluşturun. Ayrıca GPU eğitimi için gerekli kütüphaneleri de yüklemeniz gerekecektir. Bizim örneklerimiz için şunları seçtik: Ubuntu 16.04 LinuxGPU Sürücüsü 396.44, CUDA 9.2, cuDNN kütüphanesi 7.2.1, NCCL iletişimcisi 2.2.13 ve OpenMPI 3.1.1 ile birlikte kullanabilirsiniz. Ayrıca şunları da kullanabilirsiniz: , bu kitaplıkların zaten önceden yüklenmiş olduğu yer.
2 Adım
MXNet eğitim komut dosyanıza Horovod API ile çalışma olanağını ekleyin. MXNet Gluon API'sini temel alan aşağıdaki komut dosyası, basit bir şablon olarak kullanılabilir. Zaten ilgili bir eğitim komut dosyanız varsa, kalın harflerle yazılan satırlara ihtiyaç vardır. Horovod'u öğrenmek için yapmanız gereken birkaç kritik değişiklik:
- Eğitimin doğru grafik çekirdeğinde gerçekleştirildiğini anlamak için bağlamı yerel Horovod sıralamasına (satır 8) göre ayarlayın.
- Tüm çalışanların aynı başlangıç parametreleriyle başlamasını sağlamak için başlangıç parametrelerini bir çalışandan tüm çalışanlara (satır 18) iletin.
- Bir Horovod oluşturun Dağıtılmış Optimize Edici (satır 25) parametreleri dağıtılmış bir şekilde güncellemek için.
Betiğin tamamını almak için lütfen Horovod-MXNet örneklerine bakın. и .
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 ...3 Adım
MPI direktifini kullanarak dağıtılmış eğitime başlamak için çalışanlardan birinde oturum açın. Bu örnekte dağıtılmış eğitim, her birinde 4 GPU bulunan dört örnekte ve kümede toplam 16 GPU'da çalıştırılır. Stokastik Gradyan İnişi (SGD) iyileştiricisi aşağıdaki hiper parametrelerle kullanılacaktır:
- mini parti boyutu: 256
- öğrenme oranı: 0.1
- momentum: 0.9
- ağırlık kaybı: 0.0001
Bir GPU'dan 64 GPU'ya ölçeklendirirken, GPU başına görüntü sayısını 0,1'da tutarken (1 GPU için 6,4'den 64 GPU için 256'e) eğitim oranını GPU sayısına göre doğrusal olarak ölçeklendirdik. 256 GPU için 1 görüntüden 16 GPU için 384 görüntüye kadar). GPU sayısı arttıkça ağırlık azalması ve momentum parametreleri değişti. NVIDIA Tesla GPU'ları tarafından desteklenen float64 hesaplamalarını hızlandırmak amacıyla ileri geçiş için float16 veri türü ve degradeler için float32 ile karma hassas eğitim kullandık.
$ 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.pySonuç
Bu makalede Apache MXNet ve Horovod kullanarak dağıtılmış model eğitimine yönelik ölçeklenebilir bir yaklaşıma baktık. ResNet50-v1 modelinin eğitildiği ImageNet veri setinde parametre sunucusu yaklaşımına kıyasla ölçeklendirme verimliliğini ve maliyet etkinliğini gösterdik. Ayrıca Horovod'u kullanarak çoklu örnek eğitimi çalıştırmak üzere mevcut bir betiği değiştirmek için kullanabileceğiniz adımları da ekledik.
MXNet'e ve derin öğrenmeye yeni başlıyorsanız kurulum sayfasına gidin ilk önce MXNet'i oluşturmak için. Ayrıca makaleyi okumanızı şiddetle tavsiye ederiz. başlamak.
Zaten MXNet ile çalıştıysanız ve Horovod ile dağıtılmış öğrenmeyi denemek istiyorsanız şuraya bir göz atın: , MXNet'ten oluşturun ve örneği izleyin veya .
*maliyet esas alınarak hesaplanır EC2 Bulut Sunucuları için AWS
Kurs hakkında daha fazla bilgi edinin
Kaynak: habr.com
