mirror of
https://github.com/hpcaitech/ColossalAI.git
synced 2026-07-16 17:16:14 +00:00
Update metainfo patch branch (#2517)
* init
* rename and remove useless func
* basic chunk
* add evoformer
* align evoformer
* add meta
* basic chunk
* basic memory
* finish basic inference memory estimation
* finish memory estimation
* fix bug
* finish memory estimation
* add part of index tracer
* finish basic index tracer
* add doc string
* add doc str
* polish code
* polish code
* update active log
* polish code
* add possible region search
* finish region search loop
* finish chunk define
* support new op
* rename index tracer
* finishi codegen on msa
* redesign index tracer, add source and change compute
* pass outproduct mean
* code format
* code format
* work with outerproductmean and msa
* code style
* code style
* code style
* code style
* change threshold
* support check_index_duplicate
* support index dupilictae and update loop
* support output
* update memory estimate
* optimise search
* fix layernorm
* move flow tracer
* refactor flow tracer
* format code
* refactor flow search
* code style
* adapt codegen to prepose node
* code style
* remove abandoned function
* remove flow tracer
* code style
* code style
* reorder nodes
* finish node reorder
* update run
* code style
* add chunk select class
* add chunk select
* code style
* add chunksize in emit, fix bug in reassgin shape
* code style
* turn off print mem
* add evoformer openfold init
* init openfold
* add benchmark
* add print
* code style
* code style
* init openfold
* update openfold
* align openfold
* use max_mem to control stratge
* update source add
* add reorder in mem estimator
* improve reorder efficeincy
* support ones_like, add prompt if fit mode search fail
* fix a bug in ones like, dont gen chunk if dim size is 1
* fix bug again
* update min memory stratege, reduce mem usage by 30%
* last version of benchmark
* refactor structure
* restruct dir
* update test
* rename
* take apart chunk code gen
* close mem and code print
* code format
* rename ambiguous variable
* seperate flow tracer
* seperate input node dim search
* seperate prepose_nodes
* seperate non chunk input
* seperate reorder
* rename
* ad reorder graph
* seperate trace flow
* code style
* code style
* fix typo
* set benchmark
* rename test
* update codegen test
* Fix state_dict key missing issue of the ZeroDDP (#2363)
* Fix state_dict output for ZeroDDP duplicated parameters
* Rewrite state_dict based on get_static_torch_model
* Modify get_static_torch_model to be compatible with the lower version (ZeroDDP)
* update codegen test
* update codegen test
* add chunk search test
* code style
* add available
* [hotfix] fix gpt gemini example (#2404)
* [hotfix] fix gpt gemini example
* [example] add new assertions
* remove autochunk_available
* [workflow] added nightly release to pypi (#2403)
* add comments
* code style
* add doc for search chunk
* [doc] updated readme regarding pypi installation (#2406)
* add doc for search
* [doc] updated kernel-related optimisers' docstring (#2385)
* [doc] updated kernel-related optimisers' docstring
* polish doc
* rename trace_index to trace_indice
* rename function from index to indice
* rename
* rename in doc
* [polish] polish code for get_static_torch_model (#2405)
* [gemini] polish code
* [testing] remove code
* [gemini] make more robust
* rename
* rename
* remove useless function
* [worfklow] added coverage test (#2399)
* [worfklow] added coverage test
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* add doc for trace indice
* [docker] updated Dockerfile and release workflow (#2410)
* add doc
* update doc
* add available
* change imports
* add test in import
* [workflow] refactored the example check workflow (#2411)
* [workflow] refactored the example check workflow
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* Update parallel_context.py (#2408)
* [hotfix] add DISTPAN argument for benchmark (#2412)
* change the benchmark config file
* change config
* revert config file
* rename distpan to distplan
* [workflow] added precommit check for code consistency (#2401)
* [workflow] added precommit check for code consistency
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* polish code
* adapt new fx
* [workflow] added translation for non-english comments (#2414)
* [setup] refactored setup.py for dependency graph (#2413)
* change import
* update doc
* [workflow] auto comment if precommit check fails (#2417)
* [hotfix] add norm clearing for the overflow step (#2416)
* [examples] adding tflops to PaLM (#2365)
* [workflow]auto comment with test coverage report (#2419)
* [workflow]auto comment with test coverage report
* polish code
* polish yaml
* [doc] added documentation for CI/CD (#2420)
* [doc] added documentation for CI/CD
* polish markdown
* polish markdown
* polish markdown
* [example] removed duplicated stable diffusion example (#2424)
* [zero] add inference mode and its unit test (#2418)
* [workflow] report test coverage even if below threshold (#2431)
* [example] improved the clarity yof the example readme (#2427)
* [example] improved the clarity yof the example readme
* polish workflow
* polish workflow
* polish workflow
* polish workflow
* polish workflow
* polish workflow
* [ddp] add is_ddp_ignored (#2434)
[ddp] rename to is_ddp_ignored
* [workflow] make test coverage report collapsable (#2436)
* [autoparallel] add shard option (#2423)
* [fx] allow native ckpt trace and codegen. (#2438)
* [cli] provided more details if colossalai run fail (#2442)
* [autoparallel] integrate device mesh initialization into autoparallelize (#2393)
* [autoparallel] integrate device mesh initialization into autoparallelize
* add megatron solution
* update gpt autoparallel examples with latest api
* adapt beta value to fit the current computation cost
* [zero] fix state_dict and load_state_dict for ddp ignored parameters (#2443)
* [ddp] add is_ddp_ignored
[ddp] rename to is_ddp_ignored
* [zero] fix state_dict and load_state_dict
* fix bugs
* [zero] update unit test for ZeroDDP
* [example] updated the hybrid parallel tutorial (#2444)
* [example] updated the hybrid parallel tutorial
* polish code
* [zero] add warning for ignored parameters (#2446)
* [example] updated large-batch optimizer tutorial (#2448)
* [example] updated large-batch optimizer tutorial
* polish code
* polish code
* [example] fixed seed error in train_dreambooth_colossalai.py (#2445)
* [workflow] fixed the on-merge condition check (#2452)
* [workflow] automated the compatiblity test (#2453)
* [workflow] automated the compatiblity test
* polish code
* [autoparallel] update binary elementwise handler (#2451)
* [autoparallel] update binary elementwise handler
* polish
* [workflow] automated bdist wheel build (#2459)
* [workflow] automated bdist wheel build
* polish workflow
* polish readme
* polish readme
* Fix False warning in initialize.py (#2456)
* Update initialize.py
* pre-commit run check
* [examples] update autoparallel tutorial demo (#2449)
* [examples] update autoparallel tutorial demo
* add test_ci.sh
* polish
* add conda yaml
* [cli] fixed hostname mismatch error (#2465)
* [example] integrate autoparallel demo with CI (#2466)
* [example] integrate autoparallel demo with CI
* polish code
* polish code
* polish code
* polish code
* [zero] low level optim supports ProcessGroup (#2464)
* [example] update vit ci script (#2469)
* [example] update vit ci script
* [example] update requirements
* [example] update requirements
* [example] integrate seq-parallel tutorial with CI (#2463)
* [zero] polish low level optimizer (#2473)
* polish pp middleware (#2476)
Co-authored-by: Ziyue Jiang <ziyue.jiang@gmail.com>
* [example] update gpt gemini example ci test (#2477)
* [zero] add unit test for low-level zero init (#2474)
* [workflow] fixed the skip condition of example weekly check workflow (#2481)
* [example] stable diffusion add roadmap
* add dummy test_ci.sh
* [example] stable diffusion add roadmap (#2482)
* [CI] add test_ci.sh for palm, opt and gpt (#2475)
* polish code
* [example] titans for gpt
* polish readme
* remove license
* polish code
* update readme
* [example] titans for gpt (#2484)
* [autoparallel] support origin activation ckpt on autoprallel system (#2468)
* [autochunk] support evoformer tracer (#2485)
support full evoformer tracer, which is a main module of alphafold. previously we just support a simplifed version of it.
1. support some evoformer's op in fx
2. support evoformer test
3. add repos for test code
* [example] fix requirements (#2488)
* [zero] add unit testings for hybrid parallelism (#2486)
* [hotfix] gpt example titans bug #2493
* polish code and fix dataloader bugs
* [hotfix] gpt example titans bug #2493 (#2494)
* [fx] allow control of ckpt_codegen init (#2498)
* [fx] allow control of ckpt_codegen init
Currently in ColoGraphModule, ActivationCheckpointCodeGen will be set automatically in __init__. But other codegen can't be set if so.
So I add an arg to control whether to set ActivationCheckpointCodeGen in __init__.
* code style
* [example] dreambooth example
* add test_ci.sh to dreambooth
* [autochunk] support autochunk on evoformer (#2497)
* Revert "Update parallel_context.py (#2408)"
This reverts commit 7d5640b9db.
* add avg partition (#2483)
Co-authored-by: Ziyue Jiang <ziyue.jiang@gmail.com>
* [auto-chunk] support extramsa (#3) (#2504)
* [utils] lazy init. (#2148)
* [utils] lazy init.
* [utils] remove description.
* [utils] complete.
* [utils] finalize.
* [utils] fix names.
* [autochunk] support parsing blocks (#2506)
* [zero] add strict ddp mode (#2508)
* [zero] add strict ddp mode
* [polish] add comments for strict ddp mode
* [zero] fix test error
* [doc] update opt and tutorial links (#2509)
* [workflow] fixed changed file detection (#2515)
Co-authored-by: oahzxl <xuanlei.zhao@gmail.com>
Co-authored-by: eric8607242 <e0928021388@gmail.com>
Co-authored-by: HELSON <c2h214748@gmail.com>
Co-authored-by: Frank Lee <somerlee.9@gmail.com>
Co-authored-by: Haofan Wang <haofanwang.ai@gmail.com>
Co-authored-by: Jiarui Fang <fangjiarui123@gmail.com>
Co-authored-by: ZijianYY <119492445+ZijianYY@users.noreply.github.com>
Co-authored-by: YuliangLiu0306 <72588413+YuliangLiu0306@users.noreply.github.com>
Co-authored-by: Super Daniel <78588128+super-dainiu@users.noreply.github.com>
Co-authored-by: ver217 <lhx0217@gmail.com>
Co-authored-by: Ziyue Jiang <ziyue.jiang97@gmail.com>
Co-authored-by: Ziyue Jiang <ziyue.jiang@gmail.com>
Co-authored-by: oahzxl <43881818+oahzxl@users.noreply.github.com>
Co-authored-by: binmakeswell <binmakeswell@gmail.com>
Co-authored-by: Fazzie-Maqianli <55798671+Fazziekey@users.noreply.github.com>
Co-authored-by: アマデウス <kurisusnowdeng@users.noreply.github.com>
This commit is contained in:
@@ -1,139 +1,56 @@
|
||||
# Sequence Parallelism with BERT
|
||||
# Sequence Parallelism
|
||||
|
||||
In this example, we implemented BERT with sequence parallelism. Sequence parallelism splits the input tensor and intermediate
|
||||
## Table of contents
|
||||
|
||||
- [Sequence Parallelism](#sequence-parallelism)
|
||||
- [Table of contents](#table-of-contents)
|
||||
- [📚 Overview](#-overview)
|
||||
- [🚀 Quick Start](#-quick-start)
|
||||
- [🏎 How to Train with Sequence Parallelism](#-how-to-train-with-sequence-parallelism)
|
||||
- [Step 1. Configure your parameters](#step-1-configure-your-parameters)
|
||||
- [Step 2. Invoke parallel training](#step-2-invoke-parallel-training)
|
||||
|
||||
## 📚 Overview
|
||||
|
||||
In this tutorial, we implemented BERT with sequence parallelism. Sequence parallelism splits the input tensor and intermediate
|
||||
activation along the sequence dimension. This method can achieve better memory efficiency and allows us to train with larger batch size and longer sequence length.
|
||||
|
||||
Paper: [Sequence Parallelism: Long Sequence Training from System Perspective](https://arxiv.org/abs/2105.13120)
|
||||
|
||||
## 🚀Quick Start
|
||||
1. Run with the following command
|
||||
## 🚀 Quick Start
|
||||
|
||||
1. Install PyTorch
|
||||
|
||||
2. Install the dependencies.
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
3. Run with the following command
|
||||
|
||||
```bash
|
||||
export PYTHONPATH=$PWD
|
||||
colossalai run --nproc_per_node 4 train.py -s
|
||||
```
|
||||
2. The default config is sequence parallel size = 2, pipeline size = 1, let’s change pipeline size to be 2 and try it again.
|
||||
|
||||
|
||||
## How to Prepare WikiPedia Dataset
|
||||
|
||||
First, let's prepare the WikiPedia dataset from scratch. To generate a preprocessed dataset, we need four items:
|
||||
1. raw WikiPedia dataset
|
||||
2. wikipedia extractor (extract data from the raw dataset)
|
||||
3. vocabulary file
|
||||
4. preprocessing scripts (generate final data from extracted data)
|
||||
|
||||
For the preprocessing script, we thank Megatron-LM for providing a preprocessing script to generate the corpus file.
|
||||
|
||||
```python
|
||||
# download raw data
|
||||
mkdir data && cd ./data
|
||||
wget https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2
|
||||
|
||||
# install wiki extractor
|
||||
git clone https://github.com/FrankLeeeee/wikiextractor.git
|
||||
pip install ./wikiextractor
|
||||
|
||||
# extractmodule
|
||||
wikiextractor --json enwiki-latest-pages-articles.xml.bz2
|
||||
cat text/*/* > ./corpus.json
|
||||
cd ..
|
||||
|
||||
# download vocab file
|
||||
mkdir vocab && cd ./vocab
|
||||
wget https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt
|
||||
cd ..
|
||||
|
||||
# preprocess some data
|
||||
git clone https://github.com/NVIDIA/Megatron-LM.git
|
||||
cd ./Megatron-LM
|
||||
python tools/preprocess_data.py \
|
||||
--input ../data/corpus.json \
|
||||
--output-prefix my-bert \
|
||||
--vocab ../vocab/bert-large-uncased-vocab.txt \
|
||||
--dataset-impl mmap \
|
||||
--tokenizer-type BertWordPieceLowerCase \
|
||||
--split-sentences \
|
||||
--workers 24
|
||||
# run with synthetic dataset
|
||||
colossalai run --nproc_per_node 4 train.py
|
||||
```
|
||||
|
||||
After running the preprocessing scripts, you will obtain two files:
|
||||
1. my-bert_text_sentence.bin
|
||||
2. my-bert_text_sentence.idx
|
||||
> The default config is sequence parallel size = 2, pipeline size = 1, let’s change pipeline size to be 2 and try it again.
|
||||
|
||||
If you happen to encouter `index out of range` problem when running Megatron's script,
|
||||
this is probably because that a sentence starts with a punctuation and cannot be tokenized. A work-around is to update `Encoder.encode` method with the code below:
|
||||
|
||||
```python
|
||||
class Encoder(object):
|
||||
def __init__(self, args):
|
||||
...
|
||||
|
||||
def initializer(self):
|
||||
...
|
||||
|
||||
def encode(self, json_line):
|
||||
data = json.loads(json_line)
|
||||
ids = {}
|
||||
for key in self.args.json_keys:
|
||||
text = data[key]
|
||||
doc_ids = []
|
||||
|
||||
# lsg: avoid sentences which start with a punctuation
|
||||
# as it cannot be tokenized by splitter
|
||||
if len(text) > 0 and text[0] in string.punctuation:
|
||||
text = text[1:]
|
||||
|
||||
for sentence in Encoder.splitter.tokenize(text):
|
||||
sentence_ids = Encoder.tokenizer.tokenize(sentence)
|
||||
if len(sentence_ids) > 0:
|
||||
doc_ids.append(sentence_ids)
|
||||
if len(doc_ids) > 0 and self.args.append_eod:
|
||||
doc_ids[-1].append(Encoder.tokenizer.eod)
|
||||
ids[key] = doc_ids
|
||||
return ids, len(json_line)
|
||||
```
|
||||
|
||||
## How to Train with Sequence Parallelism
|
||||
## 🏎 How to Train with Sequence Parallelism
|
||||
|
||||
We provided `train.py` for you to execute training. Before invoking the script, there are several
|
||||
steps to perform.
|
||||
|
||||
### Step 1. Set data path and vocab path
|
||||
|
||||
At the top of `config.py`, you can see two global variables `DATA_PATH` and `VOCAB_FILE_PATH`.
|
||||
|
||||
```python
|
||||
DATA_PATH = <data-path>
|
||||
VOCAB_FILE_PATH = <vocab-path>
|
||||
```
|
||||
|
||||
`DATA_PATH` refers to the path to the data file generated by Megatron's script. For example, in the section above, you should get two data files (my-bert_text_sentence.bin and my-bert_text_sentence.idx). You just need to `DATA_PATH` to the path to the bin file without the file extension.
|
||||
|
||||
For example, if your my-bert_text_sentence.bin is /home/Megatron-LM/my-bert_text_sentence.bin, then you should set
|
||||
|
||||
```python
|
||||
DATA_PATH = '/home/Megatron-LM/my-bert_text_sentence'
|
||||
```
|
||||
|
||||
The `VOCAB_FILE_PATH` refers to the path to the vocabulary downloaded when you prepare the dataset
|
||||
(e.g. bert-large-uncased-vocab.txt).
|
||||
|
||||
### Step 3. Make Dataset Helper
|
||||
|
||||
Build BERT dataset helper. Requirements are `CUDA`, `g++`, `pybind11` and `make`.
|
||||
|
||||
```python
|
||||
cd ./data/datasets
|
||||
make
|
||||
```
|
||||
|
||||
### Step 3. Configure your parameters
|
||||
### Step 1. Configure your parameters
|
||||
|
||||
In the `config.py` provided, a set of parameters are defined including training scheme, model, etc.
|
||||
You can also modify the ColossalAI setting. For example, if you wish to parallelize over the
|
||||
sequence dimension on 8 GPUs. You can change `size=4` to `size=8`. If you wish to use pipeline parallelism, you can set `pipeline=<num_of_pipeline_stages>`.
|
||||
|
||||
### Step 4. Invoke parallel training
|
||||
### Step 2. Invoke parallel training
|
||||
|
||||
Lastly, you can start training with sequence parallelism. How you invoke `train.py` depends on your
|
||||
machine setting.
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
from colossalai.amp import AMP_TYPE
|
||||
|
||||
DATA_PATH = ''
|
||||
VOCAB_FILE_PATH = ''
|
||||
|
||||
# hyper-parameters
|
||||
TRAIN_ITERS = 1000000
|
||||
DECAY_ITERS = 990000
|
||||
TRAIN_ITERS = 10
|
||||
DECAY_ITERS = 4
|
||||
WARMUP_FRACTION = 0.01
|
||||
GLOBAL_BATCH_SIZE = 32 # dp world size * sentences per GPU
|
||||
EVAL_ITERS = 10
|
||||
@@ -13,12 +10,12 @@ EVAL_INTERVAL = 10
|
||||
LR = 0.0001
|
||||
MIN_LR = 1e-05
|
||||
WEIGHT_DECAY = 0.01
|
||||
SEQ_LENGTH = 512
|
||||
SEQ_LENGTH = 128
|
||||
|
||||
# BERT config
|
||||
DEPTH = 12
|
||||
NUM_ATTENTION_HEADS = 12
|
||||
HIDDEN_SIZE = 768
|
||||
DEPTH = 4
|
||||
NUM_ATTENTION_HEADS = 4
|
||||
HIDDEN_SIZE = 128
|
||||
|
||||
# model config
|
||||
ADD_BINARY_HEAD = False
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
colossalai >= 0.1.12
|
||||
torch >= 1.8.1
|
||||
colossalai
|
||||
torch
|
||||
|
||||
7
examples/tutorial/sequence_parallel/test_ci.sh
Normal file
7
examples/tutorial/sequence_parallel/test_ci.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -euxo pipefail
|
||||
|
||||
pip install -r requirements.txt
|
||||
|
||||
# run test
|
||||
colossalai run --nproc_per_node 4 train.py
|
||||
@@ -1,9 +1,8 @@
|
||||
import argparse
|
||||
|
||||
import torch
|
||||
from data import build_train_valid_test_data_iterators
|
||||
from data.bert_helper import SequenceParallelDataIterator, get_batch_for_sequence_parallel
|
||||
from data.tokenizer import get_padded_vocab_size, initialize_tokenizer
|
||||
from data.dummy_dataloader import DummyDataloader
|
||||
from loss_func.bert_loss import BertLoss
|
||||
from lr_scheduler import AnnealingLR
|
||||
from model.bert import BertForPretrain, build_pipeline_bert
|
||||
@@ -36,7 +35,7 @@ def parse_args():
|
||||
|
||||
|
||||
def pipeline_data_process_func(stage_output, micro_batch_data):
|
||||
tokens, types, sentence_order, loss_mask, lm_labels, padding_mask = micro_batch_data
|
||||
tokens, types, sentence_order, loss_mask, lm_labels, padding_mask = micro_batch_data
|
||||
if gpc.is_first_rank(ParallelMode.PIPELINE):
|
||||
data = (tokens, padding_mask, types, lm_labels)
|
||||
label = (loss_mask, sentence_order)
|
||||
@@ -53,36 +52,15 @@ def main():
|
||||
|
||||
logger = get_dist_logger()
|
||||
|
||||
# build dataloader
|
||||
if not args.synthetic:
|
||||
initialize_tokenizer(gpc.config.VOCAB_FILE_PATH, tokenizer_type='BertWordPieceLowerCase')
|
||||
VOCAB_SIZE = get_padded_vocab_size()
|
||||
trainloader, validloader, testloader = build_train_valid_test_data_iterators(
|
||||
train_iters=gpc.config.TRAIN_ITERS,
|
||||
global_batch_size=gpc.config.GLOBAL_BATCH_SIZE,
|
||||
eval_interval=gpc.config.EVAL_INTERVAL,
|
||||
eval_iters=gpc.config.EVAL_ITERS,
|
||||
data_prefix=[gpc.config.DATA_PATH],
|
||||
data_impl='mmap',
|
||||
splits_string='949,50,1',
|
||||
max_seq_length=gpc.config.SEQ_LENGTH,
|
||||
masked_lm_prob=0.15,
|
||||
short_seq_prob=0.1,
|
||||
seed=1234,
|
||||
skip_warmup=True,
|
||||
binary_head=False,
|
||||
)
|
||||
else:
|
||||
from data.dummy_dataloader import DummyDataloader
|
||||
|
||||
BATCH_SIZE_PER_GPUS = gpc.config.GLOBAL_BATCH_SIZE // gpc.get_world_size(ParallelMode.DATA)
|
||||
VOCAB_SIZE = 30528
|
||||
trainloader = DummyDataloader(batch_size=BATCH_SIZE_PER_GPUS,
|
||||
vocab_size=VOCAB_SIZE,
|
||||
seq_length=gpc.config.SEQ_LENGTH)
|
||||
validloader = DummyDataloader(batch_size=BATCH_SIZE_PER_GPUS,
|
||||
vocab_size=VOCAB_SIZE,
|
||||
seq_length=gpc.config.SEQ_LENGTH)
|
||||
# build synthetic dataloader
|
||||
BATCH_SIZE_PER_GPUS = gpc.config.GLOBAL_BATCH_SIZE // gpc.get_world_size(ParallelMode.DATA)
|
||||
VOCAB_SIZE = 30528
|
||||
trainloader = DummyDataloader(batch_size=BATCH_SIZE_PER_GPUS,
|
||||
vocab_size=VOCAB_SIZE,
|
||||
seq_length=gpc.config.SEQ_LENGTH)
|
||||
validloader = DummyDataloader(batch_size=BATCH_SIZE_PER_GPUS,
|
||||
vocab_size=VOCAB_SIZE,
|
||||
seq_length=gpc.config.SEQ_LENGTH)
|
||||
|
||||
logger.info("Dataloaders are built", ranks=[0])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user