Học tập phân tán với Apache MXNet và Horovod

Bản dịch của bài báo đã được chuẩn bị vào đêm trước khi bắt đầu khóa học "ML công nghiệp trên dữ liệu lớn"

Đào tạo phân tán trên nhiều phiên bản điện toán hiệu năng cao có thể giảm thời gian đào tạo của mạng nơ-ron sâu hiện đại trên lượng lớn dữ liệu từ vài tuần xuống còn vài giờ hoặc thậm chí vài phút, khiến kỹ thuật đào tạo này trở nên phổ biến trong các ứng dụng thực tế của học sâu. Người dùng phải hiểu cách chia sẻ và đồng bộ hóa dữ liệu trên nhiều phiên bản, điều này có tác động lớn đến hiệu quả mở rộng quy mô. Ngoài ra, người dùng cũng nên biết cách triển khai tập lệnh huấn luyện chạy từ một phiên bản đến nhiều phiên bản.

Trong bài viết này, chúng ta sẽ nói về một cách nhanh chóng và dễ dàng để phân phối việc học bằng cách sử dụng thư viện deep learning mở Apache MXNet và khung học tập phân tán Horovod. Chúng tôi sẽ chứng minh rõ ràng những lợi ích về hiệu suất của khung Horovod và trình bày cách viết tập lệnh đào tạo MXNet để nó hoạt động theo cách phân tán với Horovod.

Apache MXNet là gì

Apache MX Net là một khung học sâu nguồn mở được sử dụng để tạo, đào tạo và triển khai các mạng lưới thần kinh sâu. MXNet loại bỏ sự phức tạp liên quan đến việc triển khai mạng thần kinh, có hiệu suất cao và có thể mở rộng, đồng thời cung cấp API cho các ngôn ngữ lập trình phổ biến như Python, C + +, Clojure, Java, Julia, R, Scala và những người khác.

Đào tạo phân tán trong MXNet với máy chủ tham số

Mô-đun học tập phân tán tiêu chuẩn trong MXNet sử dụng cách tiếp cận máy chủ tham số. Nó sử dụng một tập hợp các máy chủ tham số để thu thập độ dốc từ mỗi trình chạy, thực hiện tổng hợp và gửi các độ dốc đã cập nhật lại cho các trình chạy cho lần lặp tối ưu hóa tiếp theo. Xác định tỷ lệ chính xác giữa máy chủ và công nhân là chìa khóa để mở rộng quy mô hiệu quả. Nếu chỉ có một máy chủ tham số, nó có thể trở thành nút cổ chai trong quá trình tính toán. Ngược lại, nếu sử dụng quá nhiều máy chủ, giao tiếp nhiều-nhiều có thể làm tắc nghẽn tất cả các kết nối mạng.

Horovod là gì

Horovod là một khung học sâu phân tán mở được phát triển tại Uber. Nó tận dụng các công nghệ đa GPU và nút chéo hiệu quả như Thư viện truyền thông tập thể NVIDIA (NCCL) và Giao diện truyền tin nhắn (MPI) để phân phối và tổng hợp các tham số mô hình trên các vorec. Nó tối ưu hóa việc sử dụng băng thông mạng và mở rộng quy mô tốt khi làm việc với các mô hình mạng nơ-ron sâu. Nó hiện hỗ trợ một số khung học máy phổ biến, cụ thể là MX Net, Tensorflow, Keras và PyTorch.

Tích hợp MXNet và Horovod

MXNet tích hợp với Horovod thông qua API học tập phân tán được xác định trong Horovod. API giao tiếp Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() được triển khai bằng cách sử dụng các lệnh gọi lại không đồng bộ của công cụ MXNet, như một phần của biểu đồ nhiệm vụ của nó. Bằng cách này, công cụ MXNet có thể dễ dàng xử lý các phần phụ thuộc dữ liệu giữa giao tiếp và tính toán để tránh giảm hiệu suất do đồng bộ hóa. Đối tượng tối ưu hóa phân tán được xác định trong Horovod horovod.DistributedOptimizer mở rộng Trình tối ưu hóa trong MXNet để gọi các API Horovod tương ứng để cập nhật tham số phân tán. Tất cả các chi tiết triển khai này đều minh bạch đối với người dùng cuối.

bắt đầu nhanh

