Logo Zephyrnet

Giảm thời gian đào tạo với Apache MXNet và Horovod trên Amazon SageMaker

Ngày:

Amazon SageMaker là một dịch vụ được quản lý hoàn toàn cung cấp cho mọi nhà phát triển và nhà khoa học dữ liệu khả năng xây dựng, đào tạo và triển khai các mô hình học máy (ML) một cách nhanh chóng. Amazon SageMaker loại bỏ công việc nặng nhọc khỏi mỗi bước của quy trình ML để giúp dễ dàng phát triển các mô hình chất lượng cao hơn. Khi bộ dữ liệu tiếp tục tăng về kích thước, cần phải tính toán thêm để giảm lượng thời gian đào tạo. Một phương pháp để mở rộng quy mô theo chiều ngang và thêm các tài nguyên bổ sung này trên Amazon SageMaker là thông qua việc sử dụng Horovod và Apache MXNet. Trong bài đăng này, chúng tôi chỉ ra cách bạn có thể giảm thời gian đào tạo với MXNet và Horovod trên Amazon SageMaker. Chúng tôi cũng trình bày cách cải thiện hơn nữa hiệu suất với các phần nâng cao về tự động dò tìm Horovod, Dòng thời gian Horovod, Horovod Fusion và tối ưu hóa MXNet.

Đào tạo phân tán

Việc đào tạo phân tán mạng nơ-ron cho các ứng dụng thị giác máy tính (CV) và xử lý ngôn ngữ tự nhiên (NLP) đã trở nên phổ biến. Với Apache MX Net, bạn chỉ cần sửa đổi một vài dòng mã để kích hoạt đào tạo phân tán.

Đào tạo phân tán cho phép bạn giảm thời gian đào tạo bằng cách mở rộng quy mô theo chiều ngang. Mục tiêu là chia các nhiệm vụ đào tạo thành các nhiệm vụ phụ độc lập và chạy chúng trên nhiều thiết bị. Chủ yếu có hai cách tiếp cận để đào tạo song song:

  • Song song dữ liệu - Bạn phân phối dữ liệu và chia sẻ mô hình trên nhiều tài nguyên máy tính
  • Mô hình song song - Bạn phân phối mô hình và chia sẻ dữ liệu đã chuyển đổi trên nhiều tài nguyên máy tính.

Trong bài đăng này, chúng tôi tập trung vào dữ liệu song song. Cụ thể, chúng tôi thảo luận về cách Horovod và MXNet cho phép bạn đào tạo hiệu quả trên Amazon SageMaker.

Tổng quan về Horovod

Horovod là một khung học sâu phân tán mã nguồn mở. Nó sử dụng các phương pháp giao tiếp liên GPU và liên nút hiệu quả như Thư viện Truyền thông Tập thể NVIDIA (NCCL) và Giao diện Truyền Thông báo (MPI) để phân phối và tổng hợp các thông số mô hình giữa các nhân viên. Horovod làm cho việc học sâu phân tán trở nên nhanh chóng và dễ dàng bằng cách sử dụng một tập lệnh đào tạo GPU đơn và mở rộng nó trên nhiều GPU song song. Nó được xây dựng trên đầu trang của ring-allreduce giao thức truyền thông. Cách tiếp cận này cho phép mỗi quá trình đào tạo (chẳng hạn như một quá trình chạy trên một thiết bị GPU) nói chuyện với các đồng nghiệp của nó và trao đổi gradient bằng cách lấy trung bình (được gọi là giảm) trên một tập hợp con các gradient. Sơ đồ sau minh họa cách ring-allreduce công trình.

Hình 1 Thuật toán phân bổ vòng cho phép các nút công nhân lấy độ dốc trung bình và phân tán chúng đến tất cả các nút mà không cần máy chủ tham số ( nguồn)

Apache MXNet được tích hợp với Horovod thông qua các API đào tạo phân tán được xác định trong Horovod và bạn có thể chuyển đổi đào tạo không phân tán bằng cách làm theo cấp cao hơn bộ xương mã, mà chúng tôi hiển thị trong bài đăng này.

