HorovodRunner: Horovod ile dağıtılmış derin öğrenme

HorovodRunner, Horovod çerçevesini kullanarak Azure Databricks dağıtılmış derin öğrenme iş yüklerini çalıştırmak için genel bir API 'dir. Horovod 'yi Spark 'ın bariyer moduylatümleştirerek, Azure Databricks Spark 'ta uzun süreli derin öğrenme eğitimi işleri için daha yüksek kararlılık sağlayabilir. HorovodRunner, Horovod kancaları ile derin öğrenme eğitim kodu içeren bir Python yöntemi alır. HorovodRunner, sürücüde yöntemi seçip Spark çalışanlarına dağıtır. Horovod MPı işi, bir Spark işi olarak, engel yürütme modunu kullanarak katıştırılır. İlk yürütücü kullanarak tüm görev yürüticilerinin IP adreslerini toplar BarrierTaskContext ve kullanarak bir Horovod işi tetikler mpirun . Her Python MPI işlemi, Pickle Kullanıcı programını yükler, onları serileştirir ve çalıştırır.

HorovodRunner

HorovodRunner ile dağıtılmış eğitim

HorovodRunner Spark işleri olarak Horovod eğitim işlerini başlatmanıza olanak tanır. HorovodRunner API 'SI tabloda gösterilen yöntemleri destekler. Ayrıntılar için, Horovodrunner API belgelerinebakın.

Yöntem ve imza Description
init(self, np) HorovodRunner örneği oluşturun.
run(self, main, **kwargs) Çağıran bir Horovod eğitim işi çalıştırın main(**kwargs) . Main işlevi ve anahtar sözcük bağımsız değişkenleri cloudpickle kullanılarak serileştirilir ve küme çalışanlarına dağıtılır.

HorovodRunner kullanarak dağıtılmış eğitim programı geliştirmeye yönelik genel yaklaşım şunlardır:

  1. HorovodRunnerDüğüm sayısıyla başlatılan bir örnek oluşturun.
  2. Horovod kullanımıbölümünde açıklanan yöntemlere göre bir horovod eğitim yöntemi tanımlayın. Bu yöntem, yöntemin içinde herhangi bir içeri aktarma deyimi eklediğinizden emin olmanızı sağlar.
  3. Eğitim yöntemini HorovodRunner örneğe geçirin.

Örneğin:

hr = HorovodRunner(np=2)

def train():
  import tensorflow as tf
  hvd.init()

hr.run(train)

HorovodRunner 'ı sürücüde yalnızca alt işlemlerle çalıştırmak için n kullanın hr = HorovodRunner(np=-n) . Örneğin, sürücü düğümünde 4 GPU varsa, öğesini seçebilirsiniz n4 . Parametresi hakkında daha fazla bilgi için npnpbakın. Her işlem için bir GPU 'YU sabitleme hakkında ayrıntılar için, Horovod kullanım kılavuzunabakın.

Yaygın bir hata, TensorFlow nesnelerinin bulunamaması veya pickdelenemez. Bu, kitaplık içeri aktarma deyimleri diğer yürüticilere dağıtılamadığında oluşur. Bu sorunu önlemek için, import tensorflow as tfimport tensorflow as tf horovod eğitim yönteminin üst kısmına ve horovod eğitim yönteminde çağrılan diğer Kullanıcı tanımlı işlevlerde içeri aktarma deyimlerini (örneğin,) dahil edin.

Horovod eğitimini Horovod zaman çizelgesi ile kaydet

Horovod,, Horovod zaman çizelgesiolarak adlandırılan etkinliğinin zaman çizelgesini kaydetme yeteneğine sahiptir.

Önemli

Horovod zaman çizelgesinin performansı üzerinde önemli bir etkisi vardır. Horovod zaman çizelgesi etkinleştirildiğinde Inception3 üretilen iş, %40 oranında azalabilir. HorovodRunner işlerini hızlandırmak istiyorsanız Horovod zaman çizelgesini devre dışı bırakın.

Horovod zaman çizelgesini kaydetmek için, HOROVOD_TIMELINE ortam değişkenini, zaman çizelgesi dosyasını kaydetmek istediğiniz konuma ayarlayın. Databricks, zaman çizelgesi dosyasının kolayca alınabilmesi için paylaşılan depolamada bir konum kullanılmasını önerir. Örneğin, dBFS yerel dosya API 'lerini aşağıda gösterildiği gibi kullanabilirsiniz:

timeline_dir = "/dbfs/ml/horovod-timeline/%s" % uuid.uuid4()
os.makedirs(timeline_dir)
os.environ['HOROVOD_TIMELINE'] = timeline_dir + "/horovod_timeline.json"
hr = HorovodRunner(np=4)
hr.run(run_training_horovod, params=params)