Bạn có thể nhanh chóng bắt đầu huấn luyện một mạng nơ-ron tích chập nhỏ trên tập dữ liệu MNIST bằng MXNet và Horovod trên MacBook của mình.
Đầu tiên, cài đặt mxnet và horovod từ PyPI:

pip install mxnet
pip install horovod

Lưu ý: Nếu bạn gặp lỗi trong quá trình cài đặt pip horovodcó lẽ bạn cần thêm một biến MACOSX_DEPLOYMENT_TARGET=10.vvĐâu vv – đây là phiên bản MacOS của bạn, ví dụ: đối với MacOSX Sierra bạn sẽ cần phải viết MACOSX_DEPLOYMENT_TARGET=10.12 pip cài đặt thời gian

Sau đó cài đặt OpenMPI do đó.

Cuối cùng, tải xuống tập lệnh kiểm tra mxnet_mnist.py do đó và chạy các lệnh sau trong thiết bị đầu cuối MacBook trong thư mục làm việc:

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

Điều này sẽ chạy đào tạo trên hai lõi của bộ xử lý của bạn. Đầu ra sẽ như sau:

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

Trình diễn hiệu suất

Khi đào tạo mô hình ResNet50-v1 trên bộ dữ liệu ImageNet trên 64 GPU với XNUMX phiên bản p3.16xlund EC2, mỗi GPU chứa 8 GPU NVIDIA Tesla V100 trên đám mây AWS, chúng tôi đã đạt được thông lượng đào tạo là 45000 hình ảnh/giây (tức là số lượng mẫu được đào tạo mỗi giây). Quá trình huấn luyện hoàn thành trong 44 phút sau 90 kỷ nguyên với độ chính xác tốt nhất là 75.7%.

Chúng tôi đã so sánh điều này với phương pháp đào tạo phân tán của MXNet về việc sử dụng các máy chủ tham số trên GPU 8, 16, 32 và 64 với một máy chủ tham số duy nhất và tỷ lệ máy chủ trên nhân viên lần lượt là 1:1 và 2:1. Bạn có thể xem kết quả trong Hình 1 bên dưới. Trên trục y ở bên trái, các thanh biểu thị số lượng hình ảnh được đào tạo mỗi giây, các đường phản ánh hiệu quả mở rộng quy mô (nghĩa là tỷ lệ giữa thông lượng thực tế và thông lượng lý tưởng) trên trục y ở bên phải. Như bạn có thể thấy, việc lựa chọn số lượng máy chủ ảnh hưởng đến hiệu quả mở rộng quy mô. Nếu chỉ có một máy chủ tham số, hiệu suất mở rộng sẽ giảm xuống 38% trên 64 GPU. Để đạt được hiệu quả mở rộng tương tự như với Horovod, bạn cần tăng gấp đôi số lượng máy chủ so với số lượng nhân viên.

Học tập phân tán với Apache MXNet và Horovod
Hình 1. So sánh học tập phân tán bằng MXNet với Horovod và với máy chủ tham số

Trong Bảng 1 bên dưới, chúng tôi so sánh chi phí cuối cùng cho mỗi phiên bản khi chạy thử nghiệm trên 64 GPU. Sử dụng MXNet với Horovod mang lại thông lượng tốt nhất với chi phí thấp nhất.

Học tập phân tán với Apache MXNet và Horovod
Bảng 1. So sánh chi phí giữa Horovod và Parameter Server với tỷ lệ máy chủ/worker là 2 trên 1.

Các bước để tái tạo

Trong các bước tiếp theo, chúng tôi sẽ chỉ cho bạn cách tái tạo kết quả đào tạo phân tán bằng MXNet và Horovod. Để tìm hiểu thêm về học tập phân tán với MXNet, hãy đọc bài này.

Bước 1

Создайте кластер однородных экземпляров с MXNet версии 1.4.0 или выше и Horovod версии 0.16.0 или выше, чтобы использовать распределенное обучение. Вам также нужно будет установить библиотеки для обучения на GPU. Для наших экземпляров мы выбрали Ubuntu 16.04 Linux, с GPU Driver 396.44, CUDA 9.2, библиотеку cuDNN 7.2.1, коммуникатор NCCL 2.2.13 и OpenMPI 3.1.1. Также вы можете использовать AMI học sâu của Amazon, nơi các thư viện này đã được cài đặt sẵn.

