Apache MXNet ve Horovod ile Dağıtılmış Öğrenme

Makalenin çevirisi kursun başlamasının arifesinde hazırlanmıştır. "Büyük Veride Endüstriyel ML"

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

Apache MX Ağı 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: Python, C + +, Clojure, Java, Julia, R, Scala ve diğerleri.

MXNet'te parametre sunucusuyla dağıtılmış eğitim

MXNet'te standart dağıtılmış öğrenme modülü 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?

Horovod 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: MX Ağı, 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 horovod

Not: 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 bundan dolayı.

Sonunda test komut dosyasını indirin mxnet_mnist.py bundan dolayı 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.py

Bu, 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.870000

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

Apache MXNet ve Horovod ile Dağıtılmış Öğrenme
Ş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.

Apache MXNet ve Horovod ile Dağıtılmış Öğrenme
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 bu gönderi.

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: Amazon Derin Öğrenme AMI, 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. MNİST и 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    ...

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

Sonuç

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 MXNeilk önce MXNet'i oluşturmak için. Ayrıca makaleyi okumanızı şiddetle tavsiye ederiz. 60 dakikada MXNetbaşlamak.

Zaten MXNet ile çalıştıysanız ve Horovod ile dağıtılmış öğrenmeyi denemek istiyorsanız şuraya bir göz atın: Horovod kurulum sayfası, MXNet'ten oluşturun ve örneği izleyin MNİST veya IMAGEnet.

*maliyet esas alınarak hesaplanır saatlik oran EC2 Bulut Sunucuları için AWS

Kurs hakkında daha fazla bilgi edinin "Büyük Veride Endüstriyel ML"

Kaynak: habr.com

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster