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 mpirun
bir 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 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:
- Düğüm sayısıyla başlatılan bir
HorovodRunner
örnek oluşturun. - 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.
- 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 4
seçeneğini belirleyebilirsinizn
. parametresi np
hakkı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
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:
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.
- Tek düğümlü kod hazırlama: TensorFlow, Keras veya PyTorch ile tek düğüm kodunu hazırlayın ve test edin.
- Horovod'a geçiş: Horovod kullanımındaki yönergeleri izleyerek kodu Horovod ile geçirin ve sürücüde test edin:
- Horovod'ı başlatmak için ekleyin
hvd.init()
. - 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. - 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.
- Öğ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.
- İyileştiriciyi içinde
hvd.DistributedOptimizer
sarmala. 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. - 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ızMonitoredTrainingSession
, genel değişkenler başlatıldıktan sonra işlemi yürütebilirsinizhvd.broadcast_global_variables
. - 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.
- Horovod'ı başlatmak için ekleyin
- 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.
- MNIST için HorovodRunner ile TensorFlow kullanarak derin öğrenme
- Tek düğüm pyTorch'ı dağıtılmış derin öğrenmeye uyarlama
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. yerineHorovodRunner
horovod.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 peer
hatalarla 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"