From 8e7ba1b339b904c875dad70fbd412c9cbb0e7e23 Mon Sep 17 00:00:00 2001 From: Xiaoda Zhang Date: Thu, 15 Oct 2020 09:32:29 +0800 Subject: [PATCH] add the parallel-related documents --- design/meps/mep-parallel/MEP-PARALLEL.md | 196 ++++++++++++++++++ .../mep-parallel/auto-parallel-components.png | Bin 0 -> 52773 bytes sigs/README.md | 1 + sigs/parallel/README.md | 24 +++ sigs/parallel/docs/design-template.md | 0 sigs/parallel/meetings/meeting-template.md | 14 ++ 6 files changed, 235 insertions(+) create mode 100644 design/meps/mep-parallel/MEP-PARALLEL.md create mode 100644 design/meps/mep-parallel/auto-parallel-components.png create mode 100644 sigs/parallel/README.md create mode 100644 sigs/parallel/docs/design-template.md create mode 100644 sigs/parallel/meetings/meeting-template.md diff --git a/design/meps/mep-parallel/MEP-PARALLEL.md b/design/meps/mep-parallel/MEP-PARALLEL.md new file mode 100644 index 0000000..03b3776 --- /dev/null +++ b/design/meps/mep-parallel/MEP-PARALLEL.md @@ -0,0 +1,196 @@ +| title | authors | owning-sig | participating-sigs | status | creation-date | reviewers | approvers | stage | milestone | +| ------------ | -------------------- | ---------- | ------------------ | ----------- | ------------- | --------- | --------- | ----- | ------------- | +| MEP-PARALLEL | @stsuteng @xiaoda_zh | parallel | | provisional | 2020-10-14 | | TBD | beta | beta : "v0.5" | + +# MEP-PARALLEL: Auto-parallel + +## Table of Contents + + + +- [MEP-PARALLEL: Auto-parallel](#mep-parallel-auto-parallel) + - [Table of Contents](#table-of-contents) + - [Summary](#summary) + - [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) + - [Proposal](#proposal) + - [User Stories](#user-stories) + - [Parallelizing training for general DNNs](#parallelizing-training-for-general-dnns) + - [Design Details](#design-details) + - [Test Plan](#test-plan) + - [Implementation History](#implementation-history) + - [Drawbacks](#drawbacks) + - [Alternatives](#alternatives) + - [References](#references) + + + +## Summary + + + +Auto-parallel is a functionality built in MindSpore to automatically parallelize the training of giant DNN models. While keeping the DNN descriptions identical to their single-device counterparts, it algorithmically finds good partitioning strategy for the given model. + +## Motivation + + + +It is increasingly important to find an efficient way to parallel train giant DNN models. However, there are multiple factors impacting the choice of parallel paradigms (Data-parallel, Model-parallel, and Hybird-parallel), including the size of training dataset, the size of the DNN model, the graph structure of the DNN model, the specification of hardware accelerators, etc. Different combinations of these factors prefer different parallel paradigms. It is desirable that a system takes these factors into account, and produces an efficient parallelization strategy for the given DNN model. + +### Goals + + + +- Easy use: The desired system should provide user-friendly interfaces. Ideally, parallel implementation is totally transparent to users. +- Good parallel speedup: The desired system can always find efficient parallelization strategy. + +### Non-Goals + + +- None + +## Proposal + + + +Auto-parallel aims to automatically find efficient parallelization strategy for any DNN model, while keeping the DNN descriptions same as their single-device counterparts. To do so, it captures the data flow graph defined by a DNN model, and partitions the data flow graph after evaluating the cost of different partition strategies. **Cost model** provides the mechanism to estimate the cost under a given strategy. **Tensor partitioning** and **Pipelined model-parallel** are two paradigms to implement Model-parallel. + +- **Cost model.** + The choice of different strategies depends on their associated costs. The costs here can be defined as the iteration time in training, which includes both computation and communication time. In most cases, the computation and communication can be overlapped. Instead of taking engineering efforts to investigate cost of each operator under possible strategies, it is desired to estimate the cost according the semantic of the operator and its inputs. + +- **Tensor partitioning.** + Tensor partitioning is a paradigm to implement Model-parallel. In this paradigm, each tensor in the DNN model is partitioned into slices. The data flow graph obtained by each device is symmetric, meaning that the sequences of operators assigned onto devices are same. The problem is to find an efficient partition strategy for each tensor. + +- **Pipelined model-parallel.** This is another paradigm to implement Model-parallel. In this paradigm, operators are assigned to different devices, while each operator itself is not partitioned. To address the low resource utilization problem, multiple training iterations can be active at the same time, so that the different batches are pipelined. The problem is to find a partition for the data flow graph. + +### User Stories + + + +#### Parallelizing training for general DNNs +Since the DNNs used in different areas are significantly different, it is challenging to design a universal system that can always find the best parallelization strategies for the given DNN model. The Cost model and two paradigms are important components in our consideration. Proposals according to these components and other designs to solve the parallelization problem are welcome. + +# Design Details + + + + + + +Auto-parallel consists of four main components: +- **Parallel model.** It provides the tensor layout (how each tensor is partitioned among devices), the distributed operator (the distributed counterpart of an operator), the distributed auto-grad (how to automatically generate derivatives of the distributed operators), etc. +- **Cost model.** It provides the interfaces of estimating cost of a distributed operator given a partition strategy. It also estimates cost of a tensor redistribution. +- **Parallel strategy search.** Given the data flow graph, it returns the parallelization strategy for each operator using the evaluations of **Cost model**. +- **Parallel partition.** Given the graph marked with strategy for each operator, it partitions the involved tensors for each operator, and it inserts necessary primitives to guarantee the correctness of partitioned operators. + +### Test Plan + + + +There are two types of testing strategies in Auto-parallel: + +- **Unit Test.** Every design for Auto-parallel should guarantee the correctness for each partitioned operator. + +- **System test**. Every effective design should be tested for at least one real DNN model, so that the searched strategy indeed leads to efficient performance. Auto-parallel module provides some verifications and performance testing. + +## Implementation History + + + +- Support an preliminary implementation of **Parallel model** and **Parallel partition** module. +- Support an algorithm of **Parallel strategy search** module. +- Support an preliminary implementation of **Cost model**. +- Enhance **Parallel partition** and **Parallel strategy search** module to support searching efficient strategy for a series of ResNet DNN models. +- Enhance **Cost model** module to precisely characterize memory cost, computation cost and communication cost. + +## Drawbacks + + +- Currently, the searched strategy returned by Auto-parallel may not always lead to the best iteration time. This is mainly due to the **Cost model** improperly estimates the execution cost of operators and entire models. + +## Alternatives + + +- Mesh-TF[1] partitions the data flow graph to minimize the memory consumption of each device. However, Mesh-TF may be suboptimal in end-to-end iteration time since it misses tensor redistribution strategies between two adjacent operators. +OptCNN[2] and Tofu[3] includes the tensor redistribution strategies, but they have problems when the data flow graph has complex graph structures. The algorithm in current Auto-parallel considers the tensor redistributions, and is able to deal with complex graph structures. +- The above works follow the **Tensor partitioning** paradigm. While GPipe[4] and PipeDream[5] are two implementations of **Pipelined model-parallel** paradigm. We are considering a hybrid design of combining these two paradigms. +## References +- [1] Noam Shazeer, Youlong Cheng, Niki Parmar, Dustin Tran, Ashish Vaswani, Penporn Koanantakool, Peter Hawkins, HyoukJoong Lee, Mingsheng Hong, Cliff Young, Ryan Sepassi, and Blake Hechtman. Mesh-TensorFlow: Deep Learning for Supercomputers. NeurIPS '18. +- [2] Zhihao Jia, Sina Lin, Charles R. Qi, and Alex Aiken. Exploring Hidden Dimensions in Accelerating Convolutional Neural Networks. ICML '18. +- [3] Minjie Wang, Chien-chin Huang, and Jinyang Li. Supporting Very Large Models Using Automatic Dataflow Graph Partitioning. EuroSys '19. +- [4] Yanping Huang, Youlong Cheng, Ankur Bapna, Orhan Firat, Dehao Chen, Mia Chen, HyoukJoong Lee, Jiquan Ngiam, Quoc V Le, Yonghui Wu, and zhifeng Chen. GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism. NeurIPS '19. +- [5] Deepak Narayanan, Aaron Harlap, Amar Phanishayee, Vivek Seshadri, Nikhil R. Devanur, Gregory R. Ganger, Phillip B. Gibbons, and Matei Zaharia. PipeDream: Generalized Pipeline Parallelism for DNN Training. SOSP '19. \ No newline at end of file diff --git a/design/meps/mep-parallel/auto-parallel-components.png b/design/meps/mep-parallel/auto-parallel-components.png new file mode 100644 index 0000000000000000000000000000000000000000..13a8bb54008523437a1401cf0a383f7fddbba279 GIT binary patch literal 52773 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 |5vHZ_OxERjP&~J0ZO+cG%-}_r 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 literal 0 HcmV?d00001 diff --git a/sigs/README.md b/sigs/README.md index 4e47658..4263547 100644 --- a/sigs/README.md +++ b/sigs/README.md @@ -27,3 +27,4 @@ in the mailing list. SIG artifacts can be found in the current repository. | AKG | This SIG is responsible for the development of MindSpore auto kernel generator. | | MSLITE | This SIG is responsible for the development of MindSpore lite. | | MDP | This SIG is responsible for the development of MindSpore programming library for Bayesian deep learning. | +| Parallel | This SIG is responsible for the development of MindSpore's functionality of automatically finding the efficient parallel strategy for DNN training and inference. | diff --git a/sigs/parallel/README.md b/sigs/parallel/README.md new file mode 100644 index 0000000..5e8f5f7 --- /dev/null +++ b/sigs/parallel/README.md @@ -0,0 +1,24 @@ +# MindSpore Parallel Special Interest Group (SIG) + +This is the working repository for the Parallel Special Interest Group (SIG). This repository contains all the artifacts, materials, meeting notes and proposals regarding **Auto-parallel**, **Model-parallel**, **Pipelined model-parallel**, **Tensor partitioning**, **Cost model**. Feedback and contributions are welcome. +1. **Auto-parallel**: The sizes of popular DNN models are getting larger, thus it is desired to automatically find an efficient way to parallelize the execution (training and inference) of the giant DNNs. This is the ultimate goal of this SIG. +2. **Model-parallel**: Unlike Data-parallel in which each device holds the entire model in training, Model-parallel is to partition the model to available devices, so that each device holds a slice of the entire model. Model-parallel is a more suitable approach for training giant models. +3. **Pipelined model-parallel**: This is a paradigm to implement Model-parallel. This paradigm is to assign operators of a DNN model to different devices, so that different training batches can be pipelined. +4. **Tensor partitioning**: This is another paradigm to implement Model-parallel. This paradigm is to partition tensors of each operator in a DNN model, so that the devices obtain *symmetric* sequences of sliced operators. + +# SIG Leads + +* Cheng Li (University of Science and Technology of China) + +# Logistics + +* SIG leads will drive the meeting. +* Meeting annoucement will be posted on our gitee channel: https://gitee.com/mindspore/community/tree/master/sigs/parallel +* Feedbacks and topic requests are welcomed by all. + +# Discussion + +* Slack channel: https://app.slack.com/client/TUKCY4QDR/CUZ3FESNS?cdn_fallback=2 +* Documents and artifacts: https://gitee.com/mindspore/community/tree/master/sigs/parallel + +# Meeting notes \ No newline at end of file diff --git a/sigs/parallel/docs/design-template.md b/sigs/parallel/docs/design-template.md new file mode 100644 index 0000000..e69de29 diff --git a/sigs/parallel/meetings/meeting-template.md b/sigs/parallel/meetings/meeting-template.md new file mode 100644 index 0000000..0c85d75 --- /dev/null +++ b/sigs/parallel/meetings/meeting-template.md @@ -0,0 +1,14 @@ +# Thursday Aug 20, 2020 at 21:30pm GMT+8 + +## Agenda + +## Conference links + +## Attendees +* Tom (Huawei) + +## Notes +* TODO + +## Action items +* TODO