Bước 2

Thêm khả năng làm việc với API Horovod vào tập lệnh đào tạo MXNet của bạn. Tập lệnh bên dưới dựa trên API MXNet Gluon có thể được sử dụng làm mẫu đơn giản. Những dòng in đậm là cần thiết nếu bạn đã có tập lệnh huấn luyện tương ứng. Dưới đây là một số thay đổi quan trọng bạn cần thực hiện để tìm hiểu với Horovod:

  • Đặt bối cảnh theo thứ hạng Horovod cục bộ (dòng 8) để hiểu rằng quá trình đào tạo được thực hiện trên lõi đồ họa chính xác.
  • Truyền các tham số ban đầu từ một công nhân cho tất cả (dòng 18) để đảm bảo rằng tất cả các công nhân đều bắt đầu với cùng các tham số ban đầu.
  • Tạo một Horovod Trình tối ưu hóa phân phối (dòng 25) để cập nhật các tham số theo cách phân tán.

Để có được tập lệnh đầy đủ, vui lòng tham khảo ví dụ về Horovod-MXNet DANH SÁCH и 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    ...

Bước 3

Đăng nhập vào một trong các công nhân để bắt đầu đào tạo phân phối bằng chỉ thị MPI. Trong ví dụ này, hoạt động đào tạo phân tán chạy trên 4 phiên bản, mỗi phiên bản có 16 GPU và tổng cộng XNUMX GPU trong cụm. Trình tối ưu hóa Giảm dần độ dốc ngẫu nhiên (SGD) sẽ được sử dụng với các siêu tham số sau:

  • Kích thước lô nhỏ: 256
  • tỷ lệ học tập: 0.1
  • đà: 0.9
  • giảm trọng lượng: 0.0001

Khi chúng tôi mở rộng quy mô từ một GPU lên 64 GPU, chúng tôi đã chia tỷ lệ tuyến tính tốc độ đào tạo theo số lượng GPU (từ 0,1 cho 1 GPU đến 6,4 cho 64 GPU), trong khi vẫn giữ số lượng hình ảnh trên mỗi GPU ở mức 256 (từ một loạt 256 hình ảnh cho 1 GPU đến 16 cho 384 GPU). Các tham số giảm dần trọng lượng và động lượng thay đổi khi số lượng GPU tăng lên. Chúng tôi đã sử dụng phương pháp đào tạo có độ chính xác hỗn hợp với kiểu dữ liệu float64 cho chuyển tiếp và float16 cho độ dốc để tăng tốc độ tính toán float32 được hỗ trợ bởi 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

Kết luận

Trong bài viết này, chúng tôi đã xem xét một cách tiếp cận có thể mở rộng để đào tạo mô hình phân tán bằng cách sử dụng Apache MXNet và Horovod. Chúng tôi đã chứng minh hiệu quả mở rộng và hiệu quả chi phí so với phương pháp tiếp cận máy chủ tham số trên tập dữ liệu ImageNet mà mô hình ResNet50-v1 đã được đào tạo. Chúng tôi cũng đưa vào các bước mà bạn có thể sử dụng để sửa đổi tập lệnh hiện có nhằm chạy chương trình đào tạo nhiều phiên bản bằng Horovod.

Nếu bạn mới bắt đầu với MXNet và học sâu, hãy truy cập trang cài đặt MXNeđể xây dựng MXNet đầu tiên. Chúng tôi cũng thực sự khuyên bạn nên đọc bài viết MXNet trong 60 phútđể bắt đầu.

Nếu bạn đã làm việc với MXNet và muốn thử học phân tán với Horovod, hãy xem qua Trang cài đặt Horovod, xây dựng nó từ MXNet và làm theo ví dụ DANH SÁCH hoặc IMAGEnet.

*chi phí được tính dựa trên giá theo giờ AWS dành cho phiên bản EC2

Tìm hiểu thêm về khóa học "ML công nghiệp trên dữ liệu lớn"

Nguồn: www.habr.com

Mua dịch vụ lưu trữ đáng tin cậy cho các trang web có bảo vệ DDoS, máy chủ VPS VDS 🔥 Mua dịch vụ hosting website đáng tin cậy với bảo vệ DDoS, máy chủ VPS VDS | ProHoster