Mặc dù điều này giúp đơn giản hóa quá trình sử dụng Horovod một cách đáng kể, nhưng bạn phải xem xét những phức tạp khác. Ví dụ: bạn có thể cần cài đặt phần mềm và thư viện bổ sung để giải quyết tình trạng không tương thích của mình để làm cho hoạt động đào tạo phân tán. Horovod yêu cầu một phiên bản Open MPI nhất địnhvà nếu bạn muốn sử dụng đào tạo hiệu suất cao trên GPU NVIDIA, bạn cần cài đặt thư viện NCCL. Những phức tạp này được khuếch đại khi bạn mở rộng quy mô trên nhiều thiết bị, vì bạn cần đảm bảo tất cả phần mềm và thư viện trong các nút mới được cài đặt và định cấu hình đúng cách. Amazon SageMaker bao gồm tất cả các thư viện bắt buộc để chạy đào tạo phân tán với MXNet và Horovod. Hình ảnh Amazon SageMaker Docker dựng sẵn đi kèm với các khung học sâu mã nguồn mở phổ biến và các thư viện CUDA, cuDNN, MPI và NCCL được định cấu hình trước. Amazon SageMaker quản lý quá trình khó cài đặt và định cấu hình đúng cách cụm của bạn. Amazon SageMaker và MXNet đơn giản hóa việc đào tạo với Horovod bằng cách quản lý sự phức tạp để hỗ trợ đào tạo phân tán trên quy mô lớn.

Kiểm tra vấn đề và tập dữ liệu

Để đánh giá hiệu quả mà Horovod nhận ra, chúng tôi đã đào tạo các kiến ​​trúc mô hình nổi tiếng sử dụng nhiều tài nguyên Mask-RCNN và Faster-RCNN. Các kiến ​​trúc mô hình này được giới thiệu lần đầu tiên vào năm 2018 và 2016, và hiện được coi là kiến ​​trúc mô hình cơ sở cho hai tác vụ CV phổ biến: phân đoạn cá thể (Mask-RCNN) và phát hiện đối tượng (Faster-RCNN). Mặt nạ-RCNN xây dựng dựa trên Nhanh hơn-RCNN bằng cách thêm mặt nạ để phân đoạn. Apache MXNet cung cấp các mô hình Mask-RCNN và Faster-RCNN được tạo sẵn như một phần của Vườn thú mô hình GluonCV, đơn giản hóa quá trình đào tạo các mô hình này.

Để đào tạo mô hình phát hiện đối tượng và phân đoạn cá thể, chúng tôi đã sử dụng Bộ dữ liệu COCO2017. Bộ dữ liệu này cung cấp hơn 200,000 hình ảnh và các nhãn tương ứng của chúng. Bộ dữ liệu COCO2017 được coi là một tiêu chuẩn công nghiệp để đánh giá các mô hình CV.

GlamonCV là một bộ công cụ CV được xây dựng trên MXNet. Nó cung cấp hỗ trợ sẵn có cho các tác vụ CV khác nhau, bao gồm tải dữ liệu và xử lý trước cho nhiều thuật toán phổ biến có sẵn trong vườn thú mô hình của nó. Nó cũng cung cấp một hướng dẫn về việc nhận tập dữ liệu COCO2017.

Để làm cho quy trình này có thể tái tạo cho người dùng Amazon SageMaker, chúng tôi hiển thị toàn bộ quy trình từ đầu đến cuối để đào tạo Mask-RCNN và Faster-RCNN với Horovod và MXNet. Để bắt đầu, trước tiên chúng ta mở môi trường Jupyter trong sổ ghi chép Amazon SageMaker của bạn và sử dụng conda_mxnet_p36 hạt nhân. Tiếp theo, chúng tôi cài đặt các gói Python được yêu cầu:

! pip install gluoncv
! pip install pycocotools

Chúng tôi sử dụng bộ công cụ GluonCV để tải tập dữ liệu COCO2017 xuống sổ ghi chép Amazon SageMaker của chúng tôi:

