د Apache MXNet او Horovod سره د زده کړې ویشل

د مقالې ژباړه د کورس د پیل په ماښام چمتو شوې وه "په لویو معلوماتو کې صنعتي ML"

د ډیری لوړ فعالیت کمپیوټري مثالونو کې توزیع شوي روزنه کولی شي د عصري ژورو عصبي شبکو د روزنې وخت په ډیرو ډیټاونو کې له اونیو څخه تر ساعتونو یا حتی دقیقو پورې راټیټ کړي، دا د روزنې تخنیک د ژورې زده کړې په عملي غوښتنلیکونو کې رامینځته کوي. کاروونکي باید پوه شي چې څنګه په ډیری مواردو کې ډاټا شریک او همغږي کړي، کوم چې په پایله کې د اندازه کولو موثریت باندې لوی اغیزه لري. سربیره پردې ، کارونکي باید پدې هم پوه شي چې څنګه د روزنې سکریپټ ځای په ځای کړي چې په یو واحد مثال کې ډیری مواردو ته ځي.

په دې مقاله کې به موږ د پرانیستې ژورې زده کړې کتابتون اپاچی MXNet او د هورووود ویشل شوي زده کړې چوکاټ په کارولو سره د زده کړې ویشلو لپاره د چټکې او اسانه لارې په اړه وغږیږو. موږ به په واضح ډول د هورووود چوکاټ د فعالیت ګټې وښیو او وښیو چې څنګه د MXNet روزنې سکریپټ لیکلو لپاره دا د هورووود سره په توزیع شوي ډول کار کوي.

Apache MXNet څه شی دی؟

اپاچی MXNet د خلاصې سرچینې ژورې زده کړې چوکاټ دی چې د ژورو عصبي شبکو رامینځته کولو ، روزنې او پلي کولو لپاره کارول کیږي. MXNet د عصبي شبکو پلي کولو پورې اړوند پیچلتیاوې خلاصوي ، خورا فعال او د توزیع وړ دی ، او د مشهور پروګرامینګ ژبو لپاره APIs وړاندیز کوي لکه Python, C ++, کیلوج, جاوا, جولیا, R, Scala او نور.

د پیرامیټر سرور سره په MXNet کې توزیع شوي روزنه

په MXNet کې د معیاري توزیع شوي زده کړې ماډل использует подход сервера параметров (parameter server). Он использует набор серверов параметров для сбора градиентов с каждого воркера, выполнения агрегации и отправки обновленных градиентов обратно ворекрам для следующей итерации оптимизации. Определение правильного соотношения серверов к воркерам – залог эффективного масштабирования. Если сервер параметров всего один, он может оказаться бутылочным горлышком в проведении вычислений. И наоборот, если используется слишком много серверов, то связь «многие-ко-многим» может забить все сетевые соединения.

Что такое Horovod

هوروود یو خلاص توزیع شوی ژور زده کړې چوکاټ دی چې په اوبر کې رامینځته شوی. دا د موثره کراس-GPU او کراس نوډ ټیکنالوژیو څخه ګټه پورته کوي لکه د NVIDIA اجتماعي مخابراتو کتابتون (NCCL) او د پیغام لیږدونکي انٹرفیس (MPI) ترڅو د vorecs په اوږدو کې د ماډل پیرامیټرې توزیع او راټول کړي. دا د شبکې بینډ ویت کارول غوره کوي او ښه اندازه کوي کله چې د ژور عصبي شبکې ماډلونو سره کار کوي. دا اوس مهال د ماشین زده کړې ډیری مشهور چوکاټونو ملاتړ کوي، د بیلګې په توګه MX جال، Tensorflow، Keras، او PyTorch.

MXNet او Horovod ادغام

MXNet د Horovod سره د توزیع شوي زده کړې APIs له لارې مدغم کیږي چې په هوروود کې تعریف شوي. Horovod مخابراتي APIs horovod.broadcast(), horovod.allgather() и horovod.allreduce() реализованы с помощью асинхронных коллбэков движка MXNet, как часть его графа задач. Таким образом, зависимости данных между коммуникацией и вычислениями с легкостью обрабатываются движком MXNet, чтобы избежать потерь производительности из-за синхронизации. Объект distributed optimizer, определенный в Horovod horovod.DistributedOptimizer پراخوي اصلاح کوونکی в MXNet таким образом, чтобы он вызывал соответствующие API Horovod для распределенного обновления параметров. Все эти детали реализации прозрачны для конечных пользователей.

