Ghi chú lại những phần về xử lý Parallelism Distributed Training trong ML, DL
Mục tiêu của xử lý Parallelism
- Speedup: Giảm thời gian training bằng cách sử dùng đồng thời nhiều node/GPUs
- Efficiency: Sử dụng hiệu quả cấu hình cluster, tận dụng tối đa năng suất của hardware GPUs/CPUs/Nodes
- Scalability: Cho phép tăng giảm cấu hình hệ thống linh hoạt hơn
Types of parallelism
Để đạt được mục tiêu phân tán các training step thì có 2 cách chính: Model parallelism và Data parallelism. Tùy theo yêu cầu của application mà lựa chọn cách implement phù hợp hoặc có thể kết hợp cả 2
Ví dụ,
- Model parallelism: trong DL thì các layer khác nhau của model có thể được train song song trên nhiều GPU khác nhau
- Data parallelism: là việc phân chia nhỏ training sample thành nhiều phần nhỏ và thực hiện từng xử lý đồng thời training giống nhau đối với từng phần trên nhiều GPU khác nhau.
Data parallelism
Trong cách này thì dữ liệu training sẽ được chia được chia làm nhiều subset nhỏ, mỗi subset sẽ được train trên 1 một worker node.
Ở cuối mỗi training batch, sẽ có xử lý để đồng bộ (synchronize) parameter (gradients) giữa các process trên các worker.
Điểm mạnh của cách làm này là có thể tối ưu hóa được tỷ lệ chia dữ liệu đầu vào để tăng tốc. Hơn nữa, thì cách làm này yêu cầu ít communication cost giữa các node hơn.
Nên cách này thường được dùng trong trường hợp muốn speedup các bài toán CNN với dataset lớn.
Model parallelism (còn gọi là Network Parallelism)
Model sẽ được chia ra làm nhiều phần khác nhau (mỗi phần có thể có 1 hoặc nhiều layer) và mỗi phần sẽ được train độc lập trên cùng một tập dữ liệu ở nhiều node khác nhau.
Cách này thường được áp dụng trong trường hợp model lớn phức tạp có quá nhiều node, hoặc node quá lớn mà một work node, GPU không thể xử lý hết.
Theo mình thấy thì việc phân chia tập giữ liệu và train với cùng model trên nhiều worker node sẽ dễ dàng hơn rất nhiều so với cách tách algorithm thành nhiều phần để xử lý song song. Có lẽ thế nên implementation cho approach Data parallelism nhiều hơn ví dụ như Estimator/MirroredStrategy, Horovod
Về distribute cũng thế, data lớn không có nghĩa là phải distributed, quan trọng là model (số node, số parameters trong model) có lớn hay không. Nếu số node lớn đến nỗi nó ko fit vào memory của 1 GPU thì cần distributed còn nếu số node ít mà dataset lớn thì chỉ cần chia batch chạy train trên 1 GPU vẫn được vừa tiết kiệm chi phí, vừa đỡ phải nghĩ code để distributed training
Túm lại, là tùy theo bài toán thực tế và chi phí mà áp dụng parallel hay distribute.
Tham khảo:
– https://towardsdatascience.com/distributed-tensorflow-using-horovod-6d572f8790c4
–
– https://d2l.ai/chapter_computational-performance/multiple-gpus.html