Apache MXNet болон Horovod-той тараасан сургалт

Нийтлэлийн орчуулгыг курс эхлэхийн өмнөх өдөр бэлтгэсэн "Том өгөгдөл дээр үйлдвэрлэлийн ML"

Өндөр хүчин чадалтай олон тооны компьютерийн инстанцуудыг түгээх сургалт нь их хэмжээний өгөгдөл дээр орчин үеийн гүн мэдрэлийн сүлжээг сургах хугацааг долоо хоногоос хэдэн цаг, бүр хэдэн минут болгон бууруулж, гүнзгий сургалтын практик хэрэглээнд энэхүү сургалтын аргыг өргөнөөр ашиглах боломжтой болгодог. Хэрэглэгчид олон тохиолдлуудад өгөгдлийг хэрхэн хуваалцаж, синхрончлохыг ойлгох ёстой бөгөөд энэ нь эргээд масштабын үр ашигт ихээхэн нөлөөлдөг. Нэмж дурдахад хэрэглэгчид нэг инстанц дээр ажилладаг сургалтын скриптийг олон тохиолдлуудад хэрхэн байрлуулахаа мэддэг байх ёстой.

Энэ нийтлэлд бид Apache MXNet гүнзгий сургалтын нээлттэй номын сан болон Horovod хуваарилагдсан сургалтын тогтолцоог ашиглан сургалтыг хурдан бөгөөд хялбар аргаар түгээх талаар ярих болно. Бид Horovod framework-ийн гүйцэтгэлийн давуу талыг тодорхой харуулж, MXNet сургалтын скриптийг хэрхэн бичихийг харуулах бөгөөд ингэснээр энэ нь Horovod-той тархсан байдлаар ажиллах болно.

Apache MXNet гэж юу вэ

Apache MX Net нь гүнзгий мэдрэлийн сүлжээг бий болгох, сургах, байрлуулахад ашигладаг нээлттэй эхийн гүнзгий сургалтын тогтолцоо юм. MXNet нь мэдрэлийн сүлжээг хэрэгжүүлэхтэй холбоотой нарийн төвөгтэй байдлыг хураангуйлж, өндөр гүйцэтгэлтэй, өргөтгөх боломжтой бөгөөд алдартай програмчлалын хэлүүдэд зориулсан API-уудыг санал болгодог. Python, C ++, Унтах, Java, Julia, R, Scala болон бусад.

Параметр сервертэй MXNet-д түгээсэн сургалт

MXNet дахь стандарт тархсан сургалтын модуль параметрийн серверийн аргыг ашигладаг. Энэ нь ажилчин бүрээс градиент цуглуулах, нэгтгэх, дараагийн оновчлолын давталтад зориулж шинэчлэгдсэн градиентуудыг ажилчдад буцааж илгээхийн тулд параметрийн серверүүдийг ашигладаг. Сервер болон ажилчдын зөв харьцааг тодорхойлох нь үр дүнтэй масштабын түлхүүр юм. Хэрэв зөвхөн нэг параметрийн сервер байгаа бол энэ нь тооцоололд саад болж магадгүй юм. Эсрэгээр, хэрэв хэтэрхий олон сервер ашиглавал олон-олон харилцаа холбоо нь бүх сүлжээний холболтыг бөглөрөхөд хүргэдэг.

Хоровод гэж юу вэ

Хоровод нь Uber-д боловсруулсан нээлттэй тархсан гүнзгий сургалтын тогтолцоо юм. Энэ нь NVIDIA Communications Library (NCCL) болон Message Passing Interface (MPI) гэх мэт үр ашигтай хөндлөн GPU болон зангилаа хоорондын технологийг ашиглан загвар параметрүүдийг vorrecs даяар түгээж, нэгтгэдэг. Энэ нь сүлжээний зурвасын өргөнийг ашиглахыг оновчтой болгож, гүн мэдрэлийн сүлжээний загваруудтай ажиллахад сайн масштабтай байдаг. Энэ нь одоогоор хэд хэдэн алдартай машин сургалтын тогтолцоог дэмждэг MX Net, Tensorflow, Keras болон PyTorch.

MXNet болон Horovod-ийн нэгдэл