import gluoncv as gcv
gcv.utils.download('https://gluon-cv.mxnet.io/_downloads/b6ade342998e03f5eaa0f129ad5eee80/mscoco.py',path='./')
#Now to install the dataset. Warning, this may take a while
! python mscoco.py --download-dir data

Chúng tôi tải COCO2017 lên Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) thùng bằng cách sử dụng lệnh sau:

! aws s3 cp './data/' s3: // / --recursive –quiet

Tập lệnh đào tạo với Hỗ trợ Horovod

Để sử dụng Horovod trong tập lệnh huấn luyện của mình, bạn chỉ cần thực hiện một vài sửa đổi. Để biết các mẫu mã và hướng dẫn, hãy xem Horovod với MXNet. Ngoài ra, nhiều mô hình GluonCV trong vườn thú mô hình có tập lệnh đã hỗ trợ Horovod sẵn sàng. Trong phần này, chúng tôi xem xét các thay đổi chính cần thiết để Horovod hoạt động chính xác trên Amazon SageMaker với Apache MXNet. Đoạn mã sau trực tiếp theo sau từ Tài liệu về Horovod:

import mxnet as mx
import horovod.mxnet as hvd
from mxnet import autograd # Initialize Horovod, this has to be done first as it activates Horovod.
hvd.init() # GPU setup context =[mx.gpu(hvd.local_rank())] #local_rank is the specific gpu on that # instance
num_gpus = hvd.size() #This is how many total GPUs you will be using. #Typically, in your data loader you will want to shard your dataset. For # example, in the train_mask_rcnn.py script train_sampler = gcv.nn.sampler.SplitSortedBucketSampler(..., num_parts=hvd.size() if args.horovod else 1, part_index=hvd.rank() if args.horovod else 0) #Normally, we would shard the dataset first for Horovod.
val_loader = mx.gluon.data.DataLoader(dataset, len(ctx), ...) #... is for your # other arguments # You build and initialize your model as usual.
model = ... # Fetch and broadcast the parameters.
params = model.collect_params()
if params is not None: hvd.broadcast_parameters(params, root_rank=0) # Create DistributedTrainer, a subclass of gluon.Trainer.
trainer = hvd.DistributedTrainer(params, opt) # Create loss function and train your model as usual. 

Cấu hình công việc đào tạo

Lớp ước tính Amazon SageMaker MXNet hỗ trợ Horovod thông qua distributions tham số. Chúng tôi cần thêm một mpi tham số với enabled cờ và xác định các thông số bổ sung sau:

  • process_per_host (int) - Số lượng quy trình mà MPI sẽ khởi chạy trên mỗi máy chủ. Thông số này thường bằng số lượng thiết bị GPU có sẵn trên bất kỳ phiên bản nhất định nào.
  • custom_mpi_options (str) - Mọi tùy chỉnh mpirun cờ được thông qua trong trường này được thêm vào lệnh mpirun và được điều hành bởi Amazon SageMaker để đào tạo Horovod.

Mã ví dụ sau khởi tạo các tham số phân phối:

