Apache MXNet - Đào tạo phân tán
Chương này nói về đào tạo phân tán trong Apache MXNet. Chúng ta hãy bắt đầu bằng cách hiểu các chế độ tính toán trong MXNet là gì.
Các phương thức tính toán
MXNet, một thư viện ML đa ngôn ngữ, cung cấp cho người dùng hai chế độ tính toán sau:
Chế độ mệnh lệnh
Chế độ tính toán này cho thấy một giao diện giống như API NumPy. Ví dụ: trong MXNet, hãy sử dụng mã bắt buộc sau để tạo hàng chục số không trên cả CPU cũng như GPU -
import mxnet as mx
tensor_cpu = mx.nd.zeros((100,), ctx=mx.cpu())
tensor_gpu= mx.nd.zeros((100,), ctx=mx.gpu(0))
Như chúng ta thấy trong đoạn mã trên, MXNets chỉ định vị trí để giữ tensor, trong thiết bị CPU hoặc GPU. Trong ví dụ trên, nó ở vị trí 0. MXNet đạt được hiệu suất sử dụng thiết bị đáng kinh ngạc, bởi vì tất cả các tính toán diễn ra một cách lười biếng thay vì ngay lập tức.
Chế độ tượng trưng
Mặc dù chế độ mệnh lệnh khá hữu ích, nhưng một trong những hạn chế của chế độ này là tính cứng nhắc của nó, tức là tất cả các phép tính cần được biết trước cùng với cấu trúc dữ liệu được xác định trước.
Mặt khác, chế độ Symbolic hiển thị một đồ thị tính toán như TensorFlow. Nó loại bỏ nhược điểm của API mệnh lệnh bằng cách cho phép MXNet làm việc với các ký hiệu hoặc biến thay vì cấu trúc dữ liệu cố định / được xác định trước. Sau đó, các ký hiệu có thể được hiểu như một tập hợp các thao tác như sau:
import mxnet as mx
x = mx.sym.Variable(“X”)
y = mx.sym.Variable(“Y”)
z = (x+y)
m = z/100
Các loại song song
Apache MXNet hỗ trợ đào tạo phân tán. Nó cho phép chúng tôi tận dụng nhiều máy để luyện tập nhanh hơn cũng như hiệu quả.
Sau đây là hai cách, chúng tôi có thể phân phối khối lượng công việc đào tạo NN trên nhiều thiết bị, thiết bị CPU hoặc GPU -
Song song dữ liệu
Trong kiểu song song này, mỗi thiết bị lưu trữ một bản sao hoàn chỉnh của mô hình và hoạt động với một phần khác nhau của tập dữ liệu. Các thiết bị cũng cập nhật chung một mô hình được chia sẻ. Chúng tôi có thể định vị tất cả các thiết bị trên một máy hoặc trên nhiều máy.
Mô hình song song
Đó là một kiểu song song khác, có ích khi các mô hình quá lớn đến mức chúng không vừa với bộ nhớ thiết bị. Trong mô hình song song, các thiết bị khác nhau được giao nhiệm vụ học các phần khác nhau của mô hình. Điểm quan trọng ở đây cần lưu ý là Apache MXNet hiện chỉ hỗ trợ mô hình song song trong một máy duy nhất.
Làm việc của đào tạo phân tán
Các khái niệm được đưa ra dưới đây là chìa khóa để hiểu hoạt động của đào tạo phân tán trong Apache MXNet -
Các loại quy trình
Các quá trình giao tiếp với nhau để hoàn thành việc đào tạo một mô hình. Apache MXNet có ba quy trình sau:
Công nhân
Công việc của nút công nhân là thực hiện đào tạo trên một loạt các mẫu đào tạo. Các nút Worker sẽ kéo trọng số từ máy chủ trước khi xử lý từng đợt. Các nút Worker sẽ gửi các gradient đến máy chủ, khi lô được xử lý.
Người phục vụ
MXNet có thể có nhiều máy chủ để lưu trữ các thông số của mô hình và giao tiếp với các nút công nhân.
Người lập kế hoạch
Vai trò của bộ lập lịch là thiết lập cụm, bao gồm việc chờ các thông báo mà mỗi nút gửi đến và cổng nào nút đang lắng nghe. Sau khi thiết lập cụm, bộ lập lịch cho phép tất cả các quy trình biết về mọi nút khác trong cụm. Đó là bởi vì các quy trình có thể giao tiếp với nhau. Chỉ có một công cụ lập lịch.
Cửa hàng KV
KV cửa hàng là viết tắt của Key-Valuecửa hàng. Nó là thành phần quan trọng được sử dụng để đào tạo đa thiết bị. Điều quan trọng là vì, việc truyền thông số giữa các thiết bị trên một máy cũng như trên nhiều máy được truyền qua một hoặc nhiều máy chủ có KVStore cho các tham số. Chúng ta hãy hiểu hoạt động của KVStore với sự trợ giúp của các điểm sau:
Mỗi giá trị trong KVStore được đại diện bởi một key và một value.
Mỗi mảng tham số trong mạng được gán một key và trọng số của mảng tham số đó được tham chiếu bởi value.
Sau đó, các nút công nhân pushgradient sau khi xử lý một mẻ. Họ cũngpull trọng lượng cập nhật trước khi xử lý một lô mới.
Khái niệm về máy chủ KVStore chỉ tồn tại trong quá trình đào tạo phân tán và chế độ phân tán của nó được kích hoạt bằng cách gọi mxnet.kvstore.create hàm với một đối số chuỗi có chứa từ dist -
kv = mxnet.kvstore.create(‘dist_sync’)
Phân phối các phím
Không nhất thiết là tất cả các máy chủ lưu trữ tất cả các mảng hoặc khóa tham số, nhưng chúng được phân phối trên các máy chủ khác nhau. Việc phân phối khóa như vậy trên các máy chủ khác nhau được KVStore xử lý minh bạch và quyết định máy chủ nào lưu trữ khóa cụ thể được đưa ra ngẫu nhiên.
KVStore, như đã thảo luận ở trên, đảm bảo rằng bất cứ khi nào khóa được kéo, yêu cầu của nó sẽ được gửi đến máy chủ đó, có giá trị tương ứng. Điều gì sẽ xảy ra nếu giá trị của một số khóa lớn? Trong trường hợp đó, nó có thể được chia sẻ trên các máy chủ khác nhau.
Tách dữ liệu đào tạo
Là người dùng, chúng tôi muốn mỗi máy làm việc trên các phần khác nhau của tập dữ liệu, đặc biệt, khi chạy đào tạo phân tán ở chế độ song song dữ liệu. Chúng tôi biết rằng, để chia một loạt các mẫu được cung cấp bởi trình lặp dữ liệu để đào tạo song song dữ liệu trên một nhân viên, chúng tôi có thể sử dụngmxnet.gluon.utils.split_and_load và sau đó, tải từng phần của lô vào thiết bị sẽ xử lý thêm.
Mặt khác, trong trường hợp đào tạo phân tán, lúc đầu chúng ta cần chia tập dữ liệu thành ncác bộ phận khác nhau để mỗi công nhân nhận được một bộ phận khác nhau. Sau khi có, mỗi công nhân có thể sử dụngsplit_and_loadđể chia lại phần đó của tập dữ liệu cho các thiết bị khác nhau trên một máy. Tất cả điều này xảy ra thông qua trình lặp dữ liệu.mxnet.io.MNISTIterator và mxnet.io.ImageRecordIter là hai trình vòng lặp như vậy trong MXNet hỗ trợ tính năng này.
Đang cập nhật trọng lượng
Để cập nhật trọng số, KVStore hỗ trợ hai chế độ sau:
Phương pháp đầu tiên tổng hợp các gradient và cập nhật trọng số bằng cách sử dụng các gradient đó.
Trong phương pháp thứ hai, máy chủ chỉ tổng hợp các gradient.
Nếu bạn đang sử dụng Gluon, có một tùy chọn để chọn giữa các phương pháp đã nêu ở trên bằng cách chuyển update_on_kvstoreBiến đổi. Hãy hiểu nó bằng cách tạotrainer đối tượng như sau -
trainer = gluon.Trainer(net.collect_params(), optimizer='sgd',
optimizer_params={'learning_rate': opt.lr,
'wd': opt.wd,
'momentum': opt.momentum,
'multi_precision': True},
kvstore=kv,
update_on_kvstore=True)
Các phương thức đào tạo phân tán
Nếu chuỗi tạo KVStore chứa từ dist, điều đó có nghĩa là đào tạo phân tán đã được kích hoạt. Sau đây là các phương thức đào tạo phân tán khác nhau có thể được kích hoạt bằng cách sử dụng các loại KVStore khác nhau:
dist_sync
Như tên của nó, nó biểu thị đào tạo phân tán đồng bộ. Trong trường hợp này, tất cả công nhân sử dụng cùng một bộ thông số mô hình được đồng bộ hóa giống nhau khi bắt đầu mỗi lô.
Hạn chế của chế độ này là, sau mỗi đợt, máy chủ phải đợi để nhận gradient từ mỗi worker trước khi cập nhật các thông số mô hình. Điều này có nghĩa là nếu một công nhân gặp sự cố, nó sẽ cản trở sự tiến bộ của tất cả công nhân.
dist_async
Như tên của nó, nó biểu thị đào tạo phân tán đồng bộ. Trong đó, máy chủ nhận các gradient từ một công nhân và ngay lập tức cập nhật cửa hàng của nó. Máy chủ sử dụng cửa hàng đã cập nhật để phản hồi bất kỳ lần kéo nào khác.
Lợi thế, so với dist_sync mode, là một công nhân xử lý xong một lô có thể kéo các thông số hiện tại từ máy chủ và bắt đầu lô tiếp theo. Công nhân có thể làm như vậy, ngay cả khi công nhân kia vẫn chưa xử lý xong lô trước đó. Nó cũng nhanh hơn chế độ dist_sync bởi vì, có thể mất nhiều kỷ nguyên hơn để hội tụ mà không có bất kỳ chi phí đồng bộ hóa nào.
dist_sync_device
Chế độ này giống như dist_syncchế độ. Sự khác biệt duy nhất là, khi có nhiều GPU được sử dụng trên mỗi nútdist_sync_device tổng hợp các độ dốc và cập nhật trọng số trên GPU trong khi, dist_sync tổng hợp độ dốc và cập nhật trọng số trên bộ nhớ CPU.
Nó làm giảm giao tiếp đắt tiền giữa GPU và CPU. Đó là lý do tại sao, nó nhanh hơndist_sync. Hạn chế là nó làm tăng mức sử dụng bộ nhớ trên GPU.
dist_async_device
Chế độ này hoạt động giống như dist_sync_device nhưng ở chế độ không đồng bộ.