Нийтлэлийн орчуулгыг курс эхлэхийн өмнөх өдөр бэлтгэсэн
Өндөр хүчин чадалтай олон тооны компьютерийн инстанцуудыг түгээх сургалт нь их хэмжээний өгөгдөл дээр орчин үеийн гүн мэдрэлийн сүлжээг сургах хугацааг долоо хоногоос хэдэн цаг, бүр хэдэн минут болгон бууруулж, гүнзгий сургалтын практик хэрэглээнд энэхүү сургалтын аргыг өргөнөөр ашиглах боломжтой болгодог. Хэрэглэгчид олон тохиолдлуудад өгөгдлийг хэрхэн хуваалцаж, синхрончлохыг ойлгох ёстой бөгөөд энэ нь эргээд масштабын үр ашигт ихээхэн нөлөөлдөг. Нэмж дурдахад хэрэглэгчид нэг инстанц дээр ажилладаг сургалтын скриптийг олон тохиолдлуудад хэрхэн байрлуулахаа мэддэг байх ёстой.
Энэ нийтлэлд бид Apache MXNet гүнзгий сургалтын нээлттэй номын сан болон Horovod хуваарилагдсан сургалтын тогтолцоог ашиглан сургалтыг хурдан бөгөөд хялбар аргаар түгээх талаар ярих болно. Бид Horovod framework-ийн гүйцэтгэлийн давуу талыг тодорхой харуулж, MXNet сургалтын скриптийг хэрхэн бичихийг харуулах бөгөөд ингэснээр энэ нь Horovod-той тархсан байдлаар ажиллах болно.
Apache MXNet гэж юу вэ
Параметр сервертэй MXNet-д түгээсэн сургалт
Хоровод гэж юу вэ
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
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% хүртэл буурдаг. Хороводтой адил масштабын үр ашигт хүрэхийн тулд та ажилчдын тоотой харьцуулахад серверийн тоог хоёр дахин нэмэгдүүлэх хэрэгтэй.
Зураг 1. MXNet ашиглан Horovod болон параметрийн сервертэй тархсан сургалтын харьцуулалт
Доорх Хүснэгт 1-д бид 64 GPU дээр туршилт явуулахдаа нэг тохиолдлоос ногдох эцсийн зардлыг харьцуулж үзүүлэв. 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-ийг сонгосон. Мөн та ашиглаж болно
2 алхам
MXNet сургалтын скрипт дээрээ Horovod API-тай ажиллах чадварыг нэмээрэй. MXNet Gluon API дээр суурилсан доорх скриптийг энгийн загвар болгон ашиглаж болно. Хэрэв танд тохирох сургалтын скрипт байгаа бол тод үсгээр бичсэн мөрүүд шаардлагатай. Хороводтой суралцахын тулд хийх шаардлагатай хэд хэдэн чухал өөрчлөлтүүд энд байна:
- Сургалтыг зөв график цөм дээр гүйцэтгэдэг гэдгийг ойлгохын тулд орон нутгийн Хоровод зэрэглэлийн дагуу контекстийг тохируулна уу (мөр 8).
- Анхны параметрүүдийг нэг ажилчнаас бүгдэд (мөр 18) дамжуулж, бүх ажилчид ижил анхны параметрүүдээр эхлэхийг баталгаажуулна.
- Хоровод бий болгох DistributedOptimizer (мөр 25) параметрүүдийг тархсан байдлаар шинэчлэх.
Бүрэн скриптийг авахын тулд Horovod-MXNet жишээнүүдийг үзнэ үү
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 болон гүнзгий суралцаж эхэлж байгаа бол суулгах хуудас руу очно уу
Хэрэв та MXNet-тэй аль хэдийн ажиллаж байсан бөгөөд Horovod-той тарааж сурахыг хүсвэл дараахыг харна уу.
*зардлыг үндэслэн тооцно
Хичээлийн талаар илүү ихийг мэдэж аваарай
Эх сурвалж: www.habr.com