Aracılığıyla paylaş


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

Önemli

Horovod ve HorovodRunner artık kullanım dışı bırakıldı. 15.4 LTS ML sonrasındaki sürümlerde bu paket önceden yüklenmez. Dağıtılmış derin öğrenme için Databricks, PyTorch ile dağıtılmış eğitim için TorchDistributor veya tf.distribute.Strategy TensorFlow ile dağıtılmış eğitim için API kullanılmasını önerir.

Horovod eğitim işlerini Azure Databricks'te Spark işleri olarak başlatmak için HorovodRunner kullanarak makine öğrenmesi modellerinin dağıtılmış eğitimini gerçekleştirmeyi öğrenin.

HorovodRunner nedir?

HorovodRunner, Horovod çerçevesini kullanarak Azure Databricks'te dağıtılmış derin öğrenme iş yüklerini çalıştırmaya yönelik genel bir API'dir . Azure Databricks, Horovod'u Spark'ın engel moduyla tümleştirerek Spark'ta uzun süre çalışan derin öğrenme eğitim işleri için daha yüksek kararlılık sağlayabilir. HorovodRunner, Horovod kancalarıyla derin öğrenme eğitim kodu içeren bir Python yöntemi alır. HorovodRunner, sürücüdeki yöntemi seçer ve Spark çalışanlarına dağıtır. Horovod MPI işi, engel yürütme modu kullanılarak Spark işi olarak eklenir. İlk yürütücü, kullanarak BarrierTaskContext tüm görev yürütücülerinin IP adreslerini toplar ve kullanarak mpirunbir Horovod işi tetikler. Her Python MPI işlemi, pickled kullanıcı programını yükler, seri durumdan çıkartır ve çalıştırır.

HorovodRunner

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

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

Yöntem ve imza Açıklama
init(self, np) HorovodRunner örneği oluşturun.
run(self, main, **kwargs) çağıran main(**kwargs)bir Horovod eğitim işi çalıştırın. Ana işlev 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:

  1. Düğüm sayısıyla başlatılan bir HorovodRunner ö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 ve yöntemin içine içeri aktarma deyimleri eklediğinizden emin olun.
  3. Eğitim yöntemini örneğe HorovodRunner 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 n çalıştırmak için kullanın hr = HorovodRunner(np=-n). Örneğin, sürücü düğümünde 4 GPU varsa en fazla 4seçeneğini belirleyebilirsinizn. parametresi nphakkında ayrıntılı bilgi için HorovodRunner API belgelerine bakın. Alt işlem başına bir GPU sabitleme hakkında ayrıntılı bilgi için Horovod kullanım kılavuzuna bakın.

Sık karşılaşılan bir hata, TensorFlow nesnelerinin bulunamaması veya seçilememesidir. Kitaplık içeri aktarma deyimleri diğer yürütücülere dağıtılmadığında bu durum ortaya çıkar. Bu sorunu önlemek için, hem Horovod eğitim yönteminin en üstüne hem de Horovod eğitim yönteminde adı verilen diğer kullanıcı tanımlı işlevlere tüm içeri aktarma deyimlerini (örneğin, import tensorflow as tf) ekleyin.

Horovod Zaman Çizelgesi ile Horovod eğitimini kaydetme

Horovod, Horovod Zaman Çizelgesi adı verilen etkinliğinin zaman çizelgesini kaydetme özelliğine sahiptir.

Önemli

Horovod Zaman Çizelgesi'nin performans üzerinde önemli bir etkisi vardır. Horovod Zaman Çizelgesi etkinleştirildiğinde Inception3 aktarım hızı yaklaşık %40 düşebilir. HorovodRunner işlerini hızlandırmak için Horovod Zaman Çizelgesi'ni kullanmayın.

Eğitim devam ederken Horovod Zaman Çizelgesi'ni görüntüleyemezsiniz.

Horovod Zaman Çizelgesi kaydetmek için ortam değişkenini HOROVOD_TIMELINE 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, aşağıda gösterildiği gibi DBFS yerel dosya API'lerini 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)

Ardından, eğitim işlevinin başına ve sonuna zaman çizelgesine özgü kod ekleyin. Aşağıdaki örnek not defteri, eğitim ilerleme durumunu görüntülemek için geçici çözüm olarak kullanabileceğiniz örnek kodu içerir.

Horovod zaman çizelgesi örnek not defteri

Not defterini alma

Zaman çizelgesi dosyasını indirmek için Databricks CLI'yı ve ardından Chrome tarayıcısının chrome://tracing özelliğini kullanarak dosyayı görüntüleyin. Örneğin:

Horovod zaman çizelgesi

Geliştirme iş akışı