چټک پیل

تاسو کولی شئ په چټکۍ سره د MNIST ډیټاسیټ کې د MXNet او Horovod په کارولو سره په خپل MacBook کې د کوچني عصبي عصبي شبکې روزنه پیل کړئ.
لومړی، د PyPI څخه mxnet او horovod نصب کړئ:

pip install mxnet
pip install horovod

Примечание: Если у вас возникает ошибка во время pip install horovodشاید تاسو اړتیا لرئ یو متغیر اضافه کړئ MACOSX_DEPLOYMENT_TARGET=10.vvچیرته vv - دا ستاسو د MacOS نسخه نسخه ده، د مثال په توګه، د MacOSX سیرا لپاره تاسو به لیکلو ته اړتیا ولرئ MACOSX_DEPLOYMENT_TARGET=10.12 پایپ نصب horovod

Затем установите OpenMPI له دې ځایه.

В конце загрузите тестовый скрипт mxnet_mnist.py له دې ځایه او په کاري لارښود کې د MacBook ترمینل کې لاندې کمانډونه پرمخ وړئ:

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

Так вы запустите обучение на двух ядрах вашего процессора. На выходе будет следующее:

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

د فعالیت ډیمو

کله چې د اتو مثالونو سره په 50 GPUs کې په ImageNet ډیټاسیټ کې د ResNet1-v64 ماډل روزنه p3.16x لوی EC2, каждый из которых содержит 8 GPU NVIDIA Tesla V100 на AWS cloud, мы достигли пропускной способности обучения 45000 изображений/сек (т.е. количество обученных сэмплов в секунду). Обучение завершалось за 44 минуты после 90 эпох с лучшей точностью в 75.7%.

موږ دا په 8، 16، 32 او 64 GPUs کې د پیرامیټر سرورونو کارولو لپاره د MXNet توزیع شوي روزنې طریقې سره په ترتیب سره د واحد پیرامیټر سرور او سرور څخه د کارګر تناسب 1 څخه 1 او 2 څخه 1 سره پرتله کوو. تاسو کولی شئ پایله په لاندې شکل 1 کې وګورئ. په چپ اړخ کې د y-محور کې، بارونه په هر ثانیه کې د روزنې لپاره د انځورونو شمیر استازیتوب کوي، کرښې په ښي خوا کې د y-محور په برخه کې د پیمانه کولو موثریت (دا د حقیقي څخه د مثالي تولید تناسب) منعکس کوي. لکه څنګه چې تاسو لیدلی شئ، د سرورونو شمیره انتخاب د اندازه کولو موثریت اغیزه کوي. که چیرې یوازې یو پیرامیټر سرور شتون ولري ، د اندازه کولو موثریت په 38 GPUs کې 64٪ ته راټیټیږي. د هوروود سره ورته اندازه کولو موثریت ترلاسه کولو لپاره ، تاسو اړتیا لرئ د کارګرانو شمیر په پرتله د سرورونو شمیر دوه چنده کړئ.

د Apache MXNet او Horovod سره د زده کړې ویشل
شکل 1. د توزیع شوي زده کړې پرتله کول د MXNet په کارولو سره د هوروود او پیرامیټر سرور سره

В Таблице 1 ниже мы сравнили итоговую стоимость экземпляра при выполнении экспериментов на 64 GPU. Использование MXNet вместе с Horovod обеспечивает наилучшую пропускную способность при наименьших затратах.

د Apache MXNet او Horovod سره د زده کړې ویشل
جدول 1. د هروود او پیرامیټر سرور تر مینځ د لګښت پرتله کول د سرور او کارګر تناسب د 2 څخه 1 پورې.

د بیا تولید لپاره ګامونه

په راتلونکو ګامونو کې، موږ به تاسو ته وښیو چې څنګه د MXNet او Horovod په کارولو سره د توزیع شوي روزنې پایلې بیا تولید کړئ. د MXNet سره د توزیع شوي زده کړې په اړه د نورو معلوماتو لپاره ولولئ دا پوسټ.

1 ګام

