Apache MXNet - Dağıtılmış Eğitim
Bu bölüm, Apache MXNet'teki dağıtılmış eğitim hakkındadır. MXNet'teki hesaplama modlarının neler olduğunu anlayarak başlayalım.
Hesaplama Modları
Çok dilli bir makine öğrenimi kitaplığı olan MXNet, kullanıcılarına aşağıdaki iki hesaplama modunu sunar:
Zorunlu mod
Bu hesaplama modu, NumPy API gibi bir arayüz ortaya çıkarır. Örneğin, MXNet'te, hem CPU hem de GPU'da bir sıfırlar tensörü oluşturmak için aşağıdaki zorunlu kodu kullanın -
import mxnet as mx
tensor_cpu = mx.nd.zeros((100,), ctx=mx.cpu())
tensor_gpu= mx.nd.zeros((100,), ctx=mx.gpu(0))
Yukarıdaki kodda gördüğümüz gibi, MXNets, CPU veya GPU cihazında tensörün nerede tutulacağını belirtir. Yukarıdaki örnekte, 0 konumundadır. MXNet, cihazdan inanılmaz bir şekilde faydalanır, çünkü tüm hesaplamalar anında yerine tembel olarak gerçekleşir.
Sembolik mod
Zorunlu mod oldukça kullanışlı olmasına rağmen, bu modun dezavantajlarından biri sertliğidir, yani tüm hesaplamaların önceden tanımlanmış veri yapıları ile birlikte önceden bilinmesi gerekir.
Öte yandan, Sembolik mod, TensorFlow gibi bir hesaplama grafiğini ortaya çıkarır. MXNet'in sabit / önceden tanımlanmış veri yapıları yerine semboller veya değişkenlerle çalışmasına izin vererek zorunlu API'nin dezavantajını ortadan kaldırır. Daha sonra, semboller aşağıdaki gibi bir dizi işlem olarak yorumlanabilir -
import mxnet as mx
x = mx.sym.Variable(“X”)
y = mx.sym.Variable(“Y”)
z = (x+y)
m = z/100
Paralellik Türleri
Apache MXNet, dağıtılmış eğitimi destekler. Daha hızlı ve etkili eğitim için birden fazla makineden yararlanmamızı sağlar.
Aşağıda, bir NN eğitiminin iş yükünü birden çok cihaz, CPU veya GPU cihazına dağıtabilmemizin iki yolu verilmiştir:
Veri Paralelliği
Bu tür paralellikte, her cihaz modelin tam bir kopyasını saklar ve veri setinin farklı bir parçasıyla çalışır. Cihazlar ayrıca paylaşılan bir modeli toplu olarak günceller. Tüm cihazları tek bir makinede veya birden fazla makinede konumlandırabiliriz.
Model Paralelliği
Modeller cihaz belleğine sığmayacak kadar büyük olduğunda kullanışlı olan başka bir paralellik türüdür. Model paralelinde, modelin farklı bölümlerini öğrenme görevi farklı cihazlara atanır. Burada dikkat edilmesi gereken önemli nokta, şu anda Apache MXNet'in yalnızca tek bir makinede model paralelliği desteklediğidir.
Dağıtılmış eğitimin çalışması
Aşağıda verilen kavramlar, Apache MXNet'te dağıtılmış eğitimin işleyişini anlamanın anahtarıdır -
İşlem türleri
Süreçler, bir modelin eğitimini tamamlamak için birbirleriyle iletişim kurar. Apache MXNet aşağıdaki üç işleme sahiptir -
Çalışan
İşçi düğümünün işi, bir grup eğitim numunesi üzerinde eğitim vermektir. İşçi düğümleri, her partiyi işlemeden önce sunucudan ağırlıkları çekecektir. İşçi düğümleri, parti işlendikten sonra sunucuya degradeler gönderecektir.
Sunucu
MXNet, modelin parametrelerini depolamak ve çalışan düğümlerle iletişim kurmak için birden fazla sunucuya sahip olabilir.
Planlayıcı
Programlayıcının rolü, her bir düğümün geldiği ve düğümün hangi bağlantı noktasını dinlediği mesajlarını beklemeyi içeren kümeyi kurmaktır. Kümeyi kurduktan sonra, zamanlayıcı, tüm işlemlerin kümedeki diğer tüm düğümler hakkında bilgi sahibi olmasını sağlar. Bunun nedeni, süreçlerin birbirleriyle iletişim kurabilmesidir. Yalnızca bir programlayıcı vardır.
KV Mağazası
KV mağazaları, Key-Valuemağaza. Çoklu cihaz eğitimi için kullanılan kritik bir bileşendir. Bu önemlidir, çünkü parametrelerin tek tek ve birden çok makinedeki cihazlar arasında iletişimi, parametreler için bir KVStore ile bir veya daha fazla sunucu üzerinden iletilir. Aşağıdaki noktaların yardımıyla KVStore'un çalışmasını anlayalım -
KVStore'daki her bir değer, bir key ve bir value.
Ağdaki her parametre dizisine bir key ve bu parametre dizisinin ağırlıkları, value.
Bundan sonra, işçi düğümleri pushbir partiyi işledikten sonra degradeler. Onlar ayrıcapull yeni bir partiyi işlemeden önce güncellenmiş ağırlıklar.
KVStore sunucusu kavramı yalnızca dağıtılmış eğitim sırasında vardır ve dağıtılmış modu çağrı yapılarak etkinleştirilir. mxnet.kvstore.create kelimeyi içeren bir dize bağımsız değişkenine sahip işlev dist -
kv = mxnet.kvstore.create(‘dist_sync’)
Anahtarların Dağıtımı
Tüm sunucuların tüm parametreler dizisini veya anahtarlarını depolaması gerekli değildir, ancak bunlar farklı sunucular arasında dağıtılır. Anahtarların farklı sunucular arasında bu şekilde dağıtılması KVStore tarafından şeffaf bir şekilde gerçekleştirilir ve hangi sunucunun belirli bir anahtarı sakladığına dair karar rastgele verilir.
KVStore, yukarıda tartışıldığı gibi, anahtar her çekildiğinde isteğinin karşılık gelen değere sahip olan sunucuya gönderilmesini sağlar. Ya bir anahtarın değeri büyükse? Bu durumda, farklı sunucular arasında paylaşılabilir.
Eğitim verilerini böl
Kullanıcılar olarak, her makinenin, özellikle veri paralel modunda dağıtılmış eğitim çalıştırırken, veri setinin farklı bölümleri üzerinde çalışmasını istiyoruz. Kullanabileceğimiz tek bir işçi üzerinde veri paralel eğitimi için veri yineleyicisi tarafından sağlanan bir grup örneği bölmeyi biliyoruz.mxnet.gluon.utils.split_and_load ve daha sonra, partinin her bir parçasını, onu daha fazla işleyecek olan cihaza yükleyin.
Öte yandan, dağıtılmış eğitim durumunda, başlangıçta veri setini şu şekilde bölmeliyiz: nher işçinin farklı bir parça alması için farklı parçalar. Bir kez aldıktan sonra, her işçi kullanabilirsplit_and_loadveri kümesinin bu bölümünü tek bir makinedeki farklı cihazlara yeniden bölmek için. Tüm bunlar veri yineleyici aracılığıyla gerçekleşir.mxnet.io.MNISTIterator ve mxnet.io.ImageRecordIter MXNet'te bu özelliği destekleyen iki yineleyicidir.
Ağırlıklar güncelleniyor
Ağırlıkları güncellemek için KVStore aşağıdaki iki modu destekler -
İlk yöntem, degradeleri toplar ve bu degradeleri kullanarak ağırlıkları günceller.
İkinci yöntemde, sunucu yalnızca degradeleri toplar.
Gluon kullanıyorsanız, yukarıda belirtilen yöntemler arasında geçiş yaparak seçim yapma seçeneği vardır. update_on_kvstoredeğişken. Bunu oluşturarak anlayalımtrainer aşağıdaki gibi nesne -
trainer = gluon.Trainer(net.collect_params(), optimizer='sgd',
optimizer_params={'learning_rate': opt.lr,
'wd': opt.wd,
'momentum': opt.momentum,
'multi_precision': True},
kvstore=kv,
update_on_kvstore=True)
Dağıtık Eğitim Modları
KVStore oluşturma dizesi dist kelimesini içeriyorsa, bu, dağıtılmış eğitimin etkinleştirildiği anlamına gelir. Aşağıda, farklı KVStore türleri kullanılarak etkinleştirilebilecek farklı dağıtılmış eğitim modları verilmiştir -
dist_sync
Adından da anlaşılacağı gibi, eşzamanlı dağıtılmış eğitimi belirtir. Bunda, tüm çalışanlar her partinin başlangıcında aynı senkronize model parametre setini kullanır.
Bu modun dezavantajı, her partiden sonra sunucunun, model parametrelerini güncellemeden önce her bir çalışandan gradyan almayı beklemesi gerekmesidir. Bu, bir işçi düştüğünde, tüm işçilerin ilerlemesini durduracağı anlamına gelir.
dist_async
Adından da anlaşılacağı gibi, eşzamanlı dağıtılmış eğitimi belirtir. Bu durumda, sunucu bir çalışandan degradeler alır ve deposunu anında günceller. Sunucu, daha fazla çekmeye yanıt vermek için güncellenmiş depoyu kullanır.
Avantaj, karşılaştırıldığında dist_sync mode, bir partiyi işlemeyi bitiren bir işçi, geçerli parametreleri sunucudan çekebilir ve bir sonraki partiyi başlatabilir. Diğer işçi önceki partiyi işlemeyi henüz bitirmemiş olsa bile işçi bunu yapabilir. Ayrıca dist_sync modundan daha hızlıdır, çünkü senkronizasyon maliyeti olmadan yakınsaması daha fazla zaman alabilir.
dist_sync_device
Bu mod aynıdır dist_syncmodu. Tek fark, her düğümde birden fazla GPU kullanıldığındadist_sync_device degradeleri toplar ve GPU'daki ağırlıkları güncellerken, dist_sync CPU belleğindeki gradyanları toplar ve ağırlıkları günceller.
GPU ve CPU arasındaki pahalı iletişimi azaltır. Bu yüzden daha hızlıdist_sync. Dezavantajı, GPU'daki bellek kullanımını artırmasıdır.
dist_async_device
Bu mod aynı şekilde çalışır dist_sync_device mod, ancak eşzamansız modda.