Bunlar, tek düğüm derin öğrenme kodunu dağıtılmış eğitime geçirmenin genel adımlarıdır. Örnekler : Bu bölümdeki HorovodRunner ile dağıtılmış derin öğrenmeye geçiş işlemi bu adımları göstermektedir.

  1. Tek düğümlü kod hazırlama: TensorFlow, Keras veya PyTorch ile tek düğüm kodunu hazırlayın ve test edin.
  2. Horovod'a geçiş: Horovod kullanımındaki yönergeleri izleyerek kodu Horovod ile geçirin ve sürücüde test edin:
    1. Horovod'ı başlatmak için ekleyin hvd.init() .
    2. kullanarak bu işlem tarafından kullanılacak bir sunucu GPU'sını sabitleyin config.gpu_options.visible_device_list. İşlem başına tipik bir GPU kurulumuyla, bu yerel derecelendirmeye ayarlanabilir. Bu durumda, sunucudaki ilk işlem ilk GPU'ya, ikinci işlem ikinci GPU'ya ayrılır ve bu şekilde devam eder.
    3. Veri kümesinin bir parçası ekleyin. Bu veri kümesi operatörü, her çalışanın benzersiz bir alt kümeyi okumasına izin verdiğinden dağıtılmış eğitimi çalıştırırken çok kullanışlıdır.
    4. Öğrenme oranını çalışan sayısına göre ölçeklendirin. Zaman uyumlu dağıtılmış eğitimdeki etkin toplu iş boyutu, çalışan sayısına göre ölçeklendirilir. Öğrenme oranını artırmak, artan toplu iş boyutunu telafi eder.
    5. İyileştiriciyi içinde hvd.DistributedOptimizersarmala. Dağıtılmış iyileştirici, gradyan hesaplamasını özgün iyileştiriciye devreder, allreduce veya allgather kullanarak gradyanları ortalamaya alır ve ardından ortalama gradyanları uygular.
    6. Derece 0'dan diğer tüm işlemlere ilk değişken durumlarını yayınlamak için ekleyin hvd.BroadcastGlobalVariablesHook(0) . Bu, eğitim rastgele ağırlıklarla başlatıldığında veya bir kontrol noktasından geri yüklendiğinde tüm çalışanların tutarlı bir şekilde başlatılmasını sağlamak için gereklidir. Alternatif olarak, kullanmıyorsanız MonitoredTrainingSession, genel değişkenler başlatıldıktan sonra işlemi yürütebilirsiniz hvd.broadcast_global_variables .
    7. Diğer çalışanların bunları bozmasını önlemek için kodunuzu yalnızca çalışan 0'da denetim noktalarını kaydedecek şekilde 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 sarmalamanız gerekir. Ardından HorovodRunner'ı yerel modda ve dağıtılmış modda test edebilirsiniz.

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

TensorFlow, Keras veya PyTorch'u yükseltirseniz veya düşürdüğünüzde, horovod'u yeni yüklenen kitaplıkta derlenecek şekilde yeniden yüklemeniz gerekir. Örneğin, TensorFlow'u yükseltmek istiyorsanız, Databricks TensorFlow yükleme yönergelerinden init betiğini kullanmanızı ve sonuna aşağıdaki TensorFlow'a özgü Horovod yükleme kodunun eklenmesini önerir. PyTorch ve diğer kitaplıkları yükseltme veya düşürme gibi farklı bileş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

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

Örnekler: HorovodRunner ile dağıtılmış derin öğrenmeye geçiş

Aşağıdaki örnekler, MNIST veri kümesini temel alarak tek düğümlü derin öğrenme programını HorovodRunner ile dağıtılmış derin öğrenmeye geçirmeyi göstermektedir.

Sınırlamalar

  • Çalışma alanı dosyalarıyla çalışırken, 1'den büyük olarak ayarlanırsa ve not defteri diğer göreli dosyalardan içeri aktarılırsa np HorovodRunner çalışmaz. yerine HorovodRunnerhorovod.spark kullanmayı göz önünde bulundurun.
  • gibi WARNING: Open MPI accepted a TCP connection from what appears to be a another Open MPI process but cannot find a corresponding process entry for that peerhatalarla karşılaşırsanız bu, kümenizdeki düğümler arasındaki ağ iletişimi ile ilgili bir sorun olduğunu gösterir. Bu hatayı çözmek için, birincil ağ arabirimini kullanmak üzere eğitim kodunuza aşağıdaki kod parçacığını ekleyin.
import os
os.environ["OMPI_MCA_btl_tcp_if_include"]="eth0"
os.environ["NCCL_SOCKET_IFNAME"]="eth0"