Zaman çizelgesi dosyasını indirmek için, Databricks CLI veya Filestore' u kullanın ve ardından, Chrome tarayıcısı özelliğini kullanarak görüntüleyin. Örneğin:

Horovod zaman çizelgesi

Geliştirme iş akışı

Bunlar, tek düğümlü derinlemesine öğrenme kodunu dağıtılmış eğitimlere geçirmeye yönelik genel adımlardır. Bu bölümdeki örneklerde Bu adımlar gösterilmektedir.

  1. Tek düğümlü kod hazırlama: TensorFlow, keras veya PyTorch ile tek düğümlü kodu hazırlayın ve test edin.
  2. Horovod 'A geçir: Beyovod kullanımındaki yönergeleri Izleyerek kodu horovod ile geçirin ve sürücüde test edin:
    1. hvd.init()Horovod 'yi başlatmak için ekleyin.
    2. Kullanarak bu işlem tarafından kullanılacak bir sunucu GPU 'SU sabitleyin config.gpu_options.visible_device_list . Her işlem için tipik bir GPU kurulumu ile bu, yerel derece olarak ayarlanabilir. Bu durumda, sunucu üzerindeki ilk işlem ilk GPU 'ya ayrılacaktır, ikinci işlem ikinci GPU olarak ayrılır ve bu şekilde devam eder.
    3. Veri kümesinin bir bölümünü dahil edin. Bu veri kümesi işleci, her bir çalışanın benzersiz bir alt kümeyi okumasına izin verdiğinden, dağıtılmış eğitim çalıştırılırken çok yararlı olur.
    4. Çalışanların sayısına göre öğrenme oranını ölçeklendirin. Zaman uyumlu dağıtılmış eğitimin etkin toplu iş boyutu, çalışan sayısına göre ölçeklendirilir. Daha fazla toplu iş boyutu için öğrenme oranı dengelerini artırma.
    5. İyileştiriciyi ' de sarın hvd.DistributedOptimizer . Dağıtılmış iyileştirici, orijinal iyileştiriciye gradyan hesaplamayı devreder, allazaltma veya alltoplamaı kullanarak degradelerin ortalamasını alır ve ortalama degradeleri uygular.
    6. hvd.BroadcastGlobalVariablesHook(0)0 derecesine ait ilk değişken durumlarını diğer tüm işlemlere yayınla öğesine ekleyin. Bu, eğitimin rastgele ağırlıklarla başlatıldığı veya bir denetim noktasından geri yüklendiği zaman tüm çalışanların tutarlı bir şekilde başlatılmasını sağlamak için gereklidir. Alternatif olarak, kullanmıyorsanız MonitoredTrainingSession , hvd.broadcast_global_variables genel değişkenler başlatıldıktan sonra işlemi çalıştırabilirsiniz.
    7. Diğer çalışanların bunları bozmasını engellemek için, yalnızca çalışan 0 ' dan denetim noktalarını kaydetmek için kodunuzu değiştirin.
  3. HorovodRunner 'A geçiş: HorovodRunner bir Python işlevi çağırarak Horovod eğitim işini çalıştırır. Ana eğitim yordamını tek bir Python işlevine sarmalısınız. Ardından, HorovodRunner öğesini yerel modda ve dağıtılmış modda test edebilirsiniz.

Derin öğrenme kitaplıklarını güncelleştirme

Not

Bu makale, Azure Databricks artık kullanmadığı bir terim olan bağımlıdönem başvuruları içerir. Terim yazılımlardan kaldırıldığında, bu makaleden kaldıracağız.

TensorFlow, keras veya PyTorch 'yi yükseltir veya indirgemeniz durumunda, yeni yüklenen kitaplığa göre derlenmesi için Horovod ' yi yeniden yüklemeniz gerekir. Örneğin, TensorFlow 'u yükseltmek istiyorsanız, Databricks, TensorFlow yükleme yönergelerinden init betiğini kullanmayı ve aşağıdaki TensorFlow 'A özgü Horovod yükleme kodunu eklemeyi önerir. PyTorch ve diğer kitaplıkları yükseltme veya eski sürüme düşürme gibi farklı birleşimlerle çalışmak için Horovod yükleme yönergelerine bakın.

add-apt-repository -y ppa:ubuntu-toolchain-r/test
apt update
# Using the same compiler that TensorFlow was built to compile Horovod
apt install g++-7 -y
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7

HOROVOD_GPU_ALLREDUCE=NCCL HOROVOD_CUDA_HOME=/usr/local/cuda pip install horovod==0.18.1 --force-reinstall --no-deps --no-cache-dir

Örnekler

Aşağıdaki örneklerde, Mnist veri kümesini temel alan, HorovodRunner ile tek düğümlü derin öğrenme programını dağıtılmış derin öğrenmeye nasıl geçirebileceğiniz gösterilmektedir.