د ویشل شوي زده کړې کارولو لپاره د MXNet نسخه 1.4.0 یا لوړ او د هورووډ نسخه 0.16.0 یا لوړ سره د همجنس مثالونو کلستر جوړ کړئ. تاسو به د GPU روزنې لپاره کتابتونونو نصبولو ته هم اړتیا ولرئ. زموږ د مثالونو لپاره، موږ اوبنټو 16.04 لینکس غوره کړی، د GPU ډرایور 396.44، CUDA 9.2، cuDNN 7.2.1 کتابتون، NCCL 2.2.13 مخابراتي او OpenMPI 3.1.1 سره. تاسو هم کارولی شئ Amazon Deep Learning AMI، چیرې چې دا کتابتونونه دمخه نصب شوي دي.

2 ګام

ستاسو د MXNet روزنې سکریپټ ته د Horovod API سره د کار کولو وړتیا اضافه کړئ. لاندې سکریپټ د MXNet Gluon API پراساس د ساده ټیمپلیټ په توګه کارول کیدی شي. په بولډ کې لینونو ته اړتیا ده که تاسو دمخه د ورته روزنې سکریپټ لرئ. دلته یو څو مهم بدلونونه دي چې تاسو ورته اړتیا لرئ د هوروود سره زده کړه وکړئ:

  • Установите контекст в соответствии с локальным рангом Horovod (строка 8), чтобы понимать, что обучение выполняется на правильном графическом ядре.
  • Передайте начальные параметры от одного воркера ко всем (строка 18), чтобы убедиться, что все воркеры начинают работу с одинаковыми начальными параметрами.
  • Создайте Horovod DistributedOptimizer (25 کرښه) په ویشل شوي ډول د پیرامیټونو تازه کولو لپاره.

Чтобы получить полный скрипт, обратитесь к примерами Horovod-MXNet MNIST и 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 ګام

د MPI لارښود په کارولو سره د توزیع شوي روزنې پیل کولو لپاره یو کارګر ته ننوتل. په دې مثال کې، ویشل شوي روزنه په څلورو مواردو کې د 4 GPUs سره هر یو، او په کلستر کې ټول 16 GPUs پرمخ ځي. د Stochastic Gradient Descent (SGD) اصلاح کوونکی به د لاندې هایپر پارامیټرونو سره وکارول شي:

  • mini-batch size: 256
  • learning rate: 0.1
  • سرعت: 0.9
  • د وزن کمښت: 0.0001

По мере масштабирования от одного GPU к 64 GPU мы линейно масштабировали скорость обучения в соответствии с количеством GPU (от 0,1 для 1 GPU до 6,4 для 64 GPU), сохраняя при этом количество изображений, приходящихся на один GPU, равным 256 (от пакета в 256 изображений для 1 GPU до 16 384 для 64 GPU). Параметры weight decay и momentum изменялись по мере увеличения числа GPU. Мы использовали смешанную точность обучения с типом данных float16 при прямом проходе и float32 для градиентов, чтобы ускорить вычисления float16, поддерживаемые GPU NVIDIA Tesla.

$ 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

پایلې

پدې مقاله کې، موږ د اپاچي MXNet او Horovod په کارولو سره د توزیع شوي ماډل روزنې لپاره د توزیع وړ طریقې ته کتنه وکړه. موږ په ImageNet ډیټاسیټ کې د پیرامیټر سرور طریقې په پرتله د اندازه کولو موثریت او لګښت اغیزمنتوب وښوده چې په کې د ResNet50-v1 ماډل روزل شوی و. موږ هغه مرحلې هم شاملې کړې چې تاسو کولی شئ د هوروود په کارولو سره د څو مثالونو روزنې چلولو لپاره د موجوده سکریپټ بدلولو لپاره وکاروئ.

که تاسو یوازې د MXNet او ژورې زده کړې سره پیل کوئ، د نصب کولو پاڼې ته لاړ شئ د ‏‎MXNe, чтобы сначала собрать MXNet. Также настоятельно рекомендуем почитать статью MXNet په 60 دقیقو کېد پیل کولو لپاره.

Если вы уже работали с MXNet и хотите попробовать распределенное обучение с Horovod, то загляните на Horovod د نصبولو پاڼه، دا د MXNet څخه جوړ کړئ او مثال تعقیب کړئ MNIST او یا ImageNet.

* لګښت په اساس محاسبه کیږي د ساعت نرخونه AWS د EC2 مثالونو لپاره

د کورس په اړه نور معلومات ترلاسه کړئ "په لویو معلوماتو کې صنعتي ML"

سرچینه: www.habr.com

Add a comment