distributions = {'mpi': { 'enabled': True, 'processes_per_host': 8, #Each instance has 8 gpus 'custom_mpi_options': '-verbose --NCCL_DEBUG=INFO' } }

Tiếp theo, chúng ta cần định cấu hình các thông số khác cho công việc đào tạo của mình, chẳng hạn như siêu tham số và vị trí đầu vào và đầu ra của Amazon S3. Để làm điều này, chúng tôi sử dụng lớp ước tính MXNet từ Amazon SageMaker Python SDK:

#Define the basic configuration of your Horovod-enabled Sagemaker training # cluster.
num_instances = 2 # How many nodes you want to use.
instance_family = 'ml.p3dn.24xlarge' # Which instance type you want to use. estimator = MXNet( entry_point=<source_name>.py, #Script entry point. source_dir='./source', #Script Location role=role, train_instance_type=instance_family, train_instance_count=num_instances, framework_version='1.6.0', #MXNet version. train_volume_size=100, #Size for the dataset. py_version='py3', #Python version. hyperparameters=hyperparameters, distributions=distributions #For use with Horovod.

Bây giờ chúng tôi đã sẵn sàng để bắt đầu công việc huấn luyện đầu tiên được hỗ trợ bởi Horovod với lệnh sau:

 estimator.fit( {'data':'s3://' + bucket_name + '/data'} )

Kết quả

Chúng tôi đã thực hiện các điểm chuẩn này trên hai loại phiên bản GPU tương tự: p3.16xlarge và p3dn.24xlarge mạnh mẽ hơn. Mặc dù cả hai đều có 8 GPU NVIDIA V100, phiên bản thứ hai được thiết kế với tính năng đào tạo phân tán. Ngoài giao diện mạng thông lượng cao có thể đáp ứng việc truyền dữ liệu giữa các nút vốn có trong đào tạo phân tán, p3dn.24xlarge tự hào có nhiều tính toán hơn và bộ nhớ bổ sung hơn p3.16xlarge.

Chúng tôi đã chạy các điểm chuẩn trong ba trường hợp sử dụng khác nhau. Trong trường hợp sử dụng đầu tiên và thứ hai, chúng tôi đã đào tạo các mô hình trên một phiên bản duy nhất bằng cách sử dụng tất cả 8 GPU cục bộ, để chứng minh hiệu quả đạt được bằng cách sử dụng Horovod để quản lý đào tạo cục bộ trên nhiều GPU. Trong trường hợp sử dụng thứ ba, chúng tôi đã sử dụng Horovod để đào tạo phân tán trên nhiều phiên bản, mỗi phiên bản có 8 GPU cục bộ, để chứng minh sự gia tăng hiệu quả bổ sung bằng cách mở rộng theo chiều ngang.

Bảng sau đây tóm tắt thời gian và độ chính xác cho từng kịch bản đào tạo.

Mô hình Loại sơ thẩm 1 Phiên bản, 8 GPU với Horovod 1 Phiên bản, 8 GPU với Horovod 3 phiên bản, 8 GPU với Horovod
Thời gian huấn luyện tính chính xác Thời gian huấn luyện tính chính xác Thời gian huấn luyện tính chính xác
RCNN nhanh hơn p3.16xlund 35 h 47 m 37.6 8 h 26 m 37.5 4 h 58 m 37.4
RCNN nhanh hơn p3dn.24xlarge 32 h 24 m 37.5 7 h 27 m 37.5 3 h 37 m 37.3
Mặt nạ RCNN p3.16xlund 45 h 28 m

38.5 (hộp)

34.8 (segm)

10 h 28 m

34.4 (hộp)

31.3 (segm)

5 h 34 m

36.8 (hộp)

33.5 (segm)

Mặt nạ RCNN p3dn.24xlarge 40 h 49 m

38.3 (hộp)

34.8 (segm)

8 h 41 m 34.6 (hộp)
31.5 (segm)
4 h 2 m

37.0 (hộp)

33.4 (segm)

Bảng 1: Thời gian đào tạo và độ chính xác được hiển thị cho ba tình huống đào tạo khác nhau.

Như mong đợi, khi sử dụng Horovod để phân phối đào tạo trên nhiều trường hợp, thời gian hội tụ được giảm đáng kể. Ngoài ra, ngay cả khi đào tạo trên một phiên bản duy nhất, Horovod về cơ bản tăng hiệu quả đào tạo khi sử dụng nhiều GPU cục bộ, so với cách tiếp cận máy chủ tham số mặc định. Các bản tóm tắt và API được đơn giản hóa của Horovod cho phép bạn mở khóa hiệu quả khi đào tạo trên nhiều GPU, cả trên một hoặc nhiều máy. Để biết thêm thông tin về cách sử dụng phương pháp này để mở rộng quy mô lô và tỷ lệ học tập, hãy xem SGD Minibatch lớn, chính xác: Đào tạo ImageNet trong 1 giờ.

Với sự cải thiện về thời gian đào tạo được Horovod và Amazon SageMaker kích hoạt, bạn có thể tập trung hơn vào việc cải thiện các thuật toán của mình thay vì đợi công việc kết thúc đào tạo. Bạn có thể đào tạo song song trong nhiều trường hợp với tác động biên nghĩa là Độ chính xác trung bình (mAP).

Tối ưu hóa đào tạo Horovod

Horovod cung cấp một số tiện ích bổ sung cho phép bạn phân tích và tối ưu hóa hiệu suất đào tạo.

Horovod tự động dò tìm

Việc tìm kiếm sự kết hợp tối ưu của các tham số cho một tổ hợp mô hình và kích thước cụm nhất định có thể yêu cầu một số lần lặp lại thử và sai.

Tính năng autotune cho phép bạn tự động hóa hoạt động thử-và-sai này trong một công việc đào tạo duy nhất và sử dụng tối ưu hoá Bayes để tìm kiếm thông qua không gian tham số cho sự kết hợp tham số hiệu quả nhất. Horovod tìm kiếm sự kết hợp tốt nhất của các tham số trong các chu kỳ đầu tiên của công việc đào tạo. Khi nó xác định kết hợp tốt nhất, Horovod ghi nó vào nhật ký autotune và sử dụng kết hợp này cho phần còn lại của công việc huấn luyện. Để biết thêm thông tin, hãy xem Autotune: Điều chỉnh Hiệu suất Tự động.

Để bật tự động dò và ghi nhật ký tìm kiếm, hãy chuyển các thông số sau vào cấu hình MPI của bạn:

{ 'mpi': { 'enabled': True, 'custom_mpi_options': '-x HOROVOD_AUTOTUNE=1 -x HOROVOD_AUTOTUNE_LOG=/opt/ml/output/autotune_log.csv' }
}

Dòng thời gian Horovod

Horovod Timeline là một báo cáo có sẵn sau khi hoàn thành khóa huấn luyện, ghi lại tất cả các hoạt động trong vòng Horovod. Điều này rất hữu ích để hiểu hoạt động nào diễn ra lâu nhất và xác định cơ hội tối ưu hóa. Để biết thêm thông tin, hãy xem Phân tích Hiệu suất.

Để tạo tệp dòng thời gian, hãy thêm các tham số sau vào lệnh MPI của bạn:

{ 'mpi': { 'enabled': True, 'custom_mpi_options': '-x HOROVOD_TIMELINE=/opt/ml/output/timeline.json' }
}

Sản phẩm /opt/ml/output là một thư mục với một mục đích cụ thể. Sau khi công việc đào tạo hoàn tất, Amazon SageMaker tự động lưu trữ tất cả các tệp trong thư mục này và tải nó lên vị trí Amazon S3 mà bạn xác định trong API Python Amazon SageMaker SDK.

Tenor Fusion

Tính năng Tensor Fusion cho phép bạn thực hiện hàng loạt allreduce hoạt động tại thời điểm đào tạo. Điều này thường dẫn đến hiệu suất tổng thể tốt hơn. Để biết thêm thông tin, hãy xem Tenor Fusion. Theo mặc định, Tensor Fusion được bật và có kích thước bộ đệm là 64 MB. Bạn có thể sửa đổi kích thước bộ đệm bằng cách sử dụng cờ MPI tùy chỉnh như sau (đối với trường hợp sử dụng của chúng tôi, chúng tôi ghi đè giá trị bộ đệm 64 MB mặc định bằng 32 MB):

{ 'mpi': { 'enabled': True, 'custom_mpi_options': '-x HOROVOD_FUSION_THRESHOLD=33554432' }
}

Bạn cũng có thể điều chỉnh chu kỳ hàng loạt bằng cách sử dụng HOROVOD_CYCLE_TIME tham số. Thời gian chu kỳ được xác định bằng mili giây. Xem đoạn mã sau:

{ 'mpi': { 'enabled': True, 'custom_mpi_options': '-x HOROVOD_CYCLE_TIME=5' }
}

Tối ưu hóa mô hình MXNet

Một kỹ thuật tối ưu hóa khác có liên quan đến việc tối ưu hóa chính mô hình MXNet. Chúng tôi khuyên bạn nên chạy mã với os.environ['MXNET_CUDNN_AUTOTUNE_DEFAULT'] = '1'. Sau đó, bạn có thể sao chép các biến môi trường OS tốt nhất để đào tạo trong tương lai. Trong thử nghiệm của mình, chúng tôi nhận thấy những điều sau là kết quả tốt nhất:

os.environ['MXNET_GPU_MEM_POOL_TYPE'] = 'Round'
os.environ['MXNET_GPU_MEM_POOL_ROUND_LINEAR_CUTOFF'] = '26'
os.environ['MXNET_EXEC_BULK_EXEC_MAX_NODE_TRAIN_FWD'] = '999'
os.environ['MXNET_EXEC_BULK_EXEC_MAX_NODE_TRAIN_BWD'] = '25'
os.environ['MXNET_GPU_COPY_NTHREADS'] = '1'
os.environ['MXNET_OPTIMIZER_AGGREGATION_SIZE'] = '54'

Kết luận

Trong bài đăng này, chúng tôi đã trình bày cách giảm thời gian đào tạo với Horovod và Apache MXNet trên Amazon SageMaker. Bạn có thể đào tạo mô hình của mình ngay lập tức mà không cần lo lắng về bất kỳ sự phức tạp nào khác.

Để biết thêm thông tin về học sâu và MXNet, hãy xem Khóa học về sự cố MXNetĐi sâu vào Học sâu sách. Bạn cũng có thể bắt đầu trên Trang web MXNet và MXNet GitHub thư mục ví dụ. Nếu bạn chưa quen với chương trình đào tạo phân tán và muốn tìm hiểu sâu hơn, chúng tôi thực sự khuyên bạn nên đọc bài báo Horovod: học sâu phân tán nhanh chóng và dễ dàng trong TensorFlow. Nếu bạn sử dụng AWS Deep Learning Containers và AWS Deep Learning AMI, bạn có thể tìm hiểu cách thiết lập quy trình làm việc này trong môi trường đó trong bài đăng gần đây của chúng tôi Cách chạy đào tạo phân tán bằng Horovod và MXNet trên bộ chứa AWS DL và AWS Deep Learning AMI.


Về các tác giả

Vadim Dabravolski là Kiến trúc sư Giải pháp AI / ML với nhóm FinServe. Ông tập trung vào các công nghệ Computer Vision và NLP và cách áp dụng chúng vào các trường hợp sử dụng trong kinh doanh. Sau giờ làm việc, Vadim thích chạy bộ ở các quận của NYC, đọc sách phi hư cấu (kinh doanh, lịch sử, văn hóa, chính trị, bạn đặt tên cho nó), và hiếm khi không làm gì cả.

Corey Barrett là Nhà khoa học dữ liệu trong Phòng thí nghiệm Giải pháp ML của Amazon. Là thành viên của Phòng thí nghiệm giải pháp ML, anh ấy tận dụng Học máy và Học sâu để giải quyết các vấn đề kinh doanh quan trọng cho khách hàng AWS. Ngoài giờ làm việc, bạn có thể bắt gặp anh ấy tận hưởng không gian ngoài trời, nhâm nhi đồ ăn nhẹ và dành thời gian cho gia đình.

Chaitanya Bapat là Kỹ sư phần mềm của nhóm Học sâu AWS. Anh ấy làm việc trên Apache MXNet và tích hợp khuôn khổ với Amazon Sagemaker, DLC và DLAMI. Trong thời gian rảnh rỗi, anh ấy thích xem thể thao, thích đọc sách và học tiếng Tây Ban Nha.

Karan Jariwala là Kỹ sư phát triển phần mềm trong nhóm Học sâu AWS. Công việc của anh ấy tập trung vào việc đào tạo các mạng thần kinh sâu. Ngoài công việc, anh ấy thích đi bộ đường dài, bơi lội và chơi tennis.

Nguồn: https://aws.amazon.com/blogs/machine-learning/reducing-training-time-with-apache-mxnet-and-horovod-on-amazon-sagemaker/

tại chỗ_img

Tin tức mới nhất

tại chỗ_img