From dbe62c67b8ee5a29039972900c289550b76f8e8e Mon Sep 17 00:00:00 2001 From: ver217 Date: Thu, 18 Nov 2021 23:45:09 +0800 Subject: [PATCH] add an example of ViT-B/16 and remove w_norm clipping in LAMB (#29) --- colossalai/nn/optimizer/lamb.py | 2 +- examples/vit-b16/README.md | 14 +++ examples/vit-b16/acc.jpeg | Bin 0 -> 19776 bytes examples/vit-b16/dataloader/__init__.py | 0 .../dataloader/imagenet_dali_dataloader.py | 112 ++++++++++++++++++ examples/vit-b16/hooks.py | 15 +++ examples/vit-b16/loss.jpeg | Bin 0 -> 22964 bytes examples/vit-b16/mixup.py | 12 ++ examples/vit-b16/train_dali.py | 70 +++++++++++ examples/vit-b16/vit-b16.py | 78 ++++++++++++ 10 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 examples/vit-b16/README.md create mode 100755 examples/vit-b16/acc.jpeg create mode 100755 examples/vit-b16/dataloader/__init__.py create mode 100755 examples/vit-b16/dataloader/imagenet_dali_dataloader.py create mode 100644 examples/vit-b16/hooks.py create mode 100755 examples/vit-b16/loss.jpeg create mode 100644 examples/vit-b16/mixup.py create mode 100644 examples/vit-b16/train_dali.py create mode 100755 examples/vit-b16/vit-b16.py diff --git a/colossalai/nn/optimizer/lamb.py b/colossalai/nn/optimizer/lamb.py index 68531e92a..f7248bd68 100644 --- a/colossalai/nn/optimizer/lamb.py +++ b/colossalai/nn/optimizer/lamb.py @@ -94,7 +94,7 @@ class Lamb(Optimizer): # * math.sqrt(bias_correction2) / bias_correction1 step_size = group['lr'] - weight_norm = p.data.pow(2).sum().sqrt().clamp(0, 10) + weight_norm = p.data.pow(2).sum().sqrt() adam_step = exp_avg / exp_avg_sq.sqrt().add(group['eps']) if group['weight_decay'] != 0: diff --git a/examples/vit-b16/README.md b/examples/vit-b16/README.md new file mode 100644 index 000000000..83b924c2e --- /dev/null +++ b/examples/vit-b16/README.md @@ -0,0 +1,14 @@ +# Overview + +Here is an example of training ViT-B/16 on Imagenet-1K. We use 8x A100 in this example. For simplicity and speed, we didn't apply `RandAug` and we just used `Mixup`. With `LAMB` optimizer, we can scale the batch size to 32K with a little accuracy loss. + +# How to run +Using slurm: +```shell +srun python train_dali.py --local_rank=$SLURM_PROCID --world_size=$SLURM_NPROCS --host=$HOST --port=29500 --config=vit-b16.py +``` + +# Results + +![Loss Curve](./loss.jpeg) +![Accuracy](./acc.jpeg) diff --git a/examples/vit-b16/acc.jpeg b/examples/vit-b16/acc.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..43f67fd39167963235a372abb26f11c41b8dade6 GIT binary patch literal 19776 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 self._size or self._size < 0: + self.reset() + return self + + def __next__(self): + data = super().__next__() + img, label = data[0]['data'], data[0]['label'] + label = label.squeeze() + if self.mixup_alpha > 0.0: + if self.training: + lam = np.random.beta(self.mixup_alpha, self.mixup_alpha) + idx = torch.randperm(img.size(0)).to(img.device) + img = lam * img + (1 - lam) * img[idx, :] + label_a, label_b = label, label[idx] + lam = torch.tensor([lam], device=img.device, dtype=img.dtype) + label = (label_a, label_b, lam) + else: + label = (label, label, torch.ones( + 1, device=img.device, dtype=img.dtype)) + return (img,), label + return (img,), (label,) diff --git a/examples/vit-b16/hooks.py b/examples/vit-b16/hooks.py new file mode 100644 index 000000000..b6c306ed7 --- /dev/null +++ b/examples/vit-b16/hooks.py @@ -0,0 +1,15 @@ +from colossalai.registry import HOOKS +from colossalai.trainer import BaseHook +from colossalai.core import global_context as gpc +from colossalai.context import ParallelMode + + +@HOOKS.register_module +class TotalBatchsizeHook(BaseHook): + def __init__(self, trainer, priority: int = 2) -> None: + super().__init__(trainer, priority) + + def before_train(self): + total_batch_size = gpc.config.BATCH_SIZE * \ + gpc.config.engine.gradient_accumulation * gpc.get_world_size(ParallelMode.DATA) + self.logger.info(f'Total batch size = {total_batch_size}', ranks=[0]) diff --git a/examples/vit-b16/loss.jpeg b/examples/vit-b16/loss.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..a16c333cc8e945ec9e3713017160d57d273ae3d8 GIT binary patch literal 22964 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