MXNet нь Horovod-д тодорхойлсон Distributed Learning API-уудаар дамжуулан Хороводтой нэгтгэдэг. Horovod холбооны API horovod.broadcast(), horovod.allgather() и horovod.allreduce() Даалгаврын графикийн нэг хэсэг болгон MXNet хөдөлгүүрийн асинхрон дуудлагыг ашиглан хэрэгжүүлсэн. Ийм байдлаар синхрончлолын улмаас гүйцэтгэлийн алдагдлаас зайлсхийхийн тулд харилцаа холбоо болон тооцооллын хоорондох өгөгдлийн хамаарлыг MXNet хөдөлгүүр хялбархан зохицуулдаг. Хоровод тодорхойлсон тархсан оновчтой объект horovod.DistributedOptimizer өргөжиж байна Оновчтой болгох MXNet-д байгаа бөгөөд ингэснээр тархсан параметрийн шинэчлэлтийн хувьд харгалзах Horovod API-г дууддаг. Эдгээр бүх хэрэгжилтийн дэлгэрэнгүй мэдээлэл эцсийн хэрэглэгчдэд ил тод байдаг.

Хурдан эхлэл

Та MacBook дээрх MXNet болон Horovod ашиглан MNIST датасет дээр жижиг эргэлтийн мэдрэлийн сүлжээг хурдан сургаж эхлэх боломжтой.
Эхлээд PyPI-ээс mxnet болон horovod суулгаарай:

pip install mxnet
pip install horovod

Тайлбар: Хэрэв танд алдаа гарвал pip install horovodмагадгүй та хувьсагч нэмэх хэрэгтэй MACOSX_DEPLOYMENT_TARGET=10.vvхаана vv – энэ бол таны MacOS хувилбарын хувилбар, жишээлбэл, MacOSX Sierra-ийн хувьд та бичих хэрэгтэй болно 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

Гүйцэтгэлийн үзүүлэн

ResNet50-v1 загварыг найман тохиолдол бүхий 64 GPU дээр ImageNet датасет дээр сургах үед p3.16xlarge AWS үүлэн дээрх 2 NVIDIA Tesla V8 GPU-г агуулсан EC100 нь бид 45000 зураг/сек (жишээ нь, нэг секундэд сургагдсан дээжийн тоо) сургалтын хүчин чадалд хүрсэн. Сургалт 44 эриний дараа 90 минутын дотор 75.7% -ийн хамгийн сайн нарийвчлалтайгаар дууссан.

Бид үүнийг MXNet-ийн хуваарилсан сургалтын арга барилтай харьцуулсан бөгөөд 8, 16, 32, 64 GPU-д параметрийн серверүүдийг нэг параметрийн сервертэй, серверийн ажилчдын харьцаа 1-ээс 1, 2-оос 1-тэй тэнцүү байна. Үр дүнг та доорх Зураг 1-ээс харж болно. Зүүн талд байгаа y тэнхлэгт зураасууд нь секундэд сургах зургийн тоог, шугамууд нь баруун талд байгаа y тэнхлэгт масштабын үр ашгийг (өөрөөр хэлбэл бодит ба хамгийн тохиромжтой дамжуулах чадварын харьцаа) тусгадаг. Таны харж байгаагаар серверийн тоог сонгох нь масштабын үр ашигт нөлөөлдөг. Хэрэв зөвхөн нэг параметрийн сервер байгаа бол масштабын үр ашиг 38 GPU дээр 64% хүртэл буурдаг. Хороводтой адил масштабын үр ашигт хүрэхийн тулд та ажилчдын тоотой харьцуулахад серверийн тоог хоёр дахин нэмэгдүүлэх хэрэгтэй.

Apache MXNet болон Horovod-той тараасан сургалт
Зураг 1. MXNet ашиглан Horovod болон параметрийн сервертэй тархсан сургалтын харьцуулалт

Доорх Хүснэгт 1-д бид 64 GPU дээр туршилт явуулахдаа нэг тохиолдлоос ногдох эцсийн зардлыг харьцуулж үзүүлэв. MXNet-ийг Horovod-той ашиглах нь хамгийн бага зардлаар хамгийн сайн дамжуулах боломжийг олгодог.

Apache MXNet болон Horovod-той тараасан сургалт
Хүснэгт 1. 2-оос 1-ийн сервер ба ажилчдын харьцаатай Хоровод болон Параметр серверийн зардлын харьцуулалт.

Үржүүлэх алхамууд

Дараагийн алхмуудад бид MXNet болон Horovod ашиглан тараасан сургалтын үр дүнг хэрхэн хуулбарлахыг харуулах болно. MXNet-тэй хуваарилагдсан сургалтын талаар илүү ихийг мэдэхийг хүсвэл уншина уу энэ бичлэг.

1 алхам

Тархсан сургалтыг ашиглахын тулд MXNet 1.4.0 буюу түүнээс дээш хувилбар болон Horovod хувилбар 0.16.0 буюу түүнээс дээш хувилбартай нэгэн төрлийн жишээнүүдийн кластер үүсгээрэй. Та мөн GPU сургалтанд зориулж номын санг суулгах хэрэгтэй болно. Бидний жишээн дээр бид GPU Driver 16.04, CUDA 396.44, cuDNN 9.2 номын сан, NCCL 7.2.1 коммуникатор, OpenMPI 2.2.13 бүхий Ubuntu 3.1.1 Linux-ийг сонгосон. Мөн та ашиглаж болно Amazon Deep Learning AMI, эдгээр номын сангууд аль хэдийн суулгасан байна.

2 алхам

MXNet сургалтын скрипт дээрээ Horovod API-тай ажиллах чадварыг нэмээрэй. MXNet Gluon API дээр суурилсан доорх скриптийг энгийн загвар болгон ашиглаж болно. Хэрэв танд тохирох сургалтын скрипт байгаа бол тод үсгээр бичсэн мөрүүд шаардлагатай. Хороводтой суралцахын тулд хийх шаардлагатай хэд хэдэн чухал өөрчлөлтүүд энд байна:

  • Сургалтыг зөв график цөм дээр гүйцэтгэдэг гэдгийг ойлгохын тулд орон нутгийн Хоровод зэрэглэлийн дагуу контекстийг тохируулна уу (мөр 8).
  • Анхны параметрүүдийг нэг ажилчнаас бүгдэд (мөр 18) дамжуулж, бүх ажилчид ижил анхны параметрүүдээр эхлэхийг баталгаажуулна.
  • Хоровод бий болгох DistributedOptimizer (мөр 25) параметрүүдийг тархсан байдлаар шинэчлэх.

Бүрэн скриптийг авахын тулд Horovod-MXNet жишээнүүдийг үзнэ үү МНИСТ и 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 GPU, кластерт нийт 16 GPU-тай дөрвөн инстанц дээр ажилладаг. Stochastic Gradient Descent (SGD) оновчлогчийг дараах гиперпараметрүүдээр ашиглана.

  • мини багц хэмжээ: 256
  • сурах хувь: 0.1
  • импульс: 0.9
  • жингийн бууралт: 0.0001

Бид нэг GPU-ээс 64 GPU хүртэл масштаблахдаа сургалтын хурдыг GPU-ийн тоогоор (0,1 GPU-д 1-ээс 6,4 GPU-д 64 хүртэл) шугаман байдлаар өсгөж, GPU-д ногдох зургийн тоог 256 (багцаас 256 GPU-д) байлгасан. 1 GPU-д 16 зураг, 384 GPU-д 64 хүртэл). GPU-ийн тоо нэмэгдэхийн хэрээр жингийн бууралт болон импульсийн параметрүүд өөрчлөгдсөн. Бид NVIDIA Tesla GPU-ийн дэмждэг float16 тооцооллыг хурдасгахын тулд урагш дамжуулахад float32 өгөгдлийн төрөл, градиентуудад float16 өгөгдлийн төрөл бүхий холимог нарийвчлалтай сургалтыг ашигласан.

$ 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

дүгнэлт

Энэ нийтлэлд бид Apache MXNet болон Horovod ашиглан тархсан загварын сургалтын өргөтгөх боломжтой аргыг авч үзсэн. ResNet50-v1 загварыг сургасан ImageNet өгөгдлийн багц дээрх параметрийн серверийн хандлагатай харьцуулахад бид масштабын үр ашиг, зардлын үр ашгийг харуулсан. Бид мөн Horovod ашиглан олон төрлийн сургалт явуулахын тулд одоо байгаа скриптийг өөрчлөхөд ашиглаж болох алхмуудыг оруулсан.

Хэрэв та дөнгөж MXNet болон гүнзгий суралцаж эхэлж байгаа бол суулгах хуудас руу очно уу MXNeэхлээд MXNet-ийг бүтээх. Мөн бид нийтлэлийг уншихыг зөвлөж байна MXNet 60 минутын доторэхлүүлэх.

Хэрэв та MXNet-тэй аль хэдийн ажиллаж байсан бөгөөд Horovod-той тарааж сурахыг хүсвэл дараахыг харна уу. Хоровод суурилуулах хуудас, үүнийг MXNet-ээс бүтээж, жишээг дага МНИСТ буюу IMAGEnet.

*зардлыг үндэслэн тооцно цагийн тариф EC2 Instance-д зориулсан AWS

Хичээлийн талаар илүү ихийг мэдэж аваарай "Том өгөгдөл дээр үйлдвэрлэлийн ML"

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх