From 47044fd6eb1591bd385cb5c4d9110f8554f9629b Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 16 Aug 2023 08:46:26 -0700 Subject: [PATCH 01/41] changed loc to look for yamls --- .../train/benchmarking/submit_benchmarks.py | 4 +- scripts/train/benchmarking/sweep.sh | 319 +++++++++--------- 2 files changed, 161 insertions(+), 162 deletions(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index f7db0613ef..bc5baeedbb 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -373,8 +373,8 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], composer train/train.py /mnt/config/parameters.yaml """ - - path = os.path.join('../yamls/mpt', model_yaml) + print("CHRIS: IS NONNONE") + path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) parameters = get_parameters(path) model_name = '-'.join(model_yaml.split('.')[-2].split('/')[-2:]).replace( diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index 5d962b7c5c..cec99227d1 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -3,172 +3,171 @@ PROJECT="tput" GIT_COMMIT="v0.0.4" IMAGE="mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04" -CLUSTER_80GB=YOUR_CLUSTER_80GB -CLUSTER_40GB=YOUR_CLUSTER_40GB +CLUSTER_80GB=r1z1 # A100 80GB # seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# INCREASE GPU COUNT -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 32 64 --microbatch_size 20 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 14 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 32 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 64 --microbatch_size 16 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# ## INCREASE GPU COUNT +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 32 64 --microbatch_size 20 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 14 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 32 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 64 --microbatch_size 16 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# SCALE SEQUENCE LENGTH -# seqlen 512 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 96 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# seqlen 1024 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 18 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 40 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# seqlen 4096 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 7 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# seqlen 8192 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# seqlen 16384 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# seqlen 32768 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# seqlen 65536 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +# # SCALE SEQUENCE LENGTH +# # seqlen 512 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 96 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# # seqlen 1024 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 18 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 40 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# # seqlen 4096 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 7 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# # seqlen 8192 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# # seqlen 16384 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# # seqlen 32768 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# # seqlen 65536 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# A100 40GB - -# seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 26 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN - -# INCREASE GPU COUNT -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 128 --microbatch_size 26 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 128 --microbatch_size 12 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 --microbatch_size 8 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 5 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 32 64 128 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 128 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 128 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN - -# SCALE SEQUENCE LENGTH -# seqlen 512 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 104 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 32 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# seqlen 1024 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 52 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 28 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# seqlen 4096 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 13 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# seqlen 8192 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# seqlen 16384 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# seqlen 32768 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN +# # A100 40GB +# # +# ## seqlen 2048 +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 26 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# # +# ## INCREASE GPU COUNT +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 128 --microbatch_size 26 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 128 --microbatch_size 12 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 --microbatch_size 8 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 5 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 32 64 128 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 128 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 128 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# # +# ## SCALE SEQUENCE LENGTH +# ## seqlen 512 +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 104 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 32 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# ## seqlen 1024 +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 52 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 28 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# ## seqlen 4096 +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 13 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# ## seqlen 8192 +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# ## seqlen 16384 +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# ## seqlen 32768 +# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN +# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN From a668a8d5885212f61d3886614e8238209ec7c4ea Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 16 Aug 2023 14:51:44 -0700 Subject: [PATCH 02/41] ex.py submits run ok, needs correct data loading commands --- scripts/train/benchmarking/ex.py | 41 +++++++++++++++++++ .../train/benchmarking/submit_benchmarks.py | 35 +++++++++------- scripts/train/benchmarking/sweep.sh | 2 +- scripts/train/yamls/pretrain/mpt-125m.yaml | 16 +++++--- 4 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 scripts/train/benchmarking/ex.py diff --git a/scripts/train/benchmarking/ex.py b/scripts/train/benchmarking/ex.py new file mode 100644 index 0000000000..be83fb90dd --- /dev/null +++ b/scripts/train/benchmarking/ex.py @@ -0,0 +1,41 @@ +# Copyright 2022 MosaicML LLM Foundry authors +# SPDX-License-Identifier: Apache-2.0 +import argparse +import math +import os +from typing import Any, Dict, List, Optional, Tuple, Union + +import requests +import yaml +from mcli.models.run_config import SchedulingConfig +from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs + +config = RunConfig( + name='hello-composer', + gpu_num=1, + cluster="r1z2", + image='mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04', + integrations=[ + { + 'integration_type': 'git_repo', + 'git_repo': 'mosaicml/llm-foundry', + # 'git_branch': 'main', + 'pip_install': '-e .[gpu]', + # 'ssh_clone': 'false' + } + # , { + # 'integration_type': 'wandb', + # 'entity': 'mosaic-ml', + # 'project': 'chris-scripting' + # } + ], + command=""" + cd llm-foundry/scripts + composer train/train.py train/yamls/pretrain/mpt-1b.yaml + """, + scheduling={'priority': 'lowest','resumable': True} + # data_remote='oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/', + # max_duration=100 +) + +run = create_run(config) \ No newline at end of file diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index bc5baeedbb..2055bf77ea 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -8,8 +8,7 @@ import requests import yaml from mcli.models.run_config import SchedulingConfig -from mcli.sdk import RunConfig, create_run, get_clusters - +from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs def _get_cluster_info(): clusters = get_clusters() @@ -332,7 +331,7 @@ def get_integrations(project: str, } git_integration.update({ 'integration_type': 'git_repo', - 'git_repo': 'mosaicml/examples', + 'git_repo': 'mosaicml/llm-foundry', 'pip_install': '-e .[gpu]' }) @@ -361,19 +360,25 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], # Define our command if args.data_remote is not None: command = """ - cd examples/scripts - - composer train/train.py /mnt/config/parameters.yaml + cd llm-foundry/scripts + composer train/train.py train/yamls/pretrain/mpt-1b.yaml """ else: - command = f""" - cd examples/scripts - - python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' - - composer train/train.py /mnt/config/parameters.yaml + # command = f""" + # cd llm-foundry/scripts + # python ../../examples/examples/common/convert_dataset.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' + # composer train/train.py /mnt/config/parameters.yaml + # """ TODO: Do I need to use this dataset or are we all good? + command = """ + cd llm-foundry/scripts + composer train/train.py train/yamls/pretrain/mpt-1b.yaml \ + train_loader.dataset.split=train \ + eval_loader.dataset.split=val\ + max_duration=100ba \ + eval_interval=0 \ + data_remote=oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/\ + loggers.wandb="{}"\ """ - print("CHRIS: IS NONNONE") path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) parameters = get_parameters(path) @@ -394,14 +399,14 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], microbatch_size = args.microbatch_size or 'auto' assert isinstance(microbatch_size, (int, str)) + assert(args.data_remote is not None) parameters = mod_parameters( parameters, max_seq_len, global_train_batch_size, precision, fsdp_config_mixed_precision=args.fsdp_config_mixed_precision, - fsdp_config_activation_checkpointing=args. - fsdp_config_activation_checkpointing, + fsdp_config_activation_checkpointing=args.fsdp_config_activation_checkpointing, run_name=name, data_remote=args.data_remote, microbatch_size=microbatch_size, diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index cec99227d1..22b5655734 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -9,7 +9,7 @@ CLUSTER_80GB=r1z1 # A100 80GB # seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN # python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN # python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN # python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN diff --git a/scripts/train/yamls/pretrain/mpt-125m.yaml b/scripts/train/yamls/pretrain/mpt-125m.yaml index 1d4c1d964c..0fff8fcb10 100644 --- a/scripts/train/yamls/pretrain/mpt-125m.yaml +++ b/scripts/train/yamls/pretrain/mpt-125m.yaml @@ -1,5 +1,5 @@ data_local: ./my-copy-c4 -data_remote: # If blank, files must be present in data_local +data_remote: oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ # If blank, files must be present in data_local max_seq_len: 2048 global_seed: 17 @@ -29,7 +29,7 @@ tokenizer: train_loader: name: text dataset: - local: ${data_local} + # local: ${data_local} remote: ${data_remote} split: train shuffle: true @@ -41,7 +41,7 @@ train_loader: eval_loader: name: text dataset: - local: ${data_local} + # local: ${data_local} remote: ${data_remote} split: val shuffle: false @@ -94,7 +94,7 @@ fsdp_config: verbose: false # Logging -progress_bar: false +progress_bar: true log_to_console: true console_log_interval: 1ba @@ -105,8 +105,12 @@ callbacks: memory_monitor: {} runtime_estimator: {} -# loggers: -# wandb: {} +scheduling: + resumable: true # Makes job preemptible. + priority: low # Allows higher priority jobs to preempt you + +loggers: + wandb: {} # Checkpoint to local filesystem or remote object store # save_interval: 500ba From c7f49dd40e4c6ed4063c81c7c0bb43c8e4c19252 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Thu, 17 Aug 2023 11:57:40 -0700 Subject: [PATCH 03/41] modified to work w/ new sdk features --- scripts/train/benchmarking/collect_results.py | 50 ++---- .../train/benchmarking/submit_benchmarks.py | 48 ++--- scripts/train/benchmarking/sweep.sh | 167 +++++++++--------- 3 files changed, 122 insertions(+), 143 deletions(-) diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index 050390b743..381cd292c6 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -29,7 +29,7 @@ def parse_args(): All FLOP calculations do not include norm, act, residual, etc. """) - parser.add_argument('--project', type=str, default='tput') + parser.add_argument('--project', type=str, default='intern') parser.add_argument('--filters', type=str, default=[], nargs='+') parser.add_argument('-s', '--save-path', @@ -46,13 +46,12 @@ def parse_args(): def get_runs(args: argparse.Namespace): - runs = [r for r in msdk.get_runs() if args.project in r.name] + runs = [r for r in msdk.get_runs(include_details=True) if "intern" in r.name and r.status == msdk.RunStatus("COMPLETED")] for filter in args.filters: runs = [r for r in runs if filter in r.name] - def sort_key(r: msdk.Run): model_name = r.name.split('-')[2] - num_gpu = r.config.gpu_num + num_gpu = r.gpus if model_name[-1] == 'm': model_name_size = 1e6 elif model_name[-1] == 'b': @@ -61,8 +60,8 @@ def sort_key(r: msdk.Run): print(model_name) raise ValueError model_size = int(model_name[:-1]) - return (model_name_size, model_size, r.config.parameters['max_seq_len'], - num_gpu, r.config.parameters['global_train_batch_size']) + return (model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], + num_gpu, r.submitted_config.parameters['global_train_batch_size']) runs.sort(reverse=True, key=sort_key) @@ -83,17 +82,7 @@ def filter_runs(runs: List[msdk.Run]): pop_runs = [] for run in runs: - if run.status in [ - msdk.RunStatus('FAILED_PULL'), - msdk.RunStatus('PENDING'), - msdk.RunStatus('QUEUED'), - msdk.RunStatus('RUNNING'), - msdk.RunStatus('SCHEDULED'), - msdk.RunStatus('STARTING'), - msdk.RunStatus('STOPPED'), - msdk.RunStatus('STOPPING'), - msdk.RunStatus('TERMINATING'), - ]: + if run.status != msdk.RunStatus("COMPLETED"): print(f'run {run.name} has run status {run.status}') pop_runs.append(run) for run in pop_runs: @@ -106,13 +95,12 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: n_params = micro_batchsize = throughput = -1 model_name = run.name.split('-')[2] - gpu_num = run.config.gpu_num - gpu_type = run.config.gpu_type - - fsdp_config = run.config.parameters['fsdp_config'] + gpus = run.gpus + gpu_type = run.gpu_type + fsdp_config = run.submitted_config.parameters['fsdp_config'] - seq_len = run.config.parameters['max_seq_len'] - global_train_batch_size = run.config.parameters['global_train_batch_size'] + seq_len = run.submitted_config.parameters['max_seq_len'] + global_train_batch_size = run.submitted_config.parameters['global_train_batch_size'] activation_checkpointing = fsdp_config['activation_checkpointing'] logs = msdk.get_run_logs(run) @@ -138,8 +126,8 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: throughput = float(line.split(' ')[-1]) break - d_model = run.config.parameters['model']['d_model'] - n_layers = run.config.parameters['model']['n_layers'] + d_model = run.submitted_config.parameters['model']['d_model'] + n_layers = run.submitted_config.parameters['model']['n_layers'] # mfu is approximated using thoughtput and param count # the number of paramters is approximately the number of multiply-accumulates (MAC) in the network @@ -153,11 +141,11 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: attn_flops_per_seq = n_layers * 2 * 2 * (d_model * (seq_len**2)) # there are 2 ops in bwd pass and 1 in fwd pass so we mult by 3 mfu_w_attn = (3 * flops_per_seq + 3 * attn_flops_per_seq) * throughput / ( - gpu_num * GPU_AVAILABLE_FLOPS) + gpus * GPU_AVAILABLE_FLOPS) if activation_checkpointing: hfu_w_attn = (4 * flops_per_seq + 4 * attn_flops_per_seq - ) * throughput / (gpu_num * GPU_AVAILABLE_FLOPS) + ) * throughput / (gpus * GPU_AVAILABLE_FLOPS) else: hfu_w_attn = mfu_w_attn @@ -167,7 +155,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: 'SeqLen (T)': seq_len, '# GPUs': - gpu_num, + gpus, 'GPU': gpu_type, 'MFU': @@ -177,7 +165,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: 'MicroBatchSize': micro_batchsize, 'GradAccum': - math.ceil(global_train_batch_size / gpu_num / micro_batchsize), + math.ceil(global_train_batch_size / gpus / micro_batchsize), 'GlobalBatchSize': global_train_batch_size, 'Throughput (S/s)': @@ -185,11 +173,11 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: 'Throughput (T/s)': int(throughput * seq_len), 'Throughput (T/s/GPU)': - int(throughput * seq_len / gpu_num), + int(throughput * seq_len / gpus), 'GlobalBatchSize (T)': global_train_batch_size * seq_len, 'Precision': - run.config.parameters['precision'], + run.submitted_config.parameters['precision'], 'MP Mode': fsdp_config['mixed_precision'], 'Sharding Strategy': diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 2055bf77ea..e7571505ef 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -157,7 +157,7 @@ def parse_args(): const=True, default=True) - parser.add_argument('--priority', type=str, default='low') + parser.add_argument('--priority', type=str, default='lowest') parser.add_argument('--RUN', type=str_to_bool, @@ -350,34 +350,20 @@ def get_integrations(project: str, def run_config(config: Tuple[str, int, int, str, str, int, str], args: argparse.Namespace): model_yaml, max_seq_len, global_train_batch_size, cluster, gpu_type, gpu_num, precision = config - - integrations = get_integrations( - args.project, - git_branch=args.git_branch, - git_commit=args.git_commit, - wandb=args.wandb) # point to git repo and potentially wandb - - # Define our command - if args.data_remote is not None: - command = """ - cd llm-foundry/scripts - composer train/train.py train/yamls/pretrain/mpt-1b.yaml - """ - else: - # command = f""" - # cd llm-foundry/scripts - # python ../../examples/examples/common/convert_dataset.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' - # composer train/train.py /mnt/config/parameters.yaml - # """ TODO: Do I need to use this dataset or are we all good? - command = """ + integrations = [ + { + 'integration_type': 'git_repo', + 'git_repo': 'mosaicml/llm-foundry', + 'pip_install': '-e .[gpu]', + }, { + 'integration_type': 'wandb', + 'entity': 'mosaic-ml', + 'project': 'intern' + } + ] + command = f""" cd llm-foundry/scripts - composer train/train.py train/yamls/pretrain/mpt-1b.yaml \ - train_loader.dataset.split=train \ - eval_loader.dataset.split=val\ - max_duration=100ba \ - eval_interval=0 \ - data_remote=oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/\ - loggers.wandb="{}"\ + composer train/train.py /mnt/config/parameters.yaml """ path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) parameters = get_parameters(path) @@ -396,15 +382,13 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], _name = name name = name[:name_len_lim] print(f'Shortening {_name} to {name} ({name_len_lim} chars)') - microbatch_size = args.microbatch_size or 'auto' assert isinstance(microbatch_size, (int, str)) - assert(args.data_remote is not None) parameters = mod_parameters( parameters, max_seq_len, global_train_batch_size, - precision, + parameters["precision"], fsdp_config_mixed_precision=args.fsdp_config_mixed_precision, fsdp_config_activation_checkpointing=args.fsdp_config_activation_checkpointing, run_name=name, @@ -412,7 +396,6 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], microbatch_size=microbatch_size, wandb=args.wandb, pad_vocab_multiple=args.pad_vocab_multiple) - # Create run config mcli sdk/api config = RunConfig(name=name, gpu_type=gpu_type, @@ -502,7 +485,6 @@ def run_check_dtms(num_gpus: int, dtms: int, batch_size: int): global_train_batch_size, cluster, gpu_type, gpu_num, precision) - print(config) run_config(config, args) n_jobs += 1 diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index 22b5655734..b16c624808 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -1,16 +1,18 @@ #!/bin/bash -PROJECT="tput" +PROJECT="intern" GIT_COMMIT="v0.0.4" IMAGE="mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04" CLUSTER_80GB=r1z1 - +CLUSTER_40GB=r8z3 # A100 80GB # seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -s 11 11 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -s 11 11 --RUN --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_80GB -s 11 11 --RUN # python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN # python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false @@ -96,78 +98,85 @@ python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_si # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# # A100 40GB -# # -# ## seqlen 2048 -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 26 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# # -# ## INCREASE GPU COUNT -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 128 --microbatch_size 26 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 128 --microbatch_size 12 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 --microbatch_size 8 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 5 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 32 64 128 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 128 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 128 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# # -# ## SCALE SEQUENCE LENGTH -# ## seqlen 512 -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 104 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 32 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# ## seqlen 1024 -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 52 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 28 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# ## seqlen 4096 -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 13 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# ## seqlen 8192 -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# ## seqlen 16384 -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# ## seqlen 32768 -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN +# A100 40GB + +# seqlen 2048 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ + +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN + +# # INCREASE GPU COUNT +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 128 --microbatch_size 26 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 128 --microbatch_size 12 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 --microbatch_size 8 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 5 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 32 64 128 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 128 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 128 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN + +# # SCALE SEQUENCE LENGTH +# # seqlen 512 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 104 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 32 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# # seqlen 1024 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 52 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 28 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# # seqlen 4096 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 13 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# # seqlen 8192 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# # seqlen 16384 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# # seqlen 32768 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN From 90c6ff89a68784b78de9048da74db94337ec36a9 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Thu, 17 Aug 2023 13:56:46 -0700 Subject: [PATCH 04/41] generates some results, off from what Vitaly calculated --- scripts/train/benchmarking/benchmark_results.csv | 11 +++++++++++ scripts/train/benchmarking/benchmark_results.md | 12 ++++++++++++ scripts/train/benchmarking/submit_benchmarks.py | 1 + scripts/train/benchmarking/sweep.sh | 16 +++++++++------- scripts/train/yamls/pretrain/mpt-125m.yaml | 4 ++-- 5 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 scripts/train/benchmarking/benchmark_results.csv create mode 100644 scripts/train/benchmarking/benchmark_results.md diff --git a/scripts/train/benchmarking/benchmark_results.csv b/scripts/train/benchmarking/benchmark_results.csv new file mode 100644 index 0000000000..d91e90c420 --- /dev/null +++ b/scripts/train/benchmarking/benchmark_results.csv @@ -0,0 +1,11 @@ +Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams +1b,2048,8,a100_40gb,56.21,56.21,8,8,512,75,154114,19264,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 +1b,2048,8,a100_40gb,55.86,55.86,8,8,512,74,153151,19143,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 +760m,2048,8,a100_40gb,51.5,51.5,12,4,384,114,235052,29381,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 +760m,2048,8,a100_40gb,51.96,51.96,12,4,384,115,237143,29642,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 +350m,2048,8,a100_40gb,36.26,36.26,16,4,512,161,330354,41294,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 +350m,2048,8,a100_40gb,39.45,39.45,16,4,512,175,359403,44925,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 +125m,2048,8,a100_40gb,42.12,42.12,24,3,576,524,1074518,134314,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,42.21,42.21,24,3,576,525,1076846,134605,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,11.95,11.95,12,3,288,148,304881,38110,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,10.74,10.74,12,3,288,133,274018,34252,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 diff --git a/scripts/train/benchmarking/benchmark_results.md b/scripts/train/benchmarking/benchmark_results.md new file mode 100644 index 0000000000..25a22d63af --- /dev/null +++ b/scripts/train/benchmarking/benchmark_results.md @@ -0,0 +1,12 @@ +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 1b | 2048 | 8 | a100_40gb | 56.21 | 56.21 | 8 | 8 | 512 | 75 | 154114 | 19264 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 55.86 | 55.86 | 8 | 8 | 512 | 74 | 153151 | 19143 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 760m | 2048 | 8 | a100_40gb | 51.5 | 51.5 | 12 | 4 | 384 | 114 | 235052 | 29381 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 51.96 | 51.96 | 12 | 4 | 384 | 115 | 237143 | 29642 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 350m | 2048 | 8 | a100_40gb | 36.26 | 36.26 | 16 | 4 | 512 | 161 | 330354 | 41294 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 39.45 | 39.45 | 16 | 4 | 512 | 175 | 359403 | 44925 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 125m | 2048 | 8 | a100_40gb | 42.12 | 42.12 | 24 | 3 | 576 | 524 | 1074518 | 134314 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.21 | 42.21 | 24 | 3 | 576 | 525 | 1076846 | 134605 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 11.95 | 11.95 | 12 | 3 | 288 | 148 | 304881 | 38110 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 10.74 | 10.74 | 12 | 3 | 288 | 133 | 274018 | 34252 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index e7571505ef..abf1323439 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -363,6 +363,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], ] command = f""" cd llm-foundry/scripts + python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' composer train/train.py /mnt/config/parameters.yaml """ path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index b16c624808..d2220b7c44 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -101,19 +101,21 @@ CLUSTER_40GB=r8z3 # A100 40GB # seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ + # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN # # INCREASE GPU COUNT diff --git a/scripts/train/yamls/pretrain/mpt-125m.yaml b/scripts/train/yamls/pretrain/mpt-125m.yaml index 0fff8fcb10..e174cd9f7b 100644 --- a/scripts/train/yamls/pretrain/mpt-125m.yaml +++ b/scripts/train/yamls/pretrain/mpt-125m.yaml @@ -1,5 +1,5 @@ data_local: ./my-copy-c4 -data_remote: oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ # If blank, files must be present in data_local +data_remote: # If blank, files must be present in data_local max_seq_len: 2048 global_seed: 17 @@ -94,7 +94,7 @@ fsdp_config: verbose: false # Logging -progress_bar: true +progress_bar: false log_to_console: true console_log_interval: 1ba From 985460c4a8015310a121c44cf1dc75366bdb3967 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Fri, 18 Aug 2023 10:36:30 -0700 Subject: [PATCH 05/41] update some metrics, scripts --- .../train/benchmarking/benchmark_results.csv | 10 ++ .../train/benchmarking/benchmark_results.md | 10 ++ .../train/benchmarking/submit_benchmarks.py | 33 ++-- scripts/train/benchmarking/sweep.sh | 167 +++++++----------- scripts/train/benchmarking/sweep_fsdp.sh | 95 ++++++++++ scripts/train/benchmarking/torch2.csv | 55 ++++++ scripts/train/benchmarking/torch2.md | 56 ++++++ 7 files changed, 314 insertions(+), 112 deletions(-) create mode 100644 scripts/train/benchmarking/sweep_fsdp.sh create mode 100644 scripts/train/benchmarking/torch2.csv create mode 100644 scripts/train/benchmarking/torch2.md diff --git a/scripts/train/benchmarking/benchmark_results.csv b/scripts/train/benchmarking/benchmark_results.csv index d91e90c420..d7e8396573 100644 --- a/scripts/train/benchmarking/benchmark_results.csv +++ b/scripts/train/benchmarking/benchmark_results.csv @@ -1,11 +1,21 @@ Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams +7b,2048,8,a100_40gb,50.42,67.23,12,4,384,14,29150,3643,786432,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 +3b,2048,8,a100_40gb,57.21,57.21,5,8,320,38,79667,9958,655360,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 1b,2048,8,a100_40gb,56.21,56.21,8,8,512,75,154114,19264,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 1b,2048,8,a100_40gb,55.86,55.86,8,8,512,74,153151,19143,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 +1b,2048,8,a100_40gb,45.91,61.21,8,8,512,61,125871,15733,1048576,amp_bf16,PURE,FULL_SHARD,True,False,1315950592 760m,2048,8,a100_40gb,51.5,51.5,12,4,384,114,235052,29381,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 760m,2048,8,a100_40gb,51.96,51.96,12,4,384,115,237143,29642,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 +760m,2048,8,a100_40gb,42.72,56.96,12,4,384,95,194992,24374,786432,amp_bf16,PURE,FULL_SHARD,True,False,760470528 350m,2048,8,a100_40gb,36.26,36.26,16,4,512,161,330354,41294,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 350m,2048,8,a100_40gb,39.45,39.45,16,4,512,175,359403,44925,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 +350m,2048,8,a100_40gb,39.31,52.42,16,4,512,174,358147,44768,1048576,amp_bf16,PURE,FULL_SHARD,True,False,355985408 +125m,2048,8,a100_40gb,35.6,47.47,26,3,624,443,908206,113525,1277952,amp_bf16,PURE,FULL_SHARD,True,False,125311488 125m,2048,8,a100_40gb,42.12,42.12,24,3,576,524,1074518,134314,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 125m,2048,8,a100_40gb,42.21,42.21,24,3,576,525,1076846,134605,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,40.8,40.8,24,3,576,508,1040826,130103,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,32.74,32.74,24,3,576,407,835286,104410,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,35.46,47.28,24,3,576,441,904742,113092,1179648,amp_bf16,PURE,FULL_SHARD,True,False,125311488 +125m,2048,8,a100_40gb,41.89,41.89,24,3,576,521,1068638,133579,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 125m,2048,8,a100_40gb,11.95,11.95,12,3,288,148,304881,38110,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 125m,2048,8,a100_40gb,10.74,10.74,12,3,288,133,274018,34252,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 diff --git a/scripts/train/benchmarking/benchmark_results.md b/scripts/train/benchmarking/benchmark_results.md index 25a22d63af..e16547bee3 100644 --- a/scripts/train/benchmarking/benchmark_results.md +++ b/scripts/train/benchmarking/benchmark_results.md @@ -1,12 +1,22 @@ | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 7b | 2048 | 8 | a100_40gb | 50.42 | 67.23 | 12 | 4 | 384 | 14 | 29150 | 3643 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 3b | 2048 | 8 | a100_40gb | 57.21 | 57.21 | 5 | 8 | 320 | 38 | 79667 | 9958 | 655360 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | | 1b | 2048 | 8 | a100_40gb | 56.21 | 56.21 | 8 | 8 | 512 | 75 | 154114 | 19264 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | | 1b | 2048 | 8 | a100_40gb | 55.86 | 55.86 | 8 | 8 | 512 | 74 | 153151 | 19143 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 45.91 | 61.21 | 8 | 8 | 512 | 61 | 125871 | 15733 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 1315950592 | | 760m | 2048 | 8 | a100_40gb | 51.5 | 51.5 | 12 | 4 | 384 | 114 | 235052 | 29381 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | | 760m | 2048 | 8 | a100_40gb | 51.96 | 51.96 | 12 | 4 | 384 | 115 | 237143 | 29642 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 42.72 | 56.96 | 12 | 4 | 384 | 95 | 194992 | 24374 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 760470528 | | 350m | 2048 | 8 | a100_40gb | 36.26 | 36.26 | 16 | 4 | 512 | 161 | 330354 | 41294 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | | 350m | 2048 | 8 | a100_40gb | 39.45 | 39.45 | 16 | 4 | 512 | 175 | 359403 | 44925 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 39.31 | 52.42 | 16 | 4 | 512 | 174 | 358147 | 44768 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 355985408 | +| 125m | 2048 | 8 | a100_40gb | 35.6 | 47.47 | 26 | 3 | 624 | 443 | 908206 | 113525 | 1277952 | amp_bf16 | PURE | FULL_SHARD | True | False | 125311488 | | 125m | 2048 | 8 | a100_40gb | 42.12 | 42.12 | 24 | 3 | 576 | 524 | 1074518 | 134314 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | | 125m | 2048 | 8 | a100_40gb | 42.21 | 42.21 | 24 | 3 | 576 | 525 | 1076846 | 134605 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 40.8 | 40.8 | 24 | 3 | 576 | 508 | 1040826 | 130103 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 32.74 | 32.74 | 24 | 3 | 576 | 407 | 835286 | 104410 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 35.46 | 47.28 | 24 | 3 | 576 | 441 | 904742 | 113092 | 1179648 | amp_bf16 | PURE | FULL_SHARD | True | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 41.89 | 41.89 | 24 | 3 | 576 | 521 | 1068638 | 133579 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | | 125m | 2048 | 8 | a100_40gb | 11.95 | 11.95 | 12 | 3 | 288 | 148 | 304881 | 38110 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | | 125m | 2048 | 8 | a100_40gb | 10.74 | 10.74 | 12 | 3 | 288 | 133 | 274018 | 34252 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index abf1323439..cbbcb893fc 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -159,6 +159,8 @@ def parse_args(): parser.add_argument('--priority', type=str, default='lowest') + parser.add_argument('--torch_compile', type=bool, default=False) + parser.add_argument('--RUN', type=str_to_bool, nargs='?', @@ -258,21 +260,21 @@ def mod_parameters(parameters: Dict[str, Any], 'data_remote'] parameters['data_local'] = '/tmp/c4' - parameters['train_loader']['dataset']['local'] = parameters[ - 'data_local'] + parameters['train_loader']['dataset']['local'] = parameters['data_local'] parameters['eval_loader']['dataset']['local'] = parameters['data_local'] else: parameters['train_loader']['dataset'][ 'split'] = 'train_small' # for throughput testing purposes parameters['eval_loader']['dataset'][ 'split'] = 'val_small' # for throughput testing purposes + print("local data") # set max_seq_len parameters['max_seq_len'] = max_seq_len parameters['model']['max_seq_len'] = max_seq_len - parameters['model']['attn_impl'] = args.attn_impl + parameters['model']['attn_config']['attn_impl'] = args.attn_impl - parameters['model']['low_precision_layernorm'] = True + parameters['model']['norm_type'] = "low_precision_layernorm" # Pad vocab size to multiple of N for A100 perf if pad_vocab_multiple: @@ -358,14 +360,22 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], }, { 'integration_type': 'wandb', 'entity': 'mosaic-ml', - 'project': 'intern' + 'project': args.project } ] - command = f""" - cd llm-foundry/scripts - python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' - composer train/train.py /mnt/config/parameters.yaml - """ + + if args.data_remote is None: + command = f""" + cd llm-foundry/scripts + python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' + composer train/train.py /mnt/config/parameters.yaml + """ + else: + command = f""" + cd llm-foundry/scripts + composer train/train.py /mnt/config/parameters.yaml + """ + path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) parameters = get_parameters(path) @@ -406,8 +416,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], integrations=integrations, command=command, parameters=parameters, - scheduling=SchedulingConfig(priority=args.priority)) - + scheduling=SchedulingConfig(priority=args.priority, resumable=True)) if args.RUN: # Create the run from a config run = create_run(config) diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index d2220b7c44..34caf6a3bd 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -1,122 +1,89 @@ #!/bin/bash -PROJECT="intern" +PROJECT="interntorch2" GIT_COMMIT="v0.0.4" -IMAGE="mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04" +IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" CLUSTER_80GB=r1z1 CLUSTER_40GB=r8z3 -# A100 80GB - -# seqlen 2048 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -s 11 11 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -s 11 11 --RUN --fsdp_config_activation_checkpointing false - -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN - -# ## INCREASE GPU COUNT -# #python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 32 64 --microbatch_size 20 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# #python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 64 --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 14 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 32 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 64 --microbatch_size 16 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# #python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN - -# # SCALE SEQUENCE LENGTH -# # seqlen 512 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 96 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# # seqlen 1024 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 18 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 40 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# # seqlen 4096 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 7 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# # seqlen 8192 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# # seqlen 16384 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# # seqlen 32768 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# # seqlen 65536 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN - - # A100 40GB # seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true # python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true + # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN +# Replicate/understand diffs using streaming data loader +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true + +# Test ack_ckpt differences +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml --seq_len 8192 -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml --seq_len 4096 -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 6 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# NOTE: Tried the commented ones last night, OOM'd +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 14 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 12 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 7 7 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false #PASSED + +# Test torch.compile +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --torch_compile true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ # # INCREASE GPU COUNT # python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 128 --microbatch_size 26 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN diff --git a/scripts/train/benchmarking/sweep_fsdp.sh b/scripts/train/benchmarking/sweep_fsdp.sh new file mode 100644 index 0000000000..51fa21db7a --- /dev/null +++ b/scripts/train/benchmarking/sweep_fsdp.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +PROJECT="interntorch2" +GIT_COMMIT="v0.0.4" +IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +CLUSTER_80GB=r1z1 +CLUSTER_40GB=r8z3 + +# A100 80GB + +# seqlen 2048 +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# # python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# # python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true + +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false + +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true + +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ + +# Replicate/understand any diffs using streaming data loader +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true + +# 80GB Test microbatch size w/ no act_ckpt +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# # Test ack_ckpt differences +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 6 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false + +# NOTE: Tried the commented ones last night, OOM'd +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 14 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 12 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 7 7 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false #PASSED \ No newline at end of file diff --git a/scripts/train/benchmarking/torch2.csv b/scripts/train/benchmarking/torch2.csv new file mode 100644 index 0000000000..b17b1d4f49 --- /dev/null +++ b/scripts/train/benchmarking/torch2.csv @@ -0,0 +1,55 @@ +Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams +13b,8192,8,a100_40gb,195.1,260.14,1,16,128,6,49974,6246,1048576,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 +13b,8192,8,a100_80gb,199.11,265.48,1,16,128,6,51000,6375,1048576,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 +13b,4096,8,a100_40gb,100.84,134.46,2,16,256,7,28847,3605,1048576,amp_bf16,PURE,FULL_SHARD,True,False,12864440320 +13b,4096,8,a100_80gb,102.31,136.42,2,16,256,7,29268,3658,1048576,amp_bf16,PURE,FULL_SHARD,True,False,12864440320 +13b,2048,16,a100_40gb,53.5,71.34,10,16,2560,15,32510,2031,5242880,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 +13b,2048,8,a100_40gb,51.31,68.41,4,16,512,7,15587,1948,1048576,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 +13b,2048,8,a100_80gb,55.49,73.98,20,3,480,8,16856,2107,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 +13b,1024,8,a100_40gb,51.54,68.71,8,16,1024,15,16158,2019,1048576,amp_bf16,PURE,FULL_SHARD,True,False,12848711680 +13b,1024,8,a100_40gb,36.97,36.97,1,16,128,11,11591,1448,131072,amp_bf16,PURE,FULL_SHARD,False,False,12848711680 +13b,1024,8,a100_40gb,36.33,36.33,1,4,32,11,11389,1423,32768,amp_bf16,PURE,FULL_SHARD,False,False,12848711680 +13b,512,8,a100_40gb,52.08,69.45,16,16,2048,32,16595,2074,1048576,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 +13b,512,8,a100_40gb,23.1,23.1,1,16,128,14,7358,919,65536,amp_bf16,PURE,FULL_SHARD,False,False,12846090240 +13b,128,8,a100_40gb,6.25,6.25,1,16,128,15,2014,251,16384,amp_bf16,PURE,FULL_SHARD,False,False,12844124160 +7b,2048,8,a100_80gb,53.64,71.52,32,2,512,15,31010,3876,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 +7b,2048,8,a100_40gb,50.42,67.23,12,4,384,14,29150,3643,786432,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 +7b,2048,8,a100_80gb,53.09,70.79,12,4,384,14,30692,3836,786432,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 +7b,2048,8,a100_80gb,57.18,57.18,2,16,256,16,33055,4131,524288,amp_bf16,PURE,FULL_SHARD,False,False,6658859008 +7b,2048,8,a100_80gb,47.69,47.69,1,16,128,13,27569,3446,262144,amp_bf16,PURE,FULL_SHARD,False,False,6658859008 +7b,1024,8,a100_40gb,56.13,56.13,4,16,512,32,33727,4215,524288,amp_bf16,PURE,FULL_SHARD,False,False,6654664704 +7b,1024,8,a100_40gb,47.01,47.01,2,16,256,27,28245,3530,262144,amp_bf16,PURE,FULL_SHARD,False,False,6654664704 +7b,1024,8,a100_40gb,34.74,34.74,1,16,128,20,20875,2609,131072,amp_bf16,PURE,FULL_SHARD,False,False,6654664704 +7b,1024,8,a100_40gb,56.24,56.24,4,4,128,33,33793,4224,131072,amp_bf16,PURE,FULL_SHARD,False,False,6654664704 +7b,1024,8,a100_40gb,46.3,46.3,2,4,64,27,27822,3477,65536,amp_bf16,PURE,FULL_SHARD,False,False,6654664704 +7b,1024,8,a100_40gb,34.29,34.29,1,4,32,20,20602,2575,32768,amp_bf16,PURE,FULL_SHARD,False,False,6654664704 +3b,2048,8,a100_80gb,49.6,66.13,16,8,1024,33,69068,8633,2097152,amp_bf16,PURE,FULL_SHARD,True,False,2651837440 +3b,2048,8,a100_80gb,49.54,66.05,12,8,768,33,68983,8622,1572864,amp_bf16,PURE,FULL_SHARD,True,False,2651837440 +3b,2048,8,a100_80gb,63.3,63.3,12,8,768,43,88144,11018,1572864,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,a100_80gb,61.95,61.95,8,8,512,42,86268,10783,1048576,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,a100_80gb,48.75,65.0,8,8,512,33,67889,8486,1048576,amp_bf16,PURE,FULL_SHARD,True,False,2651837440 +3b,2048,8,a100_80gb,55.15,55.15,3,16,384,37,76790,9598,786432,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,a100_40gb,57.21,57.21,5,8,320,38,79667,9958,655360,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,a100_80gb,46.31,61.75,5,8,320,31,64487,8060,655360,amp_bf16,PURE,FULL_SHARD,True,False,2651837440 +3b,2048,8,a100_80gb,58.84,58.84,5,8,320,40,81938,10242,655360,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,a100_80gb,52.58,52.58,2,16,256,35,73216,9152,524288,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +1b,2048,8,a100_40gb,56.21,56.21,8,8,512,75,154114,19264,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 +1b,2048,8,a100_40gb,55.86,55.86,8,8,512,74,153151,19143,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 +1b,2048,8,a100_40gb,45.91,61.21,8,8,512,61,125871,15733,1048576,amp_bf16,PURE,FULL_SHARD,True,False,1315950592 +1b,2048,8,a100_80gb,60.14,60.14,14,4,448,80,164898,20612,917504,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 +760m,2048,8,a100_40gb,51.5,51.5,12,4,384,114,235052,29381,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 +760m,2048,8,a100_40gb,51.96,51.96,12,4,384,115,237143,29642,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 +760m,2048,8,a100_40gb,42.72,56.96,12,4,384,95,194992,24374,786432,amp_bf16,PURE,FULL_SHARD,True,False,760470528 +350m,2048,8,a100_40gb,36.26,36.26,16,4,512,161,330354,41294,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 +350m,2048,8,a100_40gb,39.45,39.45,16,4,512,175,359403,44925,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 +350m,2048,8,a100_40gb,39.31,52.42,16,4,512,174,358147,44768,1048576,amp_bf16,PURE,FULL_SHARD,True,False,355985408 +125m,2048,8,a100_40gb,35.6,47.47,26,3,624,443,908206,113525,1277952,amp_bf16,PURE,FULL_SHARD,True,False,125311488 +125m,2048,8,a100_40gb,42.12,42.12,24,3,576,524,1074518,134314,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,42.21,42.21,24,3,576,525,1076846,134605,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,40.8,40.8,24,3,576,508,1040826,130103,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,32.74,32.74,24,3,576,407,835286,104410,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,35.46,47.28,24,3,576,441,904742,113092,1179648,amp_bf16,PURE,FULL_SHARD,True,False,125311488 +125m,2048,8,a100_40gb,42.09,42.09,24,3,576,524,1073813,134226,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,41.89,41.89,24,3,576,521,1068638,133579,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,11.95,11.95,12,3,288,148,304881,38110,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +125m,2048,8,a100_40gb,10.74,10.74,12,3,288,133,274018,34252,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 diff --git a/scripts/train/benchmarking/torch2.md b/scripts/train/benchmarking/torch2.md new file mode 100644 index 0000000000..37fcd3141f --- /dev/null +++ b/scripts/train/benchmarking/torch2.md @@ -0,0 +1,56 @@ +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 13b | 8192 | 8 | a100_40gb | 195.1 | 260.14 | 1 | 16 | 128 | 6 | 49974 | 6246 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 8192 | 8 | a100_80gb | 199.11 | 265.48 | 1 | 16 | 128 | 6 | 51000 | 6375 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_40gb | 100.84 | 134.46 | 2 | 16 | 256 | 7 | 28847 | 3605 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 12864440320 | +| 13b | 4096 | 8 | a100_80gb | 102.31 | 136.42 | 2 | 16 | 256 | 7 | 29268 | 3658 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 16 | a100_40gb | 53.5 | 71.34 | 10 | 16 | 2560 | 15 | 32510 | 2031 | 5242880 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | a100_40gb | 51.31 | 68.41 | 4 | 16 | 512 | 7 | 15587 | 1948 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | a100_80gb | 55.49 | 73.98 | 20 | 3 | 480 | 8 | 16856 | 2107 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 1024 | 8 | a100_40gb | 51.54 | 68.71 | 8 | 16 | 1024 | 15 | 16158 | 2019 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 12848711680 | +| 13b | 1024 | 8 | a100_40gb | 36.97 | 36.97 | 1 | 16 | 128 | 11 | 11591 | 1448 | 131072 | amp_bf16 | PURE | FULL_SHARD | False | False | 12848711680 | +| 13b | 1024 | 8 | a100_40gb | 36.33 | 36.33 | 1 | 4 | 32 | 11 | 11389 | 1423 | 32768 | amp_bf16 | PURE | FULL_SHARD | False | False | 12848711680 | +| 13b | 512 | 8 | a100_40gb | 52.08 | 69.45 | 16 | 16 | 2048 | 32 | 16595 | 2074 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 13b | 512 | 8 | a100_40gb | 23.1 | 23.1 | 1 | 16 | 128 | 14 | 7358 | 919 | 65536 | amp_bf16 | PURE | FULL_SHARD | False | False | 12846090240 | +| 13b | 128 | 8 | a100_40gb | 6.25 | 6.25 | 1 | 16 | 128 | 15 | 2014 | 251 | 16384 | amp_bf16 | PURE | FULL_SHARD | False | False | 12844124160 | +| 7b | 2048 | 8 | a100_80gb | 53.64 | 71.52 | 32 | 2 | 512 | 15 | 31010 | 3876 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_40gb | 50.42 | 67.23 | 12 | 4 | 384 | 14 | 29150 | 3643 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_80gb | 53.09 | 70.79 | 12 | 4 | 384 | 14 | 30692 | 3836 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_80gb | 57.18 | 57.18 | 2 | 16 | 256 | 16 | 33055 | 4131 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 6658859008 | +| 7b | 2048 | 8 | a100_80gb | 47.69 | 47.69 | 1 | 16 | 128 | 13 | 27569 | 3446 | 262144 | amp_bf16 | PURE | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | a100_40gb | 56.13 | 56.13 | 4 | 16 | 512 | 32 | 33727 | 4215 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 6654664704 | +| 7b | 1024 | 8 | a100_40gb | 47.01 | 47.01 | 2 | 16 | 256 | 27 | 28245 | 3530 | 262144 | amp_bf16 | PURE | FULL_SHARD | False | False | 6654664704 | +| 7b | 1024 | 8 | a100_40gb | 34.74 | 34.74 | 1 | 16 | 128 | 20 | 20875 | 2609 | 131072 | amp_bf16 | PURE | FULL_SHARD | False | False | 6654664704 | +| 7b | 1024 | 8 | a100_40gb | 56.24 | 56.24 | 4 | 4 | 128 | 33 | 33793 | 4224 | 131072 | amp_bf16 | PURE | FULL_SHARD | False | False | 6654664704 | +| 7b | 1024 | 8 | a100_40gb | 46.3 | 46.3 | 2 | 4 | 64 | 27 | 27822 | 3477 | 65536 | amp_bf16 | PURE | FULL_SHARD | False | False | 6654664704 | +| 7b | 1024 | 8 | a100_40gb | 34.29 | 34.29 | 1 | 4 | 32 | 20 | 20602 | 2575 | 32768 | amp_bf16 | PURE | FULL_SHARD | False | False | 6654664704 | +| 3b | 2048 | 8 | a100_80gb | 49.6 | 66.13 | 16 | 8 | 1024 | 33 | 69068 | 8633 | 2097152 | amp_bf16 | PURE | FULL_SHARD | True | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 49.54 | 66.05 | 12 | 8 | 768 | 33 | 68983 | 8622 | 1572864 | amp_bf16 | PURE | FULL_SHARD | True | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 63.3 | 63.3 | 12 | 8 | 768 | 43 | 88144 | 11018 | 1572864 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 61.95 | 61.95 | 8 | 8 | 512 | 42 | 86268 | 10783 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 48.75 | 65.0 | 8 | 8 | 512 | 33 | 67889 | 8486 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 55.15 | 55.15 | 3 | 16 | 384 | 37 | 76790 | 9598 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_40gb | 57.21 | 57.21 | 5 | 8 | 320 | 38 | 79667 | 9958 | 655360 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 46.31 | 61.75 | 5 | 8 | 320 | 31 | 64487 | 8060 | 655360 | amp_bf16 | PURE | FULL_SHARD | True | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 58.84 | 58.84 | 5 | 8 | 320 | 40 | 81938 | 10242 | 655360 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 52.58 | 52.58 | 2 | 16 | 256 | 35 | 73216 | 9152 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 1b | 2048 | 8 | a100_40gb | 56.21 | 56.21 | 8 | 8 | 512 | 75 | 154114 | 19264 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 55.86 | 55.86 | 8 | 8 | 512 | 74 | 153151 | 19143 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 45.91 | 61.21 | 8 | 8 | 512 | 61 | 125871 | 15733 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 1315950592 | +| 1b | 2048 | 8 | a100_80gb | 60.14 | 60.14 | 14 | 4 | 448 | 80 | 164898 | 20612 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 760m | 2048 | 8 | a100_40gb | 51.5 | 51.5 | 12 | 4 | 384 | 114 | 235052 | 29381 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 51.96 | 51.96 | 12 | 4 | 384 | 115 | 237143 | 29642 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 42.72 | 56.96 | 12 | 4 | 384 | 95 | 194992 | 24374 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 760470528 | +| 350m | 2048 | 8 | a100_40gb | 36.26 | 36.26 | 16 | 4 | 512 | 161 | 330354 | 41294 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 39.45 | 39.45 | 16 | 4 | 512 | 175 | 359403 | 44925 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 39.31 | 52.42 | 16 | 4 | 512 | 174 | 358147 | 44768 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 355985408 | +| 125m | 2048 | 8 | a100_40gb | 35.6 | 47.47 | 26 | 3 | 624 | 443 | 908206 | 113525 | 1277952 | amp_bf16 | PURE | FULL_SHARD | True | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.12 | 42.12 | 24 | 3 | 576 | 524 | 1074518 | 134314 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.21 | 42.21 | 24 | 3 | 576 | 525 | 1076846 | 134605 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 40.8 | 40.8 | 24 | 3 | 576 | 508 | 1040826 | 130103 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 32.74 | 32.74 | 24 | 3 | 576 | 407 | 835286 | 104410 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 35.46 | 47.28 | 24 | 3 | 576 | 441 | 904742 | 113092 | 1179648 | amp_bf16 | PURE | FULL_SHARD | True | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.09 | 42.09 | 24 | 3 | 576 | 524 | 1073813 | 134226 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 41.89 | 41.89 | 24 | 3 | 576 | 521 | 1068638 | 133579 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 11.95 | 11.95 | 12 | 3 | 288 | 148 | 304881 | 38110 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 10.74 | 10.74 | 12 | 3 | 288 | 133 | 274018 | 34252 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | From 8e3894a8cc21c2e58ee984b3d7c9eef5c1f750d5 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Mon, 21 Aug 2023 19:12:44 -0700 Subject: [PATCH 06/41] fixed some bugs, currently using this script --- scripts/train/benchmarking/collect_results.py | 13 ++-- .../train/benchmarking/submit_benchmarks.py | 65 ++++++++++++++----- 2 files changed, 56 insertions(+), 22 deletions(-) diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index 381cd292c6..62085303fe 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -8,9 +8,6 @@ from mcli import sdk as msdk -GPU_AVAILABLE_FLOPS = 312_000_000_000_000 - - def str_to_bool(value: Union[bool, str]): # helper fn if isinstance(value, bool): @@ -46,7 +43,7 @@ def parse_args(): def get_runs(args: argparse.Namespace): - runs = [r for r in msdk.get_runs(include_details=True) if "intern" in r.name and r.status == msdk.RunStatus("COMPLETED")] + runs = [r for r in msdk.get_runs(include_details=True) if args.project in r.name and r.status == msdk.RunStatus("COMPLETED")] for filter in args.filters: runs = [r for r in runs if filter in r.name] def sort_key(r: msdk.Run): @@ -60,9 +57,9 @@ def sort_key(r: msdk.Run): print(model_name) raise ValueError model_size = int(model_name[:-1]) - return (model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], + return (r.image, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], num_gpu, r.submitted_config.parameters['global_train_batch_size']) - + print(runs[0].submitted_config) runs.sort(reverse=True, key=sort_key) return runs @@ -97,6 +94,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: model_name = run.name.split('-')[2] gpus = run.gpus gpu_type = run.gpu_type + GPU_AVAILABLE_FLOPS = 312_000_000_000_000 if (gpu_type != "h100_80gb") else (1_979_000_000_000_000/2 if run.submitted_config.parameters['precision'] == 'bf16' else 1_979_000_000_000_000)# NOTE: This is accurate for BF16 or FP8 only fsdp_config = run.submitted_config.parameters['fsdp_config'] seq_len = run.submitted_config.parameters['max_seq_len'] @@ -149,6 +147,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: else: hfu_w_attn = mfu_w_attn + image = run.image return { 'Model': model_name, @@ -188,6 +187,8 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: str(fsdp_config['activation_cpu_offload']), 'NumParams': n_params, + 'Image': + image, } diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index cbbcb893fc..d92800922e 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -9,7 +9,7 @@ import yaml from mcli.models.run_config import SchedulingConfig from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs - +from torch.distributed.fsdp import BackwardPrefetch, ShardingStrategy def _get_cluster_info(): clusters = get_clusters() cluster_info = {} @@ -61,7 +61,7 @@ def parse_args(): type=str, default=['bf16'], nargs='+', - choices=['bf16', 'fp16']) + choices=['bf16', 'fp16', 'fp8']) parser.add_argument('--fsdp_config_mixed_precision', type=str, default='PURE') @@ -70,6 +70,27 @@ def parse_args(): nargs='?', const=True, default=None) + parser.add_argument('--fsdp_config_shard_strategy', + type=str, + nargs='?', + const=True, + default='FULL_SHARD') + parser.add_argument('--fsdp_config_limit_all_gathers', + type=str_to_bool, + nargs='?', + const=True, + default=True) + parser.add_argument('--fsdp_config_forward_prefetch', + type=str_to_bool, + nargs='?', + const=True, + default=True) + parser.add_argument('--fsdp_config_backward_prefetch', + type=str, + nargs='?', + const=True, + default=True) + parser.add_argument( '-s', '--seq_len_exp', @@ -120,7 +141,7 @@ def parse_args(): parser.add_argument('-c', '--clusters', type=str, - default=['r7z2'], + default=['r1z1'], nargs='+', choices=CLUSTER_INFO.keys()) known_args = parser.parse_known_args()[0] @@ -135,7 +156,7 @@ def parse_args(): parser.add_argument('-g', '--gpu_nums', type=int, - default=[16], + default=[8], nargs='+', choices=_gpu_nums) @@ -159,14 +180,11 @@ def parse_args(): parser.add_argument('--priority', type=str, default='lowest') - parser.add_argument('--torch_compile', type=bool, default=False) - parser.add_argument('--RUN', type=str_to_bool, nargs='?', const=True, default=False) - return parser.parse_args() @@ -243,6 +261,10 @@ def mod_parameters(parameters: Dict[str, Any], precision: str, fsdp_config_mixed_precision: str = 'DEFAULT', fsdp_config_activation_checkpointing: Optional[bool] = None, + fsdp_config_shard_strategy: str = "FULL_SHARD", + fsdp_config_forward_prefetch: bool = False, + fsdp_config_backward_prefetch: str = "BACKWARD_PRE", + fsdp_config_limit_all_gathers: bool = False, run_name: str = '', data_remote: Optional[str] = None, max_duration: str = '30ba', @@ -267,7 +289,6 @@ def mod_parameters(parameters: Dict[str, Any], 'split'] = 'train_small' # for throughput testing purposes parameters['eval_loader']['dataset'][ 'split'] = 'val_small' # for throughput testing purposes - print("local data") # set max_seq_len parameters['max_seq_len'] = max_seq_len parameters['model']['max_seq_len'] = max_seq_len @@ -306,10 +327,11 @@ def mod_parameters(parameters: Dict[str, Any], if fsdp_config_activation_checkpointing is not None: parameters['fsdp_config'][ 'activation_checkpointing'] = fsdp_config_activation_checkpointing - - parameters['fsdp_config']['activation_checkpointing_reentrant'] = False - parameters['fsdp_config']['limit_all_gathers'] = True - + parameters['fsdp_config']['sharding_strategy'] = fsdp_config_shard_strategy + parameters['fsdp_config']['limit_all_gathers'] = fsdp_config_limit_all_gathers + parameters['fsdp_config']['forward_prefetch'] = fsdp_config_forward_prefetch + parameters['fsdp_config']['backward_prefetch'] = fsdp_config_forward_prefetch + parameters['fsdp_config']['verbose'] = True if wandb: # add wandb parameters['loggers'] = {'wandb': {}} @@ -356,6 +378,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], { 'integration_type': 'git_repo', 'git_repo': 'mosaicml/llm-foundry', + 'git_branch': 'main', 'pip_install': '-e .[gpu]', }, { 'integration_type': 'wandb', @@ -370,12 +393,20 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' composer train/train.py /mnt/config/parameters.yaml """ + + if gpu_type == 'h100_80gb' and precision == 'fp8': + command = f""" + pip install flash-attn==1.0.7 --no-build-isolation + pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10 + cd llm-foundry/scripts + python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' + composer train/train.py /mnt/config/parameters.yaml + """ else: command = f""" cd llm-foundry/scripts composer train/train.py /mnt/config/parameters.yaml """ - path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) parameters = get_parameters(path) @@ -399,9 +430,12 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], parameters, max_seq_len, global_train_batch_size, - parameters["precision"], - fsdp_config_mixed_precision=args.fsdp_config_mixed_precision, + "amp_" + precision, fsdp_config_activation_checkpointing=args.fsdp_config_activation_checkpointing, + fsdp_config_limit_all_gathers=args.fsdp_config_limit_all_gathers, + fsdp_config_shard_strategy=args.fsdp_config_shard_strategy, + fsdp_config_forward_prefetch=args.fsdp_config_forward_prefetch, + fsdp_config_backward_prefetch=args.fsdp_config_backward_prefetch, run_name=name, data_remote=args.data_remote, microbatch_size=microbatch_size, @@ -459,7 +493,6 @@ def run_check_dtms(num_gpus: int, dtms: int, batch_size: int): if __name__ == '__main__': args = parse_args() - n_jobs = 0 for max_seq_len in get_max_seq_lens(args.seq_len_exp): for cluster in args.clusters: From 2bd2c639135a1d1c1bbde30e50a9449e15f43f5d Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Mon, 21 Aug 2023 19:18:00 -0700 Subject: [PATCH 07/41] delete old prints \& ex.py --- scripts/train/benchmarking/collect_results.py | 3 +- scripts/train/benchmarking/ex.py | 41 ------------------- 2 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 scripts/train/benchmarking/ex.py diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index 62085303fe..45dd3c8300 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -26,7 +26,7 @@ def parse_args(): All FLOP calculations do not include norm, act, residual, etc. """) - parser.add_argument('--project', type=str, default='intern') + parser.add_argument('--project', type=str, default='tput') parser.add_argument('--filters', type=str, default=[], nargs='+') parser.add_argument('-s', '--save-path', @@ -59,7 +59,6 @@ def sort_key(r: msdk.Run): model_size = int(model_name[:-1]) return (r.image, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], num_gpu, r.submitted_config.parameters['global_train_batch_size']) - print(runs[0].submitted_config) runs.sort(reverse=True, key=sort_key) return runs diff --git a/scripts/train/benchmarking/ex.py b/scripts/train/benchmarking/ex.py deleted file mode 100644 index be83fb90dd..0000000000 --- a/scripts/train/benchmarking/ex.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2022 MosaicML LLM Foundry authors -# SPDX-License-Identifier: Apache-2.0 -import argparse -import math -import os -from typing import Any, Dict, List, Optional, Tuple, Union - -import requests -import yaml -from mcli.models.run_config import SchedulingConfig -from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs - -config = RunConfig( - name='hello-composer', - gpu_num=1, - cluster="r1z2", - image='mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04', - integrations=[ - { - 'integration_type': 'git_repo', - 'git_repo': 'mosaicml/llm-foundry', - # 'git_branch': 'main', - 'pip_install': '-e .[gpu]', - # 'ssh_clone': 'false' - } - # , { - # 'integration_type': 'wandb', - # 'entity': 'mosaic-ml', - # 'project': 'chris-scripting' - # } - ], - command=""" - cd llm-foundry/scripts - composer train/train.py train/yamls/pretrain/mpt-1b.yaml - """, - scheduling={'priority': 'lowest','resumable': True} - # data_remote='oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/', - # max_duration=100 -) - -run = create_run(config) \ No newline at end of file From 3f1da72e1c26de67b21cbdb63679f8f01a10a7d4 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Mon, 21 Aug 2023 21:07:28 -0700 Subject: [PATCH 08/41] add compile settings --- .../train/benchmarking/compile_settings.sh | 25 ++++++++++++ .../train/benchmarking/submit_benchmarks.py | 40 ++++++++++++------- scripts/train/train.py | 5 +++ 3 files changed, 56 insertions(+), 14 deletions(-) create mode 100755 scripts/train/benchmarking/compile_settings.sh diff --git a/scripts/train/benchmarking/compile_settings.sh b/scripts/train/benchmarking/compile_settings.sh new file mode 100755 index 0000000000..d3ddc4b905 --- /dev/null +++ b/scripts/train/benchmarking/compile_settings.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +PROJECT="torch_compile_opts" +TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +CLUSTER_80GB=r1z1 +GIT_COMMIT=v0.2.0 + +for FULLGRAPH in true +do + for DYNAMIC in true false + do + for MODE in default reduce-overhead max-autotune + do + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 32 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN \ + --torch_compile_fullgraph $FULLGRAPH --torch_compile_dynamic $DYNAMIC --torch_compile_mode $MODE + + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN \ + --torch_compile_fullgraph $FULLGRAPH --torch_compile_dynamic $DYNAMIC --torch_compile_mode $MODE + + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN \ + --torch_compile_fullgraph $FULLGRAPH --torch_compile_dynamic $DYNAMIC --torch_compile_mode $MODE --fsdp_config_activation_checkpointing true + + done + done +done \ No newline at end of file diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index d92800922e..ee117cca81 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -9,7 +9,7 @@ import yaml from mcli.models.run_config import SchedulingConfig from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs -from torch.distributed.fsdp import BackwardPrefetch, ShardingStrategy + def _get_cluster_info(): clusters = get_clusters() cluster_info = {} @@ -89,8 +89,12 @@ def parse_args(): type=str, nargs='?', const=True, + default="BACKWARD_PRE") + parser.add_argument('--activation_cpu_offload', + type=str_to_bool, + nargs='?', + const=True, default=True) - parser.add_argument( '-s', '--seq_len_exp', @@ -180,6 +184,10 @@ def parse_args(): parser.add_argument('--priority', type=str, default='lowest') + parser.add_argument('--torch_compile_fullgraph', type=str_to_bool, default=False) + parser.add_argument('--torch_compile_dynamic', type=str_to_bool, default=False) + parser.add_argument('--torch_compile_mode', type=str, default=None) + parser.add_argument('--RUN', type=str_to_bool, nargs='?', @@ -265,13 +273,18 @@ def mod_parameters(parameters: Dict[str, Any], fsdp_config_forward_prefetch: bool = False, fsdp_config_backward_prefetch: str = "BACKWARD_PRE", fsdp_config_limit_all_gathers: bool = False, + activation_cpu_offload: bool = False, run_name: str = '', data_remote: Optional[str] = None, max_duration: str = '30ba', eval_interval: int = 0, microbatch_size: Optional[Union[int, str]] = None, wandb: bool = True, - pad_vocab_multiple: Optional[int] = None): + pad_vocab_multiple: Optional[int] = None, + torch_compile_fullgraph:bool = False, + torch_compile_dynamic: bool = False, + torch_compile_mode: str = None + ): if run_name: parameters['run_name'] = run_name if data_remote is not None: @@ -330,8 +343,11 @@ def mod_parameters(parameters: Dict[str, Any], parameters['fsdp_config']['sharding_strategy'] = fsdp_config_shard_strategy parameters['fsdp_config']['limit_all_gathers'] = fsdp_config_limit_all_gathers parameters['fsdp_config']['forward_prefetch'] = fsdp_config_forward_prefetch - parameters['fsdp_config']['backward_prefetch'] = fsdp_config_forward_prefetch + parameters['fsdp_config']['backward_prefetch'] = fsdp_config_backward_prefetch + parameters['fsdp_config']['activation_cpu_offload'] = activation_cpu_offload parameters['fsdp_config']['verbose'] = True + + parameters['compile_config'] = {'fullgraph':torch_compile_fullgraph, 'dynamic':torch_compile_dynamic, 'mode':torch_compile_mode} if wandb: # add wandb parameters['loggers'] = {'wandb': {}} @@ -387,17 +403,13 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], } ] - if args.data_remote is None: - command = f""" - cd llm-foundry/scripts - python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' - composer train/train.py /mnt/config/parameters.yaml - """ - + command = "" if gpu_type == 'h100_80gb' and precision == 'fp8': - command = f""" - pip install flash-attn==1.0.7 --no-build-isolation - pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10 + command += """pip install flash-attn==1.0.7 --no-build-isolation + pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10""" + + if args.data_remote is None: + command += f""" cd llm-foundry/scripts python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' composer train/train.py /mnt/config/parameters.yaml diff --git a/scripts/train/train.py b/scripts/train/train.py index b31c15467e..6fb61d4b1e 100644 --- a/scripts/train/train.py +++ b/scripts/train/train.py @@ -387,6 +387,10 @@ def main(cfg: DictConfig) -> Trainer: 'load_ignore_keys', must_exist=False, default_value=None) + compile_config: Optional[Dict[str, Any]] = pop_config(cfg, + 'compile_config', + must_exist=False, + default_value=None) # Enable autoresume from model checkpoints if possible autoresume_default: bool = False if logged_cfg.get('run_name', None) is not None \ @@ -568,6 +572,7 @@ def main(cfg: DictConfig) -> Trainer: autoresume=autoresume, python_log_level=python_log_level, dist_timeout=dist_timeout, + compile_config=compile_config, ) print('Logging config') From 431051c86d44d90f883447868ef16a8dd7958d1f Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 22 Aug 2023 12:10:45 -0700 Subject: [PATCH 09/41] added some scripts --- .../train/benchmarking/act_ckpt_optimize.sh | 19 +++++ scripts/train/benchmarking/collect_results.py | 12 ++- .../train/benchmarking/compile_settings.sh | 6 +- scripts/train/benchmarking/h100_benchmarks.sh | 40 ++++++++++ scripts/train/benchmarking/optimize_fsdp.sh | 32 ++++++++ .../train/benchmarking/submit_benchmarks.py | 78 ++++++++++++------- 6 files changed, 155 insertions(+), 32 deletions(-) create mode 100755 scripts/train/benchmarking/act_ckpt_optimize.sh create mode 100755 scripts/train/benchmarking/h100_benchmarks.sh create mode 100755 scripts/train/benchmarking/optimize_fsdp.sh diff --git a/scripts/train/benchmarking/act_ckpt_optimize.sh b/scripts/train/benchmarking/act_ckpt_optimize.sh new file mode 100755 index 0000000000..b05f22f728 --- /dev/null +++ b/scripts/train/benchmarking/act_ckpt_optimize.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +PROJECT="ackckpt" +TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +CLUSTER_80GB=r1z1 +GIT_COMMIT=v0.2.0 + +for MB_SIZE in 1 2 4 8 +do + for GATH_LMT in true false + do + for CPU_OFFLOAD in true false + do + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false + done + done +done \ No newline at end of file diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index 45dd3c8300..c9a089e6e4 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -43,7 +43,7 @@ def parse_args(): def get_runs(args: argparse.Namespace): - runs = [r for r in msdk.get_runs(include_details=True) if args.project in r.name and r.status == msdk.RunStatus("COMPLETED")] + runs = [r for r in msdk.get_runs(include_details=True) if args.project in r.name.split('-')[0] and r.status == msdk.RunStatus("COMPLETED")] for filter in args.filters: runs = [r for r in runs if filter in r.name] def sort_key(r: msdk.Run): @@ -146,7 +146,11 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: else: hfu_w_attn = mfu_w_attn + # New things that we're testing for image = run.image + # compile_fullg = run.submitted_config.parameters['compile_config']['fullgraph'] + # compile_dynamic = run.submitted_config.parameters['compile_config']['dynamic'] + # compile_mode = run.submitted_config.parameters['compile_config']['mode'] return { 'Model': model_name, @@ -188,6 +192,12 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: n_params, 'Image': image, + # 'Compile Mode': + # compile_mode, + # 'Compile Fullgraph': + # compile_fullg, + # 'Compile Dynamic': + # compile_dynamic, } diff --git a/scripts/train/benchmarking/compile_settings.sh b/scripts/train/benchmarking/compile_settings.sh index d3ddc4b905..7b0d3b6982 100755 --- a/scripts/train/benchmarking/compile_settings.sh +++ b/scripts/train/benchmarking/compile_settings.sh @@ -1,17 +1,17 @@ #!/bin/bash -PROJECT="torch_compile_opts" +PROJECT="torchcompile" TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" CLUSTER_80GB=r1z1 GIT_COMMIT=v0.2.0 -for FULLGRAPH in true +for FULLGRAPH in false do for DYNAMIC in true false do for MODE in default reduce-overhead max-autotune do - python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 32 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN \ + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 60 --accum 32 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN \ --torch_compile_fullgraph $FULLGRAPH --torch_compile_dynamic $DYNAMIC --torch_compile_mode $MODE python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN \ diff --git a/scripts/train/benchmarking/h100_benchmarks.sh b/scripts/train/benchmarking/h100_benchmarks.sh new file mode 100755 index 0000000000..1b035edaa3 --- /dev/null +++ b/scripts/train/benchmarking/h100_benchmarks.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +PROJECT="h100setup" +TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +CLUSTER_80GB=r9z1 +GIT_COMMIT=v0.2.0 +GIT_BRANCH=main +# 30b test Torch Runs +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 12 13 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +# #13b test Torch runs -- seperate Torch1.13 and torch2 +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +# #7b test torch runs +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +# # #3b test torch runs +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false + +# #1b test torch runs +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false + +# #abbreviate it, 350m +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false diff --git a/scripts/train/benchmarking/optimize_fsdp.sh b/scripts/train/benchmarking/optimize_fsdp.sh new file mode 100755 index 0000000000..cfca74a672 --- /dev/null +++ b/scripts/train/benchmarking/optimize_fsdp.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +PROJECT="shard_grad_op" +TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +CLUSTER_80GB=r1z1 +GIT_COMMIT=v0.2.0 + +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true --fsdp_config_shard_strategy "SHARD_GRAD_OP" --fsdp_config_limit_all_gathers true --fsdp_config_forward_prefetch false --fsdp_config_backward_prefetch BACKWARD_PRE +for SHARD_STRAT in "FULL_SHARD" "SHARD_GRAD_OP" "NO_SHARD" +do + for FWD_PREFTCH in true false + do + for GATH_LMT in true false + do + for BACK_PREFTCH in BACKWARD_PRE BACKWARD_POST + do + for CPU_OFFLOAD in true false + do + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 16 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true --fsdp_config_shard_strategy $SHARD_STRAT --fsdp_config_limit_all_gathers $GATH_LMT --fsdp_config_forward_prefetch $FWD_PREFTCH --fsdp_config_backward_prefetch $BACK_PREFTCH --activation_cpu_offload $CPU_OFFLOAD + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 16 --microbatch_size 32 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true --fsdp_config_shard_strategy $SHARD_STRAT --fsdp_config_limit_all_gathers $GATH_LMT --fsdp_config_forward_prefetch $FWD_PREFTCH --fsdp_config_backward_prefetch $BACK_PREFTCH --activation_cpu_offload $CPU_OFFLOAD + #3b test torch runs + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 16 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true --fsdp_config_shard_strategy $SHARD_STRAT --fsdp_config_limit_all_gathers $GATH_LMT --fsdp_config_forward_prefetch $FWD_PREFTCH --fsdp_config_backward_prefetch $BACK_PREFTCH --activation_cpu_offload $CPU_OFFLOAD + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 16 --microbatch_size 32 --accum 12 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --fsdp_config_shard_strategy $SHARD_STRAT --fsdp_config_limit_all_gathers $GATH_LMT --fsdp_config_forward_prefetch $FWD_PREFTCH --fsdp_config_backward_prefetch $BACK_PREFTCH --activation_cpu_offload $CPU_OFFLOAD + + #Try smaller models + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 16 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true --fsdp_config_shard_strategy $SHARD_STRAT --fsdp_config_limit_all_gathers $GATH_LMT --fsdp_config_forward_prefetch $FWD_PREFTCH --fsdp_config_backward_prefetch $BACK_PREFTCH --activation_cpu_offload $CPU_OFFLOAD + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 16 --microbatch_size 32 --accum 12 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --fsdp_config_shard_strategy $SHARD_STRAT --fsdp_config_limit_all_gathers $GATH_LMT --fsdp_config_forward_prefetch $FWD_PREFTCH --fsdp_config_backward_prefetch $BACK_PREFTCH --activation_cpu_offload $CPU_OFFLOAD + done + done + done + done +done \ No newline at end of file diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index ee117cca81..ed0b588da6 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -74,27 +74,27 @@ def parse_args(): type=str, nargs='?', const=True, - default='FULL_SHARD') + default=None) parser.add_argument('--fsdp_config_limit_all_gathers', type=str_to_bool, nargs='?', const=True, - default=True) + default=None) parser.add_argument('--fsdp_config_forward_prefetch', type=str_to_bool, nargs='?', const=True, - default=True) + default=None) parser.add_argument('--fsdp_config_backward_prefetch', type=str, nargs='?', const=True, - default="BACKWARD_PRE") + default=None) parser.add_argument('--activation_cpu_offload', type=str_to_bool, nargs='?', const=True, - default=True) + default=None) parser.add_argument( '-s', '--seq_len_exp', @@ -184,8 +184,8 @@ def parse_args(): parser.add_argument('--priority', type=str, default='lowest') - parser.add_argument('--torch_compile_fullgraph', type=str_to_bool, default=False) - parser.add_argument('--torch_compile_dynamic', type=str_to_bool, default=False) + parser.add_argument('--torch_compile_fullgraph', type=str_to_bool, default=None) + parser.add_argument('--torch_compile_dynamic', type=str_to_bool, default=None) parser.add_argument('--torch_compile_mode', type=str, default=None) parser.add_argument('--RUN', @@ -269,11 +269,11 @@ def mod_parameters(parameters: Dict[str, Any], precision: str, fsdp_config_mixed_precision: str = 'DEFAULT', fsdp_config_activation_checkpointing: Optional[bool] = None, - fsdp_config_shard_strategy: str = "FULL_SHARD", - fsdp_config_forward_prefetch: bool = False, - fsdp_config_backward_prefetch: str = "BACKWARD_PRE", - fsdp_config_limit_all_gathers: bool = False, - activation_cpu_offload: bool = False, + fsdp_config_shard_strategy: Optional[str] = None, + fsdp_config_forward_prefetch: Optional[bool] = None, + fsdp_config_backward_prefetch: Optional[str] = None, + fsdp_config_limit_all_gathers: Optional[bool] = None, + activation_cpu_offload: Optional[bool] = None, run_name: str = '', data_remote: Optional[str] = None, max_duration: str = '30ba', @@ -281,9 +281,9 @@ def mod_parameters(parameters: Dict[str, Any], microbatch_size: Optional[Union[int, str]] = None, wandb: bool = True, pad_vocab_multiple: Optional[int] = None, - torch_compile_fullgraph:bool = False, - torch_compile_dynamic: bool = False, - torch_compile_mode: str = None + torch_compile_fullgraph: Optional[bool] = None, + torch_compile_dynamic: Optional[bool] = None, + torch_compile_mode: Optional[str] = None ): if run_name: parameters['run_name'] = run_name @@ -338,16 +338,28 @@ def mod_parameters(parameters: Dict[str, Any], parameters['precision'] = precision parameters['fsdp_config']['mixed_precision'] = fsdp_config_mixed_precision if fsdp_config_activation_checkpointing is not None: - parameters['fsdp_config'][ - 'activation_checkpointing'] = fsdp_config_activation_checkpointing - parameters['fsdp_config']['sharding_strategy'] = fsdp_config_shard_strategy - parameters['fsdp_config']['limit_all_gathers'] = fsdp_config_limit_all_gathers - parameters['fsdp_config']['forward_prefetch'] = fsdp_config_forward_prefetch - parameters['fsdp_config']['backward_prefetch'] = fsdp_config_backward_prefetch - parameters['fsdp_config']['activation_cpu_offload'] = activation_cpu_offload + parameters['fsdp_config']['activation_checkpointing'] = fsdp_config_activation_checkpointing + if fsdp_config_shard_strategy is not None: + parameters['fsdp_config']['sharding_strategy'] = fsdp_config_shard_strategy + if fsdp_config_limit_all_gathers is not None: + parameters['fsdp_config']['limit_all_gathers'] = fsdp_config_limit_all_gathers + if fsdp_config_forward_prefetch is not None: + parameters['fsdp_config']['forward_prefetch'] = fsdp_config_forward_prefetch + if fsdp_config_backward_prefetch is not None: + parameters['fsdp_config']['backward_prefetch'] = fsdp_config_backward_prefetch + if activation_cpu_offload is not None: + parameters['fsdp_config']['activation_cpu_offload'] = activation_cpu_offload parameters['fsdp_config']['verbose'] = True - parameters['compile_config'] = {'fullgraph':torch_compile_fullgraph, 'dynamic':torch_compile_dynamic, 'mode':torch_compile_mode} + + parameters['compile_config'] = {} + if torch_compile_fullgraph is not None: + parameters['compile_config']['fullgraph'] = torch_compile_fullgraph + if torch_compile_dynamic is not None: + parameters['compile_config']['dynamic'] = torch_compile_dynamic + if torch_compile_mode is not None: + parameters['compile_config']['mode'] = torch_compile_mode + if wandb: # add wandb parameters['loggers'] = {'wandb': {}} @@ -371,7 +383,7 @@ def get_integrations(project: str, } git_integration.update({ 'integration_type': 'git_repo', - 'git_repo': 'mosaicml/llm-foundry', + 'git_repo': 'crinard/llm-foundry', 'pip_install': '-e .[gpu]' }) @@ -393,7 +405,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], integrations = [ { 'integration_type': 'git_repo', - 'git_repo': 'mosaicml/llm-foundry', + 'git_repo': 'crinard/llm-foundry', 'git_branch': 'main', 'pip_install': '-e .[gpu]', }, { @@ -405,8 +417,11 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], command = "" if gpu_type == 'h100_80gb' and precision == 'fp8': - command += """pip install flash-attn==1.0.7 --no-build-isolation - pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10""" + command += """ + pip uninstall install pydantic + pip install pydantic==1.9.0 + pip install flash-attn==1.0.7 --no-build-isolation + pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10""" if args.data_remote is None: command += f""" @@ -448,11 +463,18 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], fsdp_config_shard_strategy=args.fsdp_config_shard_strategy, fsdp_config_forward_prefetch=args.fsdp_config_forward_prefetch, fsdp_config_backward_prefetch=args.fsdp_config_backward_prefetch, + activation_cpu_offload=args.activation_cpu_offload, run_name=name, data_remote=args.data_remote, microbatch_size=microbatch_size, wandb=args.wandb, - pad_vocab_multiple=args.pad_vocab_multiple) + pad_vocab_multiple=args.pad_vocab_multiple, + torch_compile_fullgraph = args.torch_compile_fullgraph, + torch_compile_dynamic = args.torch_compile_dynamic, + torch_compile_mode = args.torch_compile_mode + ) + if gpu_type == 'h100_80gb' and precision == 'fp8': + parameters['model']['fc_type'] = 'te' # Create run config mcli sdk/api config = RunConfig(name=name, gpu_type=gpu_type, From beb8dee6922c5e31d27a24a713a1315b4013185d Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 22 Aug 2023 15:25:11 -0700 Subject: [PATCH 10/41] printing compile config deleted --- .../Torchcompiledebugging.numbers | Bin 0 -> 156370 bytes .../train/benchmarking/ack_ckpt_limits.csv | 8 ++ scripts/train/benchmarking/ack_ckpt_limits.md | 10 ++ scripts/train/benchmarking/attn.sh | 20 +++ .../benchmarking/compile() debug.numbers | Bin 0 -> 139975 bytes scripts/train/benchmarking/compils.csv | 4 + scripts/train/benchmarking/compils.md | 5 + scripts/train/benchmarking/h100.csv | 78 ++++++++++ scripts/train/benchmarking/h100.md | 79 +++++++++++ scripts/train/benchmarking/h100.numbers | Bin 0 -> 284466 bytes scripts/train/benchmarking/h100_vsOAI.csv | 9 ++ scripts/train/benchmarking/h100_vsOAI.numbers | Bin 0 -> 129512 bytes scripts/train/benchmarking/h100new.csv | 132 +++++++++++++++++ scripts/train/benchmarking/h100new.md | 133 ++++++++++++++++++ scripts/train/benchmarking/h100old.csv | 78 ++++++++++ scripts/train/benchmarking/h100old.md | 79 +++++++++++ scripts/train/benchmarking/larger_mb.csv | 10 ++ scripts/train/benchmarking/larger_mb.md | 11 ++ scripts/train/benchmarking/larger_mb.numbers | Bin 0 -> 144751 bytes scripts/train/benchmarking/larger_mb_1.csv | 10 ++ scripts/train/benchmarking/larger_mb_1.md | 11 ++ scripts/train/benchmarking/opt30b.sh | 12 ++ scripts/train/benchmarking/torches.csv | 25 ++++ scripts/train/benchmarking/torches.md | 26 ++++ scripts/train/yamls/pretrain/mpt-125m.yaml | 12 +- 25 files changed, 744 insertions(+), 8 deletions(-) create mode 100755 scripts/train/benchmarking/Torchcompiledebugging.numbers create mode 100644 scripts/train/benchmarking/ack_ckpt_limits.csv create mode 100644 scripts/train/benchmarking/ack_ckpt_limits.md create mode 100755 scripts/train/benchmarking/attn.sh create mode 100755 scripts/train/benchmarking/compile() debug.numbers create mode 100644 scripts/train/benchmarking/compils.csv create mode 100644 scripts/train/benchmarking/compils.md create mode 100644 scripts/train/benchmarking/h100.csv create mode 100644 scripts/train/benchmarking/h100.md create mode 100755 scripts/train/benchmarking/h100.numbers create mode 100644 scripts/train/benchmarking/h100_vsOAI.csv create mode 100755 scripts/train/benchmarking/h100_vsOAI.numbers create mode 100644 scripts/train/benchmarking/h100new.csv create mode 100644 scripts/train/benchmarking/h100new.md create mode 100644 scripts/train/benchmarking/h100old.csv create mode 100644 scripts/train/benchmarking/h100old.md create mode 100644 scripts/train/benchmarking/larger_mb.csv create mode 100644 scripts/train/benchmarking/larger_mb.md create mode 100755 scripts/train/benchmarking/larger_mb.numbers create mode 100644 scripts/train/benchmarking/larger_mb_1.csv create mode 100644 scripts/train/benchmarking/larger_mb_1.md create mode 100755 scripts/train/benchmarking/opt30b.sh create mode 100644 scripts/train/benchmarking/torches.csv create mode 100644 scripts/train/benchmarking/torches.md diff --git a/scripts/train/benchmarking/Torchcompiledebugging.numbers b/scripts/train/benchmarking/Torchcompiledebugging.numbers new file mode 100755 index 0000000000000000000000000000000000000000..b1a0787f02f8b3964bceab4c860b6a5aaf679ebf GIT binary patch literal 156370 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%0D7H; zZ5S2R$R%yLeZ}V3e_>yFE`gm|{QL%b;W;&YQG9F+x{2>*T{+{9bq^)IA>+sw8DqQA zjj@|;<&3|GyzY2I#*JQNjBP+S#%`9CGw!tPL}`VE`kOb&RpEM*<@O1ih~-5WgJH4UI<`-qg z7Ob1hZWfg@?pszE@Meso!e3;J-CQ@uZuXQjZZYTagEwRx@gigF47)LQv!}HjmI<~$)?>`%lXgA}5-NygYcm&n( zY5!*8N4trS?MyfEUojp7Kf3U|Bl!EK80}^}uu1C1_!Z+ZGV#=&Hi+5xE zit%7k9TacK*v)ughu@9yE5_q|e)ltP$k?s*;n08^<5!Hw`H2h1p`UQB1HAR}$m2EZ z0HNlFQ7p=(mGapm&gvkK*DeQe^VE53qmBQ44lebS=fKYd{Y?(XyR^OfM#^DPZpy*Q zAvfi`GAzrxH~rFoEjn`(9cMcJPV~)YdHR2!gR2zf%E6J5zsuq5$BSmZnR1w$dBs_i zzg7;P8+>#7?lsIK2#0{@HHSNRhmR0^u^!(WI~Ns;NX{-8u0*_>Nc{gSfOAQ?$B-A+ zGk9%rta!3)>`a`}2K+e^uK3RoALjJIdOdga?POTgh~(x9cizcW^X)|4BQJ4`+;w#1 zkevp;?L0fezZwY)hsWwy9V;&_X80xHO9Mm)R)N22QPEgZb6?5|`LDSO5Fz8e#uu=0 z1>AKr95};wn#+}%#py3?;@|p3v;8O6X!h6nT7!?VSKYI@Jh#Ei7<_)g;g`#^*x!2) zgWs`|zjY$^TCZgAEcU7+GdLH6XEFHYa=Gbp`QrL}pIh+M_4jVKUhBsTzPMg>{pIos z28UK~F9qLHE+Wr! z_we*umr-#0^s1LBmjf#JPI9?Ya`{X8d%sBVru6r&kzVU-2`-0TbU_xwCtPmA@g}@(!d>M{9xCC(5}qvK&+;W#m2gZ6_mtP+xzgP+@JqgI z$GdxTeaXG)OU^%Ea({`hWpLmZer@q(4cxlIc`Tfq!ig%JeZsRSyj;SiCN`7c*&g2S z;oRP4VRlQoOJk@1T~-X&n-=bX6Tb1``W{a2@vjP8PV!xD@Zpsjo|?xLq%Tr%*V2Qy zYv~u9;l1og>$wNXG4LhCUCdQ@k1hcHSH2?uhkhbobt#9uRsy)=>D7QW0Qhd>zO-L( z!1%K3Ha91X!XazGzy5pgipaptFB|TiZVZ7h0bX`vcpYKx&d>fA+!)#deB9g^!cE!B zE)4(jt&K)n{^sEK^ED0vpZfuS#Yy1*qSw#Ae4GD=Z}Pu#r+EbBeq&dfNc-Qs>~e2+ z!ccpB&o_Pne|l&9YvunhyIp<$0+yqID*$iOl*%2_|G)KRTK)o@9uPtQT}!KQHTb8S z!T*Jp=7^u?*3$mMVd(Rh4M&5|?c;xHY5%{t;w*pJ|4mEVhG+h-JFP_?uWMov+Z8CGZW$1(eS)?vNRkah&N2PVb5wcKao8T^ea3l;zx4ys!_nBU5 zoxjQ_wifZp!bvKGg$vCO=ho8!*#-iIJM4KrSUcTfMX8s zv(!32l~z$H7>T=Oe9k}q7cS(gbw-umTVI~ltS%E~vKbE@C&-*C- zS4<)y5!5P7v}e~MG>J_5sumIPZ;vj_&dMZWLlE1u5E2REXAq=OK*m=i2#E@q!4u*m zH*Ji_Q$~aONaRWJ!IL&e>^g-8R3WzP;W&vJkV|GGHP9R&nn~um?&i7Bd>2~aLJM7J zkqa$$p(WWwPJbo#>_9^A69-54NC8K8$pnt>kV1}b!*f2+Ej`?P>uRd1jFIYRXMBd! zds&?_T4ZJot)$0k zp=zqi-i6XvY2A8fEU!w2cc@P26gd7~*N#LawNnVIK?xC|_|GUP{!Xve2nMVO>q1FH ztWJ?OhHT=JjU$`GCdd*J$@F$)56T9O@8v}tK=yHzPxf0sx3uaL8Rxaax zvW=sAWIIQ9$qtV0kewXeCc8MgMRtd^Q;>*cT+W3Z6-WfXUBgxQPx2#2DP%3zU0bq_ zqn2bnN6pBFFf$&DLE@E84U$#-K@&7cE;*^??Su4~{OAGLEj0XB=IHqw0`(s)P<)f480b6Y?A( zK3+-9xDNXv4RqKa2zLWqXrK!Xa-qR4G{l95y3jC}4)0_K%Av!%T;zM?9!Gb{eU9#s zUpcx>9&mJv{N^k%bO^uKkcXJ~{pGM*g0BH;yy8;hRhJrnajEf|OO4mL8cke{KfBa; zkw4mySHv++Rt=%Yd;=O~}>rVTyL zT3+knvn!ZHa}Wmc+_Y zGr{J1j;n8!s~wMahD7pexQ;W4T;7hXb`ntE8eR<}TOrulF2<4V&(+79Db&ZCDb&ZC zDb&ZCDb&ZCDb#lq2fT#Z*;b?~agFVHCU=+?V?mLb9D z)7g10Tx&73#*&q;j;coI?6j}>*CjabjefqmR(GlJf#1 zbojY%O+D7QbOx19;S=jmgjJU6{v;v_|AA|D7#5;UQMjz(R6|bv$f-z9t>siBQ2ak; z>8h%{HCOA*f`<-4JF32KHE_V<`@HH=U;tu14xu&V!~zhJoLC5=5hoTY*Q>kt_$o6X zSs_LYBgjnelw?d_QDp6?y)9tV?aWxjEqn=4(e?3sRds| z;$ozT!O7?)9A{Col;a+hEaMpe268#aU()9I$A-Fks(@ZOnVr7qgU>YZpO{UKK);+? zm!^|#*0)I7MPYgI*mflC0a=0DJj~I6CbuE0IC`6`9{U!#RF|y59X(Edomh(E~aF$aTXsaIWD(6HV<}9c4 zB{<7@#5TR2VnlG$jBefV>e733?&CdIj|D^ z_34@URgav6c$H7@?%nYZqw6Vo1u2P8>*}g%X4NP4zTu8fv|WM|>JidB>|?6@geRzD zy0Exv7>O_qk&zp*lWCou{~vpA0@g&*G>&&C6PbiC3=twmh=2wWO%}qTq9nj7B8%uE zy2!e&sCck~ig>=O3n+*vh!-j%0xF^_9*FCG->7(BxU$~odb=K|@n4+@k;{E|-*0`N z?|Xj#=jqJ!RCP~R*Yr%fx~i)j0EeCc*~&iXDLH+Qo{>|3^qia`(F@Hqm_PYLg~vc{ zmxz`>eVu|H=_&s%1w91H{Q&m|NApXL=2sleuk|#eHySA5Iw*w)fu+1sc>b+XmlP_2 zWX)Rk0@P#;3;(1*5`=v6x<@%yHdO&Mm7{4oN7D?BrZhcG5Z}p*R3Su7(-Y+hxs)oJ zrW$CP$Ej1F9Uqw)!fuNNfL8~}|e&z^TttSW->02c9{9>eMqmiCX1nW-d z*-Gf?D6ZRP-JUOb+bn4v9UKwO%&=4!T2i+&9miRi*@@#K$HmE`Sn5`$mlnx%QVTm2|9-we z3vay^p${4W+BdS$qAbY4YX^sgnjJ{ik-$m_%#FY{kaB|wtc<|i3G6t5r4ra(0`nlS zJ7!If+taWeNxG;JM1zlELanV~v0lySjr{*$Jr6T4|Bea-Yw}}Dd9&40CF4~fd{nls+xoAf&n#-x&c|*Uo z_d{y$Ur`rkr44hw1DYqjCK1|s+4GpiG!0V&#dp@AfRMBjH50b<`vs#frANJio|QDy zv4bTbR3b;A(mBDUWgq;FWn`?Kqn*FRp%L>n+({B|FK|I_wguKf`Y6|tlEL1#&5*lo zGjZ_f=>BHS&~#}k?5pzofbnR2421}S(X8)Q`ITX2mQ?V9nln%0D92yZ{fCd!tZQNi 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 Ap#T5? literal 0 HcmV?d00001 diff --git a/scripts/train/benchmarking/ack_ckpt_limits.csv b/scripts/train/benchmarking/ack_ckpt_limits.csv new file mode 100644 index 0000000000..22707f4f72 --- /dev/null +++ b/scripts/train/benchmarking/ack_ckpt_limits.csv @@ -0,0 +1,8 @@ +Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams +13b,2048,8,a100_80gb,58.67,58.67,2,2,32,8,17824,2228,65536,amp_bf16,DEFAULT,FULL_SHARD,False,False,12853954560 +7b,2048,8,a100_80gb,62.46,62.46,4,2,64,17,36110,4513,131072,amp_bf16,DEFAULT,FULL_SHARD,False,False,6658859008 +7b,2048,8,a100_80gb,55.97,55.97,2,2,32,15,32355,4044,65536,amp_bf16,DEFAULT,FULL_SHARD,False,False,6658859008 +7b,2048,8,a100_80gb,46.59,46.59,1,2,16,13,26934,3366,32768,amp_bf16,DEFAULT,FULL_SHARD,False,False,6658859008 +3b,2048,8,a100_40gb,40.65,40.65,1,2,16,27,56609,7076,32768,amp_bf16,DEFAULT,FULL_SHARD,False,False,2651837440 +3b,2048,8,a100_80gb,34.93,46.57,1,2,16,23,48635,6079,32768,amp_bf16,DEFAULT,FULL_SHARD,True,True,2651837440 +3b,2048,8,a100_80gb,35.02,46.69,1,2,16,23,48759,6094,32768,amp_bf16,DEFAULT,FULL_SHARD,True,True,2651837440 diff --git a/scripts/train/benchmarking/ack_ckpt_limits.md b/scripts/train/benchmarking/ack_ckpt_limits.md new file mode 100644 index 0000000000..d37482a57c --- /dev/null +++ b/scripts/train/benchmarking/ack_ckpt_limits.md @@ -0,0 +1,10 @@ +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 13b | 2048 | 8 | a100_80gb | 58.67 | 58.67 | 2 | 2 | 32 | 8 | 17824 | 2228 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 8 | a100_80gb | 49.18 | 49.18 | 1 | 2 | 16 | 7 | 14942 | 1867 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 7b | 2048 | 8 | a100_80gb | 62.46 | 62.46 | 4 | 2 | 64 | 17 | 36110 | 4513 | 131072 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 2048 | 8 | a100_80gb | 55.97 | 55.97 | 2 | 2 | 32 | 15 | 32355 | 4044 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 2048 | 8 | a100_80gb | 46.59 | 46.59 | 1 | 2 | 16 | 13 | 26934 | 3366 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 3b | 2048 | 8 | a100_40gb | 40.65 | 40.65 | 1 | 2 | 16 | 27 | 56609 | 7076 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 34.93 | 46.57 | 1 | 2 | 16 | 23 | 48635 | 6079 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | True | True | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 35.02 | 46.69 | 1 | 2 | 16 | 23 | 48759 | 6094 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | True | True | 2651837440 | diff --git a/scripts/train/benchmarking/attn.sh b/scripts/train/benchmarking/attn.sh new file mode 100755 index 0000000000..88391bfc18 --- /dev/null +++ b/scripts/train/benchmarking/attn.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +PROJECT="attn" +TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +CLUSTER_80GB=r9z1 +GIT_COMMIT=v0.2.0 +GIT_BRANCH=main +# 30b test Torch Runs +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true --attn_impl xformers + +#13b test Torch runs -- seperate Torch1.13 and torch2 +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --attn_impl xformers +#7b test torch runs +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --attn_impl xformers +# #1b test torch runs +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --attn_impl xformers \ No newline at end of file diff --git a/scripts/train/benchmarking/compile() debug.numbers b/scripts/train/benchmarking/compile() debug.numbers new file mode 100755 index 0000000000000000000000000000000000000000..19f1a0597062a31219df39ec8c8786cd6c8adb2c GIT binary patch literal 139975 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 ATmS$7 literal 0 HcmV?d00001 diff --git a/scripts/train/benchmarking/h100_vsOAI.csv b/scripts/train/benchmarking/h100_vsOAI.csv new file mode 100644 index 0000000000..46a14f7163 --- /dev/null +++ b/scripts/train/benchmarking/h100_vsOAI.csv @@ -0,0 +1,9 @@ +Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams +70b,2048,64,h100_80gb,42.57,56.76,8,4,2048,32,66523,1039,4194304,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,64862437376 +70b,2048,32,h100_80gb,36.15,48.2,2,16,1024,13,28242,882,2097152,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,64862437376 +30b,8192,8,h100_80gb,29.92,39.9,1,21,168,1,11072,1384,1376256,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,30019254272 +30b,4096,8,h100_80gb,35.86,47.81,1,21,168,3,14419,1802,688128,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29989894144 +30b,2048,32,h100_80gb,43.92,58.57,14,3,1344,36,73860,2308,2752512,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29975214080 +30b,2048,16,h100_80gb,43.07,57.42,10,3,480,17,36209,2263,983040,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29975214080 +30b,2048,8,h100_80gb,38.11,50.82,3,21,504,7,16022,2002,1032192,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29975214080 +30b,1024,8,h100_80gb,38.76,51.68,6,21,1008,16,16672,2084,1032192,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29967874048 \ No newline at end of file diff --git a/scripts/train/benchmarking/h100_vsOAI.numbers b/scripts/train/benchmarking/h100_vsOAI.numbers new file mode 100755 index 0000000000000000000000000000000000000000..7b063de9b9c82e0ce142bf42a08b7cbf76c557f7 GIT binary patch literal 129512 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

-Lg$l_zU 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 Date: Tue, 22 Aug 2023 15:25:54 -0700 Subject: [PATCH 11/41] update benchmarks --- scripts/train/benchmarking/submit_benchmarks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index ed0b588da6..197aceab2e 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -406,7 +406,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], { 'integration_type': 'git_repo', 'git_repo': 'crinard/llm-foundry', - 'git_branch': 'main', + 'git_branch': 'run_initial', 'pip_install': '-e .[gpu]', }, { 'integration_type': 'wandb', From f4e30a0de34834a1420e57f916eaa1931764cb19 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 09:41:47 -0700 Subject: [PATCH 12/41] modify script --- .../train/benchmarking/act_ckpt_optimize.sh | 28 ++-- .../train/benchmarking/submit_benchmarks.py | 28 ++-- scripts/train/benchmarking/sweep_fsdp.sh | 120 +++++++++--------- .../benchmarking/torch_benchmarks_80gb.sh | 70 ++++++++++ 4 files changed, 160 insertions(+), 86 deletions(-) create mode 100755 scripts/train/benchmarking/torch_benchmarks_80gb.sh diff --git a/scripts/train/benchmarking/act_ckpt_optimize.sh b/scripts/train/benchmarking/act_ckpt_optimize.sh index b05f22f728..52ff209e8a 100755 --- a/scripts/train/benchmarking/act_ckpt_optimize.sh +++ b/scripts/train/benchmarking/act_ckpt_optimize.sh @@ -1,19 +1,21 @@ #!/bin/bash -PROJECT="ackckpt" +PROJECT="ackckptqt" TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" CLUSTER_80GB=r1z1 -GIT_COMMIT=v0.2.0 +GIT_BRANCH=run_initial -for MB_SIZE in 1 2 4 8 +for MB_SIZE in 1 2 4 6 8 do - for GATH_LMT in true false - do - for CPU_OFFLOAD in true false - do - python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false - python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false - python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false - done - done -done \ No newline at end of file +# # for GATH_LMT in true false +# # do +# # for CPU_OFFLOAD in true false +# # do + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_40gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# # done +# # done +done + +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false \ No newline at end of file diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 197aceab2e..6e1050cdf2 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -187,7 +187,7 @@ def parse_args(): parser.add_argument('--torch_compile_fullgraph', type=str_to_bool, default=None) parser.add_argument('--torch_compile_dynamic', type=str_to_bool, default=None) parser.add_argument('--torch_compile_mode', type=str, default=None) - + parser.add_argument('--torch_compile', type=str_to_bool, default=False) parser.add_argument('--RUN', type=str_to_bool, nargs='?', @@ -283,7 +283,8 @@ def mod_parameters(parameters: Dict[str, Any], pad_vocab_multiple: Optional[int] = None, torch_compile_fullgraph: Optional[bool] = None, torch_compile_dynamic: Optional[bool] = None, - torch_compile_mode: Optional[str] = None + torch_compile_mode: Optional[str] = None, + torch_compile: bool = False ): if run_name: parameters['run_name'] = run_name @@ -349,16 +350,14 @@ def mod_parameters(parameters: Dict[str, Any], parameters['fsdp_config']['backward_prefetch'] = fsdp_config_backward_prefetch if activation_cpu_offload is not None: parameters['fsdp_config']['activation_cpu_offload'] = activation_cpu_offload - parameters['fsdp_config']['verbose'] = True - - - parameters['compile_config'] = {} - if torch_compile_fullgraph is not None: - parameters['compile_config']['fullgraph'] = torch_compile_fullgraph - if torch_compile_dynamic is not None: - parameters['compile_config']['dynamic'] = torch_compile_dynamic - if torch_compile_mode is not None: - parameters['compile_config']['mode'] = torch_compile_mode + # parameters['fsdp_config']['verbose'] = True + parameters['compile_config'] = {} if torch_compile else None + # if torch_compile_fullgraph is not None: + # parameters['compile_config']['fullgraph'] = torch_compile_fullgraph + # if torch_compile_dynamic is not None: + # parameters['compile_config']['dynamic'] = torch_compile_dynamic + # if torch_compile_mode is not None: + # parameters['compile_config']['mode'] = torch_compile_mode if wandb: # add wandb @@ -471,8 +470,11 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], pad_vocab_multiple=args.pad_vocab_multiple, torch_compile_fullgraph = args.torch_compile_fullgraph, torch_compile_dynamic = args.torch_compile_dynamic, - torch_compile_mode = args.torch_compile_mode + torch_compile_mode = args.torch_compile_mode, + torch_compile = args.torch_compile ) + if args.torch_compile: + assert(parameters['model']['attn_config']['attn_impl'] != 'triton') if gpu_type == 'h100_80gb' and precision == 'fp8': parameters['model']['fc_type'] = 'te' # Create run config mcli sdk/api diff --git a/scripts/train/benchmarking/sweep_fsdp.sh b/scripts/train/benchmarking/sweep_fsdp.sh index 51fa21db7a..358855cf98 100644 --- a/scripts/train/benchmarking/sweep_fsdp.sh +++ b/scripts/train/benchmarking/sweep_fsdp.sh @@ -25,71 +25,71 @@ python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_si python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN # Replicate/understand any diffs using streaming data loader -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --fsdp_config_activation_checkpointing true # 80GB Test microbatch size w/ no act_ckpt -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false + +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false + +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false # # Test ack_ckpt differences -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 6 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - - -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 6 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false + + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false # NOTE: Tried the commented ones last night, OOM'd -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 14 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 12 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 7 7 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false #PASSED \ No newline at end of file +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 14 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 12 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false # PASSED +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 7 7 --RUN --fsdp_config_activation_checkpointing false #PASSED \ No newline at end of file diff --git a/scripts/train/benchmarking/torch_benchmarks_80gb.sh b/scripts/train/benchmarking/torch_benchmarks_80gb.sh new file mode 100755 index 0000000000..75f3f52aab --- /dev/null +++ b/scripts/train/benchmarking/torch_benchmarks_80gb.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +PROJECT="torches80gb" +TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +TORCH_113_IMAGE="mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04" +CLUSTER_80GB=r1z1 +CLUSTER_40GB=r8z3 +GIT_COMMIT=v0.2.0 +# 30b test Torch Runs +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 13 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 12 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +#13b test Torch runs -- seperate Torch1.13 and torch2 +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +# #7b test torch runs +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true + +#3b test torch runs +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false + +#3b test torch runs +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false + +#1b test torch runs +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false + +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false + +#abbreviate it, 350m +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 6 --accum 2 --image $TORCH_113_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false + +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false From 1ead3150a10c3e7c3be1606e1c8c6e9e274eb7e0 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:00:33 -0700 Subject: [PATCH 13/41] update ARGS to run locally --- scripts/train/benchmarking/submit_benchmarks.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 6e1050cdf2..0a51b6b750 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -193,6 +193,11 @@ def parse_args(): nargs='?', const=True, default=False) + parser.add_argument('--LOCAL', + type=str_to_bool, + nargs='?', + const=True, + default=False) return parser.parse_args() @@ -491,6 +496,15 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], # Create the run from a config run = create_run(config) print(f'Launching run {run.name}') + is args.LOCAL: + saved = get_runs(run.name)[0].submitted_config + stop_run(run.name) + from dataclassses import asdict + d = asdict(saved) + import yaml + f = open('/mnt/workdisk/chris/llmf/conf.yaml', 'w+') + yaml.dump(d, f, allow_unicode=True) + RunConfig.to_file() else: print(f'run = {name}') From 6c4f6855e933189ddbdf0c56675cd354d39dafcb Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:10:33 -0700 Subject: [PATCH 14/41] add local script --- scripts/train/benchmarking/run_local.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100755 scripts/train/benchmarking/run_local.sh diff --git a/scripts/train/benchmarking/run_local.sh b/scripts/train/benchmarking/run_local.sh new file mode 100755 index 0000000000..4584314cad --- /dev/null +++ b/scripts/train/benchmarking/run_local.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +PROJECT="interntorch2" +GIT_COMMIT="v0.0.4" +IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" + +# A100 40GB + +# seqlen 2048 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --LOCAL \ No newline at end of file From 7f3339cddf5e08008876be576e38e7f3d60f88eb Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:17:11 -0700 Subject: [PATCH 15/41] fix submit_benchmarks LOCAL --- scripts/train/benchmarking/submit_benchmarks.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 0a51b6b750..c93be61b35 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -438,6 +438,9 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], cd llm-foundry/scripts composer train/train.py /mnt/config/parameters.yaml """ + if args.LOCAL: + command = "" + path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) parameters = get_parameters(path) @@ -496,7 +499,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], # Create the run from a config run = create_run(config) print(f'Launching run {run.name}') - is args.LOCAL: + if args.LOCAL: saved = get_runs(run.name)[0].submitted_config stop_run(run.name) from dataclassses import asdict From bfd7b12a86e6cc4aafa0a218e93749775d0356b7 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:30:33 -0700 Subject: [PATCH 16/41] update --- scripts/train/benchmarking/run_local.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/run_local.sh b/scripts/train/benchmarking/run_local.sh index 4584314cad..3ca57f0840 100755 --- a/scripts/train/benchmarking/run_local.sh +++ b/scripts/train/benchmarking/run_local.sh @@ -5,6 +5,6 @@ GIT_COMMIT="v0.0.4" IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" # A100 40GB - +CLUSTER_40GB=r1z1 # seqlen 2048 python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --LOCAL \ No newline at end of file From 6974395e8fb42e5e8b70fa38287273c6ff4ef71f Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:32:58 -0700 Subject: [PATCH 17/41] reee --- scripts/train/benchmarking/run_local.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/run_local.sh b/scripts/train/benchmarking/run_local.sh index 3ca57f0840..1a881f10b6 100755 --- a/scripts/train/benchmarking/run_local.sh +++ b/scripts/train/benchmarking/run_local.sh @@ -7,4 +7,4 @@ IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" # A100 40GB CLUSTER_40GB=r1z1 # seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --LOCAL \ No newline at end of file +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_40GB -s 11 11 --RUN --LOCAL \ No newline at end of file From 55ddafb2c9da7a31f76f4a3a5787d6a0946ec87e Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:33:36 -0700 Subject: [PATCH 18/41] ;| --- scripts/train/benchmarking/submit_benchmarks.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index c93be61b35..d940c2c1b1 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -438,8 +438,6 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], cd llm-foundry/scripts composer train/train.py /mnt/config/parameters.yaml """ - if args.LOCAL: - command = "" path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) parameters = get_parameters(path) From 201360be6b52842e4020d7440813a9e2090c3977 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:35:41 -0700 Subject: [PATCH 19/41] ;| --- scripts/train/benchmarking/submit_benchmarks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index d940c2c1b1..f2f24258a3 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -8,7 +8,7 @@ import requests import yaml from mcli.models.run_config import SchedulingConfig -from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs +from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs, get_runs def _get_cluster_info(): clusters = get_clusters() From cd3e5fea32dac1496f4dcac12062474233ab676e Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:37:06 -0700 Subject: [PATCH 20/41] :| --- scripts/train/benchmarking/run_local.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/run_local.sh b/scripts/train/benchmarking/run_local.sh index 1a881f10b6..c2d3faf58f 100755 --- a/scripts/train/benchmarking/run_local.sh +++ b/scripts/train/benchmarking/run_local.sh @@ -1,6 +1,6 @@ #!/bin/bash -PROJECT="interntorch2" +PROJECT="ree" GIT_COMMIT="v0.0.4" IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" From 463f7e67b21c9d7c00344ca8284344ad5fddcb42 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Wed, 23 Aug 2023 11:44:02 -0700 Subject: [PATCH 21/41] :| --- scripts/train/benchmarking/submit_benchmarks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index f2f24258a3..063cb0c57f 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -498,6 +498,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], run = create_run(config) print(f'Launching run {run.name}') if args.LOCAL: + print(get_runs(run.name)) saved = get_runs(run.name)[0].submitted_config stop_run(run.name) from dataclassses import asdict From 2d5038f87f3bc1151e62beaa2d4cc18b056c3a96 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Mon, 28 Aug 2023 17:39:02 -0700 Subject: [PATCH 22/41] wip --- .../train/benchmarking/submit_benchmarks.py | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 063cb0c57f..541971c23e 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -8,7 +8,7 @@ import requests import yaml from mcli.models.run_config import SchedulingConfig -from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs, get_runs +from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs def _get_cluster_info(): clusters = get_clusters() @@ -193,11 +193,6 @@ def parse_args(): nargs='?', const=True, default=False) - parser.add_argument('--LOCAL', - type=str_to_bool, - nargs='?', - const=True, - default=False) return parser.parse_args() @@ -420,12 +415,21 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], ] command = "" - if gpu_type == 'h100_80gb' and precision == 'fp8': - command += """ - pip uninstall install pydantic - pip install pydantic==1.9.0 - pip install flash-attn==1.0.7 --no-build-isolation - pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10""" + # if gpu_type == 'h100_80gb': + # command += f""" + # cd llm-foundry + # pip install .[gpu] + # pip uninstall mosaicml --yes + # pip install -U git+https://github.com/mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 + # pip install flash-attn==1.0.7 --no-build-isolation + # pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10 + # pip uninstall torch==2.0.1 --yes + # pip install --no-cache-dir --pre --index-url https://download.pytorch.org/whl/nightly/cu121 torch==2.1.0.dev20230821+cu121 + # pip uninstall install pydantic --yes + # pip install pydantic==1.9.0 + # cd scripts + # python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens 2048 --tokenizer gpt2 --eos_text '<|endoftext|>' + # composer train/train.py /mnt/config/parameters.yaml""" if args.data_remote is None: command += f""" @@ -497,16 +501,6 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], # Create the run from a config run = create_run(config) print(f'Launching run {run.name}') - if args.LOCAL: - print(get_runs(run.name)) - saved = get_runs(run.name)[0].submitted_config - stop_run(run.name) - from dataclassses import asdict - d = asdict(saved) - import yaml - f = open('/mnt/workdisk/chris/llmf/conf.yaml', 'w+') - yaml.dump(d, f, allow_unicode=True) - RunConfig.to_file() else: print(f'run = {name}') From 568e61d2fad59710e8ce972c0385ce240ba6d575 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Thu, 31 Aug 2023 21:48:46 -0700 Subject: [PATCH 23/41] merge xformers --- llmfoundry/models/layers/attention.py | 102 ++++++++ scripts/train/benchmarking/h100_benchmarks.sh | 52 ++-- .../train/benchmarking/submit_benchmarks.py | 33 +-- scripts/train/benchmarking/sweep.sh | 230 +++++++----------- 4 files changed, 239 insertions(+), 178 deletions(-) diff --git a/llmfoundry/models/layers/attention.py b/llmfoundry/models/layers/attention.py index bea6284fb5..51bab58a2a 100644 --- a/llmfoundry/models/layers/attention.py +++ b/llmfoundry/models/layers/attention.py @@ -420,6 +420,108 @@ def triton_flash_attn_fn( return output, None, past_key_value +def xformers_attn_fn(query: torch.Tensor, + key: torch.Tensor, + value: torch.Tensor, + n_heads: int, + kv_n_heads: Optional[int] = None, + past_key_value: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, + softmax_scale: Optional[float] = None, + attn_bias: Optional[torch.Tensor] = None, + key_padding_mask: Optional[torch.Tensor] = None, + is_causal: bool = False, + dropout_p: float = 0.0, + training: bool = False, + needs_weights: bool = False, + multiquery: bool = False, +) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor, + torch.Tensor]]]: + + try: + from xformers.ops import memory_efficient_attention + except: + raise RuntimeError( + 'Please install xformers.' + ) + + check_valid_inputs(query, key, value) + + if multiquery: + warnings.warn( + DeprecationWarning( + 'The direct use of the multiquery arg is deprecated. Setting kv_n_heads=1 automatically. Please set kv_n_heads=1 explicitly to remove this warning.' + )) + kv_n_heads = 1 + elif kv_n_heads is None: + warnings.warn( + DeprecationWarning( + 'Not specifying a value for the kv_n_heads arg is deprecated. Setting kv_n_heads=n_heads automatically. Please set kv_n_heads=n_heads explicitly to remove this warning.' + )) + kv_n_heads = n_heads + + if past_key_value is not None: + if len(past_key_value) != 0: + key = torch.cat([past_key_value[0], key], dim=1) + value = torch.cat([past_key_value[1], value], dim=1) + + past_key_value = (key, value) + + if attn_bias is not None: + # clamp to 0 necessary for torch 2.0 compile() + _s_q = max(0, attn_bias.size(2) - query.size(1)) + _s_k = max(0, attn_bias.size(3) - key.size(1)) + attn_bias = attn_bias[:, :, _s_q:, _s_k:] + attn_bias.expand(axis=0, query.shape.0) + if dropout_p: + raise NotImplementedError( + f'Dropout not implemented for attn_impl: triton.') + dropout_p = dropout_p if training else 0.0 + + if needs_weights: + raise NotImplementedError( + f'attn_impl: triton cannot return attn weights.') + + if key_padding_mask is not None: + warnings.warn( + 'Propagating key_padding_mask to the attention module ' +\ + 'and applying it within the attention module can cause ' +\ + 'unnecessary computation/memory usage. Consider integrating ' +\ + 'into attn_bias once and passing that to each attention ' +\ + 'module instead.' + ) + b_size, s_k = key_padding_mask.shape[:2] + + if attn_bias is None: + attn_bias = query.new_zeros(b_size, 1, 1, s_k) + + attn_bias = attn_bias.masked_fill( + ~key_padding_mask.view((b_size, 1, 1, s_k)), + torch.finfo(query.dtype).min) + + query = rearrange(query, 'b s (h d) -> b s h d', h=n_heads) + key = rearrange(key, 'b s (h d) -> b s h d', h=kv_n_heads) + value = rearrange(value, 'b s (h d) -> b s h d', h=kv_n_heads) + # multi-query case + if kv_n_heads == 1: + # necessary to repeat instead of expand tensor because + # output contains NaN in edge cases such as with head dimension = 8 + key = key.repeat(1, 1, n_heads, 1) + value = value.repeat(1, 1, n_heads, 1) + # grouped query case + elif kv_n_heads < n_heads: + # Each query belong to a group of kv heads of group size n_heads // kv_n_heads + # We repeat each kv head by the group size number to use the underlying MHA kernels + # done along dim = 2, unlike the implementation for flash and torch attn + key = key.repeat_interleave(n_heads // kv_n_heads, dim=2) + value = value.repeat_interleave(n_heads // kv_n_heads, dim=2) + + reset_is_causal = _reset_is_causal(query.size(1), key.size(1), is_causal) + attn_output = memory_efficient_attention( # type: ignore + query, key, value, attn_bias, p=dropout_p) + + output = attn_output.view(*attn_output.shape[:2], -1) # type: ignore + + return output, None, past_key_value class GroupedQueryAttention(nn.Module): """Grouped Query Attention (GQA) is a generalization of Multi-head (MHA). diff --git a/scripts/train/benchmarking/h100_benchmarks.sh b/scripts/train/benchmarking/h100_benchmarks.sh index 1b035edaa3..2709370ba0 100755 --- a/scripts/train/benchmarking/h100_benchmarks.sh +++ b/scripts/train/benchmarking/h100_benchmarks.sh @@ -1,40 +1,40 @@ #!/bin/bash -PROJECT="h100setup" -TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +PROJECT="h100tnight" +TORCH_2_IMAGE="mosaicml/ci-staging:7d6665ea-658b-4686-b7e2-edc51e2fa866" CLUSTER_80GB=r9z1 GIT_COMMIT=v0.2.0 GIT_BRANCH=main # 30b test Torch Runs # python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 12 13 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t fp8 bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true --activation_checkpointing_reentrant true +# # python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing true +# # python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true -# #13b test Torch runs -- seperate Torch1.13 and torch2 -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true +# # #13b test Torch runs -- seperate Torch1.13 and torch2 +# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true -# #7b test torch runs -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true +# # #7b test torch runs +# # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +# # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true +# # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true --activation_checkpointing_reentrant true -# # #3b test torch runs -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# #3b test torch runs +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false # #1b test torch runs -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false # #abbreviate it, 350m -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp16 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 bf16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 541971c23e..c5d2becf1f 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -35,6 +35,8 @@ def str_to_bool(value: Union[bool, str]): return True raise ValueError(f'{value} is not a valid boolean value') +def str_to_list_int(value: Union[List[int], str]): + print(value) def parse_args(): parser = argparse.ArgumentParser( @@ -246,6 +248,7 @@ def get_gpu_nums(clusters: List[str], gpu_types: List[str]): max_gpus_per_run = 1 for c in clusters: for gpu_info in CLUSTER_INFO[c]: + print(gpu_info) #TODO: remove if gpu_info[0] in gpu_types: max_gpus_per_run = max(max_gpus_per_run, gpu_info[1]) @@ -405,7 +408,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], { 'integration_type': 'git_repo', 'git_repo': 'crinard/llm-foundry', - 'git_branch': 'run_initial', + 'git_branch': 'add_attns', 'pip_install': '-e .[gpu]', }, { 'integration_type': 'wandb', @@ -415,21 +418,19 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], ] command = "" - # if gpu_type == 'h100_80gb': - # command += f""" - # cd llm-foundry - # pip install .[gpu] - # pip uninstall mosaicml --yes - # pip install -U git+https://github.com/mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 - # pip install flash-attn==1.0.7 --no-build-isolation - # pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10 - # pip uninstall torch==2.0.1 --yes - # pip install --no-cache-dir --pre --index-url https://download.pytorch.org/whl/nightly/cu121 torch==2.1.0.dev20230821+cu121 - # pip uninstall install pydantic --yes - # pip install pydantic==1.9.0 - # cd scripts - # python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens 2048 --tokenizer gpt2 --eos_text '<|endoftext|>' - # composer train/train.py /mnt/config/parameters.yaml""" + if 'nightly' in args.image: # Fix older composer deps. TODO: this should be removed once mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 is merged + command += """pip install -U git+https://github.com/mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 + pip uninstall torch==2.0.1 --yes + pip install --no-cache-dir --pre --index-url https://download.pytorch.org/whl/nightly/cu121 torch==2.1.0.dev20230821+cu121""" + if gpu_type == 'h100_80gb': # Required for flash-attn and FP8 training + command += f""" + pip install flash-attn==1.0.7 --no-build-isolation + pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10 + pip uninstall install pydantic --yes + pip install pydantic==1.9.0 + cd llm-foundry/scripts + python data_prep/convert_dataset_hf.py --dataset c4 --data_subset en --out_root ./my-copy-c4 --splits train_small val_small --concat_tokens {max_seq_len} --tokenizer gpt2 --eos_text '<|endoftext|>' + composer train/train.py /mnt/config/parameters.yaml""" if args.data_remote is None: command += f""" diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index 34caf6a3bd..aada6bc4aa 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -1,151 +1,109 @@ #!/bin/bash -PROJECT="interntorch2" +PROJECT="tput" GIT_COMMIT="v0.0.4" -IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" -CLUSTER_80GB=r1z1 -CLUSTER_40GB=r8z3 +# IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +IMAGE="mosaicml/pytorch:2.1.0_cu121-nightly20230827-python3.10-ubuntu20.04" +CLUSTER_80GB=r9z1 -# A100 40GB -# seqlen 2048 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 24 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true - -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 12 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false - -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 8 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true - -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 12 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ - -# Replicate/understand diffs using streaming data loader -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing true +# A100 80GB -# Test ack_ckpt differences -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml --seq_len 8192 -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml --seq_len 4096 -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 6 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - - -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false - -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false +# seqlen 2048 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 40 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --attn_impl xformers --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# NOTE: Tried the commented ones last night, OOM'd -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 14 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 12 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false # PASSED -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 7 7 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --fsdp_config_activation_checkpointing false #PASSED +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# Test torch.compile -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ --torch_compile true -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 4 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --data_remote oci://mosaicml-internal-dataset-c4/preconcat-gpt_neox/ +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false # # INCREASE GPU COUNT -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 16 32 64 128 --microbatch_size 26 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 16 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 16 32 64 128 --microbatch_size 12 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 16 --microbatch_size 8 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 5 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 16 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 32 64 128 --microbatch_size 10 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 64 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 32 64 128 --microbatch_size 18 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 128 --microbatch_size 16 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 128 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 128 --microbatch_size 4 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 11 11 --RUN - -# # SCALE SEQUENCE LENGTH -# # seqlen 512 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 104 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 32 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 16 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 9 9 --RUN +# for GPU_NUM in 16 32 64 +# do +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g $GPU_NUM --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g $GPU_NUM --microbatch_size 20 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# done + +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 64 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 14 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 32 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 64 --microbatch_size 16 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN + +# SCALE SEQUENCE LENGTH +# seqlen 512 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --precision fp8 --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 96 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN # # seqlen 1024 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 52 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 16 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 28 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 8 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 18 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 40 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN # # seqlen 4096 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 13 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 4 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 7 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN # # seqlen 8192 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN # # seqlen 16384 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 2 --accum 8 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN # # seqlen 32768 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_40gb --cluster $CLUSTER_40GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# # seqlen 65536 +# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true +# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN From 803e6718208c1a41cba6f0d44a1a1eb104013f82 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 10:42:36 -0700 Subject: [PATCH 24/41] revert the attention commit --- llmfoundry/models/layers/attention.py | 201 ++++-------------- scripts/train/benchmarking/README.md | 81 +++++++ .../Torchcompiledebugging.numbers | Bin 156370 -> 0 bytes .../train/benchmarking/benchmark_results.csv | 97 +++++++-- .../train/benchmarking/benchmark_results.md | 97 +++++++-- scripts/train/benchmarking/collect_results.py | 6 +- scripts/train/benchmarking/h100.csv | 78 ------- scripts/train/benchmarking/h100.numbers | Bin 284466 -> 0 bytes scripts/train/benchmarking/h100_vsOAI.csv | 9 - scripts/train/benchmarking/h100_vsOAI.numbers | Bin 129512 -> 0 bytes scripts/train/benchmarking/h100new.csv | 132 ------------ scripts/train/benchmarking/larger_mb.csv | 10 - scripts/train/benchmarking/larger_mb.numbers | Bin 144751 -> 0 bytes .../train/benchmarking/submit_benchmarks.py | 6 +- scripts/train/benchmarking/sweep.sh | 188 ++++++++-------- scripts/train/benchmarking/torches.csv | 25 --- 16 files changed, 373 insertions(+), 557 deletions(-) delete mode 100755 scripts/train/benchmarking/Torchcompiledebugging.numbers delete mode 100644 scripts/train/benchmarking/h100.csv delete mode 100755 scripts/train/benchmarking/h100.numbers delete mode 100644 scripts/train/benchmarking/h100_vsOAI.csv delete mode 100755 scripts/train/benchmarking/h100_vsOAI.numbers delete mode 100644 scripts/train/benchmarking/h100new.csv delete mode 100644 scripts/train/benchmarking/larger_mb.csv delete mode 100755 scripts/train/benchmarking/larger_mb.numbers delete mode 100644 scripts/train/benchmarking/torches.csv diff --git a/llmfoundry/models/layers/attention.py b/llmfoundry/models/layers/attention.py index 51bab58a2a..9114bc47aa 100644 --- a/llmfoundry/models/layers/attention.py +++ b/llmfoundry/models/layers/attention.py @@ -5,7 +5,7 @@ import math import warnings -from typing import Any, List, Optional, Tuple +from typing import List, Optional, Tuple import torch import torch.nn as nn @@ -18,7 +18,7 @@ def _reset_is_causal(num_query_tokens: int, num_key_tokens: int, - original_is_causal: bool) -> bool: + original_is_causal: bool): # disable causal when it is not needed # necessary for flash & triton for generation with kv_cache if original_is_causal and num_query_tokens != num_key_tokens: @@ -31,23 +31,6 @@ def _reset_is_causal(num_query_tokens: int, num_key_tokens: int, return original_is_causal -def repeat_kv_for_gqa(hidden: torch.Tensor, n_rep: int) -> torch.Tensor: - """Perform repeat of kv heads along a particular dimension. - - hidden.shape expected to be: (batch size, seq len, kv_n_heads, head_dim) - n_rep: amount of repetitions of kv_n_heads - Unlike torch.repeat_interleave, this function avoids allocating new memory. - """ - if n_rep == 1: - return hidden - - b, s, kv_n_heads, d = hidden.shape - - hidden = hidden[:, :, :, None, :].expand(b, s, kv_n_heads, n_rep, d) - - return hidden.reshape(b, s, kv_n_heads * n_rep, d) - - def scaled_multihead_dot_product_attention( query: torch.Tensor, key: torch.Tensor, @@ -101,11 +84,8 @@ def scaled_multihead_dot_product_attention( # grouped query case if kv_n_heads > 1 and kv_n_heads < n_heads: - # necessary to do a transpose to swap (b h s d) -> (b s h d) for repeat_kv_for_gqa function - k = repeat_kv_for_gqa(k.transpose(1, 2), - n_heads // kv_n_heads).transpose(1, 2) - v = repeat_kv_for_gqa(v.transpose(1, 2), - n_heads // kv_n_heads).transpose(1, 2) + k = k.repeat_interleave(n_heads // kv_n_heads, dim=1) + v = v.repeat_interleave(n_heads // kv_n_heads, dim=1) if softmax_scale is None: softmax_scale = 1 / math.sqrt(d) @@ -263,16 +243,10 @@ def flash_attn_fn( elif kv_n_heads < n_heads: # Each query belong to a group of kv heads of group size n_heads // kv_n_heads # We repeat each kv head by the group size number to use the underlying MHA kernels - - # since repeat_kv_for_gqa expects input dims of (b, s, kv_n_heads, d) - # we use .view to modify {key, value}_unpad appropriately - - key_unpad = repeat_kv_for_gqa( - key_unpad.view(batch_size, seqlen, kv_n_heads, -1), - n_heads // kv_n_heads).view(batch_size * seqlen, n_heads, -1) - value_unpad = repeat_kv_for_gqa( - value_unpad.view(batch_size, seqlen, kv_n_heads, -1), - n_heads // kv_n_heads).view(batch_size * seqlen, n_heads, -1) + # done along the head dimension = 1 + key_unpad = key_unpad.repeat_interleave(n_heads // kv_n_heads, dim=1) + value_unpad = value_unpad.repeat_interleave(n_heads // kv_n_heads, + dim=1) dropout_p = dropout_p if training else 0.0 @@ -399,108 +373,6 @@ def triton_flash_attn_fn( key = rearrange(key, 'b s (h d) -> b s h d', h=kv_n_heads) value = rearrange(value, 'b s (h d) -> b s h d', h=kv_n_heads) - # multi-query case - if kv_n_heads == 1: - # necessary to repeat instead of expand tensor because - # output contains NaN in edge cases such as with head dimension = 8 - key = key.repeat(1, 1, n_heads, 1) - value = value.repeat(1, 1, n_heads, 1) - # grouped query case - elif kv_n_heads < n_heads: - # Each query belong to a group of kv heads of group size n_heads // kv_n_heads - # We repeat each kv head by the group size number to use the underlying MHA kernels - key = repeat_kv_for_gqa(key, n_heads // kv_n_heads) - value = repeat_kv_for_gqa(value, n_heads // kv_n_heads) - - reset_is_causal = _reset_is_causal(query.size(1), key.size(1), is_causal) - attn_output = flash_attn_func( # type: ignore - query, key, value, attn_bias, reset_is_causal, softmax_scale) - - output = attn_output.view(*attn_output.shape[:2], -1) # type: ignore - - return output, None, past_key_value - -def xformers_attn_fn(query: torch.Tensor, - key: torch.Tensor, - value: torch.Tensor, - n_heads: int, - kv_n_heads: Optional[int] = None, - past_key_value: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, - softmax_scale: Optional[float] = None, - attn_bias: Optional[torch.Tensor] = None, - key_padding_mask: Optional[torch.Tensor] = None, - is_causal: bool = False, - dropout_p: float = 0.0, - training: bool = False, - needs_weights: bool = False, - multiquery: bool = False, -) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor, - torch.Tensor]]]: - - try: - from xformers.ops import memory_efficient_attention - except: - raise RuntimeError( - 'Please install xformers.' - ) - - check_valid_inputs(query, key, value) - - if multiquery: - warnings.warn( - DeprecationWarning( - 'The direct use of the multiquery arg is deprecated. Setting kv_n_heads=1 automatically. Please set kv_n_heads=1 explicitly to remove this warning.' - )) - kv_n_heads = 1 - elif kv_n_heads is None: - warnings.warn( - DeprecationWarning( - 'Not specifying a value for the kv_n_heads arg is deprecated. Setting kv_n_heads=n_heads automatically. Please set kv_n_heads=n_heads explicitly to remove this warning.' - )) - kv_n_heads = n_heads - - if past_key_value is not None: - if len(past_key_value) != 0: - key = torch.cat([past_key_value[0], key], dim=1) - value = torch.cat([past_key_value[1], value], dim=1) - - past_key_value = (key, value) - - if attn_bias is not None: - # clamp to 0 necessary for torch 2.0 compile() - _s_q = max(0, attn_bias.size(2) - query.size(1)) - _s_k = max(0, attn_bias.size(3) - key.size(1)) - attn_bias = attn_bias[:, :, _s_q:, _s_k:] - attn_bias.expand(axis=0, query.shape.0) - if dropout_p: - raise NotImplementedError( - f'Dropout not implemented for attn_impl: triton.') - dropout_p = dropout_p if training else 0.0 - - if needs_weights: - raise NotImplementedError( - f'attn_impl: triton cannot return attn weights.') - - if key_padding_mask is not None: - warnings.warn( - 'Propagating key_padding_mask to the attention module ' +\ - 'and applying it within the attention module can cause ' +\ - 'unnecessary computation/memory usage. Consider integrating ' +\ - 'into attn_bias once and passing that to each attention ' +\ - 'module instead.' - ) - b_size, s_k = key_padding_mask.shape[:2] - - if attn_bias is None: - attn_bias = query.new_zeros(b_size, 1, 1, s_k) - - attn_bias = attn_bias.masked_fill( - ~key_padding_mask.view((b_size, 1, 1, s_k)), - torch.finfo(query.dtype).min) - - query = rearrange(query, 'b s (h d) -> b s h d', h=n_heads) - key = rearrange(key, 'b s (h d) -> b s h d', h=kv_n_heads) - value = rearrange(value, 'b s (h d) -> b s h d', h=kv_n_heads) # multi-query case if kv_n_heads == 1: # necessary to repeat instead of expand tensor because @@ -516,13 +388,14 @@ def xformers_attn_fn(query: torch.Tensor, value = value.repeat_interleave(n_heads // kv_n_heads, dim=2) reset_is_causal = _reset_is_causal(query.size(1), key.size(1), is_causal) - attn_output = memory_efficient_attention( # type: ignore - query, key, value, attn_bias, p=dropout_p) + attn_output = flash_attn_func( # type: ignore + query, key, value, attn_bias, reset_is_causal, softmax_scale) output = attn_output.view(*attn_output.shape[:2], -1) # type: ignore return output, None, past_key_value + class GroupedQueryAttention(nn.Module): """Grouped Query Attention (GQA) is a generalization of Multi-head (MHA). @@ -545,8 +418,8 @@ def __init__( attn_pdrop: float = 0.0, norm_type: str = 'low_precision_layernorm', fc_type: str = 'torch', + verbose: int = 0, device: Optional[str] = None, - bias: bool = True, ): super().__init__() @@ -578,9 +451,7 @@ def __init__( self.softmax_scale = 1 / math.sqrt(self.d_model / self.n_heads) self.attn_dropout_p = attn_pdrop - fc_kwargs: dict[str, Any] = { - 'bias': bias, - } + fc_kwargs = {} if fc_type != 'te': fc_kwargs['device'] = device self.Wqkv = FC_CLASS_REGISTRY[fc_type]( @@ -593,7 +464,7 @@ def __init__( i * self.head_dim for i in range(1, self.n_heads + 2 * self.kv_n_heads) ] - self.Wqkv._fused = (0, fuse_splits) + self.Wqkv._fused = (0, fuse_splits) # type: ignore if self.qk_ln: norm_class = NORM_CLASS_REGISTRY[norm_type.lower()] @@ -605,8 +476,21 @@ def __init__( self.attn_fn = flash_attn_fn elif self.attn_impl == 'triton': self.attn_fn = triton_flash_attn_fn + if verbose: + warnings.warn( + 'While `attn_impl: triton` can be faster than `attn_impl: flash` ' +\ + 'it uses more memory. When training larger models this can trigger ' +\ + 'alloc retries which hurts performance. If encountered, we recommend ' +\ + 'using `attn_impl: flash` if your model does not use `alibi` or `prefix_lm`.' + ) elif self.attn_impl == 'torch': self.attn_fn = scaled_multihead_dot_product_attention + if torch.cuda.is_available() and verbose: + warnings.warn( + 'Using `attn_impl: torch`. If your model does not use `alibi` or ' +\ + '`prefix_lm` we recommend using `attn_impl: flash` otherwise ' +\ + 'we recommend using `attn_impl: triton`.' + ) else: raise ValueError(f'{attn_impl=} is an invalid setting.') @@ -615,7 +499,7 @@ def __init__( self.d_model, **fc_kwargs, ) - self.out_proj._is_residual = True + self.out_proj._is_residual = True # type: ignore def forward( self, @@ -625,8 +509,7 @@ def forward( attention_mask: Optional[torch.Tensor] = None, is_causal: bool = True, needs_weights: bool = False, - ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[ - torch.Tensor, torch.Tensor]]]: + ): qkv = self.Wqkv(x) if self.clip_qkv: @@ -686,8 +569,8 @@ def __init__( attn_pdrop: float = 0.0, norm_type: str = 'low_precision_layernorm', fc_type: str = 'torch', + verbose: int = 0, device: Optional[str] = None, - bias: bool = True, ): super().__init__( d_model=d_model, @@ -700,9 +583,8 @@ def __init__( attn_pdrop=attn_pdrop, norm_type=norm_type, fc_type=fc_type, - device=device, - bias=bias, - ) + verbose=verbose, + device=device) class MultiQueryAttention(GroupedQueryAttention): @@ -723,8 +605,8 @@ def __init__( attn_pdrop: float = 0.0, norm_type: str = 'low_precision_layernorm', fc_type: str = 'torch', + verbose: int = 0, device: Optional[str] = None, - bias: bool = True, ): super().__init__( d_model=d_model, @@ -737,15 +619,12 @@ def __init__( attn_pdrop=attn_pdrop, norm_type=norm_type, fc_type=fc_type, - device=device, - bias=bias, - ) + verbose=verbose, + device=device) -def attn_bias_shape( - attn_impl: str, n_heads: int, seq_len: int, alibi: bool, - prefix_lm: bool, causal: bool, - use_sequence_id: bool) -> Optional[Tuple[int, int, int, int]]: +def attn_bias_shape(attn_impl: str, n_heads: int, seq_len: int, alibi: bool, + prefix_lm: bool, causal: bool, use_sequence_id: bool): if attn_impl == 'flash': return None elif attn_impl in ['torch', 'triton']: @@ -768,7 +647,7 @@ def build_attn_bias( causal: bool = False, alibi: bool = False, alibi_bias_max: int = 8, -) -> Optional[torch.Tensor]: +): if attn_impl == 'flash': return None elif attn_impl in ['torch', 'triton']: @@ -791,7 +670,7 @@ def build_attn_bias( def gen_slopes(n_heads: int, alibi_bias_max: int = 8, - device: Optional[torch.device] = None) -> torch.Tensor: + device: Optional[torch.device] = None): _n_heads = 2**math.ceil(math.log2(n_heads)) m = torch.arange(1, _n_heads + 1, dtype=torch.float32, device=device) m = m.mul(alibi_bias_max / _n_heads) @@ -813,7 +692,7 @@ def build_alibi_bias( alibi_bias_max: int = 8, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, -) -> torch.Tensor: +): alibi_bias = torch.arange(1 - seq_len, 1, dtype=torch.int32, device=device).view(1, 1, 1, seq_len) if full: diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index 7164e93bd8..1cb8b5a045 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -69,6 +69,87 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch [comment]: # (TODO: Update tables with torch 2.0 after next Composer release) +## H100 80GB +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 30b | 8192 | 8 | h100_80gb | 27.37 | 36.5 | 1 | 21 | 168 | 1 | 10128 | 1266 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 8192 | 8 | h100_80gb | 27.51 | 36.68 | 1 | 21 | 168 | 1 | 10179 | 1272 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 8192 | 8 | h100_80gb | 27.87 | 37.16 | 1 | 21 | 168 | 1 | 10311 | 1288 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | h100_80gb | 34.5 | 46.0 | 1 | 21 | 168 | 3 | 13873 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 4096 | 8 | h100_80gb | 34.61 | 46.15 | 1 | 21 | 168 | 3 | 13917 | 1739 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 4096 | 8 | h100_80gb | 34.51 | 46.02 | 1 | 21 | 168 | 3 | 13878 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 8 | h100_80gb | 37.35 | 49.8 | 3 | 21 | 504 | 7 | 15700 | 1962 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | h100_80gb | 37.33 | 49.78 | 3 | 21 | 504 | 7 | 15693 | 1961 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | h100_80gb | 37.54 | 50.05 | 3 | 21 | 504 | 7 | 15781 | 1972 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | h100_80gb | 38.21 | 50.94 | 6 | 21 | 1008 | 16 | 16433 | 2054 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 1024 | 8 | h100_80gb | 37.83 | 50.44 | 6 | 21 | 1008 | 15 | 16271 | 2033 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 1024 | 8 | h100_80gb | 38.07 | 50.76 | 6 | 21 | 1008 | 15 | 16376 | 2047 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | h100_80gb | 38.64 | 51.52 | 12 | 21 | 2016 | 32 | 16816 | 2102 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 30b | 512 | 8 | h100_80gb | 38.38 | 51.17 | 12 | 21 | 2016 | 32 | 16702 | 2087 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 30b | 512 | 8 | h100_80gb | 38.47 | 51.29 | 12 | 21 | 2016 | 32 | 16741 | 2092 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | h100_80gb | 30.55 | 40.74 | 1 | 3 | 24 | 0 | 15250 | 1906 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 32768 | 8 | h100_80gb | 30.73 | 40.97 | 1 | 3 | 24 | 0 | 15338 | 1917 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 32768 | 8 | h100_80gb | 30.67 | 40.9 | 1 | 3 | 24 | 0 | 15309 | 1913 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 8192 | 8 | h100_80gb | 37.02 | 49.36 | 5 | 3 | 120 | 3 | 30075 | 3759 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 8192 | 8 | h100_80gb | 36.97 | 49.29 | 5 | 3 | 120 | 3 | 30030 | 3753 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 8192 | 8 | h100_80gb | 37.15 | 49.53 | 5 | 3 | 120 | 3 | 30179 | 3772 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 2048 | 8 | h100_80gb | 41.03 | 54.71 | 20 | 3 | 480 | 19 | 39532 | 4941 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | h100_80gb | 41.29 | 55.05 | 20 | 3 | 480 | 19 | 39779 | 4972 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | h100_80gb | 40.97 | 54.63 | 20 | 3 | 480 | 19 | 39478 | 4934 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 512 | 8 | h100_80gb | 42.63 | 56.83 | 80 | 3 | 1920 | 84 | 43074 | 5384 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 13b | 512 | 8 | h100_80gb | 42.51 | 56.68 | 80 | 3 | 1920 | 83 | 42954 | 5369 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 13b | 512 | 8 | h100_80gb | 42.24 | 56.32 | 80 | 3 | 1920 | 83 | 42684 | 5335 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 32768 | 8 | h100_80gb | 30.28 | 40.37 | 2 | 2 | 32 | 0 | 25983 | 3247 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 32768 | 8 | h100_80gb | 30.45 | 40.6 | 2 | 2 | 32 | 0 | 26127 | 3265 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 32768 | 8 | h100_80gb | 30.27 | 40.36 | 2 | 2 | 32 | 0 | 25973 | 3246 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 8192 | 8 | h100_80gb | 36.39 | 48.51 | 8 | 2 | 128 | 6 | 54355 | 6794 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 8192 | 8 | h100_80gb | 36.12 | 48.16 | 8 | 2 | 128 | 6 | 53957 | 6744 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 8192 | 8 | h100_80gb | 36.43 | 48.57 | 8 | 2 | 128 | 6 | 54419 | 6802 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 2048 | 8 | h100_80gb | 40.48 | 53.97 | 32 | 2 | 512 | 36 | 74217 | 9277 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | h100_80gb | 40.43 | 53.91 | 32 | 2 | 512 | 36 | 74132 | 9266 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | h100_80gb | 40.46 | 53.94 | 32 | 2 | 512 | 36 | 74180 | 9272 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81676 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81679 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 7b | 512 | 8 | h100_80gb | 41.88 | 55.84 | 128 | 2 | 2048 | 159 | 81417 | 10177 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 32768 | 8 | h100_80gb | 28.03 | 37.37 | 3 | 6 | 144 | 1 | 45654 | 5706 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 32768 | 8 | h100_80gb | 28.0 | 37.33 | 3 | 6 | 144 | 1 | 45607 | 5700 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 32768 | 8 | h100_80gb | 27.91 | 37.21 | 3 | 6 | 144 | 1 | 45465 | 5683 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 8192 | 8 | h100_80gb | 40.35 | 40.35 | 3 | 6 | 144 | 16 | 132753 | 16594 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 8192 | 8 | h100_80gb | 40.1 | 40.1 | 3 | 6 | 144 | 16 | 131934 | 16491 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 8192 | 8 | h100_80gb | 40.33 | 40.33 | 3 | 6 | 144 | 16 | 132697 | 16587 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 2048 | 8 | h100_80gb | 44.43 | 44.43 | 10 | 6 | 480 | 95 | 196229 | 24528 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | h100_80gb | 44.42 | 44.42 | 10 | 6 | 480 | 95 | 196171 | 24521 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | h100_80gb | 44.2 | 44.2 | 10 | 6 | 480 | 95 | 195192 | 24399 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 512 | 8 | h100_80gb | 46.05 | 46.05 | 40 | 6 | 1920 | 434 | 222413 | 27801 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 3b | 512 | 8 | h100_80gb | 46.38 | 46.38 | 40 | 6 | 1920 | 437 | 223994 | 27999 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 3b | 512 | 8 | h100_80gb | 46.14 | 46.14 | 40 | 6 | 1920 | 435 | 222834 | 27854 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | h100_80gb | 33.6 | 33.6 | 1 | 4 | 32 | 2 | 96354 | 12044 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 1 | 4 | 32 | 2 | 96182 | 12022 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 32768 | 8 | h100_80gb | 33.51 | 33.51 | 1 | 4 | 32 | 2 | 96105 | 12013 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 8192 | 8 | h100_80gb | 36.66 | 36.66 | 2 | 4 | 64 | 27 | 226682 | 28335 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 8192 | 8 | h100_80gb | 36.74 | 36.74 | 2 | 4 | 64 | 27 | 227183 | 28397 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 8192 | 8 | h100_80gb | 36.39 | 36.39 | 2 | 4 | 64 | 27 | 225010 | 28126 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 350m | 32768 | 8 | h100_80gb | 28.95 | 28.95 | 1 | 4 | 32 | 5 | 191165 | 23895 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 32768 | 8 | h100_80gb | 28.88 | 28.88 | 1 | 4 | 32 | 5 | 190718 | 23839 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 32768 | 8 | h100_80gb | 28.98 | 28.98 | 1 | 4 | 32 | 5 | 191350 | 23918 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | h100_80gb | 29.9 | 29.9 | 2 | 4 | 64 | 20 | 335478 | 41934 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 16384 | 8 | h100_80gb | 29.76 | 29.76 | 2 | 4 | 64 | 20 | 333921 | 41740 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 16384 | 8 | h100_80gb | 29.95 | 29.95 | 2 | 4 | 64 | 20 | 336016 | 42002 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 2048 | 8 | h100_80gb | 6.05 | 8.06 | 3 | 21 | 504 | 170 | 349409 | 43676 | 1032192 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 355985408 | +| 350m | 512 | 8 | h100_80gb | 32.32 | 32.32 | 56 | 4 | 1792 | 2194 | 1123449 | 140431 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 350m | 512 | 8 | h100_80gb | 32.79 | 32.79 | 56 | 4 | 1792 | 2226 | 1139870 | 142483 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 350m | 512 | 8 | h100_80gb | 32.77 | 32.77 | 56 | 4 | 1792 | 2224 | 1138963 | 142370 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | + ## A100 80GB with 1600 Gbps node-node interconnect (RoCE) | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | diff --git a/scripts/train/benchmarking/Torchcompiledebugging.numbers b/scripts/train/benchmarking/Torchcompiledebugging.numbers deleted file mode 100755 index b1a0787f02f8b3964bceab4c860b6a5aaf679ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156370 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%0D7H; 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%0D92yZ{fCd!tZQNi zDi1s44DMVzeT68drIzr}LQ6Yai==}z0BNX)G}PMvV42p=8N3Ng7J|DTW}#NVFz>7( z_dUs7Y$O>>&frdvVuq8PmgL52Sr_b;$aAXb~Nb8{Tri*VJI^gPT!#U z^6OV(zi1KVXyfZU!r8~itCZ)J%d-YWj^qnbi&PhsR!&swQb~aixIVgPF8w-0{0DfS zWaj#^;N!WqWcEFue$M)h!QGkgS+KuV^0hu*0oWE)g&el=K>BC}R@ekQquOCB>v$hE z1PHgna%3%Z7JLybfc-MK4dw7fOc-*CU;HK5JV7j0ti;N3F5u`8yf?#69=N|V@hIUy zcEn;e2@f9cgHwA~59C9=SjRtXHA{IEoqCzgl;M(p0wl`-FV|)c;Yw=Z#{}4!8>mAvl z6dqo{`(S|sa4rw8M3;>acT7EdIXgg5OhRI?BhZaXh>Kaw3e$WBwW(<-1d5EZ-c z!3KLSB9wTrfi-**o3w4%HQ{R%nKw@yixTmeK`@rptxYlqp_K#0`7kL5&!K_eq2{|W zKBgv zVk{+VD3M7=*$Sr)$yj9SKXlkIyDwo+VPvf2+6IJ<_{w|Hbi7uErOSVSv#ovbwIh_) z0X%xM%Hzk5X>L_E?hFB$UG3mQihXdPRD|2Kw(|x1q7l9@fS>qElIZ3V7%}D@hsH(@ zV5pXs5yR}hiX8ta4IGPzVTfx7r6Cl8)7*Kx;&)m(ZL!#8+j(HXE@7HD35!GuDfo(H z=tn8YEQN;XAj#l&;;`R=6qdrA`(=22x+ZICBlwJ(j}ylUjF%t~c#GL$h9I zDUq4%3@z2ry6gsl*$wEdg$tAa5Yj$-teB~=o^Fa(=|rX>BGWPF=?>wZB19L<>+L&%l3zjZKQUlVq17P%<+cc3*f+Zai@WUBPTeU(zlsG z@*Xtx`X>h7d#xB)m+1^XR2ewr+Iz@eTT14L1Szr3rhy|7#9b0&Bg zyr}-Y;6=>^|19EhBB{hHs+WV9Vf%;>Yaw|lM9yo9Aab}Axk`$9p;iu;tkBlPh7ww2 zC+YvLm#`%HsRbpd>>4gs;@3aPwXANPRpL6UkTHl^XN3mA)u44&^kyEGthQp|9fRAv z`bIYlD~BQ1oME{6p$`z+`~w`|otFJ<0hq*L7-~bNco=4Udbb;fwk2N#*YVQ0hKySy zhpsZoBpLO+YyKr(#IJqh0)j} z8s@H@De8%@ZdoHpsc_sN$loA9`GAF3HE#YO#rqg*LPiaMr5w_|I(!l|SNy%MM6kXD zrlwHHPFKz|CN;RAde;xiyGA2V!1n4)A)&)yQ*Zz@*mTukQ_{(Fx){Q|7U()ti#ww> zP{>#tGM?oSUzlsQEvXOpekU3Nos)_1c!Pk68QgBzvo+>O9k|9EK*r<=j98`frxyBis450RW1i4mUK9}a zb$MWCN(c3-lII$8Cg=x!SIOv>s!;4`dSIR?frg1;>r37rb+% z@%AMGco&3v=1PNI#Rb1pTuH*D$I{%e0#JL%O6EE@zub(w6e%6rr z*LXcL@TIU9)agiZsiGsr9GJji{?OmBI>!7*4)dZ$Q|IADU?t%b;e9QTb!sJ^Bx)+@ zJ9VP;cNzJg>@6D8sTFlqt4i_BeAdcZf~?K$%q=7*Cc^*OGP9Z1`He)@5_SL+oX7-r zM3K^$6RoB>y_JeQMRpKr1WTMveZ-LAf%E>|OqwqX(;6hhayuU%EBIpVa;BJ)2qYFeyMZ=D`n|6We{~Bl#VI!j=Cmh@mv4c%9Z|5b9Vx_Pf;x)hwLrh)7nWKQv8^&)jo`~_tELipsRKcjgIfYf?Bio6u*yWUCjj6D zbEb`8ApA#)1&2pu@lZYlG=@b49@@)8r95<+hv3zN*cbPCLp@wJBucc3VmK(*CrZAa z$ylh7kII$G9PRK+(dG+-N8^0nc<=h-!BwlN%A5smB<&q>mQ2L?@%TnQ_Vtk z-La}WMzhUA`xhd0cbr*>P}ZbS1Uy9ffPRftF!5Yv7TWh6^33IBzC%BdIrt>=v(?b%H1rWcMGVK0>MQAeN{l;6;MwE^lJef-+)eOKxKdtOaqh)s(89( z!@jMlGC?Ps-9q7Ep=gz8XhldgZoXM0*ew#2iqLggOVbcX0%+@V#y#QcXmy51Z0gP4Pq1tc8s=OhzY^A(`8W89Hr3iK*;{1C{txS7K^R z$t9-lNB8Z~D0;N$tyKoJ=&g}Od&){oLu^p>BMRxVuNJ5}n#;?fnk_OOk%_UD>X}q1 zg?V`cOE-(4C=8a;&G7Xyje&e285RcMJH!F|7NWAp^lYd!l0dk$6)yFU&QN$Hk1MPz zM5;n^2kwahP*q|o?i+nmBhdwmmCrx?B%c8hDhzi4_WHq%^gNx(+Y4Yl|9X{}(iscd zOagW}D~*LAlMaP#*t-4xD-b!R7fdm8g=pum5XEiSh=cG4gnd1!{ zKg}Da&FTp@&1AdU7#}HQV93~Qcmk8XC%dH@rm(eqV4u1@|0|H{+>w-+QnK7$HqDT! z?xd=2@;s^fZw)0N3)#p|s*vsNlPW^j^CO;BZ&*3tB!K%9mYv!(0mhSwUoDoo3_LFLD4d1a^3`A@=yzf)I>L#x# zUjIezLHo=UFW{WbH_aY;EANMy>uj1qsTp$=o_*i`gH(t2v!6dqc@Lxns(ED-GGSvpKjV7Bg09*!Mfw$}~EQNuAU^=Y(b zI4+YwI4j9_Dc-~Ty70=r)>y)N60GTX4u^mQn|adRJZq2PjPPK);i~8rH>dJ5Vo8QCHj&aP6AVvm^W*#EWp1#;FConyQ)sU71Pk6$@-us6gZ?d9D+ zWZ*|ZEfpqvC)5X`UX}=CCT`V5g+U({7zk{;ZO8^K>*XNggYsL@;BM9GBJrwaSY8AX zT)(!cm%(Y+vm|Ln-!_-%oe6KNcg^)l7ZusnC9;?3O$5P78o0%)GT9^ch2N`P3=7Gy z28hW@FU;TVe4Wi|tiyVdV7NH9YHhirVQsnEnk<&qUX#TNF^<;lNJ^Xa?)w?)VY-dGOFP=`jvw!$rt2bBK%(AP;KF4Oq1ZQ6&$>s5eOLq z-w)(cTY0j!3~JTikD(zM{cSgllaZ0&kERIgnwqR? zYC;HWYEsv#+5S^j=MP4z;xQDswdVx8ljIVpzF!5eSfg_Qlm2 z#l%Wqbz_r%Qn)@MYg<#e{vy_fPxHRCWpX7H2-hx6{<3gQz3@AbV`(RXCGUSLU3aCpA6Q$;zC?XKDI1o?MmxgcpOCU!_f3K&gbwkr zgm5-_qOx9~Q3-F-i_McY{uf8~9obUsyLrP46w*UbV z7`UfMO>Ef^WN@^du&Ry(?s8-HCU?b{L%(a38wV2)gKrJ^q5>O!i^0!B)zXEH!kjq zXS`gE^7rFbP##jHK@6`unj&H=0Jn>T)faO>Ym+`uYQwkHpVa_?I#EaMfTNBYG)SQmt@03=+$9GD3OtFdY)Tv9lq zF|6UjEnw{rGF)+BmTe)x!u2b-&;w51c3JD<-d-{4RU3`+wfk8zu=HzRPUOql`djLy?uPQV{x-Eb(Os=Oj?d8 zP7oj77ezB2yu~1iV`)lz93DInl_hmx*7vO;kME&~JU;Jx>Ir80_v=_oAP0>-^Qt{< zL2sT7hPJNKkv+(g?rMahWT`HQZjoX^MuJP#Y zJTu>TBpWl4SH|EfO9S6gV0AHo21|pk$+|{Z)d)+oBI-9Ykc{r{Qp3)G2_De(HoB%5 zi*nL>TIwwf%sj?2UIThw)f*YaaYhE5?`=tKI|EC{vHeG`!(+U@(+MuVuPHoc%y``vR4-souB%Y(q5F z%nH8d%nD8tvjT-9SQW^}j*tu&s$TX0CD+#yy>-FT5r1M`K(q99iBoSxtP5CTUBF2A zjGa<#*bey7&|sly@uhE=S(4-;*aJvEyl(p~Qfuyvl%45~x;x(JZB zbeDL&VcFv2;v}rSp+t@hP?kf7tCFXk37X6y>evGys1NkjH3vXRMnn};0RXlIC|QrF zWek9()(cIk7dlN3C2iJP3`sR2YPI{r2PG1-fPel!n=`@^gORlz)!#Ty70R7=m zV|95_^c0sGnoaq4zOuzV$(;CJm%nwCLwV5MRUM)Ez0p&oyCyOhCNr6BnOzeBQavR` zPXP@=`B4{?C_9n}@&ocY*wj^buS?9mE=0$9$W^{&91$yEQlkgLG^eb2=h@HzOlt0R zffRMGOJ+rKM62XBZlL%bIoY7?g!=l)jT{Q;71eTRnbUdR>tfJ(-s_^e*M-x027Xzk z^CZgXxv(TQZ%d|UF_15 z-4*wrzS1bO^B<06WLbK->u(TXAmLVBqkjZt}u^VBl15!I=MVvPS$i`H;7?%z<_-i6o*!)zDMbJ7(?^zI@Zh zSPC+PFMqsR-d>?CzOGSv=iTsf*Nf`#c;VypmydENS@kwafC#~qGQkvGnM3tdTINvW zZTdVz1}K5n8Nn16-jgTo6+LD&*D8;-Q*gtj(!CKSSrs@$RnMS#K$w%{Tbnu0Z>)4z z%qe%$DiNzOGO~ zNjD>c%ftXIO)(a3Lb)j=WutputySQE=Oy$C0yNJE3p8|TE1Vaq#|&JvDYj-8_W~kI zKZ}5gvg*r!^?LYi$hPlwuKl=_>e>%2B@^XSlZn2y8fQrh%k+~bP`B#b`f;hktsh#h zhsu-&J!`c(YN%7dVUb?V3X`xZU0DSv$~aqA*%_F%d{jw+iWL>q4)aMe+3%s> z|4~c%=vG_#=<4xTm5)R#3VSrTI3uX8{*j<2l0&s!ArP^S+ZE!?l3gJf*WMQLw^Wdy z+89z@1zFG5kOlSXZdWd>t-Dq9ruDmJ&=&>3NuoTYe0+nWF{eGWZ*8ep9(rIAa2_n7 ziIk)_mIh1TkNU%^M+MJ}SRVh(p$wMC5i^MX7Bt*k+6p@M)m#CC{c&(-%6fvCIjGly43XQcYpvpQu3SNk6J(~nQThGDk=wypIcpaVW20gsC zTvAdmbfX?hB#(>b^2RyK8ZOJ^6%^wW9+lS?y>4zouh7YzI14 zIQ$bj*8kj+xjwC`4cW^G{|5$RW*k^${rFGlR73tFTV_s+YOrPgs70MabQbk#Q6rt` zw3`jpPW-y+oX@F0{j4U;eqckoY;sF2taJxy9M@ZbW&_f*KeG-*a|wfL>Q3{)68e{C zD>Mu-@Q8L&fr`Th{oSJ)YS|+0$k9>jxEBf-%$T86FbME^>+VFz>#e&DK)pH#fPs2- zP61S^rp_sYOT7$lD6CiJKw*&K%?be)s8{Ad!+y}ER(pTf7-;~2rb>GQhVnCc=b_d_ zWHyoLljjkh)UjQ5KeQx9tJu$qG|I$v8gI|fsZjoJ8NCA=Y{tkfHA>~2AR=VwElS}C z?;xP+Gk8atggJE;r(XnnXceZyZQja|&1LHUIddfcOHG&E`zH+1D*jde*jpJjgK{Iw z9s0Md9LCL`+c2Z~gmX3Zr|Iy<4kRWiiINfCfx!3wnI0aP_V1LZ|CNy?2bSo~m2Kvq z?x0mnS-*@}#_Rb6$3GcdGf5BrRC8Koxm;ay>UhkoY-9sYbNX%&Xig7)QAcyC8C+9y ziiqaaVF*|TWae}5B(q&^dbA+$mZ;Ef37z*vv=DQ!~FUKLX62*M*V5tG^CZjaQFb49YJWZzDwE|oCb~0@8t#6-p9p!1AUD|(JbGo|P zKJ8CwP9qNezo|K0J*KYaRFW^2{X6Appc$t;9jP@cPxE`|m8UM_|6F;xwI1cE`@d11 z9w5q7cTL;`P@bwrO)%fBmFiTtE6$kIyW-Gk4r^4MR!Qb$dFTv>tE)Oa%OUDBz(?owIHEcQ`}< zJ*rdAoV%9l)L_S5*ZLkE0tuZcO+R6MPnIq&k);a|`m1Tbh}M*|@+PYRRVq`+5UnX^ z=3RFeHR24q>(QEW=G+8PYyE(;=dQgv@teNywV`CU0_cq4CRGWxTN7QOK~q~xYf5%0 za4OtdZ5{@Wd|b1rt~E7SW>>9QRNp;aWt?4iwc=>iYDL|>)96^WHHzw6r_u3GEl`ww zVu1oo5pGC2wF-pi0!u%7z3EQSo09!DEZEud80kl_O+==)a{W z<@Bnco2;cRH8x_*r2l&jDW~fEw1yOvq+6jSPS;nZ7X={bSnJh@x}5F~dkSvf?xsvTgslb0FexfhhMdTZVXo|1cA5YhnC z^wx4W9CV9&8dLh>o-Uz9e68ZE`3V|jp_v8PUjC1z2r}2I_IQkW1LvwNQ|lP+{`2Ok z=US+>ilClrHOk9A9YLC4T)GlfvV8_52m6e=W`$tDn>n8dT)WB4xTX*aGh>&eh9k6! z%QJUsl+WL`_$PQ}oPt)*tbs=WdgLlbm2PMN*qF~_!pqF-YNyC_JE~E3xBDw*s??r^ zeW$H(fZd{X#8H4t%Eh)p|26J>P6OxG5izjQ_^TkXR(Z0!!7TqU5_>J z)!q4vK%<<$^&OGc^#T>}!6ACer#Q5)UYXOyq)e+-6deak^1)$4z5d7c-ypSBXN)ob zU*?ca>*x?zp&6-Qj%))58&woj6qMZuPpa=Q* zrwI8NfZYOJY4jAzLn(Z3ZkDv5uE1aK_DRPYtN&)&ouY$BB zn!q9qUPk`yF3M*$G;v$&-$fbCDKcR{9SO7$r}U_!$gHc!1ZQ^jY@+<=D~UKv`h*@6 z?+mD>#)LI&t$ruv`TBNJUKilddUsON;s5zoN}|Wi8iuL23srF3#sjCht@;ncG;Aa7 zI}9V2oM?=Tt9FAz*oFX@Wr9)?5A!psB{^eBPPzbBOyxXK+kI48a^{ktODyMs7bj3W z)^hZOIGahmBd1<4rLCI0R)DsRvzjCmzK<&CNuVx`&jRV;jeV6Hrz$-sXgk%QT1b)0by2_T*I+4GuQMmkRuWY?bFw#qHX&7jVievq(n9^t zoX~T1I!)%=dS_1cD^HX3W}Ef8bK>kO>k%C|)5?0J5YD=?9x3Fbfn_!R5iKTXU}+R9 zAVVaJ>H1#PhR&!Lnx==6Hfu>C=|)7YHebMvKiY0qcj9EQs5D9;2{wrdHXqfd2D{3- zg2*eq=m2U{*ruA>j7#OY&A?Dtzu&c9Md=$3S65M5$sy`fltLIlPEp#ur9n};uf-=7 zrII|SkR`m2y3$=OYUoP)wvY^HQC(LG0R|1a(iFYFr|NrAuSq{TdwT3tO;`HC>2K;v zzjSu*-)WgfG00}UMmbQhQzHv%`JXCG>vQ*Xv(=||qy`gZDO2J6ceJIEAO6!FsaSl1a14i-xc26pC_w;9OpJ1nFy>6fWcPL8}{;0bJwU)B9 zb_{6iw5FP}Lki6%)r#H#ig3 zPi#5W8`;%s)H}uYnMQGV57H{d5kk4Cu&(VPC{6XY(tm1{2A?n2&tMV#PuceFYVD|1gzt3GDz$Sv5VrD3(6V)+jfe%9n?? zG7`ckW$^dQ7IjLM;mB)DFC-^caa`xfjC&?qFw12oFO zJpum|w?JhIgz$~euX@I_*0<=hF-ynuVt8IIL-&?y6pxRUYLvn~rA9^pMfDG=JMgeU zUz**iYNu&-r;j^LmvjP8Ph)(^PE&QK>iSaIPW$rPd`@5bCMf(|he1 zm*F4vrT!htto5FsEJuL8^y-NE^rfT8M$@}QWR9!P`_u9fpVpTuhl6n(36>+G@0v@6 zT>=6{4k8M|0z^tI2k7JKC`U2wu{KIBv`(Dt^#Ds@xC4z@`Ra}?PRL8|KRpnIqkfXh zBQa*dd&2&C%((z`&+OX{^ROr#iyS3Yad?=F02(5;KpdVWv1S7-O~U(wi}x|&v?E8D+Bi4dT zc)?DzMZFWDowhrXYj6-2FUFz)v0edX=^i$ItV9?95ny}=pizovEx#{22{C}wCy^?h zL|HqD64SBgNr>gci`|JJ92AokK)iYK9TNR~gV47Aa920LxKvuhyyMZ%CmQ9I*B6~j zXxK__W|sORc*jk_JBgD}oP{d?a8}#)!2R z^bYkt(74*}gAh^skT?&E2J6iE{^tDdmJ&1n;jz)MW46bTh=Ie$+JZl5P5OL{rbgU= zf#`gpqn!hi(h#y+!fw3iejdE4&zaXov>uBZODrNr*#KMh0U8gqFFGj}f&YEoDM8dJ z0k~TU%*Dr%lPFxyBF-JSUm zS3=}0qWmC2kHm(AxlnpKP9CqYL`rOf>}30BRmyneqN^MMDZO%pIEtoZx|H#ODdU|m z=XRbZp($QZuqJNjrS$4a!@x^(`7mCYjj693X?4SR{fF^rDP1(_A$Xywc!)|rnCl)Q zaf!g`CcJK0G-mE0G|G1XGgfOet3v%?DF~ zT-MkO-1iqdCnq6Gb#jumlJfvBNlOZ;4Amv{yPePvMak2WP+Mm>U|m`gp!@}5RP6Ty z_{Q`4ffv|73`g-;nS+*TVj-X0NcRH|QqLdIf-dk=AEQut)(LhH=36SnK6id%|meU%V-|j0Fc0Rv)-d!;$6Tg>$Iuhlyy?} zw{pLRPymwWXfh^C{B9!6enDW8S>u~715{wYcDspCqpa-GLq1QeyNMuK-CVvON^T@2 zy{W(-p`^{dUnXf4V>_r4yunqlY=*I9k~ft6g_Jyu14og2jz0prvL&%e8s*Chd!4-i zlApamahUd`52)=0=unouz^A38Mm(=LrC*v!@R5{Wts_GgP&!8Nh!N;g8iu4aWPVIn zO*UcT)5V_j#vGMMsGEenC&`385%8@Ckz;gfK%c_LWR*J^T` zq23r1w7WKLy8$a$qnAdzXlHj_NEQr(5^;ow5f z;f@uGmvzZtHaN#>&6#nLs2?+2=J~cU2-XQQ=^d+B69)>FFh~ZT1|CPFc**j?G7|@D zCR|Fq&&i}x2z0=cq65tQhGGl)R3@|EiF&S*+B#8(ycv6$J}4SfA%*Y8YhkdmbEd$zn1a!I`qt z>U6NyNYXPMLQQL2eNp{N_nOb8m#_Ko8oe{5XYVj#tCvH(8dp?}E4vz3bd9TqHLhCM zxZ>Bi5?8-sT_DIw2J>Pi^I#?P`q4_dlxL>C-W;7|uCKC$zXN=imw5R{_#=JLT7LP* zkZrc*+Zp*KKV2wNg`$s{%Rd?*z9W0Vng}|*48x>t>W^@7z8?!UIW#JcEkx&G{bOq^ zAmF?g;9$ZEmI2)PwBcNCIA1rM?;Fm~pdLbAy0)3$SfNS-Fj3ZEQm<_Od2pwlY5>hP zoU;hLHOaN2fbHYgrEHYUQ{JC{?z`P#0W}12uOb29u%He7I&N+BjZJ%M1bsUMt4d6e=e=LBzH-j2DYO~Qz)(SgH9)J=u^J`D>-y+&TMd~2HqP<(1<}Q zrpU5X+0^lpJh0@8@=ydB;BezmD2SiI=5UL5kkc*0s%4mDxJ}~vGWtO*H|!s;7iAde zx+*SuSteJp?eP83USxt=9p+F3j zsmTNm*mtg=>@^1N^|CXA0SLe`kcUAyMM$da{nNu&HEDj|VsF@oS+k}8|MIhP;3d4& zOUUc(_W7DAhubf0g0_|O!3Y(m@}Q$L=`TRmGA=%t6@=QvqP7OLqZRp21lO2VvB5CJ z2Ak9aS=v#ux3JGJ4Ecw_e=+B}Ql~?~@CW%B{=jzY|G-F~E~3UP)W_+9zpxtqXHOa; zYQcXQdd53))V;BGIo9|CCUF4|0ZaCjJ3uPu)NDf-4^DW^2?{{#| zX(kak!}x&74_CC3J42j^l|J~k;P|6=$n4!m;-CuwddyHY?0^&n1+4a#@@WDrYa5^19vf1L8yOzT2@q&RLusQZKE z(z8EUkc~g<1n~2{>i-w->;<2vGvpKKF##q9f4qp(Dk|TM*DBw<9`}E-I~>h@FUiXs z+Q^H&*&W-rYYbBwNBDn@FFn}_z&H?IDvQub#ojO#B*#$wu{-ASI)FgpE~^))FAs(P zO3Hy7X7eW*+u~ZRI{uYA7|T=?d-u09E7fTM5>xEmw-9kCd9k-0OOs&IBKn04Ij>k6x3zFPf3?8DOM)!h*rAyPl5T2E`(DVHF(I!Lf+7vi+(GoeHpv1mQ*y z-vszoM_eKZcY;_r${3B1)F>wi4}vJqaj9P8oEl&qiL|To;(d<|5)w1gm=@znQ$& zhWOX|wP4RM^z}@3*1s{?I6Nh2#eFhYm&+kOS(U@gl;D2lCNx1QEd>8iDSr zq4FRI{pg^I;2Yv-=RGmR(H<)G%N0}?l2a}C=#F|UVh4y?NSelsMZw{iJ+W|L70Ib_ z2<*t>5IY0{jyCs$s{qwIzVNvpEb^TRNox?L9c zj#dXh2EKZwG(fI>yP2FyVITfJj9|se2lu0_hDW{Op+~?O)YHdv`(WS-jr$S~rB`+Xlt#=A)U=eW<5_f*Hon z&oXv?wz2bbsyYu25DfQ+di|l^B4e)saH|_yT-8sw3;}$up_6W;lgkX9bOR*m0C-V(NxN)7#Gj>ukE=)XcuBApb?AsV9xAJ5ERvG*Ev$21x zjr}V!_V1UfTSHT%e;aG{Z&R)QZ8h}Io%C;~p?~g%{_QgMZ@003dyM_tYwX_+L;pxU z(!cEnBHX$DZ8P@IM)!WARWrEoe&dRK(PJxnGPA#{ZxQvs=KV&d1tME?oYdGd#Pa$i3;{!lk`mGsAjKhymY@=kT(*B?N1aQ@Zrp!f)F) zd|kD$8WMHTcuS?<@L>bJ`frY}9@Ll_W=|q$h>78+WXn+M0A{XBYDG1+hWT?m52Y{% z#v_Po%#@9HuNl->YTg>R^UH`a1U9Cs2R3f;i4Yo+mBXtdXw>7rrh~zK4Ma93DyG9c zY3B)I|?UWC-F0hq&^4ZNyCu@&0{nM5P+49j%Cm z|ChdSD1IN0EIs2*EIAE_F3|*1Y@!Kj`#up?WD`xoA^%pFi2W0>njisYNXdy9ymxY# zDRnUK4VdIQ7@Yx=QX50fov#v^Uxy*7)}@*l(`^9Ejy8WAG`*@ zEfZk@p;nt~>o2~pe(?JG!Nv814+9w5bg$j!k@}05)(<{fKloVv;OhWxnHV0?61B~; zvu2MR28#;AQeo==-6}=mDuv$GSiMT2bCRb!$zgQqpKfWYNr?F4bI*e3e$$A743{1O z_*VVk+jYUW6EQ5A-OglEGtoVnT4@8?`mqq(S}HMDIt52WM;i3O>Woa9AKoMO^=jsL z>w`Gkx;sDIn#JmnFM5Nf>6ZFyJ5-w0+fm$F1R`*+`8IZ;L*s@;+PTU~dYfGm6Rodm zU^fzqTmHQx4c6nHtybv593k}zb40vn^7IeJi()dA6pyAay@gQ|^0-ImNrji-3lGg>LR9{MFPo}VoK74@esQJUyZ?vMlmaw zBBj7qCjDOG=nhtzj$WX;a`Xy!^b(6MG}{i@*#N>hj$Yt5Yj%*>h6G8npi|~CaSXa6 zi(}l6@*swJ1HaM3hDF9n8Y%i&x+;ea9TnH|TVZ2mA6gK`(}!YbhBNwD?93f6yJ!Rv zs^PE>3nme{>}yn9(ua^8V{9a zUE^81i0B@p`^PaY%qfXnImPQH&%#bQ-C1Rha&;4sC77PtZuQ!n8FupVCFRsA{L#8gW7c-a*rVy zk9iI~B(QX+;2V>lf)A6n3|tOpH`fg05d#6G-8?eV6@1#H@+XhMoqN5K@PyX6$L6T4-*8okR+epbOZ+M8YfkP=wUZ zZ_NbO%6{<3F+B2|Kgr_n1c(i$i33-k))gO2Td|E6QkQ% zGcm0dnfv}>85wKmXy-5KJ(iLlg9S-tDtwaz-J`Td(M-G%UR*Xb$SFA0XC;7vc8~-U{|hor&d66HCt#h#Dt^s`O!u`tlJp zH9as4i-Si;_xBD%?%rV*O>|+HOQm5D(gVu&?Ma;Z!(?KXx+{gwW_6`#PmyVY!VWlW z7Xp;oce?1;Sz_BvnIeg@l74Ls3xtDBI2SiNiHnsbG9MbCVQ-Vb{5=;9Cy8rNT^8JpI?$*jsmH|T^ z(U@Ilm@w;uha4qE;9>m>$?6>l_4;*Z^Z3PILR_?5a499(e#{+gp{ne!z-)u*7s@&i z^R95y7Vdhx4Y2VE1GB6RIZXH{sxVmkC={OdmKJscV~39bHyb0Af``@yLorzk8mwaG zWvN^d`?aW%#2mXec0n%6rY;zQ!K+0spcIF-e4Iyj$GveG#wY>{Fs6rQErjC{?MR`} z?w;0_&V=ms*Xs6H$ufMOnISPvK3P zXN}j~L}>n_n@Dg|-c$-!7OQR|OITBZ2+aBLSQc=YQC1uV@qYo}LJqjs5`gz_A_!C+ zo54p}YPi#~#8nOaGx&0IOWG`aKtguZ*sqZwxJ{$*+5C{!Xpc9QhZm1UICCr&>vrk< zApvrZ>eUix@U^fY8^jI}Ycun59>!TOb!}5i6oQMUNN~F>2_j z#w}T}#iI+=Em22Xk(J1-M_laCA0p$1#10=lct~Rv+YhiS)hguDSY#m*_KX=A84IDj z%=Y30HVoU)t0V_3EDBKaJ>%+n9S1hGpEWUP9 zE<51!-qx9aDzlA zD$um3dZ4b$xwGo=eo(=v!VKmKS;RcS@y#yda&@T=IYW`E)$4!w^6-rscmC%tZCvc> zX=&{wO&lheqpwsG%*D?9W%Hy>&8cPcR87sL3Fa=dI(E}2jw-#i%Bj-E@`mQ}1asi6 zwFA9pOB;!e!phdPZLBjB%@NO>fbr$)?42&2S*>!l#a0y~v?k=&@ zC>np51d)iAhSPvRB2;yNaU{Y^Nf3yhEAi95Fnz<9zI$m3fLq!7k zVqWzXm{9%v1SY6ZXo9W^O(^k~0xRSM7aif(4}L$wZwCCbgeGj^m-ci@MKqTDW?^I7 zGg_l;miN%&k!v&|+lr1aYb!DLh^DNaL;68D(QqD(`=jn(@hMB9qeDYx*?cp)QB&L% z^5h4GF{lfSzj0r596n%lbYx6i*T}etfe~>Ls-a^e5NzG|f6}Qj-C1HqPwvI3MOr%u zMSKzFlUR>5k~xVSMV8xzp%V8w&!>2{Py_{>cCF|brD0gyxbVR40Vy{x_&V@KJpM-_ ztV3+SIlS?;_C+TMtqwnlk%$_NKk0;Y2l11kb~I07L+g5S%@-cP904L0`sd6)mf4Pm zpTtSh+^wUVr<+H|FO@Fs{QQ*ezOL>{Uv=BIN*A>n@@juyUsn%nBL&zBm+IC0%c2Keq`T*3Cg+>UJ-HGXGWNeSP z;Sk$0(r@$tc(Y~pgKUs66t)n8j%hzE!NXr=D6;H8pPtuFGW$0Ct$Vcf*C4blzd8H| z`JF^`2l_((k0=;m=L+E9>c17Cvn1z2%ALvAAj+d1$(|y>HY9f(a(;1`4xzVJcI3fr zI`SaDg=o=oF?y7L8&PdNHO+B{K>E_pZ6v~8LnFubh=V2W#&!W}8oo%2vf5Z*!mkW17}R z+0Mnioo5@RXGbjXLF=-7kl4e;rLDgY>CcON7mV6@PC{r07|o_-O+sS#c5U2(0r0$F z67u^U(;9jPM~@4B zM}F-az%7;r9;HH-QD#BF;qb3QrmA%O{XI#rq!fe)xqqB=HCLLOX0lQL%-{npQu_iw$mbPc*Tu7A)J3*~PP_B^4c5_o@ZpR?Ne; z{kCpD^ZUgkkCwu17wtJ)Ic@gKyS?D91@mxNzl(dftbKTS){4oP-FDzodT!bM>E)!! zWPv>B>G7Md_D?>Nw+XXpYiDeqyl`1jC6-fJS-8W=`9)VYoyfbld>>{vo_Sl4R}{bE z76$e#gz1MReQinJ?&VkCEp5hbJ@e?n+9Ol$P6FHlflb)Gl#@xfwjW*|!)7PUP1`^F z*rlO>nGcvpXKp;6d+YMjuI$douYeC{w=#gq1k9T9Z7=5EytiU7ySeDueLHTEvWnJ2OVQCR&HxxZ6DZ0OY^F7=i zr3%{jTRiXB#dq0jmz7{P@A%z=*Ro$N6$24V=h@@1g0hU)Y3FAxk7Ktzoc-$6i3c~D z!wvHV-vm9q^=$9{&C6Dt#_YN~$(aw2zsNgc-y6*Y=C0VOi+@{oWjUaxuKfAd)|5-T z_TkZJnqYLmqGcO)TzU7fz>7_pnYi!fp0s(1_G3`4V075V50BRVoRe2Df-T;dyzA-n ztGfq5OG}`o%X6|)mj0HUTM6T8{@abeP0gHf5PP8I zS65wu6N?3-`XrrvcRVxxS>6K7Zrw7y_~*$Vws^z+vf+LUZc{*~+XcJ_l86=#yytSAM}9tWn+ycfUYOyaeIUoh}u z^Xv14&!4}+qp7m_5kvay&E9o4JHI#&I9POU>)xrq9!iadTW%1v4=T?rO;0Y`w;aYr z(esBV?(@)Gw(C2+^$Hw&^WQz}>N#BAZr-0Z2-@0IMqahTX$F|CXOYov^I{WySV_UcQLt7s*@yVbm*PpGtIWH^k zIA#-*_TR3^m^J4YXe?gPJ7`}`-d)>dmuaY z!-@{Je`_+uFwroN1>@jm!IywTC_RW zf!%STr2I+dtfEpJhe`qS?A7@#_phZF2-%cZIi+XzU&=UOuSG``+MtaKPOZ3=QM%$4 z-0uCA9lK7(ADs*jG+yMIoGqV>;=Xa3wrmtbLi%bU*F!$ z&Bg4@`76t2?L1N*1vIP&@+ME+kXSw~JO4Rmi|6fr5`XycEDsoj>lELG?RZ&Qesjb9 zJUg~<-i66mU)GK4m`xNh) zb!7SL@}+CxKVi{|(hG^l&vpaUT;SiTN7tt3Eh#SGvD;Uky10I7{+y?{7p2RLDD1fQ z?wl!0GK!ap+2ZH-o*&$}^R(|z=zXW30$#jWHhb=xiWNVyNhdOHCQQ#-RD|!McW}2i zPmXQevVD5~*X+V`7t+^!SUvY=c<(iMwsOx?m-YLe99g&ONd^rRR0?c6 zZoM*l`G;SoF8hW}IsRhf-R&oTyZ~r_KJz@;>+{yZP|Wk&m;T|8DBv^ zryZGbr*d0vF=l^xyyfxf-||;j_%4Pjzun(4^}xE>d9m!aeY9^AtT18YmoLh^dg$Ubf1vDv!aE@8 z_KpuP-XF>x%P!q<`R?WI7nWw?Ug#d&ZFAE6n}^<|tkAGC(pH~O-umm548Yu1tP8tz zBr9=m=4SZAn|x`*-0Ztg7dL}Jat;2X(pEp)SbYB6iZSer_ow%qI9PCRBw(%r=EUiW zb8pLM<=V2D@8?%+$oOzU4HWz)7}@9NcRwG$cjE5y5AZIZnX$0ob(syk2fnz0M^OntTP$%&KK@hWr<>TJHW z?*5A8O-oy{Nry7hmaop7VFGo|L!FgtE?!N$cs$RXU7MD&_G$KxM_In>sTYeA-UMu0 zvU}B$ZGYs#w`SF=dq=kv-gv5zqYHxeecsHtaJg*h;uXKcw;|!of|Pw%Ui<*}`xRc6 znZIv)RrK&g0elUouUxnC=U3ZS^#Igm;N8(ncXm8X`mG=x9^SrFFP0pxD269dF0i#Z zyEJi0=KEvI_wZUL96B2y-ebE_W7s=oIS5`ggK?*(sC1L7q4m zVOD;&5slSyz7d+(#IP(bmnUL_ka+A1lZ1A9Y%i&YWr#BE@?&MfR{J@SB?VqXCGiq# zo1^*b&`>*;Qyw!cEgtg%NrtB8*^0(lF+8ppNVHsgIzMs9#t>?q1WgUDu`U^Fk6|7_ zsfr3xY;l_H8z?Rjn(9oVq!d^4dA%4^=t5)1+T|7>2P!4#2??>mwvt>wUv3=+Eux&^Tm=}K29wiC2b!;tEBq!UGTW3cLFfK?Gun>tG>fS5jGEbth)h#Se4?|#Y z08{W-6XOB55Vs(!at<(8tS8;frL4*-6NJ7PyOxk*Sw9pzoWy28Ql*>2fU|8Ce%k^h z7<)}KPLxvUBCuvn=?9Os_LLS@&YprM1z|f)f`%hx9BP1IB`Rhl$;~{a9>$Oo2!nPk zv@*=^S3>sKmK}t-v&O8K}{DH0#S!74B zTM}CXwaunWSgr-l%OHgX#Z}ud8r|!7>}#l*jWDLRM_P0jiep1@zU6r`dUye+9fL|@ z8NNX^Ecc(G?>N{NW6KVqRY|&-TMv4c%E<4Qm1cP997X(KY*x0k<&F7qxJ?+8)FsL5 zPT&`Q2L%eC_qaXn1Q^8u?eu_@APf|<%S1A~)V)fm8~`gwqG_X54>mE7Cj zmlDLTfSPAdPcTOqX`3LIH|WIzb4EjCAYTA_jAGN|+g+XCn`E#MafK1>?p#*XQC`FK z!JyGR&$dW`S1cRjicml=cD9aY#Z7hakD!uF%j{4lKXosZ=YlXl7l0{y0dn3Jz z7Ye3BV3aT*(Jt)^NU{Xk!I4&F<&M}GEY^4LDXMDkrZX->#VcEKOln0jwD5^3-sfmc z-%zPfR;^?Y2%^3<0TQvm z#tTnXMHs*=EtW)PM3D>g7c?SYY+ey&GZd!t7Ky;?Eivx(sflz=V{&RSsGz5pphRb%*aH8M4wi$CyGpw!?!y8Tr(CDQY1b;Bl~pBx+t)Q)eWwdoPTvksMlVtSFqt1NvurGBeEGJMXR}kr`?wu3-zn%M*nL1hV-3c>AS@41aoosi>Vgk>}RK&BCA_630+SQaE1|da@g9 zVkoTlki-Qjm^V>oHdi(oSeHYi4Dq=4~*@7yww1DzDJZY&4nXdDziRZLgXk9}Y zIBbd8J@&l#9M|=bsRtWO2;#UgQ-aw{=v?>Y8uCngdQI}T$fTaGahpd+aJj7?6U4ov zS5uh0*|JLvu0gkvg^7G>deWhR&w7Y*+cL~Os+fY8P}~HzP20^c!?()4na@e4ZH_4l zDXr_$gl_G^wi(BC4;4mC_VYnoN5#9)GGcrsjvy??v2BKpp~X!e3AL=P;Hs4*IV4#M zhi_A0?6fZ9kal7WpH<&`D(pAB)R>)Zg_Etk;KD=nRJ&u2bEMbutq=*vR z)YP_EvFtG@v4s>^UKU8hRjMLwkTlC^9_0*`ve%*Jf!%S<>GG0XF#d-j#YZvH!^;R` zE<~OE%gr66zEm?z8)8l*5d>Xa*U^|n_DjWJuqt}g=9{54rE_P8KPM6bX@af4sbYxIEh;k+Lwx|fJk_R9| zY?Q)prixo^-^D>8m_kaVRFd3(g_H@SlP1=EmhM%ZMf_W+Bz?lpwz-M71yZcB`%UWF z=&rGTb^Hk!@Rq&3*&QQ40XK{rozR?`uIU;t@HaT2Z648YHWcI~Az_>lBE&aR71r@x zE@T!S^{K8;X_vGIY5r2?KG26b>9Ce;?n#MhuWC8IcoWT#EGW(h!y zv1@q49Z6-gdPfl}y`!e?$&R%2rZiSDC|*m;vbqXx>2fG<)Mx>r(Iv*VTp{NFgwk1* z5@#-h!_ql|Sn3@ywrX|AsLG3HL3qfV6-(j850N`DLS#e_Yd9X^lQdaIWN$%z%NgTc z9nua^yA~j&Y}#{}zERbjez1-bd3hbf`JTx-MZhPo2%S@XwdHQ3>|fESrU56ZBQvfT znAIFBBygH0Ya~;i9B@airpB|aXr&1l6J!Y6Nl5Fj_OOi#WPx`Sk)A}VACr!?+=j5h zYXZ3@hA|buV}ey4lg$#v5i{Dbhmk?-VQm{}zu&k|D!Uv<;db&SSoEd+=2XOo0v?_tX%7xq&$ zF~5jRbIBDb<6ynm7R|BpKye(aLN3;hiE3@joNTou>zINo`ofgfW))jOieVRm9q(ur zJ6zf~v;rD52qS5-s=ca!En@wMy0dKJ6jOcNW}wjkC{I^jZ3jD8%C!U<@e=x|p|jG1 z@TO`ojd~*8^UR28EQqRz3Y)WdohfBzI*~{#&xs&&%Vp$8$MfjGT=|UL(aIzt-bxjz z(z{_=$a1ix=i2ejF(|*swk5%~vgW_DI8y9_j|qHA&b5#+0tUnB)_5)@v?yM%4)spv4qEWs z(|j>4NCKqvjWDXls!G^DqT$Jn%#5maR}$BiR58hO_)9wiK5&Iwkb+?ov;{-4$V@Ad~!jiRaO=U z4yKf{7NI_cEg-CKOKT_r4<8q~bh$iq0sa@b7}Iluy=M=0=|8Fviz zcGGc(Ajy1_kp^zE)W3$a3$>&r6793ZwOY^-C3@i|WG4&f9;{h=`;MgNH<7|2T!r1mL2718Nvib>(o`?TIZA6gd z&b<4gT7pU~n4r#x_Q5kkaHH}-iZZbW4a4O8evjZ_)*P6&D6$ZcLS(pe8sHb?5~|$e z$llpi91^@Kv!~Q2S}4T*qz=;-YYZv9!Qtc97Th0D&v^fakqlcA{;WCz;XdQ|0N-j> znG3fSWT?4tEWWlbeI3qeDb~ffXr`uAGFc=5nQX;NE6f%J(gr~qLL6ZAOkNmshM3LK ziPWTVBfM&DZ1G`>Ab21&kqw1d$od<2b5QeC%W+4yx{}|ZNs%y|>eCf9TP=jbp<${I>eHN#u2`GbxkRgT+qWog`}qP zu};w~+%K9y+TrHL3QK-7c!S|B)zm)Agkmc2e<*}d7`CC)-X2me3_%B1VXHJ)G8afI z#2(O;bofW~D~fRT3-tM86o>JC=ZGI+poM^Xq!+oRR`ZesU!eZMUc!NCt}E_)RS0Yx zF!d^GwkrsW7uZ0ENfN~BDd{6#giKz*D$OYrH%DO-R|BP5Cgu=BJ2MyIJn`7ohJ#Y8 zJbGB7U>@ouZ0(uJ_43ATT!I8*uNbDrmrTgI*xZ$ba5ObC|D;S5kM3tKG&?6oaxV`g1(6I8ZnQzv~Idm=O@NyYCHQvdDAeVBMKfKDvP8wg1JV=9x^N^kEhOZD%g+Fc%sD=-FkKw zZ>|dSIco^?st(0uRw7FujgrZuM#d7V3t>jg2^(VQ=_6~m6O%yG#w3r=T7^-wa9`kH z3hMxYEeNTJ2r1_6L%qs9Y<+vFm1z)AbHT2;UBRDDjLaNmfwL4J8%wMRtF*lUG;j96 zZC-MlRozbuw8&*bFvQc-DI$1 zLnox6LeKOH9~kN|*JL`@N1cgMIIvP-W-F0bBnaiEuZB$adMcXc;;^_WQ7+D6!Rp|y z;(~OFTPbdfD!5>6Ch4}$r2N@P=4I60F{-$lR$O@xnmYn)Da_3E%yRQ$y+*l}&F*8B zqG+5%6>Q|^go(uZ(MB$pB?E3rFA|Nqn%l@XfF*puBsMiI+AhMGcNmSV38-Xyq7wzVG;HUp}Zabno{U?+1nGws zjds=h%5nqvFql|19GApuB5wy2M>5he4dTkB13{7OGpJp1K(?cYTi~xCIqW=f&1!^J zD=IN5rJM;iV2~uTM&RdWhF^zAZ1vU>0z(tVDQThnH>lH4w55}mvkl$gEnriz|hye>o@zK#P)%=^N z8@aBLR~ao^235Df=4cK~Qf2P`fjDDSJJhanf?pEKaDw=gIS9R>zW7?RJ~QSV)Y^*? zo=`m#k2}9crO!i0h0s+H&f%KHaXUfebTAU@MwoQ`dsT2hOpGTx$e?!yl zrKvJm*`0DkfjvxMw!2xI@vGQ!i0nBwcEChn^1bhnSv?w|jMFQ2u5w|DmI`9Hzo7Aqy4)#|Cm99a zn}VSc%Oko<zbTB=qdaNMwBPOcQ8*JDKfdP<+YAW86VJB=~kF zP1|&*@(-ZaR5qzKIMlyWM;F2m2Mirz9Z3VD{@i(Eom{&3;1SbpX2WbJ z8Cf`k1xO;+M3cqzpjy<-;0`R-77~fcP0nLQI`Ye)1zV(<9X7+Rf=ejhXVxq~H6U>S zs+WL$r9E512%aG)vFdOMI+|@34ux*jG%%(@@yQz640%OiL2VB+A9rby=7fTr8kFew z$~PSBdp7s4>n- zjxNaL3Hjicv&nfSetBh%JzyjTgP^CxPKgSvJNVzDqA)K}9hV#fc4ds-X2S^g`j(!o ze&$6qmeCTT3-**s!Sl2@<&V@OE@8Q&f1>d2e1;~YaR?Lr_q!IN(X?!X3Hp-ewqK`KSTHfJIHH~g+PZODqZGkjq zIPUcZ^(l&YGI<*By8x+%X^AGWt;8+ANHB{*X+GR&m`Jl*0@bbp%R_8d!i%;jXX~PV zE}``UnfB3N;XbYeC((*n5=P7MV$VZ^GkGok{dFE|AWH@4pQIjIAt#5!nuiMd{BrCX z{mqWx2ura)69VmB#wZ+r?oBjALGf*FlejSrjv`{cmxjEAgdDnkH47HHOf>a&$ao3( z!=Hh#o^2fE92m^zv_!b~Vt zyb&w!PUbGusVB(Wsj{;2JLrT0?9YZi!a+aFgd)~Hl$XitF`HH7;C!?YBHl-f5J1Z! z4TNPeVT^N&v%>;Qax?Jn*C7;qwT6k@Eln0wTLiu+IXj%=Kj_YV4Fx7)pPMK+vY>iv zA^RINZlF}yIMy#Z4JrA+#C{>}KG7bn>_;$RVm~`WGRri?g?xt1Bn*3`dYM_b@^h8T zrK~t!f(9p@91w$746B-o(gq?dSzn=Mw4{#4p~?!J;X))&?>T`|AZAZ?)pCu{XkmDT zd*y6Sybhd!3I>OwuROJ4B96Ta^|c8up`_(9_k&o-)ypQt^#lY@RPopu(4fSkQI@Ok zH2%~oM0790Sd`oBP*vi}bb`e^l?>~?MkzfKq;v{4$HduR%JUepEc-_}dEz6pNHhT5bhj4|OZInH01S+l+#}=zu*~6qCzH4~vfz zfRRaS@$|_SCDkp0wki+U)le;#ha|PfL@+GJ(A;CRapewUx}q?n-7;;m$9mNUGl46 z1eXY6a&vD0r%*g_KQ1O%hV={;#IwMiay2iTjmYdx(=%U;cw$zYj1EUTaLT5bS}2oR zI+B$xYu*gGZ1j#CkL7iA1yPEacObATOLw!5Yso@fjP#7Hgw(RMtOgFO;c}8?n~(W~ zWQSwOuo#0(FsmoJw8xJK^igZe$Y9S@MXs;h9)b*q2zkDeSz<|pa%B)P!jhle9npuE zsKIzXWEjjYcB!RCa6h2JRL59hLvg546oemg4Euzvo}4~6&VE!J>)KtIJ{e|k3kLH6 zLT8P5$SW$DwF0#+Eh+X1W)6*j@8blzrL}mxg;G_;>;SP5UoUF4t!}~3E&-?Zs-eFJ zcesBb7Wmk$E`VDdl_$lWScQ1$y)mq7k1_9|I`U7U{t^e@7@=oKOM^0uw9tHhDrj7yFX4&~d(Cep=ckhq_KU zan;aJm+_HQd8uMMP~8J2M&+*NmT^&bxSv&b$4v?7?sl13gTgg-6mqn zudA|T{2aWg*d3Fp$s${~D!30(pNXDfyOB87J=ImJVm%BYz0un>tT9*kBO33@^qZV2 zaOwnE=&46B4h-_Fvlm(Odw{YNCD|p4NlL!XVbEi*2(=E>iPpwa_6^i4*wvmDMU+_r zuTu522~>;zPPZ{%&UsXr9^$MBC7Wm88AQVMR1AGGN5VbHHtcth;^vbRXVC}IM4nNx zNn*L3nPsR2YZL14KM)xwYn<8)wGIdW#@Z*))2uLy=Lpil&bN`Pu*|^~Zw4>9jSxB& zEwqfQhYk|O$Cn7urvKgv9pZy&5&aWsZ6@{d~fZ`xtq3Pmiolqel z;bJxQ0}8u+^7`8*QJ@3_EDX!q11-H{$-F(NolR9xpQ14pcYm=mDq)!C>rmkxNn`Fo z6XWx;8pe1YcsMXO2*i+sl~){5Vhizi>mkRu@Q9*mj?P+$J-|9Ymjr9FeFL`~=2fWG z7R)5`UI+&VU|$#xPe}#hYAfbJ)YE*NQ#cSag`+M<()8AvcofJ71ta6IEYC^SJ`@_) z&M|?y6~pXOl^2^=PM=^Kp*;VhK%ekoM=fYj2# zidRf>_zfOreLR?w3h9Y&@sT(B;TC}g*1JmRol28shKYGFcVRVCKbnx!UXNS304Xxk zF)rn}c?RSpF~L-H^S5fTY4a>|#k8sjJPaaCtsUb?>6Ye#2w1#C3*_eUr?a*|J#6q# zvC8pkT6m^|Sb0 z2U0ni<*t)>oQ($7Sv%g!rAzLq5J+*-m71iw+W78(F-(Yx#1~hx*f`Ce;gDSt6$0v! zT0T7C<{mNB3!VV2rI8TZXgxM)Kg@&KNP2o6x4bW|2+z|1W`1o_YTd;N7-h2cV1cYh zVP?i)%U947z1Vg_S7?54PGLRg3>w|yFl?8s@F@T>RdTP?Sn60)6gQT@f;BVFj-BOM zvAq>n<(lB`IwVmh>$q;b^QcSH1S35wHw15wgC%PR4f!q}d7ZLJJ^>A$iijR3=6d1j zcyJ!p69nCL9$AGk!LT63m*!PBn#c~u^{YYH@+!f?D^HTjspH*78589dY*D3z3Ujjl zz~y|$;h`W|qyQW?n&X%wB|R|>cWW`?YUE|g4Y%T2b+&M3z)FyhdgRlnWaR{gGOB77 zH`(T%=f+e;DYT-D)?{%5Uc4BlYhgaCUDOfcz~dXD(PM)d6J-10X%PNnkmBn@kIN~r zVSa?wh)sECE8JoQt^su{LKcP|}aF1^dW_kgi3oHT>iLTlB{MCquQKg|fRhTmn<<5q6 zVI$*#Hd09^E_MmR(<>qr8okuCC)tJu)Dp6;`-LeY8i$7dnsaoQ(55G*6>DAjloRTb9h6*JqR@BL^&9~!m zR}ZTSVMEWMBi}sRj~w{&`99bb6L~ItpUU#f%fB(u{C(pSPU|4LM}NmoUEBu)<%TEZ zf|lzMBtW?*NB>m+zQu=CCj-AsKw#6$;=TKJ?>+hfd26n!+(Lv`J9+2P_pct^QEoOi zdUF5alY6>z=gwIOWo+1~qTFKzf77w^&@{MH#eKhjG1}t3Z^=Rwb|~&t!Ep>!;O|cc zC_Gh3#mqx0u=BurnFq$mJTNcj!D`BRNC6-p5Q8-Z%WxjdoZ%rbH&4aU7j~=;!NKAV zfI)ygpc_C0bOEdYMcBnE9X^=DFw43a2%@Qy<&D83omjkzrLS57(xH)sv}-Jc&PVibYilscO@RLSqZk3<*tuMt~g90FVJ{0M&phKqa68P^Ym_#fz$zgw$%NBXmFs zpd1p)0HuIoy$veibRA8V2)f!Oa5{TcCId0cAsDe5>C@W{@w!tW6Y;PF2oDiDJj{XM zL1oQ@$e<<+HBAsYcu+_4Ac{W^8Nsdv3u`S5X}k)}N9{F;ir3(&QNTLh3_-ljz^oqH z7&J|}v1_NwohSI&CZx`rRuLoRuLDurOvR}jGK{UyYHzc(;O|7OB#pfR z-hG3(533LT}SjE;GbI7?u?nje!w{oN~r$NgnhIPwJ7Q=46A2%&rb@}U)MzF2>)%W-ABs`2- zefGuuuOI$$4}V93XkoC1KWZ;jzx?&(lYcq?4HE9!(N^lJYT09SVtru@?A&IlqOxP=Ku$!E*RMcd<#424s6Rs{GE{329fkd z7-av>2gi_|{u&47!tww6cC5qSJ@TM2ct3PqB*hw>a!=M%)T+tGuVs8D6um9Lj3OiK zQAFjyu2Z83;sm$IzMW!Z!6hyLZnCDB?0}n+jg*Z2p%YP9R#p&`&5!PEuVA8{saqUJibv+!v=l z=Ux_4z^;cA8BWYI(Emc!8Dz%_gC|d(zPy8TS49n8y?pR=t@oEZJ2BcGDq0(1vngt* zHE?|OADcmU>LHr(DsZT#*3snVQ*g@sTKG|q6J?0<>4wi$F?dzAhb!-F?MEo-{^nhX z3ye52zzN_8Z~)i?NB}#4Ex-m~4Il!n0G0p?fH}YnhO@#mjDgI;KV|^afGNNvU;;1> z7z2y~MgYTrA;2JD0MG~M1@r*A0bPJjKnLKHz=6+JKnvhs$(VZh9%KrLlfTFtDSZB; z%=xo;DS`B2KoOu2PyomW1=r{;yZpqOtK?4cs;L1)E>r*TA)CEZ7WU zD*>6@qq6a54UmTF@No`OR;+-n%XHmmOa3KOn(OWaj^1MpBGLl-Mjhz~xBz+qWIzwV z380kMb{bDWbf|-zRtNE+4zgMuM2I@bYjqGK>L9b#L6oS2+*Sv1q7MC}4kASz7&!ps zygG? z*+=mJFF+hXY1zdBJOMEPC7;oN_oCt69S{Ye0>l6}fC!*$Yb1aIhyWgaMRo z4+SXOE(ACNLI6rJY7b=x!M(CAfdCF5O+y`bXeFY8b5navLi~u+xUa7v&ARz3k=83; zY)sGqhB1Z*je$sD4nhWhtUBfb7)xq*ky)%dP8F}hpyE!hRH+VB)55)jk}%trIN=1! zBD?U1VJG^0*ojVro#+_2S6#9g!QywUK%DU(Gznu#Hs)nrnM@JHNfH&-oqa>&xWbD_ zGk(XK+pQ5rLy44THpEaEJZ5BYMOaaea+{I^en!uv#CbA3o72p@f!fYYq`M`H+m#Fb z8}P|%2!gVjQh|ent%))V$>~!69ugV%K@)bpt|53NSMAvp_$7sK8o{0B(Z;5jY5h;ZT#UvWd}i!DPE7Z-4rZ4^q{1>ZDQ6@jt_)+M z677kr&?I;VNgXXbW_f2&&*GMNXCEKAFNDH4_-!jSn{3l7+XYPA%o=@(op+YGO=12T zDAN~fa@&6@M^lIMK0Fa3fQ;=v71Om7txN#30egC zvhWXA5(>=i2LwDfCOF-RGghUYO!_pwNe`Bz6=>!(%#a4NNx0#|`mD@snzW@ido5(k zfc0LTynOqT-a*{DgR6NpIsEcw2@4;(4atS2W#0Z3KGh@#+_@dvj&%&P;kXE=Xt2w= zv2KP_v%-*s;8EBz?HQF8F*Ro4jJG`xGkvcO3+yQIAxsbUE0k+F)@zr*s>ZL;Ln@Ch zfZzMsvj8HCUPeogY*h7c^V+&`v6gBM9p|WJ;_MaY67QqnEkGl3LptkhxKibc=Mt7EBgUdI|=p z!;z^m;Oi6dzpNv)HCdMARr|BSqfhWLALtsbvA{L&gk87o#;`!o+&$D&xt}Yb&}O2w zgfVjtxBMu+?HD18Q^N3|rZ8d27^#KhH$F&g#FMwGl=~QbvBnjN0d(TM4jBj5&|1TX zh)ipkk0p)_M?^J+bivjeJM5wU-{P}~b@f>V{4=OyM}OZ0+q%3T15PvsTpp(ydRp-|)qm~IU0H1MLD4-o{eldCMHm0J&OmF$OE^H{*0Vd$ z?mfTt_}<<7&+ok3_T#gA_u=>Qbio_GfA9Href?W6AKZIS0wz$M-JsGsJ(^o$~bSuf2aOP>I)C{&JQIX2IUgS_?H*F>8E%)+kRKR{p}u7r+1H!&1nCKe`3cwDgG% zJGRxH|&Hgu1v#%b#e0TxQdbx$-UwryG zfIp7$P(E-ARr>+>;M0%%z5M1cg^n{=tL)&cQUd&<%S}9XMgMd+&*@ zr%vwMyLI>e9s9Q$>^iw;>j|SB`nyk^Jf**PuK_&vZaL&$05Yvcj) z9)@ZNJJCnz6NUVnW4JKg&CFHCNkvvV<2P6^#VzwpGXhmY?5PGkZw9-JNj zHx5)jt-SvDJbdi!<44-R^VJdE9ozJEweLOo{^?zi4M%jZTt2mRzwWW43lHlUo4ySnh2zm)!W)q!vCJO{CLbm4-- zFW`)_C-;wDzW4YUg!Jwm)IRa(&Xb?CH}BZ7ZRcl)xBs5}w+GKESz_xx{at(E6+3qB z-MaH{4;|kAd$EVNe|qcDg@5bc<#71Z=Qw?0S{|H~1Xu+9`%F0`@4W%(d0$CD<=4vV zk55IFq5(m_Jay(20%y`81o#h8$dThlZy){u$5@?(^YIYiIgHIiL**PVpW#tu>Rn<~? zV^ecWYg>Cq=fL35@W|-c_{5~LT^MBUUz!Df|I)I5XqOtaYmSP_T$TCCc46kg$$N9= zs;OXgcFe;YT%3RB=ViJ(%~jP;xUj;K7p&iPsbAx}=fw+`Z`du@8&EdwQ_KFnhFSby zwd}7A`&+wekdw%qPuJWzpdjYX1tp;Z7j`~Yd4bCNbgBM+E&OyXQeI2`dMTg~43q(x z=fVF=7R+Dp*R+58Mo|ZBxn3bf7SF{1GtE^)jv+JCY|>`re+lL)ivE|?r})2JA52KP zn$Km)1;UjK6Q|S-iy6c0*6FhbezkiLO(Mq~XC-yNS^oA7qves_9*VaD}<&dJ14GwQ4PWjUD#yQjXY&3t|B zO-9d(zVBBKl2)9j=5D^g)VhAZXI($z8}d2d(ko9lT@0m9A2Lj44>Hafnm4ZWC_GTU zHE)sDe$N}5(=_U;>!;842L~5gvP8c+o?5r&T+zc7?&y(pmpLUjiZ?_pJnZMvXgl$% z*GsEu((&gBU%#5#G`*!Ph*EQ7wzynCQW2B-E<}Ij&mk=jd$8h>%kFJDvjt|GDSL5; z3-t+ipa1qts=SgooWCw5M#F095}M^*(zjdoJm0%}Z@6@u0_mIWykGE3SU&RR@9V;hKZ{B`v;{5Sz|AV=&?r8ixb}8Bo%s=4R=r8O6}cj%&u;DZ zTdHqwosXek({Xw$Tr1Uxbh%l+&8Y%r>*spNnj0_QYu|Mg1p>@|s`K9UKfVQVC6-Ylj5s15HUBCZ_qY9*G zeX;@>zj#Z53_6)#^QQehll+Vm-4z-hZe-hPsx{Ox@}iZWv&s3Fo~(_;Jz0>vaxMZ)P{UUB71ZSRLzNc8bM) z$hEt8^W7b@9gp5cY<$M^{9yYp%6!!}fAr-zv8is~mjgIag94e`xqX|@)6r{B_tcc` z)=$VT+qV0gLB=nEct>x)2`4P(hxgM8B=WqCyrf4ID75j_waDnL{3hP%hi^5>>kSt_ z)eQL2xao&dbBCz@*7);sLE1W%_urI?)_k2(;h2qmZ)V!>2_s?l1(OR3fW#i}k+O)}=f;l~P=)3}9 zn0)M$LI$K$HZv~>!2Y17#-jY81kmHiM{^sGJO-5(MEjLew znTRoCkDtnEnKu^gZWtCRbTJLzIr`xFI6KYY)-iF;{&oq1;r%PE&Ji?jSsic z^OD@dQlHQs4P`#l^|?@!MPZrL{Bkh7S$|VyVfV+zzVIX7H&y#LY;Fqrpj|e1-nzRw zLo=ig@2hI|Hc_tYZQ67ouQc&H2HGJ#D<&%t)$Qg_SYq?wv2WknT%e!1*znc;p_P%h zyd!sT?;lpVz{DcR>&?Qn^VU1x9<0nP`u5~eyI((x64MtQ;JaU|IAzEF>TTmsmb%%i z0=3D{sgIK$?{6Jm>UeBn+{r+(&78A8y_R~%d>d2S5zekXv&_Sa)V1o1pU-T`UVV0l zLss#bNZ5K4VEQ3<-Ll?ckLe?C z*PEUkJ>&TP%|6o0Tgz{Z|CF-)&B4_rrZ-X_H-4Vg@Q(Y&^}XekilkvimcDxc((Wo{_3}FOMBGbHGWmqbG@RYcYP}1mcw)is+kL-%=B;tV?u2*C8;a`wq@6a?+xo1&nOw^dcHxgw=ka44+&f+g z^6m{r#xlas4Q{xY-75ob9(i|J$}T8ja(ZD_)OQ?sYj;zdQPnPHePO=k1`EK1uOu z7jt6|Su$@MXpn#FUz)1r@;Whe{QR!NJ8rbZ{q({`eG9sU(Jge_>36k;tiSkZC-%Dr zw6r&A=r8EUumkhVBK8L^TC^fe{6=i&$v$z$Xaj}gnttQYs_T0Fy77Ahm6wWM)}5*( z^gCO3mMq{5f%p)H6Uu4Nv_40ky+d4lTfv6;XQhVu;rXpU3C_)bF8JH0|0wP_vl`no zWs@pzkAY_UT!GA9ELwhF@6T2a`On=~0p0OWBKO#TS&1#Yd?G3T$K_IOI2Tzpj=Z&C z=~{Ly`JbfmH7#1|b|-NZ{qnMhYw@youlv)Z()Oi2U0#~==Dv~Us_&m1-?U#dc?0H$ zy9(q_>Xq|%BlT6{KkM~>e%JB;H=6!`rYioA?|fJK?L4t9(G6L+eQxea^GyGcrhlSU z#VN1;+@|32)&x@>$p362bT1&%8$f5Mi-wuRlS0ODLAE%(Z1$+?0*|i{I?l1 zp`m~2v~9v_1rmCeJZt;q#IAqppUR347zN_8B9$?^AWVT2FF0Oa5Kh|6ykn$(VZNgD zFD^#N{Klu#q-7r~M?Dn?uVO@Yb?(5vS)&DsT~o#iq@?Q?WJqf>+ic+p}d?el)ycYMf0{JeJcx*W0 zCKGq=@v%`>#K2lt_O_@uzkdIc_Vw8hp&eg3?|$=|VE6n(7AI$~u>Kd$8B~;)N>nd>?yr*q^&w_$GoYN)$AJ)tIT(tAT6bQFPq9A>3DhZ zI946-p3(T!Mutw`lQS0Aj~}`rDUnC?@2OQY!uHfLX;-2xD!U&UiSiaMRDXX)H)q9$ z$IX=$8rkFXXAN)RK2~kaR3L_W$a~L5pH-tN73(Ws&TPN5*S)gj$FOTwkM}OOUd2_b zF@L2s(dnLa*yUi_rZ;!5!KxEqPVj?7t<~e-pR>OfGlW+lUz57NCO&>I)9!R$b>;^n z%Whs`m{G}e(ZqLh*OsBZYQwM8F+*#KPp7`jWOm(8TY=^Wib>zpWbOTYPUoX#xxcEl z+%VVv|k# zUr;B$q>oH)X5!9gFb3yG0RxI16^LNfj}uWD4BYI|Z{H?fj_+@cJ?y)>OvLg#^Zktf zo}hv2H>5SGdci?F}|J8;^Ho=uS<2vu|cfRx7Fv*LTu4A&g1Qr6#LCjJ(SptUNrKuZ~l-J#8EW5Sn{jwkE>$!!C zZr0ajAAbG=)?=5Wr^7}~yrkfTH2SCQmUzf_u1VpyFGYVCcfS=HuTha_3n#F z?mfFgr)o$68Y^p;=Db|hsJkz1-njD*$D~iXTepWUjc8%%ucP&N&2|*Zx_Z*D_OEby z^kH57k1O^rt}Oo1{p_7rPv87-;;?bYrh1Ffm6!V*U)UfH7OH#TlpoLF#akRU)^g5m zsXQA)d*74u<=L8ZS6;34`Z3{>`_g?ZtBY1OZV%J1cSK$4^O2lA6ZF-_WTu^VQJ43%4Crax>0r8e+fEJ~4K_k6 z^!fmaU2$oQ)q)>Co@P#`(44laXb8(Hc zuqQ($n_{Qn7FYDNy{v6{h^Z8<-D6JokoO&jQLa6s#Hnsz5yaCQ=JstmMHxJoqRVIU zvpo~V{FuQdiBk$q`fpuNWcey|Rj_YT`I-kjbK=n^LpX2eF(bU~M80hu`|AefMPwkl zaV}`H*wF)jSGiJ9VrVsDT-!o?)K=k$?UA+8pa^9bb6u>#EJ#hd;{_tvBaQ!ao$hLR zuAOF8?820LjYN5@8;jdx3%p{ASoDLA6$&Cet~>Q;E)XWVBu57^q6^9~FcxUyh{_Ht zH*Ee`#}#;oOMt_ojH9^WrP8J67xSDdr^0R_Vdvm+dZ8O7I0IhdusM}n@(!lgj8Mi_VRXGX5Az(d&5nqrGs%NZ-$50r&QO5 z$D=<*?{qqCq{7Qs_`OgQjcr{&s>F_sYDn+fk{VVcX#5+R#Lln9$^#+_ZZ$w1zb#Qr z=bQ(t>g6ZS*7yC38^#k{J=)OtGg^L3bMNMWyEMa(jylYgzbGJQPri(TH zt-wQ9mzQ#n#3H|R99Ry%udE!FxoF``9zO*J3}d}vDLFdY0*+ioLrt6-NtY0DFZ3xy zgWOcU$eLUiY_cMCb8DNtF;kT_*D!XVX8LV%&7uY(f%ISbyu?x)C)hVYZ^iJpS#_BK zy@9n$-Ga=z82Uh%aEYyitBG6y%otYf>fPmGcQ>Ft!-e|M*;kkKl$xG)suKG@=RdCg zHBR+v`+Y)`(Y6k_xL{`6m95OTcf4S|y&YUJPPde0V!@_HMpIwVEf%)^w*{A!KHN{` zyLu@z9eSpzkhk0Hk}h{YI>oiBO08SVvmV}?kbrZZ&?xEJ^?DU==%dIjvEt~ElDfR* z`2&N3-Ly98jJXHlaZB%R80Qw;PP}H(sPp+%n7xJ$Q%y(gCSjc=OuMX14tYe_hNGVPNfE!?ZK1!(=ngWjl9pYpQ_a0QYcK`3C$w2BWW{%tg+U6 z`@}GBT|YTJ!;ytL%Tw=T*Y!3-L!+A+S@(Lw6VP8az?WM$1P$_3Z^jk(a1E<>OT@ay zs;Y8rjWw+`yQuWg2~qdj@VhFD#jZSA`P z3rtlqo`xv6JH%M(9_hF@dSilG+@MVzEwb#`D_(O`QdTQ%Azb5L+VXi*MS=XPfn~Kd zZ@dWxU%o99Fyyu8GY4Tr3ysW+0|7AlMdsiVAz_8sgBriym^O;+JQ=5|k!uOJFdvjY zXfa55-JpHr!l+o9$gSMHzrxEe-OVx_mvRVC>aw#cu4hoBiS=RJ)k#IFYsHi|Wc2YW zqr8q%6B3N3Dp96CK=X-n%(4_G0yv@)oX?_Ugv{NAKJ}%x!|G_GZ&GO$)Q$CDz9^KP zvm@d&lhpLpIo1b2`V;Z$&Bh-fdGKcd?Y{$XI!l!&SzpaAVWy9T>X$Sa%x2JbMozhO ziDXQsb!svb`ezJDs5^sMl%i>3l(}Bsh2&sJKJQTA>RTjbZ;YMDvjy46=1U~zs(K5? z*PRdKj_Y|YB$UDJ!ojN~({VP|9|V})<6?;d!`6({ZdB539@-xm*>7%d`Mf|VhAzTT zq>TLy$(r_pyH&NxjqwR3{o51OB|+b>{Q!|W;)UTu`T!nv0F>RJ?bi{bJpl`A=%KAml7e@pn2EGO2l+?lqwyo)U$i|d^S-sD}vsz=A!&u3m< zxJ`a5nb3Jc{{zI~833d+J#wei@#_nvF2z#O{=-5O+nXuX*_$ULrj**`Vd37RVRTWj z>aR1gp8Ji6WJm_dKaW_ZiUxnAP5L~Gaz|uPV?y)r572tuL0$LqiQ*5?wMbI<7bEbg zq}kvv2?~)3B1mpoWD$WUmHz?C+2GsYkHxH=1j=at06nus?ax@H*Cvx?n9&QXvYFIad zbowsG=gar~JF{X%Rb>UQ*VQx18qsHcCJ(~#hv(NgW5J_8KwC6INtCZ)-Vzmq*VB{b zf|9pNLf+C5pAQ+yK{HRYP(0#*+(~Xaud1}UMc)mN;r7G*r!cGITIq$%s<8H2(hv3?&5h@ zCgVByAxUQ7-BD=04BPFJI}H{ka-oV5%XRVJhw_B-gr<5d4l1KmxV~8I;+|hHt#@e` zY4asU;u0TY5gn0q^7-~mCI^ywO;<%DKnDF*R+FNoSEIb#OY~dy zhV0BFFuFkjmBN(brwKtev~5G_!@eTUIs>a0S9}LWLHD@JW5Z~6lb3t;nC#=F#4(s~ zMb)H9BR)Zir2gr;vrLzdLKxS-Q-0}>%c`u>x6y{YKfh>OUvok`IHCahdL;#D2Ib&4`L z%2v;hzoDrv4Nenh3jwlWZ z7k+@e^K6fuUb|t#!y{sBAO?vo7wU~xUaPc*E74i=WeO-azZ$%Bnmpvbvl-6Tp-kusMQXq}x2OSNHaSLas=*#t~LOg`!vHA+`|5*%la(kj*;B(M0F)xYp^+B%tX zJWBni6^y>2-d{ADO#Ev^6FA<;c0!gDr;62R8JE{v(!sPxT3vRDr#1nbDr7}It`%lFrocm%qef%Ml@Tjby>4m!xPpt%>Z&gph*vf{@un+`Ovu1B!4A zj>&U<`Tf;qS4VcH2ly@w-%iSn?5=)AWRTfn;nKr&G~IkBvlp`ia4IfH*;$`Cv+0KF z317B3m@puqj?&@IW~w=Gh6N`q$x zI8&cTzZY67^M_1l;-oWFvC?K3YlK(c29san2jdMo=Unt7XJ`3ViI@T|jSi0GD5(Ws z$m~9V$K@UjV35H(-{(Ll0x7Ch4b?Gyj>5=&UroV^?hgjj)2gK{^UIs;y!<0~zMee9 zv-*vti(}tn<-%l1%~a36aEy=Bt23+2Trc7-4-wllQaU7|c=EBH=#iDYV`;Ig^^^XB zMemP;K*a;UMvk$ ztKUU1;5eJjE@KrVtS}N;=y8OHZ=PUa3L(g8_+DF*A=1KH0W9#UQTzS0tHk_q$EUeq zvpbb9PvpvQh$R%+7dyCf-Nl71EmdE(;r1D(MZ1Q|<^x(qC`b4<_50xoA!2J+Y9w?5I7EQuBw&+%P&?08hutyBJDsE}EOyue;| zpGgbO5<8POXUE;UxLGM0FR)qxQ5epdw#&m0+A044Q9tpiWZvScO*KtyfIpZkJ18%} zg&w%!97{H;C#2Fd;0xim7QgN8>Lsr(8eUbfhel7S`fPoSdG(w z4?j_=cn<)T`30DIPw|tXIP=G=Ru1$7)ET-kfIs`?2k7gYpSabpBY*z@3Txxv#WVKR_?BKR{UVYI%@3yjgr<;P{*&d|n2AqQ;I1hq@77>49;S z>_0#>#_pQudHx$;?^+KHUW1htYsbj^^D#hbTEJJN9u2T1}CPRhX z#Oyz*mO<=By+xauy7V;`;AHPgH(0?w!*6fXsaWFZ(LELe29}7Qtiuqu-Lps%|#I_$$BCMiiS6ib!7Ky|l{=Tc8;&xO>F=(SW2`dL04t%XgtJ$VMY%ehe1 zpefp$Jk=tTO;kV(C=*e#9c zgLgdV0^jzm#Ob$iIHJP}bk2k*>Uv{#n)MUw9QVEyC}+>im_49cFf#6mYf6FM>4bEC zs97TE3s-lEx+eobYWkapMFwE|WUHKb7n|HKviV%=nR1ETS@#$%tDVai*SZDhbYJ({ zPQQ6x@?hdDiV0<1%cD&ZeD;9SjkRX<>JXjn8Py!+f}_po_KAy^jN6+Ppou-ty+H3j z9+GOjMv)5$2)ow{p1&X{yhYb;VBt+mH{+QW_3{U(riY_m%$RXmb5r$Yiy(pM8xq@LHpA^+6k;MA*^o2e^1k3?UK*%(k4n~5 zYy-CKN~CpSu)&fEWJ7=Cp=$yA(DLkIG{1Stq4NgJwg9=5}l;=Nl1xN zTJb%yE1Z&W$#D@*ZO@za6>%2E?BR9Q+MuIb>3(d_RTiQRa2~h{brPi!1|aj-?dFd4 zy}{k*T7);;~(cbP%~aDrfm>%%J+6 zW>=|7*c$EbX!*3x&4MP5a*ut$B~xdQchG}s`LW3Ta{z~1a;GP&h9Ds&g$I<+yH)7d+&L1I&N<<*l~ z4H>572IaTm>_rN%?V4#+w&Y%j#;Q$zt967pjn_@eoAIyO`}dmOSvwsRRqGmkiLiW9wGS2yV1m6P(g z9KfH-1JY(P9`yEV#wg$6+EsH0lt#Y>@f*LYAvSIh1A+X1Y+cayLI@WzmQu*TrJ(yG zmw85)BXo^#--|vMFct8WW|cYKm?Z4wi&tj3CWyB`K+7Tv&UjMQpC}I+B)33>5k4hN z)*yfYB(C+zZ#!FE_y6>n+p+;?jz$J^rraN4y*j!S!40{s6iyzH8Lz3m!km;s92WB; z_UD=Z3Qzt2KJhEiU*r})6USc${?2#8fBdcC;lCgT4U^-qQNVk>Blh{1h$m;z=PSN;&&N*7&%%te28 zgc%*UIeQ%VaF;2B$bH-n;(IkEd|mzCr_~0s4ZLcS??anQp_?b3CJ|f3!oJA0oWiwo z)Rwx{DWW_;zQRvh*!nv}bq;d0UeFTzY3>SqforHi&@S(^YNPeCSe<)S@`nM)?eHu` zQYj^ib8I|%XEBNyXA=mdxB!n5)2|7$*UF>p4*U-ejy!7m5soys-(GZj)MSKu*PU|9 zAm*k>pGF4kUd7OL46L>yg>d<{@O($gbA%nrviWX{;g{=xM6;e?c1GIchx^jD zU)z?pIjyc<<{COpSiIYtmlApHRVVu+sPF;zX{O`;U1wFSa6m={5dU&p6RQuq9Fg~8 zK0ouKE)=-cURGF3$q@y6*+P^Qw*Z56++JjnW$b%)y5nWlSE!oYrB2vbH9{YA&1^$! z(>+?>Iq)a9_#6cGB$?*z8S++dH(3=UKd8;Ft%{*2Va_h|;lk}wLJbpgb|c@J@hLW= z@jSda(|uR^oG(Wy^Km^1W(e4JNq>F3hj}*edY=RSmC**MDYZ}tX6G-`2X!MBBLWUE zax1~A=norcE@2^*d6_EPN2i1CPa>CwNTcJ<2Js&z%D^A8F_qPf!0u$*P1w`<81qB9 zLH@)YOoe0-lpIYdH@t(y<->7K(`Lbw-FoVMTWtEil2z*n?O2(PIy3PvR z>qYtodBSK-&||}r9hr?gZzGoIzU?`MOLV3%ill<1E*(AIBMmPM&Hesjwjb!@rqPd8 z9}gKe{f?e6LU1CUiHw!H6OiD^wszG;`&~QqkdbOrz0roY&F5JP3?X(A{HEGyJ4q0Y zOWtJOP|Ymk70s)x5G);fE&q}K7S*HIoL40vqyQHi1eAhW2F8z56fvvsM!reKHEo?Q@ly3xQb`*%x{&N;EZ&y3bqcH`Fx5_&jCyo40&d@l<3c zIzkERat+uB!)R4`!Smha3l%k9;%p7Jj4U3fJ$aYW7;F=RFX71Ng=eOx$G?a)v)K|>i zX9eUCSrbAsY8dwR^lSBxLQEAG>GEBN+Rt>br##EO`G^?A_xk1CbAD+PyU}=Q!jv2f z+(v_R?nDBopZQgP+)FCEz4&HLd0peXe(Xcyc-w95L!YaUVU4bC18j5bC$zB#CGkAa z3XMxrQ)K=6stp|1Qmr~0j})M5EEA&u$?#b_07wVx1*5;~#PdDZ$*_!37V5EtD__yy zOZou+tc`*QzL?T&C?7tdi?SV8^Ys#_qPGoYa1YmEuS%`&;wTVy^~*tJpeW`B3UKhp zV?qytkpf%WTo-O;tb`lPQ$N22T`iz}#;bDK3j!BHC1f{OaPvM8+Lk`D^Yt@I`jaB- z&l)XT+dta>0MS(>AiARaDY`-(J2n0UuPy^{mPPa20bL@Xx|*o?4;j_pR96cF0EL)K zXdZ&E*LD9y-T(#Gwa6;~8fzqcDrxwu#tEPh{~0^^_k;i2V&A`7MihzHwWl-E02=M; zO0r4N4x0^kKA4z13_FTygS&6P+o`=z3p9Prz%(#v5vYZ<3IBA{Qc=&Nt%ZKD7~QYgt z#JAaLTcI+AG-0`_%vw+Kmbl_{x3jWYk1R*V(EWn-f)3G`X;uGj5d*YN>6jH$#4Tlc zvu`R-<`UF}^_}$Td8~E}IV;DTxTn~I+1OBHNU<5PLP)nSyH?Hc(wO1$@D5rxp2tzM z%S9kMtB(U@z}x(KH_R;`OEKKD6!98qJ2ByDMmH!dR($JXreUVwhxOe@C1zr576PA{ zY{K%nYR|c~DPlPnPyx?yuL_`|pR_;l1i8#i$_#h?pPbgjJG^+aXb84v)kn}9kZG!$rpNXfHQ?N{rF2N{l3WNEKUL>PD{ls>StUrJf^Zy840;LzsYt>+(OT_QdvQLy1wnk zPLF4@QNBdI0l}VU%%Nf+PN>L%89{m-U|9ds{ zGnfH^?3Y^WpB7*LB683Gyun7bA3aV3tJ*qFN;6|8%Q%G0Fl-T1$EOnZ z@_xqy{v$tZWcZ0`0q(^}Gl8SbzkO2v4W_iZCeV<&o$+b#tEi~%9)7xO&y^THb;^w< zZixydlC7wKDzP5rLggQ?bnG-~R`X7O89T3mA$$$|=!A<&RO z>a)Dph^d`eSjJ287r|6GL_3q?_l|)5Bg?^}YZZ}?0=qY-d}FA3(;bY_<|5Zsof+p- zmt)yq$=uC?LKfw|$lhp>k~`qL+hg?YaxYfRiz%qOI%N~vyTM$~uk@gLyM-c4zX=!F zVs;A~xphu_B1n8Hm`#mFaZJ2^i)M@W)|8@^y@`PN?R4eqR{DYBdL%EL&=242m9w-6 zH!oeWP`*(>UJ%};7%vuQK3qPmp|ew@g_20OwtBbn<*|JjFE_)WqmGjbOMX@+U3_}X zi(C(AwwIvn?ed{Yas_4ck@fxZzM;CJ8kY4 zTPS162g07AYDV_kjg5N@mX(voki;*I`gz}_q>ChwLGv0IpDoN?X;~s?Z=tcT`ZxDED~Yy(h4oeRhSN;hjnH5#=>Te@Kw0t zoK=QMD!wNkx+-+bn)Rz{LY673)oQ*|FwYUUV<())QX1!?Gr)9WDer|WvP!nT@My}l zV?`I3a7o_ay3di>nej;`z?$)^ny1HJ$7W0@`(_KKOw5G?86XzL>Pk%H^p5lPZQ1Yp zcl{#LzRNvUKmO133jeM}|BLC-|0dT2SildKY-BYz3o88g)V>t8=~PcW{lsK@=y9}98S20OkN!U`p}u>F0V^*Y9uamA{;$M@=n%^|x(dO~@6P<;UH0yb#UrpUew#rc5;j@4U zlr@FA*|%>)SKRAd{IK0&q15?A2ML<@NGeauJHY!F0Im)q_XBkG$-w|Ce2^1hBR&@a zI>c87?3WxHeC-wzUN5o?54?zdYGvM{v<`OabvoO2>4vOwBz#A5B72a8 z=eN%*PRRfbCHKMs{_cD^;979bBMy-J|8|f`hriQ_brad3-h}E1*BiS8bIDk(WJ$|i zZ96ME^()b%=butC-i3^AECcKnNG8o)A{;K**CxbOEb69rGQ;t0k~0K13>oCnWo2B^>F+%$mNYXzr=iI zRmi%yK~b|r3h6`g;R{=z>cU~)RiCmcrJ2*zmk9)bY&4#XSAfGQU?RElMKj*P@ccH9 z{N}1A=O_;)@~m=>&j(s_Up}n+*}_VnckLdf08eNXu7Yk5UNLD9$N@lQ`O>dfoWEtC zACA_$OJXd0wII&$giU-I>zCb;1xoas?b!0z zHbs{3Qqm*(gka{k`*xe7J&sos#vEr)T4b<~>R--qS@eQ5Nxpy`uoI_e0K$xE0H|fI z`2KRO^%*g48rc4nY=|B~D#p%+Fs5xiqBQI`Z)hY?PZ~2tK3~J1PT`8;)iy)jV>4Xb zKrvRugKCHOTQ#=sa``96^?QZlU0CI;NqcTuMS70#!( zr}TSeB{A$^5khOd z0%ZyoQ)`PY2hF20yd}1E0iFIpGhd*=rtpVEwLnLi()rP`a&`nI>sng{ zLB7Vn-LQYUt6^)hv3T{g7k5oPE-sgTY)W|aaZhZNUQ^UeWwt7OmCAm`uGD!zY#pTa@m~*SH6>DZHBr4jV2zy662=cIFei z%CDF0_a$md8!`*XdcO&?BtGDxX;9IVh`TZSM45}%VV+uv_1hQ-wt^*TS?Zu`62|1V z-sMqpB+(tL*znc6Q&}H+TONsk>YQdfULH;8_uHN(6PbQ+VgfgZe@QB>e}F0d^l6}# z_2GMfXV)J@{Z9S$&gRbVP_D;7gYR7tKN5KibMD0Tuq4fu- zl%KjU18NXEig+s(1TdvQNFr0kQ^N;In&)uOJpf?=iYgZ;nPtyT^L>XH>eE`a*db5v z+UM;}Hvg$=0&H`$lkTcz(nDT>(3MgdDk+Wp6XL{2sK!uztU}WHv|PKsJd1 zp_-1j40O+$L8MIbp9G+%sh+#aAig67)Gx;?q{i5}cJHKEL7ec;%g`U74Nsj^PQLIv zT*EH$a}wRt_4OyxN9m8rmbFIk-ffNSa+;l z^rz|@LkX8YO&4}BxkL?LB18j~QBfqG3CFs0pGoX^LFa7L`)?EP7-dp@Ch`M%ZOyIh zDK-*rp;T24jwa1!XiNu;FD7ZWsf@Bt2w3?g#Bc4DHP&6PN2uXMTk6(c%J5`CIh)bv zOKEr@Cn^Fnj`Jwagix8rY-H`d$LllL-CPcZ$N!Rc`w$r1nBjhcF26+IY;-# zTS^K^)|}qryqTUF+!6^-EEkkn?^%PevEy~{Ut^!l?_e%ynefjxz@H@cfB6XhcN5zu z)*fK;q>4rn6MI(%|8LqiZSd#5TnjEU&2(CdVpt{$qiz}9_`UEV`8|5E{}Op<$DiC| zLHti0?=nY2|t4n|gz5>Kcr&i;Lc72cFdE$%y||B<|1fR(BiVXJv0Hd)Ciu zT(Ar0n6Fx)Pka-0{(z>*}N@?Q@o&(d-GQMn&l) zb)GKEf{y-oUc9l<`o!D?0-qs-<}|r^sf9^KU)!G~o_NkwATst7@GNu4(NX1)@W~x) z&w~oYXNe}ZAwduF2ZBW7 zs!m0STAS(2OtudX#B}Q6s%Y-fCr&}5aXt(UNdru`F9q;dc8|CQ)TN)M3y^hPp!FJ zDeDGi-z08Z4ER~OFYwCC%UU1ijE$#OjorQ3WZvhDMp znv+wqyKMgSBJyPuDGn$wWlImgoN|>pBG*O)~zG!QlZ{SG0<bwv-+)r<#?z#L&_hqs%jQqZ(p}+UQsa ziWKm>aUums`yFqgjioiH*AwcpB=+KOwXu$x%PaD!B!K4U7whYeMh+hS0L7Z%v;h~0 zgyOK06^LgQ4pvfL?2mdCg@i^}@} zn!2UDfMdo6LJY~Y73WVymY#pUR5vqA^^p4J{WbBEeS0~k{mCW{sAAhVla_q$*S@=i zY+IWua*4wHZOOyS#GKcbk?}Q@HMh<~F?$Zy&lFq?`1tJFHGB-)Bx!$uoTa&^^ae<7 zw_A(x(7yUmz{A+MWy4VYbEf|1408$~qoIC^rN*g%DU`$$14=l{2z_t*xcC@DKfG=7 zXs+guj#AXL&naHmVg0IQe|dw6XOdYp;-a%m&jnDRbOI@9=`OZR;VM6wzq+VdVcv=S z$OxETqAm;_fglO;NW0!iE~het9#>PpI7Dk+meM0q6cgmt>5#zJuscU_qBJM~lYie; zGTG((UVh>2iF7ggVsS%HK=`b#h_!DP*N5v`Z5rJQByhevIqvTZRQzL})GI4XY;Pw@ z3Z{f8UvJ{&@9qI#zf%HzU(o%>#9@@0g4oWInW0u%fWG zyRye*^4O&w0KzJ zfnMYsoYd+O+QT6qXlSaUWWdsRD>0!lll5C2l)Yu{&5>f9BaE0c5?N5vq{*R&{@S2~QAE1cP( zGcX&HU@_&@lvYU*#hm7$sTR@h@Jo|f{6qoKJ&)*aO3?A78>}Ktp%Wd1Yrb&fxP}z> zyowp+#lQ>H6Y6`5;T%d!!E{${Z9d@C<#8bibT}FA*?XbOk-)+0bL0Lj*x6u@yJxIo zq^{nip>76-I`DK+$kJ++7q+?}-Ltj9X2qsnoP)Tv3Q0^fMtBx*cI3% zJXs(20#j8gJ8p3>Yh5sEQRihK#uvUyKZWdXqux1B(hx3Pnkz%Jm?|zz%M!C)H+^V~ zFvJ@}*q`07sjhn6z1x<0)G>MJG%Z@su*CBXj)R?coKgcEb#oMe#+5Y<$BV09O7&Ff zm>SMydakonrnggy&zAQS0Qy|dS!0Vk0xhv&?8KId3U8yi(a=cOtK=WciE_3tv20B% zOk-0gHgiIOeFgG$oT)l-#kUI094Rba<(WzMn!!$#GYP+-gi zw=#G?CCSNfTih7>CXp)C|Iu(kzE)r5yZM^~k0UB~k5(UHx@>aQLGu(4{x1&Jtcwg zb`~LwRJC_5P!jh><;OCsmdtDtF*3x$gsMjgH|=LHt35c_(?T8{~- zWO=t}2*kXd5b(3^;%VXuA<)jQH^~gb*fV@HPz&6FXk(@Cq?Z2QzVwJC>~^?@Mirke zRbq*dD1jnVGZgvq*0qtw$xdSD>B(olY;`@ByJTauYVY$~ zc$SDLmx1d|`V89e`8iq~jS{MCWWOa-G1DGJ<#E9&FoV1(CO2qB)hbN7KYO9tN-*J^ z!pg>O@+qKs_IEg;!ci`vUZ)F>!tT#+5w~qvEETJ?XpDYuyxzaNzWJ>Dqiy>Uhk2fA z`5O{Y?Y27nq1-|O+}in=YxW`#YJ7kiYKiu1%WK=Qtmy)k;V`{|0VUU5p)DsQrvC6Q zAB;w!^7@LNUYvQQ-iwFvcf26bxdpFnxFCWOtTO1w1Z`i_K`2!ariM!#i*`7gBGjIC zmvvP2Z2HV3Fot=1iCp{QwrX((RRRZEDLT_K;9qV5aQCBZZ}7>jfz3YP*Obq4I1M|1 z&@gWtzHqH7P#R)8e&d6#($YQJCs&@{Abts&Cjvit)zgI3tF+;-i$P__C_5bst9RM^ z>JbYbSK5D{F8QWHNKoc3^rdd4~G@`IWIiQ-7e|4 zNEm}_p{k6GyD)M~XH3hB$QQ_OstkqqQ_Y$=@lo7z8GJFZXMvS$mL*&BV{NE1j^0_l~6S@zib!)(6l{Gp-X3elrO z?Z*$2a-%e!d!2hMlf>?oR#?bR8Hv`oKT^q0S-r0B<;NPi8C&tpbH)hmU?|Z_{V1$v zI-BI(`@lQqVsYRL6znW2fTP^=UO0!K1{7h zSqT$Z@m4i6t}Fucdk&u70-}nu-ze}LQsNV`@dkD*xa|N{DU3aCY;k8#m@> zNKiZY*!xKseDc-7_2gp8z z{2%lHOFA#0O1Z|&%);X7LiynQ9=K;91op6GW6x+{Npa%)#WR=f(P{YJsf(Z^YXgn5 zuhJToR#62Av>QQrt`&?2eU&?QsYR}3c9@A`l5vIVLk((6(pwgrP2#B0Ra6E2^XaeS zhL=O3vyWzTdrhLxuiQ&|93#4W)C3Wbkcz+k>@;&Fwoa{!t4c3a<)EqeCv z?N6_di`?53TA^t$3TSAfMLyGFyD*faAp$G=Msnvfb}iL>V{kQsXzxa$eA`T}cES_= zNCAC5RKs|zsJ2wQ{`*{(#($U(3Df7(I?SrDt5_^KktIOVeDrE-N4LboA8N;n znsnVAN?v%WsoH6DW{osL!`U9cbO7{i_y@y`aGaPHRh-(q@Hso9_N0u;o{qa;>eIiT zR;{WA?vYV4!HePw7Dzx88ayooR$R-cbY^UIu=tFAhh(*yQ06mlh>xhfrlRke@`hp; z+Jd5(8Tr~L7EwiK6I*Ug&~F zoFUJ(>fdJKWzj4&>x6@iqI7is?RQdXQ|lJ(N)%HO z3Qg(76&8z5QI_rCtc%m}d2?Pu^RxdVs&MYtw8&TCNs_sUYf<47_ff84C&I28T2(%C z#t4tlkF|amW?9I$&nkZLc3VBZOCl~IRI#pd-}3*#@6t!H<}X;L{fj6ZZSdxynHcTG zZANy zWN?gz%R;GB6I;c|iSUc#fP^$A`1@7yd zX2A648_ndlg2lk+J|#zuGH*r0Ap>&DSC7O-;#jLE{1=>x=Os2wSq7rVQCG97O^SLP4DuQ!+nb3eHbyE3!q9V5F- zbQ}5A`C!N+5@`7}WD}3q|6J#CqV|wz}*aCW3iM!?Pvtt3&S_s~c_IG04oK zM5c%@XP-JkG@Wjy++z?~0+BsG2Q{oZQ)ypX_#l`6Nj@vOJVq}*A;zU@pm9VEvUk)D zHfyxi&Crg{(}~zJ?BZAHQNCSSzT-Y(bgYYPi98Eo6TonN=y)=;kD$Hp%e|V!-I=^i z`LUv>iPz}HZp@o=UOcm8cNj{1n$eUmW%Ruk!PG{!MltJVOv74OcLQYWgnmo~_LFJu zE|F5S<=j<+E{6GeY{v|4t*vgg*0E%kyYB$Waimx6>;dN<0w+nd@t{?g5*V~2l)e`h z0*^#-ep#6&F%Ff*qF5T(A~O(MWvGY7qCd=V&5fw^zrmMuWyaLLy`> zz9Kc7+h+!!5F~BVC1jPq(txC8a-tQH$Xl{4@itcO*3xgBtF`q}s2w)x?%ju45T!tvq-xSAa9QdE6!Q`-{i)6=}brF^DLQ~T=i-OK7 zSCh{^ck|M;bfZHXo|mjy3#h-ap?%)Hvq@nkiwnB7Afd=zKJ{B>sgyW+a=CLo%+UJKYYw+RB;Sml_e&=S>8W|xNi zSfKn5F_eL=nJSp?Zs>gelop!mO)sreVNQhbd!n4U5` z;lX8l``9}d7oUh`s)`qs?8&&ynTobw`9AwT%x7Y+FAvg>px>Wkw3p>?!cqiCWP3|J z7*CE&%AT6Zt_qT+ufR}TFTOGg?50O`^@NSDyNR1<1|fG0k0f1Yps-?z^B*E;X} ztaEF~Fni`^HWOyg?0xO)5~`hp$X`ev?_MdZhXgxzKB)O*d0*gI_u=W{hO;b)i`r#Jdss8+co2BHA1bzT1t9Ou`e>e?2H={aHDT&M2;rj;*p8Mdy{bE1i+lQUM30`lsZ< zceVUnA@2F*&YP;Y7y@`lfxf+P?bv70pD}&)%7zKWC5f(7lv^||p5wj~klM?pg#k}( zb9&zvt<0_sDW23~Q*v$1JoA>xyvc$&@R?WB`@NjiDTCyZT_IL%zBgnFc1qV}y28|X&Jcss<+?@lI_wQeCXFYwRJ=MD03|#t8lWucFDh|u zPG~ZVd%6MBpJ;?|1OKMHW`7dYiT9=1!mN?+9aOnrG20*rvI1cR ztwrf)tVUn#XFTxDX2%9RQ>mmv@1TLG{^gbci*dANwrNXmC~U!5&V+Zn%wkapLPW?4 zOQgTHPo@AEPvruL?`*MMh+mcP^VgCEv)twrWTTjyM|nLC){~=SpA<-Zzc$Hec(k;p zbrU7g0dI|RT?-&EMtM%6N-zP;6l!93Y4Psqoo4I9KJ#+;gKeJJ3TV#_Uj_21FDk;> zC!uQkQVw?1wFcATjqfWVNm;|$2wx3T!C;4wiy;o4^qT4ji^ICA8Yi8WI+FnLkP!?m zVG~NGdv}dru6eieI2Nhl>|3b*c~Q!c`$fEffnuK+w{U(gi_Gz`r7pXn zGMkJf{W4XxyUH>vg)SG@s#>*EvN&n=MF6}caW2x#Qi9i2*R0a-cAK#Cw3e|-p}dDK zU)OS5?G&^98V$|xz`VXv-`SYV5$C?`$@^C?X0pg-)mKfg9zBK$4_wqnH}Q$Xed3(q zPlQc7=}YD*l8{}Os?X~O+U{=&LETm-pbi$3XhRz-$BWHuFIQ;t50WoF4vqcps^cfD z(8I2v6n47Z)QcY-M{;dlSu7T_y>4aw65*oUcCaz~Oa7@6+;|Mhp_1FC>6anv&t{3< zdNslx3Y1RN5|DD}cO%er>M?cYOZ!Py71eT9n(&;R8$j%mhK?ecFNWKT4Z^qg4WAih`RIyk$RB}@rCNxnaLM5o_AN}PS;rm4DzWamNvY50zK0KEZl zC)$EZQ6)sFah#ZtZGM!v<7B_agCO+2P*2D5J(Y!|8$b>fHma*asNnVEeWL63q<{+! zUQ}e|{%Cu^A(x}&>0f0&a(mLP=gd76o&-sD*EQ~5_`mxfq(F?V{w=#a|0M90m`lB0 zAHfccVrLa-oL$0YWtjX~ywYMA_oP6eh~Ntb+~^Z@-@Iey{Rxj^S-a;+ucphn!abPC z`BK{jrorDj`bJ`a6P7xJoV zCr!M)_sJ8P9!6FH0nfhRu~rHCb6_GeA!&IL|6+Dgx9bWxhV0u&qkci`7@hyBU*?Dw zx77pHdBW$6kS_q&v7wq6&kR{v8y5T2#`v>}sd$rnc?la3wbB0kP8E@n7PvbC8R?hm zw4=V%WB_!`iPuWfi7Z2>ni-TLCb}=gLmSJx(+f6b<}P{X*z5VlK2`-TuB<0J#j**_ z<1Ksz03}ObWp!9G&4C+7!g4@0yXrZT;RmZD-(c1cY2#vD2k&w52+upvR&1?s^)M)e z$Wt{Ut_~7ip=XUPuo|i;H71@15k-%P?y~~N*&p^0j2OAg83wlA_mvs<1(%_AyQBrO zIrF_&K_@<-wW|82v^|O{UT5MXp1H=`@yK9%mV0(zoYuSTn-xP6?HCoL1AWW+Ip-ow zxS)BJOiNxqW^3J>XqAvekAK*r!xp)Dd%YGGXXL%d(L`%e;76a4@`*X~3n1|@kx_3( zz?Z-UMfKz!;qaF#W^P|G^csu*daH8{Tu136o4T`z&?0##@JfBukFxBR$=b(_^3oBO*mip}I=-pOwRnV7q$mFZ2_WIB;)y<1!P7 zozfDn+86RYQeVVifPFZ}Aq$J!Tsfv$;Mc|Bsp&{=!B=YBT>g4+ji#m}_RKJo4XuBr zX#FE;YejX_2;$$elKm%v;P_mcZikiovZ6|J`!+e+Fg(}K&4?3kTbgIz@#=B29IA|J zWyW;tJT-M{G$=2&1WjLDZN4o|DYp)G<%kV~n|e?*R#&S&3bB((PRHpzp1Cw7d5p%) zb`@=8iODt!<}v7$lr2JAn+_3-@3=fAZDK5V&$Ey;f&ScbWhRvJGyd zN$nNks%awUp|PDimOtN6f|f@d6e4YO5qrrR1&*gCx27Velim)In{Ep&X3f)u3QMvm z{J1{?q{YX+jzFkCoN3mpGjT2s5Koi{d4{BFB)Dt-a4psLO%BfyAE3)PW6ob(5RlND z(7z_9V{Wl!;b*YCWML$pBHL#3+6CrgWk0r00<)igJ`ZqN9XSAhmBm8(E8Lu45U=6C z+I#tZ%rWWER1r)$UH8?Dzaz*v9?IUYlh@B6Ns{Hz=Zgx_M2Lye_rhS7%y2!yvi($ujz3E|g0J>ED(!=aigmVxKPX z>{D|%?Ye~5Q<5ShLhLdMHA2$-&_|?%6?kn%0S+;q#ONrl{;Bm;36(VD^sZHF>J-hl7#GT^7Wq2KYL>rSh5pa}pCuw-5VP^$BD( z&Kqpp;V!9*CwuWN7X=gF<4&Z^TzTFx^PuOeTK>gwQGAI3P4-v#VhT}J>Z%xhNZZPs z-QjCe6rNU4z|Ce31l)A2SRvTmM~=UeT9926Vr?`OC_Gx@DH7GoT+qVWa(hDRcLdJ= z)z#sjI!R!IW1r zHUNZ|(FWN)XG|v_4p0fG^^Eaa6%4YZlvODFFukjbn2xd|OjJ~6|J>FXrH)O&L*&-J z+LqenLWUxrIcCM*m25Q*VdUHlreOZef z+F{Oh2|R{a@WxY*k1Ti)Y&4iF?5o{{-tBn*?eNh6K-tcY@f^R$bWTpOd)F0QFuPst z7k;C`l+%%{*Dd3(Cny)Ed}@LFozeRFDAi*P5E4H~*LS}>;~RvSo2{;n#> zgCcKx;}+c;cJdjj<&_;fN#YJ@rPEcPhG~)kP&3yxs%3gY0GaMR%=5?U zRawg~yC+buXx_%f12!2Sl;*_UYjc`*O^5-ta*nPlTrvw{BnB4>W_D@=n5Y%#<>h=y zTc_n&pfWus^}*$P9x`!m;Jl&dALF+Pf(nGXsMMvq-g*k_2})wO**=`+8^vivw+dh?S$cT;z1;eyDqlbDqO zd8x)Czq$POo?oI8r9p7We`-eePXbJNb7{O&e?ik>8UAWB$;Nb8rjuT7q2YZ{r237M z`LNGbPw_VB`l-+pn1F5iaob;L0u5QwB55yNZ1+E#i8BMA&fI^JfJZUcm2D%W+#XFR zFqm0LbtU0HosSZ2G>#m;SsPN16>HtWZnBLf4piQo>2vs;PATL>TjaQWo+X;N zI@z*lw9TK@H6AsUvEhJhxaPtkwhrc@my~xH=781;dL>C~IUq%IJsiA^kM8?EnAkgk zNb$jFZ4d`(*-o$MLA{o>5`xU7Tjz&qxpWLiQgGRHz{gjUGYT}aDlRTQG(r63zH;0X zuqy`j&o$Flw?P+>^h(*d^R&)>j-fJopl}8O{NY++E#mB5vni4lLp(+L)rECp-+#KE z(5oZ|C~d+QJwql{$BSLUxuvAihs)iM`%1GCk^2RXS6;qDR^UWm9+VXX`*F*3dpg;< zd~;!;*LjD_$1d^X)1k{qo;j(rN;aCSAhj~?)fb0u?{&3bZY~z2_fLXTbs$IT?(6C0 z?$FO|dpE_3C%RVFchrQO1kC0p&%6_gW<>MmHj}pdrA)pfW0-edg+!wt$f~UIhg>RnD%hNbI$(uweN( zg~HR!ELRZ~zE)l8L)^&x2j(N;z~#4xh2icWU}U#RUvy@nIf9@cU;XieCjWC$1 zwPP>4);PYNX%<=4AnTE5p1>SITGym#h6$W^khiF&+L7~V-|lCeU>$-!yn5a(ty!{b z4Yw7ot8f#Q>jVxz8cQ|5hyStgxIYPu#1K=pR>xGW*`Ab*#o%psC(^Q!pEiv|Dgyiv z;PZGSeuS*%(zj%Pj%Fld{@s|TeKM!^ma`~&6-&e7jrf9mRyOF5ze zK==rjQ4Qsm4m#->9CBPO73I`>X=83C!}S}}yPd;3m(uSyx4F0F_B|ZyZ5PATrXfv` z#ohknrCV^vi*%FegsW1AqDPym2OlR5q{im%#O^xNQV`;2J`}qEUlRC|He40$U$Z*Z zUyCD|-xh;nLDDaGu)i-Z5>yCqG+j*&Z-^TCn2{gh8MD0B1TP0fTh7Kq6SSHpPE>!a zXK5*>ZeTr4Tb17qn(Ic3+b-(?+^UZeCk5m_17)DJS44;Wsch&{!tHLqSg^`ny z*#r@>#w*|vM`P>AX_MN{&Q<2l_Rc4a5_1JLZMqWWdHjNhll^Dhx@@5o(qaS zCa8iV6&w?O%^j~E0c%THluXHMig^M2mOQA|GzZT5;4CSdI@EvxzR95Fnm;EU9<8c` za%FmfIFi&&y}X%5j8nqctGL)RftBCjyfZ=cFHo$>eW!Po)8z^Bzef|TxV+w%r$$R6 zMmr;jiUrG?#q#0Xu4Y5owkiBJo9A{#oDUUkNd5 zF|c$Dr_w*k==}p`{+k5-?-?60%~(bf&FdXX|Nz_>w`iDU+gUb8B_5hR%qo8NBQCK}Vc-eqho|mHtFpv7?kJ z-&Lwy#=3MfMhDLewZ+wXQFoV_k-03fjG2*a6Y@dso~N!EbKAT=;qzl-EoXc4UQ+ui zD-u0&yyh^({=y+qTAz!93Vk&#mFV#i*Ad5&xUzw8X~gQFx%>$&-F?Lq=h1KSM!1bg6{AHz!LzNeLo z?S>^*9GrPGs0}@gHjkvb-e#j4ewmuptq|F$neUZv4&CbF1aq&~$M%*jNYjLc*G*Hb zB(nudvbK<|R7T2*EZZve2?v2a%7ebvRD(mtfH)Hxb*uKKO@mZf62?3@KGe zZCi0gn`0zP*1ED#;uvDgwc4vBlsu3Vkrc*PX1=5ev$vPBx1op!%EoI12w}t@_Q>YQ zu7iBY(2T|b$ershxBp(Ne&csm;wq5frb!xp3AkC6QwLX1v(oPmO97Cz`B7niGqSGsQ=vtL8y zMmqGZMexqtQ|wilG!AOdiSwC9ss>{4yHV)*kNVG_>)a<5dTXhWvHqzSoRiGAnr2dA zXFIW^Qhd~KphE1^8g7;l4smKoOwjUUE_7MVkoW>ugDQ4kI43|w%biDdz!?JIY>gwNj z(&^0FhLU`vdkXHV+?>{j9Jgp`z2{FCI6a-X$|JCPY5OvC+&6ScodSTno_SK05AEzZ zrAMdsgvn>))fSi136xj3P#N-);*{HF1b z$xmBN=Zb^o``)A)K0Tz4OJ-4!>ZjYaboRx)YG`w`e8+NwrDKVV56!|A(#)_qgxI+? z-(Pg@b(WU;gdgsrCI9{29b!@$+e=EJ_rsNS~z+(D)T@IpGUg5 zQc3hwj(y_WRn6}^@P2pqu*)6!x9sEZDR=+xO5y!UAR`!+fSp_03OD`l?bKtX@(PkT z)>GipSyx#uNPRi^Qn_WRhja)QW!UH0>agIfZf&t-utY_SW@)uj*TtIUJra~Mxe?bl zdldS{PQe{P-oSSTkgJzRuqGG9+*BqvjKxutE0D10GG?1 z47ZFs*EXd}-ePd0$xLwZD-eHpL~Kh6?twl@(knh(-2y!tt1HjvVpxi6wcQvTY&&x) zUKzxX8%dP0-Z6O!gOq}RJ!k8XVX2pgKd$C>Jm6UovJ9o@XUMuL>XM{Jl~8xnCK<>h zuxZ=9`FVKPyJiq&J&thjyjs<$lvMwbAYk6{6s{2E&Tpd=p#iZ`4Tq1cItthZ13$La zHq2dy+IlR;){PI~xuzRFEJPDb3!KE<2G#7u^2yVRxB5=k%@|f|Fs&vB8!ZQNCJ%fQ zVf%z7jL+FDprjWUXZk|t!E^FhndKvkMdLSvyE;%a4iHdT)KEi;;yu$m#G6;V*5G@E z&#VQGK&8^k3y%#Bf-%Dh&ByupUJMc(4jd)*N^U!TB8ClLud#muAWj&uW%xYUXQc(( z+xlM3c4IN{z?_I==#I9m)yxJ9sMn8d{ zOqcZo{uTZ^RX7O|wv01lwR;=JdM`9#m0miU7Rl3thWQ6qrXb#Lr-$h|k~Aiug~_z! z{Dr;RR~A3eItf6F!QWq){@6S`Blr5>vgG(slUp&2n*^>Jb zqI$WN{+V6nj?LS}HvEI`tKMD(JZNwLsj0E!nSpq`$&#rOpR3bNxG2ZOu(0swcW>$U z+O=c5>cx;~bwhl$e55GlT%q;?tgy^atI4G2oT1`5-c|!F zGX60A1YL!}}h6$kWKB z-5y%xMAcS6Gi6X*b>n3pCq*MPsB&Q8D+V&AGPO;S+3`Szp~W}GAL=%CB$%eYO9#9= z4q(__BCCX9pzsp~Gq8P4a1%+rmK_^t!kp)Q5Z9&RfK8NVPj!s265UFg+y&G}9bwq( z$E7iL%&X1Ww4&ZX64gbaT3Hi$K?c zS-ryBsY;6#n`8T%3HxIaDm9^xgM~=CeBPD>?sA@3;{$A2isi`z+GVe0ug4Z~s!_uj z>Ew=2+t+NLTN0_ScMgbRgc(wvy@$CP1L@zgKiA`BNoJBJ3u@K^6@A-1n}*jViJI2F zhc!Z@R;V|=JbS}#?*Slx-4)Aw5spdII0p28fZo1t+_k*$Xs&Gdviu3QZ}AQ?Ok4ir zAV0^X)D3GGS@u)wanSZ;j#6*XhMC-og1&ZDGhU8IsB(qbN(cd4bw{p9P}1WT%z1#oYR6AF;61O*TAqp6lZE6#8B8bm%LT;VEjUO@P(0q++kMfO3$^ZV zW+Q%aj>DF4#pw^%21Cm`Wim1$znz^%0@3)b>{eC;nKrE#0ZxPR->g9#8cLVbN#$xl zQ}={$&EciRu_h5dJO!~#g&kC?w%(*=3&^}*^DovB!!wxk(3L*sZ_?|!Pod^)pA4aE zjI8fwApr)I8l!T4JPF7A8t3$>$Bbv6l<06z0hdJ5<1$^p8SXoDECnszM2Rf>DXffk z&T&n^nD|Df>wd`A69;cPWIpK^k*Twdi{W!kC*?i-3AiRSTpPtf-9ClR90xE$BY=n# zbgOV{L-dS(Yv6#_n=;X3V``}d+H6}pVmv|}ky!9?=QT}CyXD2bUphnWQ^`L8OqF@^ z=_m9&nHfdf7cEh(#d!;gK6YO8!#BE{BQO$hYdqh-t5wJK-HBB)!wAFvGrj76Ose)z z0>-erw1JnOwJStSYw$b}kmbnlvP(EnW3+9;# zbKm`-L!)#5&i=+`O#G--`Y6*QDW6&a z<0F~gRj04c+f7`h^~tIJuNH|B(WPs1TKFjGU9%~x1zAI#2wLiu^?FkEhvW_VhoMiB z62Inbgi5yW*J{1BphBD$muXahX?AnA;Uv+GQ4o@r?m7PbNzWXdYBwyqxITeusxKol zhKY{y9G1kpyQ>fugXV~*c#x3`Uy9uFj%u|^#srvibXj}i`#>_a<6()l;9T6)>HOjy zk;R=?!Er9Ra5cD6XnkFM;DJn36r`y?UN{^X#Qnu8ni6X`<=N5q$-wq0&D2QUCN)j7 z-4rwlhGdOj3}#w;Uh{kPQ=OE=c4 zPk@WQekK*D{OF6@YtPL#^#J?P+1slw`)y@ zH30z6N=1$@_C~MbGsWu_gbmH}aw*|w`Uy^2n=n)6XqDtmD8?jRFC8B>qr^d5FwB#VF=t&eNP^FB)SZ?grC9MWfE0X31yh@q@({EP|6l_qKk6lG?6q;urk?OL4!e?n? zsq<0G!oC)Q@i1dJyd<37Q(!NFo4>%n1dnFpi=i={x{9k786_YS`O+1nl}EX%b+u`R z@S=j)WRM+Q$d9{hudX)w`qmvbYKAJJ*~o9!3JIjuoH>{Cavn@9#iJLRzWZkSB|h!4 zwlXN-9{2R$UjrFScxIxLH}{tm7ts1XD`3IUR=ml*yI*SuCnqYcCRdWR$8*C9l+zzg z%q!6wadf#>e~3^XFxCdX6!v9X;{ipih2@Q(*iKV`O+g%S@&k*HhiR8^fVR|d`tilO^Vd}m>uByz6K8BREt$;$}U zT78^(FRMN2;-*%aX?BvjBW%~+F7(;?yK^JLKzZv2>!gKLTkGG<+6WCY9IbN&Ok7H) zDbnJTszFLJ`QYabY1Qf@{r6KmNo%DM-92Wov;{DsM!&kT=*KjW$(#U4hP}-PBi$0q za`^n34FkJe{fQ}NXuu)!<6sO&jH3eItNETd|WSF zJZ7Z72y>t%SWs)GDi81m`BhdVfA`a?DQlITpIR;lUyhAmTAB-fy)G%L+%TCtO}c8R zlqJCEDM0*L!SRmBc_5B(U)q;2FWJwBb>~k0I$jQ5&)qC1ErXmLS`e)<-tL>g!cVnH zD$Zp;D3ZA56H>Q3SHBy+)U(eY*xNe=yQ4?SwYa%y<;pz|g+HFkUiXbV;F0}718EtdZe5=(RPG#j)=&t3+ zOjjEnRK)n}aR$woBoK%?t$ehkOgO;)TSwfJxRNen30>Lfocr{~gbur3uvCuqFD*cZ z(r4{U5%f$c+VZ)W+VVJS?@eZ(U6@(c6AV}Vz_dRO)On`+LM0f(AfWiNX3-Mvq`qma z<@G$(UD;cJn!&VTq+gqzApZO%Z^bknYpa%AW#UB7*G%bL-N5vmM0j;fGaR^A38}0r z>~lax7Gz2XJ@Hd6ydkB;TWd!%^cP!+;r-fj)6N&ZRxnh;N`FCPt@PpUjKNug(Oh4o zbN8SkUG%}zWwQ4&&-?doxIneK{K*gjq0Jgpk%wm6%oh^KWJUNQ~CSdQ!E%=g!MzMv{xKm_u$^>6?yLW+#4H1x-#=^|bT)17rw|V13oOz^$C_;3j z*{{TWp~DIlR0NIDs)99q5*}z(D(z(&+0DmbKj6m1AFz5zA68~Hb1e(v?ur|>vQB%L zYmO@U+0Q+mctRbg;dx}v7f;BgC8bXx`tUQGh>)a3aPweSBU5j%tV#*Wd4C#sTsjxQ z%_P4o*Br$_J`-pdz8*umjw(~^eEKqSxooe&Z#r>&OhrBK+@E1iGu?HiESV-0YC`ee z;f90VAQV=S6fSMfHHcW8Hka>0^zN-7>wDU6I$N`l$?A)mjeocyoHqCA4Ff*dxrbCz3_S=Apla4x zea5-%uOdN46`wM<0bc}R$dGiiwl7a}Gl?vNvnVPm@>H!tIxiUGfowM(D@_VShzNZF zkOF0~EMH$7R4#`#+pX-zgrYhgGYKkJ@JzNs{_m ztsL-*>Tz_UH_U{A>mQ%SQSl6{yiH$YL?WR#;fS3C74PK3NK zXM_g1Cm{PDf!G-zX*+2b?tEyNvnxAuV_VdwS|s zK~7WAv-^`=Jnun0!k!v=2_RnH+LokF<4pMG?U*Tj>VIU-qQ!9_K7N@o;A6z^OFoCXbT z!quU*5nf>6``7*Mi_U#F69UZx0|~h9tX;gls`OAVCtKd?&T#4~YM4Ot<}ExjvwIx7 zxX`#xntR8-EhS zn?QVdaVyjNLC`W$sq8_niB{Zga|{dpvBw-x9}F-fbiE4eXagMn*- z8{Eb-HDMVXaLaDyIg9~32o9bswLq&0s}qUKQF!gZBNo zpgEfa9$-J3(YIYQ@sH2E)Y+7(l9q#&$%PgrS)!b`nFX#&PF&0SngsJ5^*D1`2KzH_W%O_AqCh{?`UvpOoTrpiqHc?+t}F^51z(c;pR--88mVi z=hX2NTt$V`fxIMp#Th9#6|v>KtwmBM6Q$iJ_18c$ax8-4;a-hqi-v0R3w~j%A`O!n z7?WWWNZv4aV{=UNEPQLPBC#Rq+Nuz>c3M7(=DEHPL&dGWwXZUpXV+Lw%WF(s9E}KD zeN*u`hEe722b`~Kl9JajG@EEW^X)N*3^>qsqMT`=-`?KweLQeI-kW{qXwc@8`FbuE zEnbJX(c8ITvH-jE83Y@{+UP-^)Z@L-QO>zRZCBQLTyKWlySC@RUa>1Ol=aA#CSoz6 zaFHunt~?4RT%ZVnuIXFFs!FmINmlHYRM<#O8=>yyb7nhNHPyUoF{y{RWPi7#s^K1K z9J-V99v;-#b1=Mf;xuYkKJ*jt-$UzK65#)ak7j=ogiP3_!S*fG+ZD^ME4)>g8l_^W zi&BkujB1k4Wzir;nO4!hEzKpoQ33M^72^37>h-93OlPh;wLHPE)lweR4Wr)P#6Qfv zt0|?GqJQ@6lw~YtKfSu`%V;DJyJ=vNY~m50_oC6l;xhp(snI7luT5*Ss4>Viaz&a@ zF*yg5XgdA7rcM3Mi5#&IESzAhZvv9*Yw%`_UUMY|0!&Vy^iBZYWKKWp_#>dU7PgS3 zfKh4=pT!Wh&?glV)m6+W*O|yH?L#0E_E{Z2h(Q+INcPiPwo*qE*V{B^r)AJrh{=*yIa^b12b3LO`?#c~oi z>cV$5UBVzWQf_?pG@(5_lU0nca)x|Pm`-zi4bY8Ws+FU5Z&2ZOvs3|8t5-TRBqznc zlQ7WKRR%xK=5w%AU=1KU{5;L=O}c$sK^uxQ1f3G{Mq#%C!^u`?I&f{iWo~IPY47vF zgGBl2!EG9^%onU!c!y8xZULH)0XHuzm$T56Hfx4^NW{_;l;VmDDb#sQ^J`ucd22c3 z)mhqsv)$)7J0bHgDaP#208y#{oP>D4d15=wclV~UL??Azn(8VyeZCP4WHM*a*KDR+ zC-}il+R`Ska~&(WQ8a7ihN}VXl{b8qX71M4Px=D0zwLNEh4Yp-YIsoe?b3RB5fCnm z2=(fKr%KEA{!=@9|0DnujO@m)5Xx<(zANk2z?|+A#B~s~3;V?{)u)g*{VU+}m1%iS zU;6r1#1Qk%AXurKOwY6gJmSNKm8(s@5V_^2*^I-oL+S?-=(ZQO4i`jM6~_yT#wa?9Hn7f%yqJiGI>TWm-DiDI& zKrRovI2>|1fy=M=ZF{6vTe-qMHRvJrwqlC!HHkUa58CGakfT5IaBVZMEJifzz8i3| zE*`yKD%onxtJG?t_sa_NaNXRkewDrzPe?k z)O0yf!rx1VqpFJT(I(PiH!k?Bwx-!&dUirq!4WMlP%2Nxl1<;4b&F^FkY-a(RQK&v z7nz#%Flz*L`R6$#PhXQl*OZVT>}3y|ueCMeSm=`3|(emIfDaAq_*(l6!vf)^rErfK|I^q8QpkSfs=&*`aCra&bme zIBL?RQD@5UA!4x0^WvakEr15)wCR%~aH2(;X1u>&X)6d#O27w)?i-FmWf$hA^;I(( zmNLoOE%+yXh-Ojl(pzLhQ=_KxuZC_fKHhx%IZ2AnLf>r=|CuSKQ}CFK6y>5f`MkF6 zmXkae=B5_>c%mX%(=isx4U`0~TP0T z84jy!fvb8$80+tJTUXV(iWfS)@QUdiBUf?jdGw6t6R zS>m)`=&R@>IT0KTU65%4fK(lv6V_)WirZ zs$b^E9bFGlfX@$*g0DqYeKnSMAwC_Rne>@QJ%f2lHaHqJ+GDt%utdT*V(W+~kMxRS zrLOmV1ITTJ2aHPGk+6pKH5o`fZ(|KOO}#ve|6ng;G;;Ncy`egdTBdZ2Y`O!aPTR`> z;s)}_N&d}Bn9!Xxy~sZyYqe4Y6C_&z>Grx&iW3%nU{8`b5?*!VwTc0t@jS6th-S*`3eZ6jT9vY?wfzEazf*{*;<#zE}fketVd>a=>M@8OKMK9bCC zwrV3!YYUt%j>op?nSz7Bwuf^{Br&O8J@Mkxi5u~c4s8NE9pw`*HU7{qc>1EjpFaQI zR0c1wH+j)_eB;$&gZa`AhuU|8pQb>{NDxU3lz@_Hv>@@6c@|BX@O(11zp=18mn|$#IiNt z1>{q-bfcyr?vYT?3b{Hgr{ulYvqzCf@d4Q;ylN@(6uIy7No*%PAx?=22Crm59`@5Q ziY5&Lr2o9$X#{R=T$}s#+5y9dJ;73|f<8smUlVU&l1e7macCJU`Q()=ktdCFTPDVH z?VJ;dOO#IKZ+nzgsA`m6ITZb|g#5=f|Biq2e?_m9&}Sywl+C7*s0m8rLG!p9lDC4U zA4}q>rb}@XG?0=yF|JN0zxjC<;Mp2KO6@CKb+s-Mp zu6bhq<-11d|IKOA@}Y{Ijhr=pt4snD{gYz6rs^`q&HXGxf!zn}Z#-+L%%ePn23~9a z_z+9O#83Hm6%uVFN`SsP5rerv$J~=DEgtwdWgulgq^c)d&n}D$fE5osDRuvcEF*^B z?uPmtgSj$QeY2LZXe!;8elws8>mXg<9dt#w>(@1WHrDbnrN5uZUm0^(d2y86@=|Cc zUhPT@9Y%!-PVW%mdj?KGO zpbm)^yP3-elmrmRYn7W~C~E%JFv62R992F)T~9;Us?HsWV2rC)j#}jcy!HpuK3jLo z{7CNnk8OYL!;@bdRh~CvNWERHKKt${J)u=8iWMI>R$g`T*)!M7yo5h&9~4!QYy~MW zDolicZa%zeTla14X^C)G!fT9t=EYRw-`U)8e*P8a@Hc$;|K)d_pR-TZad0UCzXr7q zlVRZfb9E3N0PyQY4xj|QcxmSevh(7HfNWm62spiPzyjR*&G>7FUmN`zKfnE42Ha9p z1}X!vumAv6%s;@-6~F@}D99cF(9i(zU^XHEV1HCj796 zdgTA}3xJ#eAO_&Z!D0nqlVjnKWBu#`uwZ`j4XoeBZ@Xc>U}59n-oV2rAiPP0*`W3o z02>Pj2OAgX#*JS;2Fnj)2jG(5ptvja5bw6O6+WvgrSO}$Yy!4NRqa$dV+eK;>z9Fq zH>qi8>F7B)x$bfEh>D3zNJ>d7K2}mzQ3a~$>ggL88X23|*xK1UID(wq+&w(Kpx&?E zz6%Nt2@MO6Pk5i0l>8wjH77SOzo4+FxTLxUR$Ev9xuLP6v#YzOx37O-d}4BHdgj|K zd}VcQePeU$`}Pj<@aXvD^bB==@yjnP0M1|B!hHRUXTS4{9OD-@E-nr({x83OKj8pk94yR-35Oh@0Jv&Hl0}G_bLm|Vf0|fnoDbE` zYq-BLzl@Em^(Ngdwb6r&fsjo%&xp#FgpFwHoc6T+wXMgxzy1KUNDBGblmT-YRq0WF zAX7TQEYo%$k^;CX@s?TL$#^G|uNhX~L~ob=XjL>;g=7BB#H#~%XP>0i*BBEN{`JiV zMc21cHV|o3wIft3!3wxGY!l!db6 zh-ZR{^yKr8aIqzg}e{b$C%Z9M6wVUEA+m{m>q75!zb@Nidy9DGRZ^ zesx0E=`U3&j#NQM-M@lh_?CE16wk7*#;zQ3j+#!7NgN=Ez!A9j-RPrU@wfpu+~^%^ zmpF~xh!>^|Dj#-IWHH&Chs#8w82z^ogRi>@aVs85ascU=yJFPP-!ZkWXmILGh%Y~4 zP8V^Nb((mA`q)bqGrQJ!X>kdB_)djSms^O>?-e% zZh!~S7!^jgCkmzkS2tUpUTysZxCfX3&}*233v=?Kmybf^>eRrJE>_9tI-UjIzL!{d zUzL@69Z1|gHBil?8uZ}?AC}k!UH+(tN5MCw`y@T- z7=?B%vlI|d(+a95S}DxCJ(EO~)>JL%)}y^24b_c*=$SJB_B&vyBn`|;%?rg{(Akg6 zm6r}Cu(2l1XBy8NrWa^VWX?)%r*7t>jnQpvNy*4xt_J+gzo!9YSFoRe*^*b=(lHnn z!qsNPb($Zv{*0in1nUfx0MdmTvr z=Y@z!pDpCBW=^<`!tY}h8_Lm9iX8y>^&!=c~U$bC@n$!i+1TjAW;U7s#cxkRF zv`BvfzW!rs%)?efXWKDlHKuU#+in1OPIFC{zx=f50`M;4BsisPw)tUXuTkLG_yg5@ z+MNz;v~1B06&<5p7mq*TwX}T-G#?S?pLZ4yzDxR2iZ@VMl8f==BWZMa_aCNK_=}g% z|KjCq@uD)z-yLJ_Uysk=UtIq`nCKslVt$9EAV0eRx}=^}-uJpNm}bStlODaeOs6S8 z046-5E8nB-R_JOKsCMcHi@dSbV@?7b411=u&mtnXm=jOzpz;_dp}WJ1*R2faHvxw( zs0S4a-}wR%Q~{_BJEs65+nFz8_N{FV(NO#My#+a@<_Sc~D#>><@3;A6eXw<1Y;me< z#$+GafY^UDz8tJLlJM;@>T#$kOl76b=pbZvTtD(cs-&F2oG^1M+ zXGam7lFRX0``i9{Ha`K(Ri`XJ49BQUj;>`fF|5J`9ff7H%0M=IvM1I%wHnfOsKuZm zJ$TyW4Jj1KXnL###S^cxGk8$7hC@rW2+AU?Ww_Gb6VTQBRIkTZpL}Z;rl~A%UZr_J zIEs#Mcs9)m*y@`Hxuf316&Hq|L36n1%khR0T#~!ai zaYat1Z2#s9{s|Glo?b^ZR|=ekbUJaRtn`#I;n&wcJW&pGDTkg8t;ij%i|G&8UlmqcWp zo>}TzsrRj*6CZi3Sxh3U=X=&#>Ve}%v}^o^JbTZ3Y3FoXMh;YEQjbO^hWTo6G9Dcu zDnH?8N+Y&eZnbdgM93>-I%72O4pqc8;F!2>c;zgN%8L~UH>_I**_lu>!>5h7+RbfQ zt`v2hcr+7Fu691*lpfc;zh;at4MwUm`cwN9O%5#14XpOSG0dx-0om6be0l_AR)J#_ z;7^eLxZD1NXE3&f-v`FsU}#=TU_LJ=h$U{=hScd@MbY^$@xsf@Hl9ZntpNfArefDC zy_v4u26oeNZg)c15>OWg5}lYgHA^tM0FKIm4k@bv|1}9;pa(oymH%_!*OD+I)D1VKrseYtn(o+` z@r_V_k>&aTM$&Mhu8N#zHro*P_>}oftZ#{rFBAyc(1jF8=%`c{99aYBFj_PsDQxDP z?g_bO(9pvYsn1H0OQJw$V^a-ZlDq~-mP}yV3S7S=V!a2jn?M36|Hs?Ur4hp#a>}~B zHnyxK-`vgPc%xhy6`EyyrPfnvo?DkppxuEjU~dd;Fju$B>Zea@ElwVc&u8WiJ^pkb zr8>Dzm4URlq#QNu-P>~Un21-JpX|{(9_*V|3e5C~#aV`}N9Z7JBTxH9u4-QS#?9D- z7Q4R^#NU5_dBn6kYAyRx8C$6i9rUk4{A1wM_eV@0vmZ{e4(IMF{ccT)JTQ^(K8$j;U zTV)&4z)RAC72|4Nh^bqwe`+KD$SWriT{&7kcm^vzkule2v%!g+x!U4g?Pk|T?km_s zDv>W4_$1?^B!!8vF_~N>;CX-JNtT>K#SPwuKq!1x{wnewBggWj3(Id&*U5PZxf3TC-e4*2xHx zV82RR0GX$vm3)y}P0^m4ot>+n+CF67s4ryvRHgli(;+Z>YvWE7tRle`?OBGom$D5} zt@PpdsrKPUX#;0B3N+krsmni7t14!?`(8ni-jF+3!N zGhHbzjsm@y{r0Qv+Yma~awlRk-Gfn*xBaRntYRGQJuvPe$;;dJ^RBxB&oH!0zHdWX z9uKT{z|fA_a-A(}p%gQ^@T^4CbL$H+ zEO@NO<+tV1F0EU1HS5A~I#?fcwv~MBsPe2Uba_kyv&ygyIhMBjCY2b8g$e>w8w`;( z#%yv)HeMo(+xGDCkulR3fGeKlTFt)z!JRn1$3SQb;Ehf|KPtSBRq_>{Hmo_U0)2Ga z^a=er8^hM7_lFdh-Ub+ml?*{Qj-7^1_bhKitS(WMHjoOzbHa3e5qy42;Q`?_C2H=# zsN%E@K}uj%^Ez!>P|GRUa>SA-kr5RO&wVMj{*&fm5<)86g9m_}Li9pr@`hr*+^39M z3~TZgr+LGac^&AV#jrWSrK55Xb2U2coX`B6@!`DwLXg<+FiE+ha2u^GpbvBKr)-YV zEJqi%QpBKL50`z2V96_|bf!Kh#Ck8$wPh0aQ7ghJW76qcLz>O&b8$#R`OUZPfn_bi^!kHG7@?j_EHBIXqlPSwwLP}%E^eQ6S$9Ih=;N4)rdPdEIn3NIdOi zXaAxOTI$w%@8wmU7_8DIIC39ig*RvSO>V0k?W#@(kke&x0lXdH?prmDa->tx0d|P# z(3H)6sZH#Ql0#J+FHe~)4R_xV~;WYQ6cYs)}f_K7l^b~X= zzS5#InM+I4uvR>dR{QQ9?ve`3?2FH&O^ShG1#h@E*wB|KD&SU=1Iw!v7&L4#2bmC; zWXnT5MYC$Z4G~~y-RfXg3!YuEaOZei`9@gnnC)7{lQR@^enh^G4h>KtR?n{Varuu> zj1zp+k~qCIJ(J4P?`^=GAi5Z)IIjzIcB>t9fjB$SHyN>>se}%=rPeLY3wLQ5jAwLQ zP1L!{6yLwkmlLd}e|t4&^PNX{wi9>Ar8*bS(+kEUQAcP~Lmd=WQ>iIS1Z1{UM=?3a z+yQ%QR#}bdF9iO;B;u#+1@;CDon;|nXWNae>20l}Ub9e@3%J?|L}Cqy8jg_z%V@iD zpuPg!(dt?yg(MtaK^+rB%Fzy~5{xaZ??=)h=3dvH$|(;OKDZ;=92C7Ya`ElMK4bpV z8Tw)Vq@fm`c3jpYF?DbeUF;Y3V)I=0+?rfBjXGV!cV8b_v8z0mZGCVes@EYTB+<#P zM?ARiBT428V)5yz=Rl0{BcJ(}u%&+UkrzSc{l|^dZ+}sqNV5p|4Cn89dUjDP57>;- zPBZU3azCk~O5yi&^h)ioGwRAm2g&UA?e~qSYzaup;nPWKcbv4-m`g^=RXD@L@|U~Y z(wJ18G@E)1qqj0$TI~ARGfJV>(7|MS_)&T0$%Ke%Z6+(%1nt0;3U~XJNtc_#hE&1t zDiS23ye28tDZZdCrTS9bxQ%@>*%Ox}&?|8XUXX&lE{I;W_do;F27fazhnU)`BUPvq zdDo`6^cQBFrslI?H}hMc_Rn4WWc{L|@j_mX#*yOayFZ{h#e?#ne#S^s#)trhFJt4g zn^x;=r4*>cUUNQn16#IniIy^3+Q3+vk_DXy-X;sv@z&77w)tXm4!9qIH>+S*d{)c+ zuG}WsxMY>Di?c|+=j@7biu4MhBVXW~a(<{KUNkqbDvI$rhTeFXFYLC7+Yly*taZkqU;g^a6!YX=zSDnnJ(s-Xwb`$=CN`ES-5ba|GuS(e@?%agn zwrc&a=^R)|RdbZwh@{?u49$ZWViNzc)Vsy(x^0LUDsOU^_{Mh&nDy=(7mULSE>xUW zoo$*M2(BKvN7NFhrMjfOnzmS;EPu%D<49knv&K@z!LCNX#ei>{Z1sqgly2y7;mpKB zS54g^Y%3dahnMEsbfUZH6Z3YC&g+!VB~BW*X>*cIu)7|gvEV6RbUNSU6iU~jt9`Wx zoz6b}YS{eM;|XSK>r)-RZ@Mh&Ni8gm>5l177vPP?FjAi{MpBqatQe|(LKS7U(Cut{t6EX) z+IWYkp&|67=3-DZMYw_1!bJ-%$N}R;m?sbo%=~mo1OBlFy5rfrRbM1Zs%(={OnR~M z)~`b=B>THI${cqO-1wt--i+Yx2(xo4EgLXp@oDUvkK2&c1V|97>8hZHs@P4PVGKcrlf-3x7NRsrDsV z3PoYxsotZQ>;H)m`*BnGDYMwh0%qZMyOf1_qs^kurfJU`q9-!?phNwYs|0ILM-FyH8Z9nZ6wZ*-HziobA9ko^x=Lx3o=F0IqsxU zk`FB{7LLVfh-R09>2!=N^=nCa>&T#UL{e!0j!nN~#0<3=djX9kl$q#($ zhK=i4N=e4C+~r;f;Xiu|UDLfC0dK7NHz7YR1B#!2*)zTTzYIR4&o6p0FBZR|*Vm-b zG2?T1|H$=tz!c2|tSQ1GOn+#$u>LbSJXAVp3&o6OnV)Sxt^aTx}cRpgg&nU^=ED@U9=CSE)B`$v=LEvHc~KoBoWg1#LFan!091|za25s zhnNPwzS|U=-oRiYOQ7F^6&Est<$1BK3B?}zb#e^X6E>x|z17dbOrw12>m`q-8o$i5 zptz?d@KFjgzmV}N0~K7eW_0{(reQu*SJ~Z4+MoW~8ODz+zV8n)F&>VjkwxY!_9yg? zl{K#M%CsALm2TW|7E{&U*ry0g22TR>yXU!`c(?hQ8u*cjm`BzWe2Mxk(2s@TKTi4z z0*jl7b`LK2Q%41MkksA(x31HS6+eWaL>qtRQX+rkbupx(8xn*ygAMa{9GrNF)e3)E zTBewf*2@x6W0vJ8b}>+2J}Ifks}#7^kUHusZv@TVhJ=SQ3?jpx{FTLg@VSPdP6&I{ zoQ(dGZnm5MFg4%3wvz4wo?En!3~Vp$WB3&Liq@;*3Q2UTW39gsOfK0Z`TFBF{i?*1 zWrkZZWrGM{dxd|$^d+`t1O4Kk5i+cD(P`)fyGo5*P zJ%-Ns)mVrgBkfQ8v>#G*6cKVZM8-j=rbqN7g2=lCoc{ud~8P{Ry+uR32T^ zHX)L}|YCf^(cxxYl^7f#)k~EZm7j|mh%2Fjwjg8qLqS4G$m*tbMMfCS*RsPM- zsP9B5#gXF%hgfO1Arq1GDwvw3_l^ov3RC=n zv6@o>v$VV#W{z4{)me^HKkP*W3N46u>~}G7Tee)WQH?A08Le=(TC0%vlzPS-YvSgF z`)O=);%K~GnEc10b^A5rcDSivki4|F#Spx9S`JnRY)@0%#$ECjdHkJw(%a&@b+nx9 zXFmq9YFlI202kD~o!MCoB6-d)APw*U30g-cZZmyB9~>$%YC#km+b&8hVD zN7)zdNZOFA3><$Qyilkc-ia>tI*lsIL-U{>rJ^m{#NagAd6uVK$x2=*|4UB6sWLA=I!E*6R0VVH{xTO+Q}bfM0+&Ue#DPt zdt?FA9S&aTbl|`yogV&Oo6G+?7{+B>4tM3*!weA4WwEiDrj%hJTqMuxJYDFBmbW2m z-oO?bo1eEKKD}suSoNBIl-uii1KY84hBhw^qWt~6@`%qjNDfzK083RX2T!&+kgJC+ zP_%XeAvlY%$~%PxCBdcatmnSGwRvJx_m2>sd1#M5Lz|H!U>wel$rIB`9~=%D>T9KQeRzcDO5W~Dr_np+m+(_ zY!kZppQOR0r>Ik^9F9J?6?uhNn`iU>^EcCj*MOw^(0=?`%5T1?$GiG*!B^kD3N#mtE{<84W3jnf&BlUxzN_7GJ&Z zcctWndHYF$5j?QWa737)gR)#Q=}e*GA7RH-5v z1cEC^c2|X@0L1^)zX~k8)pa&;HUk5gvmbz_9)mz|g#{0Am}>{1Y;xz8%N-MED|Pak+vh^^o+e=ku6o)kXsff_;iq<-h&^sU?ExCgH9M-4(esk6WH za4p&Wj^)l>Kv!JBmyi1*L7wpMJe+*lOR_59@^xwwM zBz|u)To;W|aw0zsNQ^6NK>2kQ>_y|87fwtmaS(TbV+lT4`2^nG=`ZgQb9eWY5(jY? zI9^h3A1gTTE@2)>3*mU?Uvx{sd7lXLK+Ff%-5UqRqQSd6k1j!d|IijEZ!SE}!fbLi$R8xLaI%*onUN1?R;R<_UrKWepq1M{wQ} zVcs9yH@Dw$c5t4i9zlKoU?0S?nML5dEW*4$*oR3vk`A0la`n&hiJd+BhyG$|?Yy0h+jksQBJc1Q#yC)4aTP{1gzd?Ya)>@6q)? zeo91KTA1%&aM>aW z)1<&?9@r!faM~n6n)q2T+QppBRdAZpbwZko3xUzvRPFS^X^DhspteAUxfuaYTOmvX zwFQqj?L2TB)im6r=|46q2`bkKHo9xzauw|*;n{&Cs9Zt%L;v_md^WaBBZGlsEukMpKF2B;Dl+QHYy=*L{ec&`9 z7(q=zZDBB_FlJ{e!M|%1g+LzerGd^;M8qY)9nAPufC|B?#$G`^4MXKrJMq-o}CavR8lfl1U@ zf`YC9*(qGX&nw#O-{BCdFCT2rQ%MAY;0mrie_aumh#)&P1ur?;JD52-TbVhXakvAd z<94Sfaq3vn=hEX+7Px|IyKKvpbulj!Uq6Za0Nf7LaDn8 zq~v0C=k`@IM<<}w&I9t;JG%ca7;b+8{)1ObE+y`(|*_s$6F5Os(EJp>YQkr=4)KOL6< Ap#T5? diff --git a/scripts/train/benchmarking/benchmark_results.csv b/scripts/train/benchmarking/benchmark_results.csv index d7e8396573..a39035d320 100644 --- a/scripts/train/benchmarking/benchmark_results.csv +++ b/scripts/train/benchmarking/benchmark_results.csv @@ -1,21 +1,78 @@ Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams -7b,2048,8,a100_40gb,50.42,67.23,12,4,384,14,29150,3643,786432,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 -3b,2048,8,a100_40gb,57.21,57.21,5,8,320,38,79667,9958,655360,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 -1b,2048,8,a100_40gb,56.21,56.21,8,8,512,75,154114,19264,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 -1b,2048,8,a100_40gb,55.86,55.86,8,8,512,74,153151,19143,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1315950592 -1b,2048,8,a100_40gb,45.91,61.21,8,8,512,61,125871,15733,1048576,amp_bf16,PURE,FULL_SHARD,True,False,1315950592 -760m,2048,8,a100_40gb,51.5,51.5,12,4,384,114,235052,29381,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 -760m,2048,8,a100_40gb,51.96,51.96,12,4,384,115,237143,29642,786432,amp_bf16,PURE,FULL_SHARD,False,False,760470528 -760m,2048,8,a100_40gb,42.72,56.96,12,4,384,95,194992,24374,786432,amp_bf16,PURE,FULL_SHARD,True,False,760470528 -350m,2048,8,a100_40gb,36.26,36.26,16,4,512,161,330354,41294,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 -350m,2048,8,a100_40gb,39.45,39.45,16,4,512,175,359403,44925,1048576,amp_bf16,PURE,FULL_SHARD,False,False,355985408 -350m,2048,8,a100_40gb,39.31,52.42,16,4,512,174,358147,44768,1048576,amp_bf16,PURE,FULL_SHARD,True,False,355985408 -125m,2048,8,a100_40gb,35.6,47.47,26,3,624,443,908206,113525,1277952,amp_bf16,PURE,FULL_SHARD,True,False,125311488 -125m,2048,8,a100_40gb,42.12,42.12,24,3,576,524,1074518,134314,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 -125m,2048,8,a100_40gb,42.21,42.21,24,3,576,525,1076846,134605,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 -125m,2048,8,a100_40gb,40.8,40.8,24,3,576,508,1040826,130103,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 -125m,2048,8,a100_40gb,32.74,32.74,24,3,576,407,835286,104410,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 -125m,2048,8,a100_40gb,35.46,47.28,24,3,576,441,904742,113092,1179648,amp_bf16,PURE,FULL_SHARD,True,False,125311488 -125m,2048,8,a100_40gb,41.89,41.89,24,3,576,521,1068638,133579,1179648,amp_bf16,PURE,FULL_SHARD,False,False,125311488 -125m,2048,8,a100_40gb,11.95,11.95,12,3,288,148,304881,38110,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 -125m,2048,8,a100_40gb,10.74,10.74,12,3,288,133,274018,34252,589824,amp_bf16,PURE,FULL_SHARD,False,False,125311488 +30b,8192,8,h100_80gb,27.37,36.5,1,21,168,1,10128,1266,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 +30b,8192,8,h100_80gb,27.51,36.68,1,21,168,1,10179,1272,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 +30b,8192,8,h100_80gb,27.87,37.16,1,21,168,1,10311,1288,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 +30b,4096,8,h100_80gb,34.5,46.0,1,21,168,3,13873,1734,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 +30b,4096,8,h100_80gb,34.61,46.15,1,21,168,3,13917,1739,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 +30b,4096,8,h100_80gb,34.51,46.02,1,21,168,3,13878,1734,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 +30b,2048,8,h100_80gb,37.35,49.8,3,21,504,7,15700,1962,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 +30b,2048,8,h100_80gb,37.33,49.78,3,21,504,7,15693,1961,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 +30b,2048,8,h100_80gb,37.54,50.05,3,21,504,7,15781,1972,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 +30b,1024,8,h100_80gb,38.21,50.94,6,21,1008,16,16433,2054,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 +30b,1024,8,h100_80gb,37.83,50.44,6,21,1008,15,16271,2033,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 +30b,1024,8,h100_80gb,38.07,50.76,6,21,1008,15,16376,2047,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 +30b,512,8,h100_80gb,38.64,51.52,12,21,2016,32,16816,2102,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 +30b,512,8,h100_80gb,38.38,51.17,12,21,2016,32,16702,2087,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 +30b,512,8,h100_80gb,38.47,51.29,12,21,2016,32,16741,2092,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 +13b,32768,8,h100_80gb,30.55,40.74,1,3,24,0,15250,1906,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 +13b,32768,8,h100_80gb,30.73,40.97,1,3,24,0,15338,1917,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 +13b,32768,8,h100_80gb,30.67,40.9,1,3,24,0,15309,1913,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 +13b,8192,8,h100_80gb,37.02,49.36,5,3,120,3,30075,3759,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 +13b,8192,8,h100_80gb,36.97,49.29,5,3,120,3,30030,3753,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 +13b,8192,8,h100_80gb,37.15,49.53,5,3,120,3,30179,3772,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 +13b,2048,8,h100_80gb,41.03,54.71,20,3,480,19,39532,4941,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 +13b,2048,8,h100_80gb,41.29,55.05,20,3,480,19,39779,4972,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 +13b,2048,8,h100_80gb,40.97,54.63,20,3,480,19,39478,4934,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 +13b,512,8,h100_80gb,42.63,56.83,80,3,1920,84,43074,5384,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 +13b,512,8,h100_80gb,42.51,56.68,80,3,1920,83,42954,5369,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 +13b,512,8,h100_80gb,42.24,56.32,80,3,1920,83,42684,5335,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 +7b,32768,8,h100_80gb,30.28,40.37,2,2,32,0,25983,3247,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 +7b,32768,8,h100_80gb,30.45,40.6,2,2,32,0,26127,3265,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 +7b,32768,8,h100_80gb,30.27,40.36,2,2,32,0,25973,3246,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 +7b,8192,8,h100_80gb,36.39,48.51,8,2,128,6,54355,6794,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 +7b,8192,8,h100_80gb,36.12,48.16,8,2,128,6,53957,6744,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 +7b,8192,8,h100_80gb,36.43,48.57,8,2,128,6,54419,6802,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 +7b,2048,8,h100_80gb,40.48,53.97,32,2,512,36,74217,9277,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 +7b,2048,8,h100_80gb,40.43,53.91,32,2,512,36,74132,9266,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 +7b,2048,8,h100_80gb,40.46,53.94,32,2,512,36,74180,9272,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 +7b,512,8,h100_80gb,42.02,56.02,128,2,2048,159,81676,10209,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 +7b,512,8,h100_80gb,42.02,56.02,128,2,2048,159,81679,10209,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 +7b,512,8,h100_80gb,41.88,55.84,128,2,2048,159,81417,10177,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 +3b,32768,8,h100_80gb,28.03,37.37,3,6,144,1,45654,5706,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 +3b,32768,8,h100_80gb,28.0,37.33,3,6,144,1,45607,5700,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 +3b,32768,8,h100_80gb,27.91,37.21,3,6,144,1,45465,5683,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 +3b,32768,8,h100_80gb,14.38,19.18,3,6,144,1,46853,5856,4718592,amp_fp8,DEFAULT,FULL_SHARD,True,False,2730480640 +3b,8192,8,h100_80gb,40.35,40.35,3,6,144,16,132753,16594,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 +3b,8192,8,h100_80gb,40.1,40.1,3,6,144,16,131934,16491,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 +3b,8192,8,h100_80gb,40.33,40.33,3,6,144,16,132697,16587,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 +3b,8192,8,h100_80gb,23.28,23.28,3,6,144,18,153174,19146,1179648,amp_fp8,DEFAULT,FULL_SHARD,False,False,2667566080 +3b,2048,8,h100_80gb,44.43,44.43,10,6,480,95,196229,24528,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,h100_80gb,44.42,44.42,10,6,480,95,196171,24521,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,h100_80gb,44.2,44.2,10,6,480,95,195192,24399,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 +3b,2048,8,h100_80gb,27.7,27.7,10,6,480,119,244692,30586,983040,amp_fp8,DEFAULT,FULL_SHARD,False,False,2651837440 +3b,512,8,h100_80gb,46.05,46.05,40,6,1920,434,222413,27801,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 +3b,512,8,h100_80gb,46.38,46.38,40,6,1920,437,223994,27999,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 +3b,512,8,h100_80gb,46.14,46.14,40,6,1920,435,222834,27854,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 +3b,512,8,h100_80gb,30.25,30.25,40,6,1920,570,292217,36527,983040,amp_fp8,DEFAULT,FULL_SHARD,False,False,2647905280 +1b,32768,8,h100_80gb,33.6,33.6,1,4,32,2,96354,12044,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 +1b,32768,8,h100_80gb,33.54,33.54,1,4,32,2,96182,12022,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 +1b,32768,8,h100_80gb,33.51,33.51,1,4,32,2,96105,12013,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 +1b,32768,8,h100_80gb,17.55,17.55,1,4,32,3,100643,12580,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,1378865152 +1b,8192,8,h100_80gb,36.66,36.66,2,4,64,27,226682,28335,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 +1b,8192,8,h100_80gb,36.74,36.74,2,4,64,27,227183,28397,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 +1b,8192,8,h100_80gb,36.39,36.39,2,4,64,27,225010,28126,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 +1b,8192,8,h100_80gb,20.71,20.71,2,4,64,31,256087,32010,524288,amp_fp8,DEFAULT,FULL_SHARD,False,False,1328533504 +1b,512,8,h100_80gb,29.06,29.06,56,4,1792,1098,562523,70315,917504,amp_fp8,DEFAULT,FULL_SHARD,False,False,1312804864 +350m,32768,8,h100_80gb,28.95,28.95,1,4,32,5,191165,23895,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 +350m,32768,8,h100_80gb,28.88,28.88,1,4,32,5,190718,23839,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 +350m,32768,8,h100_80gb,28.98,28.98,1,4,32,5,191350,23918,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 +350m,32768,8,h100_80gb,14.8,14.8,1,4,32,5,195516,24439,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,387442688 +350m,16384,8,h100_80gb,29.9,29.9,2,4,64,20,335478,41934,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 +350m,16384,8,h100_80gb,29.76,29.76,2,4,64,20,333921,41740,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 +350m,16384,8,h100_80gb,29.95,29.95,2,4,64,20,336016,42002,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 +350m,16384,8,h100_80gb,15.31,15.31,2,4,64,20,343435,42929,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,370665472 +350m,2048,8,h100_80gb,6.05,8.06,3,21,504,170,349409,43676,1032192,amp_fp8,DEFAULT,FULL_SHARD,True,False,355985408 +350m,512,8,h100_80gb,32.32,32.32,56,4,1792,2194,1123449,140431,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 +350m,512,8,h100_80gb,32.79,32.79,56,4,1792,2226,1139870,142483,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 +350m,512,8,h100_80gb,32.77,32.77,56,4,1792,2224,1138963,142370,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 +350m,512,8,h100_80gb,17.77,17.77,56,4,1792,2412,1235360,154420,917504,amp_fp8,DEFAULT,FULL_SHARD,False,False,354412544 diff --git a/scripts/train/benchmarking/benchmark_results.md b/scripts/train/benchmarking/benchmark_results.md index e16547bee3..2a320d0b2d 100644 --- a/scripts/train/benchmarking/benchmark_results.md +++ b/scripts/train/benchmarking/benchmark_results.md @@ -1,22 +1,79 @@ | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 7b | 2048 | 8 | a100_40gb | 50.42 | 67.23 | 12 | 4 | 384 | 14 | 29150 | 3643 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 3b | 2048 | 8 | a100_40gb | 57.21 | 57.21 | 5 | 8 | 320 | 38 | 79667 | 9958 | 655360 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 1b | 2048 | 8 | a100_40gb | 56.21 | 56.21 | 8 | 8 | 512 | 75 | 154114 | 19264 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_40gb | 55.86 | 55.86 | 8 | 8 | 512 | 74 | 153151 | 19143 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_40gb | 45.91 | 61.21 | 8 | 8 | 512 | 61 | 125871 | 15733 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 1315950592 | -| 760m | 2048 | 8 | a100_40gb | 51.5 | 51.5 | 12 | 4 | 384 | 114 | 235052 | 29381 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_40gb | 51.96 | 51.96 | 12 | 4 | 384 | 115 | 237143 | 29642 | 786432 | amp_bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_40gb | 42.72 | 56.96 | 12 | 4 | 384 | 95 | 194992 | 24374 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 760470528 | -| 350m | 2048 | 8 | a100_40gb | 36.26 | 36.26 | 16 | 4 | 512 | 161 | 330354 | 41294 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_40gb | 39.45 | 39.45 | 16 | 4 | 512 | 175 | 359403 | 44925 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_40gb | 39.31 | 52.42 | 16 | 4 | 512 | 174 | 358147 | 44768 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 355985408 | -| 125m | 2048 | 8 | a100_40gb | 35.6 | 47.47 | 26 | 3 | 624 | 443 | 908206 | 113525 | 1277952 | amp_bf16 | PURE | FULL_SHARD | True | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 42.12 | 42.12 | 24 | 3 | 576 | 524 | 1074518 | 134314 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 42.21 | 42.21 | 24 | 3 | 576 | 525 | 1076846 | 134605 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 40.8 | 40.8 | 24 | 3 | 576 | 508 | 1040826 | 130103 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 32.74 | 32.74 | 24 | 3 | 576 | 407 | 835286 | 104410 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 35.46 | 47.28 | 24 | 3 | 576 | 441 | 904742 | 113092 | 1179648 | amp_bf16 | PURE | FULL_SHARD | True | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 41.89 | 41.89 | 24 | 3 | 576 | 521 | 1068638 | 133579 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 11.95 | 11.95 | 12 | 3 | 288 | 148 | 304881 | 38110 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 10.74 | 10.74 | 12 | 3 | 288 | 133 | 274018 | 34252 | 589824 | amp_bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 30b | 8192 | 8 | h100_80gb | 27.37 | 36.5 | 1 | 21 | 168 | 1 | 10128 | 1266 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 8192 | 8 | h100_80gb | 27.51 | 36.68 | 1 | 21 | 168 | 1 | 10179 | 1272 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 8192 | 8 | h100_80gb | 27.87 | 37.16 | 1 | 21 | 168 | 1 | 10311 | 1288 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | h100_80gb | 34.5 | 46.0 | 1 | 21 | 168 | 3 | 13873 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 4096 | 8 | h100_80gb | 34.61 | 46.15 | 1 | 21 | 168 | 3 | 13917 | 1739 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 4096 | 8 | h100_80gb | 34.51 | 46.02 | 1 | 21 | 168 | 3 | 13878 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 8 | h100_80gb | 37.35 | 49.8 | 3 | 21 | 504 | 7 | 15700 | 1962 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | h100_80gb | 37.33 | 49.78 | 3 | 21 | 504 | 7 | 15693 | 1961 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | h100_80gb | 37.54 | 50.05 | 3 | 21 | 504 | 7 | 15781 | 1972 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | h100_80gb | 38.21 | 50.94 | 6 | 21 | 1008 | 16 | 16433 | 2054 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 1024 | 8 | h100_80gb | 37.83 | 50.44 | 6 | 21 | 1008 | 15 | 16271 | 2033 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 1024 | 8 | h100_80gb | 38.07 | 50.76 | 6 | 21 | 1008 | 15 | 16376 | 2047 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | h100_80gb | 38.64 | 51.52 | 12 | 21 | 2016 | 32 | 16816 | 2102 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 30b | 512 | 8 | h100_80gb | 38.38 | 51.17 | 12 | 21 | 2016 | 32 | 16702 | 2087 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 30b | 512 | 8 | h100_80gb | 38.47 | 51.29 | 12 | 21 | 2016 | 32 | 16741 | 2092 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | h100_80gb | 30.55 | 40.74 | 1 | 3 | 24 | 0 | 15250 | 1906 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 32768 | 8 | h100_80gb | 30.73 | 40.97 | 1 | 3 | 24 | 0 | 15338 | 1917 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 32768 | 8 | h100_80gb | 30.67 | 40.9 | 1 | 3 | 24 | 0 | 15309 | 1913 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 8192 | 8 | h100_80gb | 37.02 | 49.36 | 5 | 3 | 120 | 3 | 30075 | 3759 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 8192 | 8 | h100_80gb | 36.97 | 49.29 | 5 | 3 | 120 | 3 | 30030 | 3753 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 8192 | 8 | h100_80gb | 37.15 | 49.53 | 5 | 3 | 120 | 3 | 30179 | 3772 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 2048 | 8 | h100_80gb | 41.03 | 54.71 | 20 | 3 | 480 | 19 | 39532 | 4941 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | h100_80gb | 41.29 | 55.05 | 20 | 3 | 480 | 19 | 39779 | 4972 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | h100_80gb | 40.97 | 54.63 | 20 | 3 | 480 | 19 | 39478 | 4934 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 512 | 8 | h100_80gb | 42.63 | 56.83 | 80 | 3 | 1920 | 84 | 43074 | 5384 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 13b | 512 | 8 | h100_80gb | 42.51 | 56.68 | 80 | 3 | 1920 | 83 | 42954 | 5369 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 13b | 512 | 8 | h100_80gb | 42.24 | 56.32 | 80 | 3 | 1920 | 83 | 42684 | 5335 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 32768 | 8 | h100_80gb | 30.28 | 40.37 | 2 | 2 | 32 | 0 | 25983 | 3247 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 32768 | 8 | h100_80gb | 30.45 | 40.6 | 2 | 2 | 32 | 0 | 26127 | 3265 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 32768 | 8 | h100_80gb | 30.27 | 40.36 | 2 | 2 | 32 | 0 | 25973 | 3246 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 8192 | 8 | h100_80gb | 36.39 | 48.51 | 8 | 2 | 128 | 6 | 54355 | 6794 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 8192 | 8 | h100_80gb | 36.12 | 48.16 | 8 | 2 | 128 | 6 | 53957 | 6744 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 8192 | 8 | h100_80gb | 36.43 | 48.57 | 8 | 2 | 128 | 6 | 54419 | 6802 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 2048 | 8 | h100_80gb | 40.48 | 53.97 | 32 | 2 | 512 | 36 | 74217 | 9277 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | h100_80gb | 40.43 | 53.91 | 32 | 2 | 512 | 36 | 74132 | 9266 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | h100_80gb | 40.46 | 53.94 | 32 | 2 | 512 | 36 | 74180 | 9272 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81676 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81679 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 7b | 512 | 8 | h100_80gb | 41.88 | 55.84 | 128 | 2 | 2048 | 159 | 81417 | 10177 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 32768 | 8 | h100_80gb | 28.03 | 37.37 | 3 | 6 | 144 | 1 | 45654 | 5706 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 32768 | 8 | h100_80gb | 28.0 | 37.33 | 3 | 6 | 144 | 1 | 45607 | 5700 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 32768 | 8 | h100_80gb | 27.91 | 37.21 | 3 | 6 | 144 | 1 | 45465 | 5683 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 8192 | 8 | h100_80gb | 40.35 | 40.35 | 3 | 6 | 144 | 16 | 132753 | 16594 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 8192 | 8 | h100_80gb | 40.1 | 40.1 | 3 | 6 | 144 | 16 | 131934 | 16491 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 8192 | 8 | h100_80gb | 40.33 | 40.33 | 3 | 6 | 144 | 16 | 132697 | 16587 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 2048 | 8 | h100_80gb | 44.43 | 44.43 | 10 | 6 | 480 | 95 | 196229 | 24528 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | h100_80gb | 44.42 | 44.42 | 10 | 6 | 480 | 95 | 196171 | 24521 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | h100_80gb | 44.2 | 44.2 | 10 | 6 | 480 | 95 | 195192 | 24399 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 512 | 8 | h100_80gb | 46.05 | 46.05 | 40 | 6 | 1920 | 434 | 222413 | 27801 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 3b | 512 | 8 | h100_80gb | 46.38 | 46.38 | 40 | 6 | 1920 | 437 | 223994 | 27999 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 3b | 512 | 8 | h100_80gb | 46.14 | 46.14 | 40 | 6 | 1920 | 435 | 222834 | 27854 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | h100_80gb | 33.6 | 33.6 | 1 | 4 | 32 | 2 | 96354 | 12044 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 1 | 4 | 32 | 2 | 96182 | 12022 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 32768 | 8 | h100_80gb | 33.51 | 33.51 | 1 | 4 | 32 | 2 | 96105 | 12013 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 8192 | 8 | h100_80gb | 36.66 | 36.66 | 2 | 4 | 64 | 27 | 226682 | 28335 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 8192 | 8 | h100_80gb | 36.74 | 36.74 | 2 | 4 | 64 | 27 | 227183 | 28397 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 8192 | 8 | h100_80gb | 36.39 | 36.39 | 2 | 4 | 64 | 27 | 225010 | 28126 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 350m | 32768 | 8 | h100_80gb | 28.95 | 28.95 | 1 | 4 | 32 | 5 | 191165 | 23895 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 32768 | 8 | h100_80gb | 28.88 | 28.88 | 1 | 4 | 32 | 5 | 190718 | 23839 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 32768 | 8 | h100_80gb | 28.98 | 28.98 | 1 | 4 | 32 | 5 | 191350 | 23918 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | h100_80gb | 29.9 | 29.9 | 2 | 4 | 64 | 20 | 335478 | 41934 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 16384 | 8 | h100_80gb | 29.76 | 29.76 | 2 | 4 | 64 | 20 | 333921 | 41740 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 16384 | 8 | h100_80gb | 29.95 | 29.95 | 2 | 4 | 64 | 20 | 336016 | 42002 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 2048 | 8 | h100_80gb | 6.05 | 8.06 | 3 | 21 | 504 | 170 | 349409 | 43676 | 1032192 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 355985408 | +| 350m | 512 | 8 | h100_80gb | 32.32 | 32.32 | 56 | 4 | 1792 | 2194 | 1123449 | 140431 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 350m | 512 | 8 | h100_80gb | 32.79 | 32.79 | 56 | 4 | 1792 | 2226 | 1139870 | 142483 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 350m | 512 | 8 | h100_80gb | 32.77 | 32.77 | 56 | 4 | 1792 | 2224 | 1138963 | 142370 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index c9a089e6e4..64ca38b920 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -57,7 +57,7 @@ def sort_key(r: msdk.Run): print(model_name) raise ValueError model_size = int(model_name[:-1]) - return (r.image, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], + return (r.gpu_type, r.image, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], num_gpu, r.submitted_config.parameters['global_train_batch_size']) runs.sort(reverse=True, key=sort_key) @@ -93,7 +93,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: model_name = run.name.split('-')[2] gpus = run.gpus gpu_type = run.gpu_type - GPU_AVAILABLE_FLOPS = 312_000_000_000_000 if (gpu_type != "h100_80gb") else (1_979_000_000_000_000/2 if run.submitted_config.parameters['precision'] == 'bf16' else 1_979_000_000_000_000)# NOTE: This is accurate for BF16 or FP8 only + GPU_AVAILABLE_FLOPS = 312_000_000_000_000 if (gpu_type != "h100_80gb") else (1_979_000_000_000_000/2 if run.submitted_config.parameters['precision'] == 'amp_bf16' else 1_979_000_000_000_000)# NOTE: This is accurate for BF16 or FP8 only fsdp_config = run.submitted_config.parameters['fsdp_config'] seq_len = run.submitted_config.parameters['max_seq_len'] @@ -190,8 +190,6 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: str(fsdp_config['activation_cpu_offload']), 'NumParams': n_params, - 'Image': - image, # 'Compile Mode': # compile_mode, # 'Compile Fullgraph': diff --git a/scripts/train/benchmarking/h100.csv b/scripts/train/benchmarking/h100.csv deleted file mode 100644 index c4d115cee6..0000000000 --- a/scripts/train/benchmarking/h100.csv +++ /dev/null @@ -1,78 +0,0 @@ -Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams -3b,32768,8,h100_80gb,14.38,19.18,3,6,144,1,46853,5856,4718592,amp_fp8,DEFAULT,FULL_SHARD,True,False,2730480640 -3b,8192,8,h100_80gb,23.28,23.28,3,6,144,18,153174,19146,1179648,amp_fp8,DEFAULT,FULL_SHARD,False,False,2667566080 -3b,2048,8,h100_80gb,27.7,27.7,10,6,480,119,244692,30586,983040,amp_fp8,DEFAULT,FULL_SHARD,False,False,2651837440 -3b,512,8,h100_80gb,30.25,30.25,40,6,1920,570,292217,36527,983040,amp_fp8,DEFAULT,FULL_SHARD,False,False,2647905280 -1b,32768,8,h100_80gb,17.55,17.55,1,4,32,3,100643,12580,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,1378865152 -1b,8192,8,h100_80gb,20.71,20.71,2,4,64,31,256087,32010,524288,amp_fp8,DEFAULT,FULL_SHARD,False,False,1328533504 -1b,512,8,h100_80gb,29.06,29.06,56,4,1792,1098,562523,70315,917504,amp_fp8,DEFAULT,FULL_SHARD,False,False,1312804864 -350m,32768,8,h100_80gb,14.8,14.8,1,4,32,5,195516,24439,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,387442688 -350m,16384,8,h100_80gb,15.31,15.31,2,4,64,20,343435,42929,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,370665472 -350m,2048,8,h100_80gb,6.05,8.06,3,21,504,170,349409,43676,1032192,amp_fp8,DEFAULT,FULL_SHARD,True,False,355985408 -350m,512,8,h100_80gb,17.77,17.77,56,4,1792,2412,1235360,154420,917504,amp_fp8,DEFAULT,FULL_SHARD,False,False,354412544 -30b,8192,8,h100_80gb,13.69,18.25,1,21,168,1,10128,1266,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 -30b,8192,8,h100_80gb,13.76,18.34,1,21,168,1,10179,1272,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 -30b,8192,8,h100_80gb,13.93,18.58,1,21,168,1,10311,1288,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 -30b,4096,8,h100_80gb,17.25,23.0,1,21,168,3,13873,1734,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 -30b,4096,8,h100_80gb,17.3,23.07,1,21,168,3,13917,1739,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 -30b,4096,8,h100_80gb,17.26,23.01,1,21,168,3,13878,1734,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 -30b,2048,8,h100_80gb,18.67,24.9,3,21,504,7,15700,1962,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 -30b,2048,8,h100_80gb,18.67,24.89,3,21,504,7,15693,1961,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 -30b,2048,8,h100_80gb,18.77,25.03,3,21,504,7,15781,1972,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 -30b,1024,8,h100_80gb,19.1,25.47,6,21,1008,16,16433,2054,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 -30b,1024,8,h100_80gb,18.91,25.22,6,21,1008,15,16271,2033,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 -30b,1024,8,h100_80gb,19.04,25.38,6,21,1008,15,16376,2047,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 -30b,512,8,h100_80gb,19.32,25.76,12,21,2016,32,16816,2102,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 -30b,512,8,h100_80gb,19.19,25.59,12,21,2016,32,16702,2087,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 -30b,512,8,h100_80gb,19.24,25.65,12,21,2016,32,16741,2092,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 -13b,32768,8,h100_80gb,15.28,20.37,1,3,24,0,15250,1906,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 -13b,32768,8,h100_80gb,15.36,20.49,1,3,24,0,15338,1917,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 -13b,32768,8,h100_80gb,15.34,20.45,1,3,24,0,15309,1913,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 -13b,8192,8,h100_80gb,18.51,24.68,5,3,120,3,30075,3759,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 -13b,8192,8,h100_80gb,18.48,24.64,5,3,120,3,30030,3753,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 -13b,8192,8,h100_80gb,18.58,24.77,5,3,120,3,30179,3772,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 -13b,2048,8,h100_80gb,20.51,27.35,20,3,480,19,39532,4941,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 -13b,2048,8,h100_80gb,20.64,27.52,20,3,480,19,39779,4972,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 -13b,2048,8,h100_80gb,20.49,27.32,20,3,480,19,39478,4934,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 -13b,512,8,h100_80gb,21.31,28.42,80,3,1920,84,43074,5384,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 -13b,512,8,h100_80gb,21.25,28.34,80,3,1920,83,42954,5369,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 -13b,512,8,h100_80gb,21.12,28.16,80,3,1920,83,42684,5335,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 -7b,32768,8,h100_80gb,15.14,20.19,2,2,32,0,25983,3247,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 -7b,32768,8,h100_80gb,15.22,20.3,2,2,32,0,26127,3265,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 -7b,32768,8,h100_80gb,15.13,20.18,2,2,32,0,25973,3246,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 -7b,8192,8,h100_80gb,18.19,24.26,8,2,128,6,54355,6794,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 -7b,8192,8,h100_80gb,18.06,24.08,8,2,128,6,53957,6744,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 -7b,8192,8,h100_80gb,18.21,24.29,8,2,128,6,54419,6802,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 -7b,2048,8,h100_80gb,20.24,26.99,32,2,512,36,74217,9277,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 -7b,2048,8,h100_80gb,20.22,26.95,32,2,512,36,74132,9266,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 -7b,2048,8,h100_80gb,20.23,26.97,32,2,512,36,74180,9272,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 -7b,512,8,h100_80gb,21.01,28.01,128,2,2048,159,81676,10209,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 -7b,512,8,h100_80gb,21.01,28.01,128,2,2048,159,81679,10209,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 -7b,512,8,h100_80gb,20.94,27.92,128,2,2048,159,81417,10177,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 -3b,32768,8,h100_80gb,14.01,18.68,3,6,144,1,45654,5706,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 -3b,32768,8,h100_80gb,14.0,18.67,3,6,144,1,45607,5700,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 -3b,32768,8,h100_80gb,13.96,18.61,3,6,144,1,45465,5683,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 -3b,8192,8,h100_80gb,20.17,20.17,3,6,144,16,132753,16594,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 -3b,8192,8,h100_80gb,20.05,20.05,3,6,144,16,131934,16491,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 -3b,8192,8,h100_80gb,20.16,20.16,3,6,144,16,132697,16587,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 -3b,2048,8,h100_80gb,22.22,22.22,10,6,480,95,196229,24528,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 -3b,2048,8,h100_80gb,22.21,22.21,10,6,480,95,196171,24521,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 -3b,2048,8,h100_80gb,22.1,22.1,10,6,480,95,195192,24399,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 -3b,512,8,h100_80gb,23.03,23.03,40,6,1920,434,222413,27801,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 -3b,512,8,h100_80gb,23.19,23.19,40,6,1920,437,223994,27999,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 -3b,512,8,h100_80gb,23.07,23.07,40,6,1920,435,222834,27854,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 -1b,32768,8,h100_80gb,16.8,16.8,1,4,32,2,96354,12044,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 -1b,32768,8,h100_80gb,16.77,16.77,1,4,32,2,96182,12022,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 -1b,32768,8,h100_80gb,16.75,16.75,1,4,32,2,96105,12013,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 -1b,8192,8,h100_80gb,18.33,18.33,2,4,64,27,226682,28335,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 -1b,8192,8,h100_80gb,18.37,18.37,2,4,64,27,227183,28397,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 -1b,8192,8,h100_80gb,18.2,18.2,2,4,64,27,225010,28126,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 -350m,32768,8,h100_80gb,14.48,14.48,1,4,32,5,191165,23895,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 -350m,32768,8,h100_80gb,14.44,14.44,1,4,32,5,190718,23839,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 -350m,32768,8,h100_80gb,14.49,14.49,1,4,32,5,191350,23918,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 -350m,16384,8,h100_80gb,14.95,14.95,2,4,64,20,335478,41934,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 -350m,16384,8,h100_80gb,14.88,14.88,2,4,64,20,333921,41740,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 -350m,16384,8,h100_80gb,14.98,14.98,2,4,64,20,336016,42002,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 -350m,512,8,h100_80gb,16.16,16.16,56,4,1792,2194,1123449,140431,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 -350m,512,8,h100_80gb,16.4,16.4,56,4,1792,2226,1139870,142483,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 -350m,512,8,h100_80gb,16.38,16.38,56,4,1792,2224,1138963,142370,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 diff --git a/scripts/train/benchmarking/h100.numbers b/scripts/train/benchmarking/h100.numbers deleted file mode 100755 index 4d11c45f138d6248fa3f879fbe81528989a344d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 284466 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 ATmS$7 diff --git a/scripts/train/benchmarking/h100_vsOAI.csv b/scripts/train/benchmarking/h100_vsOAI.csv deleted file mode 100644 index 46a14f7163..0000000000 --- a/scripts/train/benchmarking/h100_vsOAI.csv +++ /dev/null @@ -1,9 +0,0 @@ -Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams -70b,2048,64,h100_80gb,42.57,56.76,8,4,2048,32,66523,1039,4194304,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,64862437376 -70b,2048,32,h100_80gb,36.15,48.2,2,16,1024,13,28242,882,2097152,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,64862437376 -30b,8192,8,h100_80gb,29.92,39.9,1,21,168,1,11072,1384,1376256,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,30019254272 -30b,4096,8,h100_80gb,35.86,47.81,1,21,168,3,14419,1802,688128,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29989894144 -30b,2048,32,h100_80gb,43.92,58.57,14,3,1344,36,73860,2308,2752512,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29975214080 -30b,2048,16,h100_80gb,43.07,57.42,10,3,480,17,36209,2263,983040,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29975214080 -30b,2048,8,h100_80gb,38.11,50.82,3,21,504,7,16022,2002,1032192,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29975214080 -30b,1024,8,h100_80gb,38.76,51.68,6,21,1008,16,16672,2084,1032192,amp_bf16,DEFAULT,FULL_SHARD,TRUE,FALSE,29967874048 \ No newline at end of file diff --git a/scripts/train/benchmarking/h100_vsOAI.numbers b/scripts/train/benchmarking/h100_vsOAI.numbers deleted file mode 100755 index 7b063de9b9c82e0ce142bf42a08b7cbf76c557f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129512 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

-Lg$l_zU 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' - composer train/train.py /mnt/config/parameters.yaml""" + """ if args.data_remote is None: command += f""" diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index aada6bc4aa..1949bff4eb 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -1,109 +1,109 @@ #!/bin/bash -PROJECT="tput" +PROJECT="opt30" GIT_COMMIT="v0.0.4" -# IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" -IMAGE="mosaicml/pytorch:2.1.0_cu121-nightly20230827-python3.10-ubuntu20.04" -CLUSTER_80GB=r9z1 +IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" +# IMAGE="mosaicml/pytorch:2.1.0_cu121-nightly20230827-python3.10-ubuntu20.04" +CLUSTER_80GB=r1z1 # A100 80GB # seqlen 2048 -python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 40 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --attn_impl xformers --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 40 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# # INCREASE GPU COUNT -# for GPU_NUM in 16 32 64 -# do -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g $GPU_NUM --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g $GPU_NUM --microbatch_size 20 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# done +# INCREASE GPU COUNT +for GPU_NUM in 16 32 64 +do + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g $GPU_NUM --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g $GPU_NUM --microbatch_size 20 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +done -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 64 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 14 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 32 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 64 --microbatch_size 16 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN -# python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 64 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 14 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 32 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 64 --microbatch_size 16 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN +python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 11 11 --RUN # SCALE SEQUENCE LENGTH # seqlen 512 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --precision fp8 --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 96 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN -# # seqlen 1024 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 18 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 40 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN -# # seqlen 4096 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 7 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN -# # seqlen 8192 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN -# # seqlen 16384 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN -# # seqlen 32768 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN -# # seqlen 65536 -# python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --precision fp8 --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 96 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 9 9 --RUN +# seqlen 1024 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 18 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 40 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 10 10 --RUN +# seqlen 4096 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 7 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 12 12 --RUN +# seqlen 8192 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 13 13 --RUN +# seqlen 16384 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 14 14 --RUN +# seqlen 32768 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 15 15 --RUN +# seqlen 65536 +python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true +python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN +python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN diff --git a/scripts/train/benchmarking/torches.csv b/scripts/train/benchmarking/torches.csv deleted file mode 100644 index 3cf7be6db5..0000000000 --- a/scripts/train/benchmarking/torches.csv +++ /dev/null @@ -1,25 +0,0 @@ -Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams,Image -30b,2048,8,a100_80gb,52.12,69.49,3,21,504,3,6908,863,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -30b,1024,8,a100_80gb,52.43,69.91,6,21,1008,6,7111,888,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -30b,512,8,a100_80gb,52.56,70.08,12,21,2016,14,7212,901,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -13b,32768,8,a100_80gb,50.26,67.02,1,3,24,0,7910,988,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -13b,8192,8,a100_80gb,52.76,70.35,5,3,120,1,13514,1689,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -13b,2048,8,a100_80gb,55.33,73.78,20,3,480,8,16810,2101,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -13b,512,8,a100_80gb,55.93,74.57,80,3,1920,34,17821,2227,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -7b,32768,8,a100_80gb,48.75,65.0,2,2,32,0,13189,1648,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -7b,8192,8,a100_80gb,51.47,68.62,8,2,128,2,24242,3030,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -7b,2048,8,a100_80gb,54.23,72.3,32,2,512,15,31348,3918,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -7b,512,8,a100_80gb,55.27,73.69,128,2,2048,66,33876,4234,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552,mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04 -30b,8192,8,a100_80gb,39.86,53.15,1,21,168,0,4650,581,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -30b,4096,8,a100_80gb,49.36,65.81,1,21,168,1,6258,782,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -30b,2048,8,a100_80gb,51.8,69.06,3,21,504,3,6865,858,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -30b,1024,8,a100_80gb,51.97,69.3,6,21,1008,6,7048,881,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -30b,512,8,a100_80gb,52.04,69.38,12,21,2016,13,7140,892,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -13b,32768,8,a100_80gb,49.34,65.79,1,3,24,0,7765,970,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -13b,8192,8,a100_80gb,52.45,69.93,5,3,120,1,13433,1679,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -13b,2048,8,a100_80gb,53.63,71.51,20,3,480,7,16293,2036,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -13b,512,8,a100_80gb,55.07,73.43,80,3,1920,34,17547,2193,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -7b,32768,8,a100_80gb,48.13,64.18,2,2,32,0,13023,1627,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -7b,8192,8,a100_80gb,50.19,66.91,8,2,128,2,23639,2954,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -7b,2048,8,a100_80gb,52.45,69.93,32,2,512,14,30321,3790,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 -7b,512,8,a100_80gb,52.93,70.57,128,2,2048,63,32442,4055,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552,mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04 From 0ddf16b68b75c5d86dcce7dd5f5e836272046927 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 10:47:14 -0700 Subject: [PATCH 25/41] undo attn on this branch --- llmfoundry/models/layers/attention.py | 99 ++++++++++++++++----------- 1 file changed, 59 insertions(+), 40 deletions(-) diff --git a/llmfoundry/models/layers/attention.py b/llmfoundry/models/layers/attention.py index 9114bc47aa..bea6284fb5 100644 --- a/llmfoundry/models/layers/attention.py +++ b/llmfoundry/models/layers/attention.py @@ -5,7 +5,7 @@ import math import warnings -from typing import List, Optional, Tuple +from typing import Any, List, Optional, Tuple import torch import torch.nn as nn @@ -18,7 +18,7 @@ def _reset_is_causal(num_query_tokens: int, num_key_tokens: int, - original_is_causal: bool): + original_is_causal: bool) -> bool: # disable causal when it is not needed # necessary for flash & triton for generation with kv_cache if original_is_causal and num_query_tokens != num_key_tokens: @@ -31,6 +31,23 @@ def _reset_is_causal(num_query_tokens: int, num_key_tokens: int, return original_is_causal +def repeat_kv_for_gqa(hidden: torch.Tensor, n_rep: int) -> torch.Tensor: + """Perform repeat of kv heads along a particular dimension. + + hidden.shape expected to be: (batch size, seq len, kv_n_heads, head_dim) + n_rep: amount of repetitions of kv_n_heads + Unlike torch.repeat_interleave, this function avoids allocating new memory. + """ + if n_rep == 1: + return hidden + + b, s, kv_n_heads, d = hidden.shape + + hidden = hidden[:, :, :, None, :].expand(b, s, kv_n_heads, n_rep, d) + + return hidden.reshape(b, s, kv_n_heads * n_rep, d) + + def scaled_multihead_dot_product_attention( query: torch.Tensor, key: torch.Tensor, @@ -84,8 +101,11 @@ def scaled_multihead_dot_product_attention( # grouped query case if kv_n_heads > 1 and kv_n_heads < n_heads: - k = k.repeat_interleave(n_heads // kv_n_heads, dim=1) - v = v.repeat_interleave(n_heads // kv_n_heads, dim=1) + # necessary to do a transpose to swap (b h s d) -> (b s h d) for repeat_kv_for_gqa function + k = repeat_kv_for_gqa(k.transpose(1, 2), + n_heads // kv_n_heads).transpose(1, 2) + v = repeat_kv_for_gqa(v.transpose(1, 2), + n_heads // kv_n_heads).transpose(1, 2) if softmax_scale is None: softmax_scale = 1 / math.sqrt(d) @@ -243,10 +263,16 @@ def flash_attn_fn( elif kv_n_heads < n_heads: # Each query belong to a group of kv heads of group size n_heads // kv_n_heads # We repeat each kv head by the group size number to use the underlying MHA kernels - # done along the head dimension = 1 - key_unpad = key_unpad.repeat_interleave(n_heads // kv_n_heads, dim=1) - value_unpad = value_unpad.repeat_interleave(n_heads // kv_n_heads, - dim=1) + + # since repeat_kv_for_gqa expects input dims of (b, s, kv_n_heads, d) + # we use .view to modify {key, value}_unpad appropriately + + key_unpad = repeat_kv_for_gqa( + key_unpad.view(batch_size, seqlen, kv_n_heads, -1), + n_heads // kv_n_heads).view(batch_size * seqlen, n_heads, -1) + value_unpad = repeat_kv_for_gqa( + value_unpad.view(batch_size, seqlen, kv_n_heads, -1), + n_heads // kv_n_heads).view(batch_size * seqlen, n_heads, -1) dropout_p = dropout_p if training else 0.0 @@ -383,9 +409,8 @@ def triton_flash_attn_fn( elif kv_n_heads < n_heads: # Each query belong to a group of kv heads of group size n_heads // kv_n_heads # We repeat each kv head by the group size number to use the underlying MHA kernels - # done along dim = 2, unlike the implementation for flash and torch attn - key = key.repeat_interleave(n_heads // kv_n_heads, dim=2) - value = value.repeat_interleave(n_heads // kv_n_heads, dim=2) + key = repeat_kv_for_gqa(key, n_heads // kv_n_heads) + value = repeat_kv_for_gqa(value, n_heads // kv_n_heads) reset_is_causal = _reset_is_causal(query.size(1), key.size(1), is_causal) attn_output = flash_attn_func( # type: ignore @@ -418,8 +443,8 @@ def __init__( attn_pdrop: float = 0.0, norm_type: str = 'low_precision_layernorm', fc_type: str = 'torch', - verbose: int = 0, device: Optional[str] = None, + bias: bool = True, ): super().__init__() @@ -451,7 +476,9 @@ def __init__( self.softmax_scale = 1 / math.sqrt(self.d_model / self.n_heads) self.attn_dropout_p = attn_pdrop - fc_kwargs = {} + fc_kwargs: dict[str, Any] = { + 'bias': bias, + } if fc_type != 'te': fc_kwargs['device'] = device self.Wqkv = FC_CLASS_REGISTRY[fc_type]( @@ -464,7 +491,7 @@ def __init__( i * self.head_dim for i in range(1, self.n_heads + 2 * self.kv_n_heads) ] - self.Wqkv._fused = (0, fuse_splits) # type: ignore + self.Wqkv._fused = (0, fuse_splits) if self.qk_ln: norm_class = NORM_CLASS_REGISTRY[norm_type.lower()] @@ -476,21 +503,8 @@ def __init__( self.attn_fn = flash_attn_fn elif self.attn_impl == 'triton': self.attn_fn = triton_flash_attn_fn - if verbose: - warnings.warn( - 'While `attn_impl: triton` can be faster than `attn_impl: flash` ' +\ - 'it uses more memory. When training larger models this can trigger ' +\ - 'alloc retries which hurts performance. If encountered, we recommend ' +\ - 'using `attn_impl: flash` if your model does not use `alibi` or `prefix_lm`.' - ) elif self.attn_impl == 'torch': self.attn_fn = scaled_multihead_dot_product_attention - if torch.cuda.is_available() and verbose: - warnings.warn( - 'Using `attn_impl: torch`. If your model does not use `alibi` or ' +\ - '`prefix_lm` we recommend using `attn_impl: flash` otherwise ' +\ - 'we recommend using `attn_impl: triton`.' - ) else: raise ValueError(f'{attn_impl=} is an invalid setting.') @@ -499,7 +513,7 @@ def __init__( self.d_model, **fc_kwargs, ) - self.out_proj._is_residual = True # type: ignore + self.out_proj._is_residual = True def forward( self, @@ -509,7 +523,8 @@ def forward( attention_mask: Optional[torch.Tensor] = None, is_causal: bool = True, needs_weights: bool = False, - ): + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[ + torch.Tensor, torch.Tensor]]]: qkv = self.Wqkv(x) if self.clip_qkv: @@ -569,8 +584,8 @@ def __init__( attn_pdrop: float = 0.0, norm_type: str = 'low_precision_layernorm', fc_type: str = 'torch', - verbose: int = 0, device: Optional[str] = None, + bias: bool = True, ): super().__init__( d_model=d_model, @@ -583,8 +598,9 @@ def __init__( attn_pdrop=attn_pdrop, norm_type=norm_type, fc_type=fc_type, - verbose=verbose, - device=device) + device=device, + bias=bias, + ) class MultiQueryAttention(GroupedQueryAttention): @@ -605,8 +621,8 @@ def __init__( attn_pdrop: float = 0.0, norm_type: str = 'low_precision_layernorm', fc_type: str = 'torch', - verbose: int = 0, device: Optional[str] = None, + bias: bool = True, ): super().__init__( d_model=d_model, @@ -619,12 +635,15 @@ def __init__( attn_pdrop=attn_pdrop, norm_type=norm_type, fc_type=fc_type, - verbose=verbose, - device=device) + device=device, + bias=bias, + ) -def attn_bias_shape(attn_impl: str, n_heads: int, seq_len: int, alibi: bool, - prefix_lm: bool, causal: bool, use_sequence_id: bool): +def attn_bias_shape( + attn_impl: str, n_heads: int, seq_len: int, alibi: bool, + prefix_lm: bool, causal: bool, + use_sequence_id: bool) -> Optional[Tuple[int, int, int, int]]: if attn_impl == 'flash': return None elif attn_impl in ['torch', 'triton']: @@ -647,7 +666,7 @@ def build_attn_bias( causal: bool = False, alibi: bool = False, alibi_bias_max: int = 8, -): +) -> Optional[torch.Tensor]: if attn_impl == 'flash': return None elif attn_impl in ['torch', 'triton']: @@ -670,7 +689,7 @@ def build_attn_bias( def gen_slopes(n_heads: int, alibi_bias_max: int = 8, - device: Optional[torch.device] = None): + device: Optional[torch.device] = None) -> torch.Tensor: _n_heads = 2**math.ceil(math.log2(n_heads)) m = torch.arange(1, _n_heads + 1, dtype=torch.float32, device=device) m = m.mul(alibi_bias_max / _n_heads) @@ -692,7 +711,7 @@ def build_alibi_bias( alibi_bias_max: int = 8, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, -): +) -> torch.Tensor: alibi_bias = torch.arange(1 - seq_len, 1, dtype=torch.int32, device=device).view(1, 1, 1, seq_len) if full: From f2c13009a6e89d2394e7ab8af954adc9158d8e11 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 11:04:36 -0700 Subject: [PATCH 26/41] cleanup files --- scripts/train/benchmarking/README.md | 325 ------------------ .../train/benchmarking/ack_ckpt_limits.csv | 8 - scripts/train/benchmarking/ack_ckpt_limits.md | 10 - .../train/benchmarking/act_ckpt_optimize.sh | 21 -- scripts/train/benchmarking/attn.sh | 20 -- .../train/benchmarking/benchmark_results.csv | 78 ----- .../train/benchmarking/benchmark_results.md | 79 ----- .../benchmarking/compile() debug.numbers | Bin 139975 -> 0 bytes .../train/benchmarking/compile_settings.sh | 25 -- scripts/train/benchmarking/compils.csv | 4 - scripts/train/benchmarking/compils.md | 5 - scripts/train/benchmarking/h100.md | 79 ----- scripts/train/benchmarking/h100new.md | 133 ------- scripts/train/benchmarking/h100old.csv | 78 ----- scripts/train/benchmarking/h100old.md | 79 ----- scripts/train/benchmarking/larger_mb.md | 11 - scripts/train/benchmarking/larger_mb_1.csv | 10 - scripts/train/benchmarking/larger_mb_1.md | 11 - scripts/train/benchmarking/opt30b.sh | 12 - scripts/train/benchmarking/optimize_fsdp.sh | 32 -- scripts/train/benchmarking/run_local.sh | 10 - scripts/train/benchmarking/sweep_fsdp.sh | 95 ----- scripts/train/benchmarking/torch2.csv | 55 --- scripts/train/benchmarking/torch2.md | 56 --- .../benchmarking/torch_benchmarks_80gb.sh | 70 ---- scripts/train/benchmarking/torches.md | 26 -- 26 files changed, 1332 deletions(-) delete mode 100644 scripts/train/benchmarking/README.md delete mode 100644 scripts/train/benchmarking/ack_ckpt_limits.csv delete mode 100644 scripts/train/benchmarking/ack_ckpt_limits.md delete mode 100755 scripts/train/benchmarking/act_ckpt_optimize.sh delete mode 100755 scripts/train/benchmarking/attn.sh delete mode 100644 scripts/train/benchmarking/benchmark_results.csv delete mode 100644 scripts/train/benchmarking/benchmark_results.md delete mode 100755 scripts/train/benchmarking/compile() debug.numbers delete mode 100755 scripts/train/benchmarking/compile_settings.sh delete mode 100644 scripts/train/benchmarking/compils.csv delete mode 100644 scripts/train/benchmarking/compils.md delete mode 100644 scripts/train/benchmarking/h100.md delete mode 100644 scripts/train/benchmarking/h100new.md delete mode 100644 scripts/train/benchmarking/h100old.csv delete mode 100644 scripts/train/benchmarking/h100old.md delete mode 100644 scripts/train/benchmarking/larger_mb.md delete mode 100644 scripts/train/benchmarking/larger_mb_1.csv delete mode 100644 scripts/train/benchmarking/larger_mb_1.md delete mode 100755 scripts/train/benchmarking/opt30b.sh delete mode 100755 scripts/train/benchmarking/optimize_fsdp.sh delete mode 100755 scripts/train/benchmarking/run_local.sh delete mode 100644 scripts/train/benchmarking/sweep_fsdp.sh delete mode 100644 scripts/train/benchmarking/torch2.csv delete mode 100644 scripts/train/benchmarking/torch2.md delete mode 100755 scripts/train/benchmarking/torch_benchmarks_80gb.sh delete mode 100644 scripts/train/benchmarking/torches.md diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md deleted file mode 100644 index 1cb8b5a045..0000000000 --- a/scripts/train/benchmarking/README.md +++ /dev/null @@ -1,325 +0,0 @@ -# MPT Training Benchmarks - -Benchmark measurements for MPT models trained on [MosaicML platform](https://www.mosaicml.com/platform), including throughput, MFU, and HFU. Each model is based on optimized configurations of various sizes in the [yamls](../yamls) folder, ranging from a 125m to 70B parameter models. - -To reproduce table results, first run: -``` -./sweep.sh -``` - -Then, after the runs are completed: -``` -python collect_results.py --save-path results -``` -will use our Python API to collect and calculate the benchmark results, and then save as both a CSV file `results.csv`, and a markdown table `results.md`. - - -``` -python submit_benchmarks.py --cluster [your_mosaicml_cluster] ARGS --RUN -``` -can be used to sweep a larger set of configurations. For example usage of `submit_benchmarks.py` see `sweep.sh` which lists all benchmarks in the tables. - -> **Note** -> The `collect_results.py` will by default find all runs with `tput` in the run name. To customize this project tag, use `--project` in both the submissing and collection scripts. - - -## MFU and HFU - -Model FLOPs Utilization (MFU) and Hardware FLOPS Utilization (HFU) are estimates, based on the measured throughput and the known FLOPs of the computation, of what percentage of the hardware's FLOPs are being used during training. - -MFU calculates the utilization from the floating point operations required for a single forward/backwards pass of the model, and does not account for the additional compute required for other implementation details such as activation checkpointing. Thus, MFU is independent of implementation and hardware. - -HFU attempts to capture the actual floating point operations incurred during the forward/backwards pass on the hardware. While it is a more accurate measurement of hardware utilization, it is less general and is difficult to compare across various hardware and implementation details. - -For more information, see [Korthikanti et al, 2022](https://arxiv.org/abs/2205.05198). All FLOP calculations exclude the operations required for normalization, activation, and residuals. - -### MFU - -Per token, each parameter is used for a MAC (2 FLOPS) per network operation. Neural Network training has 3 network operations: forward pass, backward pass, and computation of parameter gradient. - -The attention mechanism forward pass FLOPS are: `attn_flops_per_seq = n_layers * 2 * 2 * (d_model * (seq_len**2))` -``` -flops_per_token = 2 * n_params -flops_per_seq = flops_per_token * seq_len -mfu* = 3 * flops_per_seq * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) - -attn_flops_per_seq = n_layers * 2 * 2 * (d_model * (seq_len**2)) -mfu = (3 * flops_per_seq + 3 * attn_flops_per_seq) * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) -``` - -### HFU - -The HFU numbers shown below account for the fact that the networks use checkpointing and recomputes activations. This effectively requires an extra forward pass through the network. -``` -hfu* = 4 * flops_per_seq * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) -hfu = (4 * flops_per_seq + 4 * attn_flops_per_seq) * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) -``` - -Note that these are approximations. Actual HFU would be higher since it includes the floating point operations for normalization, activation, and residual lyaers, as well as **all** recomputation. For example, our models use Flash Attention, which requires including an extra recompute factor for its recomputation in the forward pass. Therefore, the attention multipler would be 5 instead of 4. - -## Results - -Below we include several configurations across different hardware platforms, sequence lengths and batch sizes. It is easy to benchmark configurations for your own use case. For example, using the Mosaic platform, to test MPT {13B, 30B} using fp16 with a batch size of 2M tokens and seq len {2k, 4k, 8k, 16k} run: -``` -python submit_benchmarks.py -m 13b.yaml 30b.yaml -t fp16 -b 21 21 -s 11 14 --RUN -``` -This will run 8 configs for 12 steps to get throughput numbers. `python collect_results.py` can then be used to parse all output training logs and create the tables below. - -Our microbatching engine enables microbatch sizes that do not divde Global Batchsize while being mathematically faithful to the global batch size. For example, a total batch size of 48, and a micro batch of 11, means we will accumulate gradients across microbatches of 11, 11, 11, 11, 4. - -[comment]: # (TODO: Update tables with torch 2.0 after next Composer release) - -## H100 80GB -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 30b | 8192 | 8 | h100_80gb | 27.37 | 36.5 | 1 | 21 | 168 | 1 | 10128 | 1266 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 8192 | 8 | h100_80gb | 27.51 | 36.68 | 1 | 21 | 168 | 1 | 10179 | 1272 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 8192 | 8 | h100_80gb | 27.87 | 37.16 | 1 | 21 | 168 | 1 | 10311 | 1288 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | h100_80gb | 34.5 | 46.0 | 1 | 21 | 168 | 3 | 13873 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 4096 | 8 | h100_80gb | 34.61 | 46.15 | 1 | 21 | 168 | 3 | 13917 | 1739 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 4096 | 8 | h100_80gb | 34.51 | 46.02 | 1 | 21 | 168 | 3 | 13878 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 8 | h100_80gb | 37.35 | 49.8 | 3 | 21 | 504 | 7 | 15700 | 1962 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | h100_80gb | 37.33 | 49.78 | 3 | 21 | 504 | 7 | 15693 | 1961 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | h100_80gb | 37.54 | 50.05 | 3 | 21 | 504 | 7 | 15781 | 1972 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | h100_80gb | 38.21 | 50.94 | 6 | 21 | 1008 | 16 | 16433 | 2054 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 1024 | 8 | h100_80gb | 37.83 | 50.44 | 6 | 21 | 1008 | 15 | 16271 | 2033 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 1024 | 8 | h100_80gb | 38.07 | 50.76 | 6 | 21 | 1008 | 15 | 16376 | 2047 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | h100_80gb | 38.64 | 51.52 | 12 | 21 | 2016 | 32 | 16816 | 2102 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 30b | 512 | 8 | h100_80gb | 38.38 | 51.17 | 12 | 21 | 2016 | 32 | 16702 | 2087 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 30b | 512 | 8 | h100_80gb | 38.47 | 51.29 | 12 | 21 | 2016 | 32 | 16741 | 2092 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | h100_80gb | 30.55 | 40.74 | 1 | 3 | 24 | 0 | 15250 | 1906 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 32768 | 8 | h100_80gb | 30.73 | 40.97 | 1 | 3 | 24 | 0 | 15338 | 1917 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 32768 | 8 | h100_80gb | 30.67 | 40.9 | 1 | 3 | 24 | 0 | 15309 | 1913 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 8192 | 8 | h100_80gb | 37.02 | 49.36 | 5 | 3 | 120 | 3 | 30075 | 3759 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 8192 | 8 | h100_80gb | 36.97 | 49.29 | 5 | 3 | 120 | 3 | 30030 | 3753 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 8192 | 8 | h100_80gb | 37.15 | 49.53 | 5 | 3 | 120 | 3 | 30179 | 3772 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 2048 | 8 | h100_80gb | 41.03 | 54.71 | 20 | 3 | 480 | 19 | 39532 | 4941 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | h100_80gb | 41.29 | 55.05 | 20 | 3 | 480 | 19 | 39779 | 4972 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | h100_80gb | 40.97 | 54.63 | 20 | 3 | 480 | 19 | 39478 | 4934 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 512 | 8 | h100_80gb | 42.63 | 56.83 | 80 | 3 | 1920 | 84 | 43074 | 5384 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 13b | 512 | 8 | h100_80gb | 42.51 | 56.68 | 80 | 3 | 1920 | 83 | 42954 | 5369 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 13b | 512 | 8 | h100_80gb | 42.24 | 56.32 | 80 | 3 | 1920 | 83 | 42684 | 5335 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 32768 | 8 | h100_80gb | 30.28 | 40.37 | 2 | 2 | 32 | 0 | 25983 | 3247 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 32768 | 8 | h100_80gb | 30.45 | 40.6 | 2 | 2 | 32 | 0 | 26127 | 3265 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 32768 | 8 | h100_80gb | 30.27 | 40.36 | 2 | 2 | 32 | 0 | 25973 | 3246 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 8192 | 8 | h100_80gb | 36.39 | 48.51 | 8 | 2 | 128 | 6 | 54355 | 6794 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 8192 | 8 | h100_80gb | 36.12 | 48.16 | 8 | 2 | 128 | 6 | 53957 | 6744 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 8192 | 8 | h100_80gb | 36.43 | 48.57 | 8 | 2 | 128 | 6 | 54419 | 6802 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 2048 | 8 | h100_80gb | 40.48 | 53.97 | 32 | 2 | 512 | 36 | 74217 | 9277 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | h100_80gb | 40.43 | 53.91 | 32 | 2 | 512 | 36 | 74132 | 9266 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | h100_80gb | 40.46 | 53.94 | 32 | 2 | 512 | 36 | 74180 | 9272 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81676 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81679 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 7b | 512 | 8 | h100_80gb | 41.88 | 55.84 | 128 | 2 | 2048 | 159 | 81417 | 10177 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 32768 | 8 | h100_80gb | 28.03 | 37.37 | 3 | 6 | 144 | 1 | 45654 | 5706 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 32768 | 8 | h100_80gb | 28.0 | 37.33 | 3 | 6 | 144 | 1 | 45607 | 5700 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 32768 | 8 | h100_80gb | 27.91 | 37.21 | 3 | 6 | 144 | 1 | 45465 | 5683 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 8192 | 8 | h100_80gb | 40.35 | 40.35 | 3 | 6 | 144 | 16 | 132753 | 16594 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 8192 | 8 | h100_80gb | 40.1 | 40.1 | 3 | 6 | 144 | 16 | 131934 | 16491 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 8192 | 8 | h100_80gb | 40.33 | 40.33 | 3 | 6 | 144 | 16 | 132697 | 16587 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 2048 | 8 | h100_80gb | 44.43 | 44.43 | 10 | 6 | 480 | 95 | 196229 | 24528 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | h100_80gb | 44.42 | 44.42 | 10 | 6 | 480 | 95 | 196171 | 24521 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | h100_80gb | 44.2 | 44.2 | 10 | 6 | 480 | 95 | 195192 | 24399 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 512 | 8 | h100_80gb | 46.05 | 46.05 | 40 | 6 | 1920 | 434 | 222413 | 27801 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 3b | 512 | 8 | h100_80gb | 46.38 | 46.38 | 40 | 6 | 1920 | 437 | 223994 | 27999 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 3b | 512 | 8 | h100_80gb | 46.14 | 46.14 | 40 | 6 | 1920 | 435 | 222834 | 27854 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | h100_80gb | 33.6 | 33.6 | 1 | 4 | 32 | 2 | 96354 | 12044 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 1 | 4 | 32 | 2 | 96182 | 12022 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 32768 | 8 | h100_80gb | 33.51 | 33.51 | 1 | 4 | 32 | 2 | 96105 | 12013 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 8192 | 8 | h100_80gb | 36.66 | 36.66 | 2 | 4 | 64 | 27 | 226682 | 28335 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 8192 | 8 | h100_80gb | 36.74 | 36.74 | 2 | 4 | 64 | 27 | 227183 | 28397 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 8192 | 8 | h100_80gb | 36.39 | 36.39 | 2 | 4 | 64 | 27 | 225010 | 28126 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 350m | 32768 | 8 | h100_80gb | 28.95 | 28.95 | 1 | 4 | 32 | 5 | 191165 | 23895 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 32768 | 8 | h100_80gb | 28.88 | 28.88 | 1 | 4 | 32 | 5 | 190718 | 23839 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 32768 | 8 | h100_80gb | 28.98 | 28.98 | 1 | 4 | 32 | 5 | 191350 | 23918 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | h100_80gb | 29.9 | 29.9 | 2 | 4 | 64 | 20 | 335478 | 41934 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 16384 | 8 | h100_80gb | 29.76 | 29.76 | 2 | 4 | 64 | 20 | 333921 | 41740 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 16384 | 8 | h100_80gb | 29.95 | 29.95 | 2 | 4 | 64 | 20 | 336016 | 42002 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 2048 | 8 | h100_80gb | 6.05 | 8.06 | 3 | 21 | 504 | 170 | 349409 | 43676 | 1032192 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 355985408 | -| 350m | 512 | 8 | h100_80gb | 32.32 | 32.32 | 56 | 4 | 1792 | 2194 | 1123449 | 140431 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 350m | 512 | 8 | h100_80gb | 32.79 | 32.79 | 56 | 4 | 1792 | 2226 | 1139870 | 142483 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 350m | 512 | 8 | h100_80gb | 32.77 | 32.77 | 56 | 4 | 1792 | 2224 | 1138963 | 142370 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | - -## A100 80GB with 1600 Gbps node-node interconnect (RoCE) - -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 8192 | 8 | a100_80gb | 42.66 | 56.89 | 1 | 21 | 168 | 0 | 4977 | 622 | 1376256 | bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | a100_80gb | 49.12 | 65.49 | 1 | 21 | 168 | 1 | 6227 | 778 | 688128 | bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 64 | a100_80gb | 52.93 | 70.57 | 16 | 3 | 3072 | 27 | 56126 | 876 | 6291456 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 32 | a100_80gb | 53.48 | 71.3 | 14 | 3 | 1344 | 13 | 28353 | 886 | 2752512 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 16 | a100_80gb | 53.4 | 71.2 | 10 | 3 | 480 | 6 | 14157 | 884 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | a100_80gb | 47.57 | 63.43 | 3 | 21 | 504 | 3 | 6305 | 788 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | a100_80gb | 51.69 | 68.92 | 6 | 21 | 1008 | 6 | 7010 | 876 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | a100_80gb | 49.23 | 65.63 | 12 | 21 | 2016 | 13 | 6754 | 844 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | a100_80gb | 49.53 | 66.04 | 1 | 3 | 24 | 0 | 7795 | 974 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 16384 | 8 | a100_80gb | 51.71 | 68.94 | 3 | 3 | 72 | 0 | 10953 | 1369 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 12927354880 | -| 13b | 8192 | 8 | a100_80gb | 52.83 | 70.44 | 5 | 3 | 120 | 1 | 13531 | 1691 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_80gb | 53.62 | 71.5 | 10 | 3 | 240 | 3 | 15339 | 1917 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 64 | a100_80gb | 52.51 | 70.01 | 32 | 1 | 2048 | 62 | 127624 | 1994 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 32 | a100_80gb | 52.86 | 70.48 | 32 | 1 | 1024 | 31 | 64241 | 2007 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 16 | a100_80gb | 53.14 | 70.86 | 24 | 1 | 384 | 15 | 32291 | 2018 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | a100_80gb | 54.38 | 72.51 | 20 | 3 | 480 | 8 | 16522 | 2065 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 1024 | 8 | a100_80gb | 55.23 | 73.63 | 40 | 3 | 960 | 16 | 17315 | 2164 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | -| 13b | 512 | 8 | a100_80gb | 54.99 | 73.32 | 80 | 3 | 1920 | 34 | 17521 | 2190 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 65536 | 8 | a100_80gb | 42.61 | 56.82 | 1 | 2 | 16 | 0 | 7355 | 919 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6918905856 | -| 7b | 32768 | 8 | a100_80gb | 48.18 | 64.24 | 2 | 2 | 32 | 0 | 13035 | 1629 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 16384 | 8 | a100_80gb | 49.5 | 66.0 | 4 | 2 | 64 | 1 | 18698 | 2337 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_80gb | 50.71 | 67.62 | 8 | 2 | 128 | 2 | 23887 | 2985 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_80gb | 52.05 | 69.4 | 16 | 2 | 256 | 6 | 27973 | 3496 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 64 | a100_80gb | 50.8 | 67.73 | 32 | 1 | 2048 | 114 | 234932 | 3670 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 32 | a100_80gb | 51.16 | 68.22 | 32 | 1 | 1024 | 57 | 118310 | 3697 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 16 | a100_80gb | 51.59 | 68.79 | 32 | 1 | 512 | 29 | 59653 | 3728 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | a100_80gb | 52.92 | 70.56 | 32 | 2 | 512 | 14 | 30596 | 3824 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 1024 | 8 | a100_80gb | 53.66 | 71.55 | 64 | 2 | 1024 | 31 | 32243 | 4030 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | -| 7b | 512 | 8 | a100_80gb | 53.5 | 71.34 | 128 | 2 | 2048 | 64 | 32794 | 4099 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 65536 | 8 | a100_80gb | 46.17 | 61.57 | 1 | 2 | 16 | 0 | 14174 | 1771 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2814366720 | -| 3b | 32768 | 8 | a100_80gb | 46.73 | 62.31 | 3 | 6 | 144 | 0 | 24003 | 3000 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_80gb | 57.29 | 57.29 | 1 | 6 | 48 | 2 | 44356 | 5544 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2688537600 | -| 3b | 8192 | 8 | a100_80gb | 58.68 | 58.68 | 3 | 6 | 144 | 7 | 60883 | 7610 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_80gb | 59.51 | 59.51 | 5 | 6 | 240 | 18 | 74388 | 9298 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 64 | a100_80gb | 58.36 | 58.36 | 12 | 3 | 2304 | 317 | 650175 | 10158 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | a100_80gb | 59.22 | 59.22 | 12 | 3 | 1152 | 161 | 329856 | 10308 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | a100_80gb | 59.08 | 59.08 | 10 | 3 | 480 | 80 | 164543 | 10283 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | a100_80gb | 59.77 | 59.77 | 10 | 6 | 480 | 40 | 83230 | 10403 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_80gb | 61.56 | 61.56 | 20 | 6 | 960 | 88 | 90906 | 11363 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_80gb | 62.09 | 62.09 | 40 | 6 | 1920 | 184 | 94553 | 11819 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 1b | 65536 | 8 | a100_80gb | 45.29 | 60.39 | 1 | 2 | 16 | 0 | 23885 | 2985 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1445974016 | -| 1b | 32768 | 8 | a100_80gb | 56.02 | 56.02 | 1 | 4 | 32 | 1 | 50657 | 6332 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 16384 | 8 | a100_80gb | 55.84 | 55.84 | 2 | 4 | 64 | 4 | 78591 | 9823 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_80gb | 56.38 | 56.38 | 3 | 4 | 96 | 13 | 109915 | 13739 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_80gb | 58.3 | 58.3 | 7 | 4 | 224 | 34 | 140767 | 17595 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 64 | a100_80gb | 56.67 | 56.67 | 20 | 1 | 1280 | 606 | 1243103 | 19423 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | a100_80gb | 56.74 | 56.74 | 20 | 1 | 640 | 303 | 622285 | 19446 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | a100_80gb | 57.47 | 57.47 | 20 | 1 | 320 | 153 | 315117 | 19694 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_80gb | 59.16 | 59.16 | 14 | 4 | 448 | 79 | 162214 | 20276 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_80gb | 58.98 | 58.98 | 18 | 4 | 576 | 169 | 173458 | 21682 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_80gb | 60.38 | 60.38 | 56 | 4 | 1792 | 359 | 184268 | 23033 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | -| 760m | 65536 | 8 | a100_80gb | 45.48 | 60.64 | 1 | 2 | 16 | 0 | 33252 | 4156 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 857988096 | -| 760m | 32768 | 8 | a100_80gb | 54.48 | 54.48 | 1 | 2 | 16 | 2 | 70305 | 8788 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 807656448 | -| 760m | 16384 | 8 | a100_80gb | 55.21 | 55.21 | 3 | 2 | 48 | 7 | 115383 | 14422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_80gb | 55.13 | 55.13 | 6 | 2 | 96 | 20 | 166928 | 20866 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_80gb | 55.2 | 55.2 | 12 | 2 | 192 | 52 | 215501 | 26937 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 64 | a100_80gb | 51.82 | 51.82 | 24 | 1 | 1536 | 923 | 1892166 | 29565 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 32 | a100_80gb | 53.27 | 53.27 | 24 | 1 | 768 | 474 | 972497 | 30390 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | a100_80gb | 53.56 | 53.56 | 24 | 1 | 384 | 238 | 488871 | 30554 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_80gb | 55.67 | 55.67 | 24 | 2 | 384 | 124 | 254104 | 31763 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_80gb | 55.98 | 55.98 | 48 | 2 | 768 | 272 | 279108 | 34888 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_80gb | 56.2 | 56.2 | 96 | 2 | 1536 | 573 | 293755 | 36719 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | -| 350m | 65536 | 8 | a100_80gb | 52.39 | 52.39 | 1 | 2 | 16 | 0 | 59835 | 7479 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 420997120 | -| 350m | 32768 | 8 | a100_80gb | 47.45 | 47.45 | 2 | 2 | 32 | 3 | 98793 | 12349 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_80gb | 53.01 | 53.01 | 4 | 2 | 64 | 11 | 187535 | 23441 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_80gb | 53.21 | 53.21 | 8 | 2 | 128 | 35 | 289398 | 36174 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_80gb | 52.46 | 52.46 | 16 | 2 | 256 | 95 | 390131 | 48766 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 64 | a100_80gb | 47.76 | 47.76 | 32 | 1 | 2048 | 1699 | 3480601 | 54384 | 4194304 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 32 | a100_80gb | 48.58 | 48.58 | 32 | 1 | 1024 | 864 | 1770287 | 55321 | 2097152 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 16 | a100_80gb | 50.53 | 50.53 | 32 | 1 | 512 | 449 | 920605 | 57537 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_80gb | 51.73 | 51.73 | 32 | 2 | 512 | 230 | 471290 | 58911 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_80gb | 51.28 | 51.28 | 64 | 2 | 1024 | 514 | 526393 | 65799 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_80gb | 51.18 | 51.18 | 128 | 2 | 2048 | 1095 | 560858 | 70107 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 125m | 65536 | 8 | a100_80gb | 54.31 | 54.31 | 1 | 2 | 16 | 2 | 163472 | 20434 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 174070272 | -| 125m | 32768 | 8 | a100_80gb | 53.15 | 53.15 | 2 | 2 | 32 | 8 | 293685 | 36710 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_80gb | 51.58 | 51.58 | 4 | 2 | 64 | 29 | 489578 | 61197 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_80gb | 49.18 | 49.18 | 8 | 2 | 128 | 88 | 727986 | 90998 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_80gb | 46.62 | 46.62 | 16 | 2 | 256 | 233 | 958343 | 119792 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 64 | a100_80gb | 40.77 | 40.77 | 32 | 1 | 2048 | 4063 | 8321727 | 130026 | 4194304 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 32 | a100_80gb | 41.22 | 41.22 | 32 | 1 | 1024 | 2053 | 4206041 | 131438 | 2097152 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 16 | a100_80gb | 41.92 | 41.92 | 32 | 1 | 512 | 1044 | 2139036 | 133689 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_80gb | 44.04 | 44.04 | 32 | 2 | 512 | 548 | 1123506 | 140438 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_80gb | 43.25 | 43.25 | 64 | 2 | 1024 | 1225 | 1254561 | 156820 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_80gb | 42.54 | 42.54 | 128 | 2 | 2048 | 2587 | 1325030 | 165628 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | - -## A100 40GB with 1600 Gbps node-node interconnect (RoCE) - -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | -| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | -| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | -| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | -| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | -| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | -| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | -| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | diff --git a/scripts/train/benchmarking/ack_ckpt_limits.csv b/scripts/train/benchmarking/ack_ckpt_limits.csv deleted file mode 100644 index 22707f4f72..0000000000 --- a/scripts/train/benchmarking/ack_ckpt_limits.csv +++ /dev/null @@ -1,8 +0,0 @@ -Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams -13b,2048,8,a100_80gb,58.67,58.67,2,2,32,8,17824,2228,65536,amp_bf16,DEFAULT,FULL_SHARD,False,False,12853954560 -7b,2048,8,a100_80gb,62.46,62.46,4,2,64,17,36110,4513,131072,amp_bf16,DEFAULT,FULL_SHARD,False,False,6658859008 -7b,2048,8,a100_80gb,55.97,55.97,2,2,32,15,32355,4044,65536,amp_bf16,DEFAULT,FULL_SHARD,False,False,6658859008 -7b,2048,8,a100_80gb,46.59,46.59,1,2,16,13,26934,3366,32768,amp_bf16,DEFAULT,FULL_SHARD,False,False,6658859008 -3b,2048,8,a100_40gb,40.65,40.65,1,2,16,27,56609,7076,32768,amp_bf16,DEFAULT,FULL_SHARD,False,False,2651837440 -3b,2048,8,a100_80gb,34.93,46.57,1,2,16,23,48635,6079,32768,amp_bf16,DEFAULT,FULL_SHARD,True,True,2651837440 -3b,2048,8,a100_80gb,35.02,46.69,1,2,16,23,48759,6094,32768,amp_bf16,DEFAULT,FULL_SHARD,True,True,2651837440 diff --git a/scripts/train/benchmarking/ack_ckpt_limits.md b/scripts/train/benchmarking/ack_ckpt_limits.md deleted file mode 100644 index d37482a57c..0000000000 --- a/scripts/train/benchmarking/ack_ckpt_limits.md +++ /dev/null @@ -1,10 +0,0 @@ -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 13b | 2048 | 8 | a100_80gb | 58.67 | 58.67 | 2 | 2 | 32 | 8 | 17824 | 2228 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 2048 | 8 | a100_80gb | 49.18 | 49.18 | 1 | 2 | 16 | 7 | 14942 | 1867 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 7b | 2048 | 8 | a100_80gb | 62.46 | 62.46 | 4 | 2 | 64 | 17 | 36110 | 4513 | 131072 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 7b | 2048 | 8 | a100_80gb | 55.97 | 55.97 | 2 | 2 | 32 | 15 | 32355 | 4044 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 7b | 2048 | 8 | a100_80gb | 46.59 | 46.59 | 1 | 2 | 16 | 13 | 26934 | 3366 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 3b | 2048 | 8 | a100_40gb | 40.65 | 40.65 | 1 | 2 | 16 | 27 | 56609 | 7076 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | a100_80gb | 34.93 | 46.57 | 1 | 2 | 16 | 23 | 48635 | 6079 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | True | True | 2651837440 | -| 3b | 2048 | 8 | a100_80gb | 35.02 | 46.69 | 1 | 2 | 16 | 23 | 48759 | 6094 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | True | True | 2651837440 | diff --git a/scripts/train/benchmarking/act_ckpt_optimize.sh b/scripts/train/benchmarking/act_ckpt_optimize.sh deleted file mode 100755 index 52ff209e8a..0000000000 --- a/scripts/train/benchmarking/act_ckpt_optimize.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -PROJECT="ackckptqt" -TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" -CLUSTER_80GB=r1z1 -GIT_BRANCH=run_initial - -for MB_SIZE in 1 2 4 6 8 -do -# # for GATH_LMT in true false -# # do -# # for CPU_OFFLOAD in true false -# # do - python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_40gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false - python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false - python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size $MB_SIZE --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# # done -# # done -done - -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 12 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type a100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_limit_all_gathers $GATH_LMT --activation_cpu_offload $CPU_OFFLOAD --fsdp_config_activation_checkpointing false \ No newline at end of file diff --git a/scripts/train/benchmarking/attn.sh b/scripts/train/benchmarking/attn.sh deleted file mode 100755 index 88391bfc18..0000000000 --- a/scripts/train/benchmarking/attn.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -PROJECT="attn" -TORCH_2_IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" -CLUSTER_80GB=r9z1 -GIT_COMMIT=v0.2.0 -GIT_BRANCH=main -# 30b test Torch Runs -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true --attn_impl xformers - -#13b test Torch runs -- seperate Torch1.13 and torch2 -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --attn_impl xformers -#7b test torch runs -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --attn_impl xformers -# #1b test torch runs -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false --attn_impl xformers \ No newline at end of file diff --git a/scripts/train/benchmarking/benchmark_results.csv b/scripts/train/benchmarking/benchmark_results.csv deleted file mode 100644 index a39035d320..0000000000 --- a/scripts/train/benchmarking/benchmark_results.csv +++ /dev/null @@ -1,78 +0,0 @@ -Model,SeqLen (T),# GPUs,GPU,MFU,HFU,MicroBatchSize,GradAccum,GlobalBatchSize,Throughput (S/s),Throughput (T/s),Throughput (T/s/GPU),GlobalBatchSize (T),Precision,MP Mode,Sharding Strategy,Activation Checkpointing,Activation CPUOffload,NumParams -30b,8192,8,h100_80gb,27.37,36.5,1,21,168,1,10128,1266,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 -30b,8192,8,h100_80gb,27.51,36.68,1,21,168,1,10179,1272,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 -30b,8192,8,h100_80gb,27.87,37.16,1,21,168,1,10311,1288,1376256,amp_bf16,PURE,FULL_SHARD,True,False,30019254272 -30b,4096,8,h100_80gb,34.5,46.0,1,21,168,3,13873,1734,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 -30b,4096,8,h100_80gb,34.61,46.15,1,21,168,3,13917,1739,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 -30b,4096,8,h100_80gb,34.51,46.02,1,21,168,3,13878,1734,688128,amp_bf16,PURE,FULL_SHARD,True,False,29989894144 -30b,2048,8,h100_80gb,37.35,49.8,3,21,504,7,15700,1962,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 -30b,2048,8,h100_80gb,37.33,49.78,3,21,504,7,15693,1961,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 -30b,2048,8,h100_80gb,37.54,50.05,3,21,504,7,15781,1972,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29975214080 -30b,1024,8,h100_80gb,38.21,50.94,6,21,1008,16,16433,2054,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 -30b,1024,8,h100_80gb,37.83,50.44,6,21,1008,15,16271,2033,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 -30b,1024,8,h100_80gb,38.07,50.76,6,21,1008,15,16376,2047,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29967874048 -30b,512,8,h100_80gb,38.64,51.52,12,21,2016,32,16816,2102,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 -30b,512,8,h100_80gb,38.38,51.17,12,21,2016,32,16702,2087,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 -30b,512,8,h100_80gb,38.47,51.29,12,21,2016,32,16741,2092,1032192,amp_bf16,PURE,FULL_SHARD,True,False,29964204032 -13b,32768,8,h100_80gb,30.55,40.74,1,3,24,0,15250,1906,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 -13b,32768,8,h100_80gb,30.73,40.97,1,3,24,0,15338,1917,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 -13b,32768,8,h100_80gb,30.67,40.9,1,3,24,0,15309,1913,786432,amp_bf16,PURE,FULL_SHARD,True,False,13011240960 -13b,8192,8,h100_80gb,37.02,49.36,5,3,120,3,30075,3759,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 -13b,8192,8,h100_80gb,36.97,49.29,5,3,120,3,30030,3753,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 -13b,8192,8,h100_80gb,37.15,49.53,5,3,120,3,30179,3772,983040,amp_bf16,PURE,FULL_SHARD,True,False,12885411840 -13b,2048,8,h100_80gb,41.03,54.71,20,3,480,19,39532,4941,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 -13b,2048,8,h100_80gb,41.29,55.05,20,3,480,19,39779,4972,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 -13b,2048,8,h100_80gb,40.97,54.63,20,3,480,19,39478,4934,983040,amp_bf16,PURE,FULL_SHARD,True,False,12853954560 -13b,512,8,h100_80gb,42.63,56.83,80,3,1920,84,43074,5384,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 -13b,512,8,h100_80gb,42.51,56.68,80,3,1920,83,42954,5369,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 -13b,512,8,h100_80gb,42.24,56.32,80,3,1920,83,42684,5335,983040,amp_bf16,PURE,FULL_SHARD,True,False,12846090240 -7b,32768,8,h100_80gb,30.28,40.37,2,2,32,0,25983,3247,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 -7b,32768,8,h100_80gb,30.45,40.6,2,2,32,0,26127,3265,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 -7b,32768,8,h100_80gb,30.27,40.36,2,2,32,0,25973,3246,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6784688128 -7b,8192,8,h100_80gb,36.39,48.51,8,2,128,6,54355,6794,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 -7b,8192,8,h100_80gb,36.12,48.16,8,2,128,6,53957,6744,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 -7b,8192,8,h100_80gb,36.43,48.57,8,2,128,6,54419,6802,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6684024832 -7b,2048,8,h100_80gb,40.48,53.97,32,2,512,36,74217,9277,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 -7b,2048,8,h100_80gb,40.43,53.91,32,2,512,36,74132,9266,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 -7b,2048,8,h100_80gb,40.46,53.94,32,2,512,36,74180,9272,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6658859008 -7b,512,8,h100_80gb,42.02,56.02,128,2,2048,159,81676,10209,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 -7b,512,8,h100_80gb,42.02,56.02,128,2,2048,159,81679,10209,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 -7b,512,8,h100_80gb,41.88,55.84,128,2,2048,159,81417,10177,1048576,amp_bf16,PURE,FULL_SHARD,True,False,6652567552 -3b,32768,8,h100_80gb,28.03,37.37,3,6,144,1,45654,5706,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 -3b,32768,8,h100_80gb,28.0,37.33,3,6,144,1,45607,5700,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 -3b,32768,8,h100_80gb,27.91,37.21,3,6,144,1,45465,5683,4718592,amp_bf16,PURE,FULL_SHARD,True,False,2730480640 -3b,32768,8,h100_80gb,14.38,19.18,3,6,144,1,46853,5856,4718592,amp_fp8,DEFAULT,FULL_SHARD,True,False,2730480640 -3b,8192,8,h100_80gb,40.35,40.35,3,6,144,16,132753,16594,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 -3b,8192,8,h100_80gb,40.1,40.1,3,6,144,16,131934,16491,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 -3b,8192,8,h100_80gb,40.33,40.33,3,6,144,16,132697,16587,1179648,amp_bf16,PURE,FULL_SHARD,False,False,2667566080 -3b,8192,8,h100_80gb,23.28,23.28,3,6,144,18,153174,19146,1179648,amp_fp8,DEFAULT,FULL_SHARD,False,False,2667566080 -3b,2048,8,h100_80gb,44.43,44.43,10,6,480,95,196229,24528,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 -3b,2048,8,h100_80gb,44.42,44.42,10,6,480,95,196171,24521,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 -3b,2048,8,h100_80gb,44.2,44.2,10,6,480,95,195192,24399,983040,amp_bf16,PURE,FULL_SHARD,False,False,2651837440 -3b,2048,8,h100_80gb,27.7,27.7,10,6,480,119,244692,30586,983040,amp_fp8,DEFAULT,FULL_SHARD,False,False,2651837440 -3b,512,8,h100_80gb,46.05,46.05,40,6,1920,434,222413,27801,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 -3b,512,8,h100_80gb,46.38,46.38,40,6,1920,437,223994,27999,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 -3b,512,8,h100_80gb,46.14,46.14,40,6,1920,435,222834,27854,983040,amp_bf16,PURE,FULL_SHARD,False,False,2647905280 -3b,512,8,h100_80gb,30.25,30.25,40,6,1920,570,292217,36527,983040,amp_fp8,DEFAULT,FULL_SHARD,False,False,2647905280 -1b,32768,8,h100_80gb,33.6,33.6,1,4,32,2,96354,12044,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 -1b,32768,8,h100_80gb,33.54,33.54,1,4,32,2,96182,12022,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 -1b,32768,8,h100_80gb,33.51,33.51,1,4,32,2,96105,12013,1048576,amp_bf16,PURE,FULL_SHARD,False,False,1378865152 -1b,32768,8,h100_80gb,17.55,17.55,1,4,32,3,100643,12580,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,1378865152 -1b,8192,8,h100_80gb,36.66,36.66,2,4,64,27,226682,28335,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 -1b,8192,8,h100_80gb,36.74,36.74,2,4,64,27,227183,28397,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 -1b,8192,8,h100_80gb,36.39,36.39,2,4,64,27,225010,28126,524288,amp_bf16,PURE,FULL_SHARD,False,False,1328533504 -1b,8192,8,h100_80gb,20.71,20.71,2,4,64,31,256087,32010,524288,amp_fp8,DEFAULT,FULL_SHARD,False,False,1328533504 -1b,512,8,h100_80gb,29.06,29.06,56,4,1792,1098,562523,70315,917504,amp_fp8,DEFAULT,FULL_SHARD,False,False,1312804864 -350m,32768,8,h100_80gb,28.95,28.95,1,4,32,5,191165,23895,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 -350m,32768,8,h100_80gb,28.88,28.88,1,4,32,5,190718,23839,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 -350m,32768,8,h100_80gb,28.98,28.98,1,4,32,5,191350,23918,1048576,amp_bf16,PURE,FULL_SHARD,False,False,387442688 -350m,32768,8,h100_80gb,14.8,14.8,1,4,32,5,195516,24439,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,387442688 -350m,16384,8,h100_80gb,29.9,29.9,2,4,64,20,335478,41934,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 -350m,16384,8,h100_80gb,29.76,29.76,2,4,64,20,333921,41740,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 -350m,16384,8,h100_80gb,29.95,29.95,2,4,64,20,336016,42002,1048576,amp_bf16,PURE,FULL_SHARD,False,False,370665472 -350m,16384,8,h100_80gb,15.31,15.31,2,4,64,20,343435,42929,1048576,amp_fp8,DEFAULT,FULL_SHARD,False,False,370665472 -350m,2048,8,h100_80gb,6.05,8.06,3,21,504,170,349409,43676,1032192,amp_fp8,DEFAULT,FULL_SHARD,True,False,355985408 -350m,512,8,h100_80gb,32.32,32.32,56,4,1792,2194,1123449,140431,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 -350m,512,8,h100_80gb,32.79,32.79,56,4,1792,2226,1139870,142483,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 -350m,512,8,h100_80gb,32.77,32.77,56,4,1792,2224,1138963,142370,917504,amp_bf16,PURE,FULL_SHARD,False,False,354412544 -350m,512,8,h100_80gb,17.77,17.77,56,4,1792,2412,1235360,154420,917504,amp_fp8,DEFAULT,FULL_SHARD,False,False,354412544 diff --git a/scripts/train/benchmarking/benchmark_results.md b/scripts/train/benchmarking/benchmark_results.md deleted file mode 100644 index 2a320d0b2d..0000000000 --- a/scripts/train/benchmarking/benchmark_results.md +++ /dev/null @@ -1,79 +0,0 @@ -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 30b | 8192 | 8 | h100_80gb | 27.37 | 36.5 | 1 | 21 | 168 | 1 | 10128 | 1266 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 8192 | 8 | h100_80gb | 27.51 | 36.68 | 1 | 21 | 168 | 1 | 10179 | 1272 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 8192 | 8 | h100_80gb | 27.87 | 37.16 | 1 | 21 | 168 | 1 | 10311 | 1288 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | h100_80gb | 34.5 | 46.0 | 1 | 21 | 168 | 3 | 13873 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 4096 | 8 | h100_80gb | 34.61 | 46.15 | 1 | 21 | 168 | 3 | 13917 | 1739 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 4096 | 8 | h100_80gb | 34.51 | 46.02 | 1 | 21 | 168 | 3 | 13878 | 1734 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 8 | h100_80gb | 37.35 | 49.8 | 3 | 21 | 504 | 7 | 15700 | 1962 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | h100_80gb | 37.33 | 49.78 | 3 | 21 | 504 | 7 | 15693 | 1961 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | h100_80gb | 37.54 | 50.05 | 3 | 21 | 504 | 7 | 15781 | 1972 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | h100_80gb | 38.21 | 50.94 | 6 | 21 | 1008 | 16 | 16433 | 2054 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 1024 | 8 | h100_80gb | 37.83 | 50.44 | 6 | 21 | 1008 | 15 | 16271 | 2033 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 1024 | 8 | h100_80gb | 38.07 | 50.76 | 6 | 21 | 1008 | 15 | 16376 | 2047 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | h100_80gb | 38.64 | 51.52 | 12 | 21 | 2016 | 32 | 16816 | 2102 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 30b | 512 | 8 | h100_80gb | 38.38 | 51.17 | 12 | 21 | 2016 | 32 | 16702 | 2087 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 30b | 512 | 8 | h100_80gb | 38.47 | 51.29 | 12 | 21 | 2016 | 32 | 16741 | 2092 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | h100_80gb | 30.55 | 40.74 | 1 | 3 | 24 | 0 | 15250 | 1906 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 32768 | 8 | h100_80gb | 30.73 | 40.97 | 1 | 3 | 24 | 0 | 15338 | 1917 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 32768 | 8 | h100_80gb | 30.67 | 40.9 | 1 | 3 | 24 | 0 | 15309 | 1913 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 8192 | 8 | h100_80gb | 37.02 | 49.36 | 5 | 3 | 120 | 3 | 30075 | 3759 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 8192 | 8 | h100_80gb | 36.97 | 49.29 | 5 | 3 | 120 | 3 | 30030 | 3753 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 8192 | 8 | h100_80gb | 37.15 | 49.53 | 5 | 3 | 120 | 3 | 30179 | 3772 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 2048 | 8 | h100_80gb | 41.03 | 54.71 | 20 | 3 | 480 | 19 | 39532 | 4941 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | h100_80gb | 41.29 | 55.05 | 20 | 3 | 480 | 19 | 39779 | 4972 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | h100_80gb | 40.97 | 54.63 | 20 | 3 | 480 | 19 | 39478 | 4934 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 512 | 8 | h100_80gb | 42.63 | 56.83 | 80 | 3 | 1920 | 84 | 43074 | 5384 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 13b | 512 | 8 | h100_80gb | 42.51 | 56.68 | 80 | 3 | 1920 | 83 | 42954 | 5369 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 13b | 512 | 8 | h100_80gb | 42.24 | 56.32 | 80 | 3 | 1920 | 83 | 42684 | 5335 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 32768 | 8 | h100_80gb | 30.28 | 40.37 | 2 | 2 | 32 | 0 | 25983 | 3247 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 32768 | 8 | h100_80gb | 30.45 | 40.6 | 2 | 2 | 32 | 0 | 26127 | 3265 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 32768 | 8 | h100_80gb | 30.27 | 40.36 | 2 | 2 | 32 | 0 | 25973 | 3246 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 8192 | 8 | h100_80gb | 36.39 | 48.51 | 8 | 2 | 128 | 6 | 54355 | 6794 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 8192 | 8 | h100_80gb | 36.12 | 48.16 | 8 | 2 | 128 | 6 | 53957 | 6744 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 8192 | 8 | h100_80gb | 36.43 | 48.57 | 8 | 2 | 128 | 6 | 54419 | 6802 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 2048 | 8 | h100_80gb | 40.48 | 53.97 | 32 | 2 | 512 | 36 | 74217 | 9277 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | h100_80gb | 40.43 | 53.91 | 32 | 2 | 512 | 36 | 74132 | 9266 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | h100_80gb | 40.46 | 53.94 | 32 | 2 | 512 | 36 | 74180 | 9272 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81676 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81679 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 7b | 512 | 8 | h100_80gb | 41.88 | 55.84 | 128 | 2 | 2048 | 159 | 81417 | 10177 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 32768 | 8 | h100_80gb | 28.03 | 37.37 | 3 | 6 | 144 | 1 | 45654 | 5706 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 32768 | 8 | h100_80gb | 28.0 | 37.33 | 3 | 6 | 144 | 1 | 45607 | 5700 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 32768 | 8 | h100_80gb | 27.91 | 37.21 | 3 | 6 | 144 | 1 | 45465 | 5683 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 8192 | 8 | h100_80gb | 40.35 | 40.35 | 3 | 6 | 144 | 16 | 132753 | 16594 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 8192 | 8 | h100_80gb | 40.1 | 40.1 | 3 | 6 | 144 | 16 | 131934 | 16491 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 8192 | 8 | h100_80gb | 40.33 | 40.33 | 3 | 6 | 144 | 16 | 132697 | 16587 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 2048 | 8 | h100_80gb | 44.43 | 44.43 | 10 | 6 | 480 | 95 | 196229 | 24528 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | h100_80gb | 44.42 | 44.42 | 10 | 6 | 480 | 95 | 196171 | 24521 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | h100_80gb | 44.2 | 44.2 | 10 | 6 | 480 | 95 | 195192 | 24399 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 512 | 8 | h100_80gb | 46.05 | 46.05 | 40 | 6 | 1920 | 434 | 222413 | 27801 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 3b | 512 | 8 | h100_80gb | 46.38 | 46.38 | 40 | 6 | 1920 | 437 | 223994 | 27999 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 3b | 512 | 8 | h100_80gb | 46.14 | 46.14 | 40 | 6 | 1920 | 435 | 222834 | 27854 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | h100_80gb | 33.6 | 33.6 | 1 | 4 | 32 | 2 | 96354 | 12044 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 1 | 4 | 32 | 2 | 96182 | 12022 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 32768 | 8 | h100_80gb | 33.51 | 33.51 | 1 | 4 | 32 | 2 | 96105 | 12013 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 8192 | 8 | h100_80gb | 36.66 | 36.66 | 2 | 4 | 64 | 27 | 226682 | 28335 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 8192 | 8 | h100_80gb | 36.74 | 36.74 | 2 | 4 | 64 | 27 | 227183 | 28397 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 8192 | 8 | h100_80gb | 36.39 | 36.39 | 2 | 4 | 64 | 27 | 225010 | 28126 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 350m | 32768 | 8 | h100_80gb | 28.95 | 28.95 | 1 | 4 | 32 | 5 | 191165 | 23895 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 32768 | 8 | h100_80gb | 28.88 | 28.88 | 1 | 4 | 32 | 5 | 190718 | 23839 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 32768 | 8 | h100_80gb | 28.98 | 28.98 | 1 | 4 | 32 | 5 | 191350 | 23918 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | h100_80gb | 29.9 | 29.9 | 2 | 4 | 64 | 20 | 335478 | 41934 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 16384 | 8 | h100_80gb | 29.76 | 29.76 | 2 | 4 | 64 | 20 | 333921 | 41740 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 16384 | 8 | h100_80gb | 29.95 | 29.95 | 2 | 4 | 64 | 20 | 336016 | 42002 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 2048 | 8 | h100_80gb | 6.05 | 8.06 | 3 | 21 | 504 | 170 | 349409 | 43676 | 1032192 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 355985408 | -| 350m | 512 | 8 | h100_80gb | 32.32 | 32.32 | 56 | 4 | 1792 | 2194 | 1123449 | 140431 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 350m | 512 | 8 | h100_80gb | 32.79 | 32.79 | 56 | 4 | 1792 | 2226 | 1139870 | 142483 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 350m | 512 | 8 | h100_80gb | 32.77 | 32.77 | 56 | 4 | 1792 | 2224 | 1138963 | 142370 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | diff --git a/scripts/train/benchmarking/compile() debug.numbers b/scripts/train/benchmarking/compile() debug.numbers deleted file mode 100755 index 19f1a0597062a31219df39ec8c8786cd6c8adb2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139975 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 Date: Tue, 3 Oct 2023 11:05:16 -0700 Subject: [PATCH 27/41] remove h100 shell script --- scripts/train/benchmarking/h100_benchmarks.sh | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100755 scripts/train/benchmarking/h100_benchmarks.sh diff --git a/scripts/train/benchmarking/h100_benchmarks.sh b/scripts/train/benchmarking/h100_benchmarks.sh deleted file mode 100755 index 2709370ba0..0000000000 --- a/scripts/train/benchmarking/h100_benchmarks.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -PROJECT="h100tnight" -TORCH_2_IMAGE="mosaicml/ci-staging:7d6665ea-658b-4686-b7e2-edc51e2fa866" -CLUSTER_80GB=r9z1 -GIT_COMMIT=v0.2.0 -GIT_BRANCH=main -# 30b test Torch Runs -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 12 13 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $TORCH_2_IMAGE --git_branch $GIT_BRANCH --gpu_type h100_80gb -t fp8 bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true --activation_checkpointing_reentrant true -# # python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 10 10 --RUN --fsdp_config_activation_checkpointing true -# # python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true - -# # #13b test Torch runs -- seperate Torch1.13 and torch2 -# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true -# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# # python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 80 --accum 3 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true - -# # #7b test torch runs -# # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -# # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing true -# # python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 32 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing true -# python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 128 --accum 2 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing true --activation_checkpointing_reentrant true - -# #3b test torch runs -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing true -python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t bf16 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 11 11 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false - -# #1b test torch runs -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 13 13 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false - -# #abbreviate it, 350m -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 bf16 --cluster $CLUSTER_80GB -s 15 15 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 14 14 --RUN --fsdp_config_activation_checkpointing false -# python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 56 --accum 4 --image $TORCH_2_IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb -t fp8 --cluster $CLUSTER_80GB -s 9 9 --RUN --fsdp_config_activation_checkpointing false From 36fc5d2551fec58731c4522febd63f441bec2a24 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 11:42:49 -0700 Subject: [PATCH 28/41] remove random things --- scripts/train/benchmarking/submit_benchmarks.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 6c26724387..7a2df6361d 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -35,9 +35,6 @@ def str_to_bool(value: Union[bool, str]): return True raise ValueError(f'{value} is not a valid boolean value') -def str_to_list_int(value: Union[List[int], str]): - print(value) - def parse_args(): parser = argparse.ArgumentParser( description= @@ -248,7 +245,6 @@ def get_gpu_nums(clusters: List[str], gpu_types: List[str]): max_gpus_per_run = 1 for c in clusters: for gpu_info in CLUSTER_INFO[c]: - print(gpu_info) #TODO: remove if gpu_info[0] in gpu_types: max_gpus_per_run = max(max_gpus_per_run, gpu_info[1]) @@ -355,12 +351,6 @@ def mod_parameters(parameters: Dict[str, Any], parameters['fsdp_config']['activation_cpu_offload'] = activation_cpu_offload # parameters['fsdp_config']['verbose'] = True parameters['compile_config'] = {} if torch_compile else None - # if torch_compile_fullgraph is not None: - # parameters['compile_config']['fullgraph'] = torch_compile_fullgraph - # if torch_compile_dynamic is not None: - # parameters['compile_config']['dynamic'] = torch_compile_dynamic - # if torch_compile_mode is not None: - # parameters['compile_config']['mode'] = torch_compile_mode if wandb: # add wandb From 2542a2e26dd7a958d0a1d4deb3712e956503ecdd Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 13:14:39 -0700 Subject: [PATCH 29/41] use dict --- scripts/train/benchmarking/README.md | 280 ++++++++++++++++++ scripts/train/benchmarking/collect_results.py | 14 +- scripts/train/benchmarking/sweep.sh | 108 ++++++- 3 files changed, 399 insertions(+), 3 deletions(-) create mode 100644 scripts/train/benchmarking/README.md diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md new file mode 100644 index 0000000000..e1fe4b2d36 --- /dev/null +++ b/scripts/train/benchmarking/README.md @@ -0,0 +1,280 @@ +# MPT Training Benchmarks + +Benchmark measurements for MPT models trained on [MosaicML platform](https://www.mosaicml.com/platform), including throughput, MFU, and HFU. Each model is based on optimized configurations of various sizes in the [yamls](../yamls) folder, ranging from a 125m to 70B parameter models. + +To reproduce table results, first run: +``` +./sweep.sh +``` + +Then, after the runs are completed: +``` +python collect_results.py --save-path results +``` +will use our Python API to collect and calculate the benchmark results, and then save as both a CSV file `results.csv`, and a markdown table `results.md`. + + +``` +python submit_benchmarks.py --cluster [your_mosaicml_cluster] ARGS --RUN +``` +can be used to sweep a larger set of configurations. For example usage of `submit_benchmarks.py` see `sweep.sh` which lists all benchmarks in the tables. + +> **Note** +> The `collect_results.py` will by default find all runs with `tput` in the run name. To customize this project tag, use `--project` in both the submissing and collection scripts. + + +## MFU and HFU + +Model FLOPs Utilization (MFU) and Hardware FLOPS Utilization (HFU) are estimates, based on the measured throughput and the known FLOPs of the computation, of what percentage of the hardware's FLOPs are being used during training. + +MFU calculates the utilization from the floating point operations required for a single forward/backwards pass of the model, and does not account for the additional compute required for other implementation details such as activation checkpointing. Thus, MFU is independent of implementation and hardware. + +HFU attempts to capture the actual floating point operations incurred during the forward/backwards pass on the hardware. While it is a more accurate measurement of hardware utilization, it is less general and is difficult to compare across various hardware and implementation details. + +For more information, see [Korthikanti et al, 2022](https://arxiv.org/abs/2205.05198). All FLOP calculations exclude the operations required for normalization, activation, and residuals. + +### MFU + +Per token, each parameter is used for a MAC (2 FLOPS) per network operation. Neural Network training has 3 network operations: forward pass, backward pass, and computation of parameter gradient. + +The attention mechanism forward pass FLOPS are: `attn_flops_per_seq = n_layers * 2 * 2 * (d_model * (seq_len**2))` +``` +flops_per_token = 2 * n_params +flops_per_seq = flops_per_token * seq_len +mfu* = 3 * flops_per_seq * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) + +attn_flops_per_seq = n_layers * 2 * 2 * (d_model * (seq_len**2)) +mfu = (3 * flops_per_seq + 3 * attn_flops_per_seq) * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) +``` + +### HFU + +The HFU numbers shown below account for the fact that the networks use checkpointing and recomputes activations. This effectively requires an extra forward pass through the network. +``` +hfu* = 4 * flops_per_seq * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) +hfu = (4 * flops_per_seq + 4 * attn_flops_per_seq) * seq_per_sec / (gpu_num * GPU_AVAILABLE_FLOPS) +``` + +Note that these are approximations. Actual HFU would be higher since it includes the floating point operations for normalization, activation, and residual lyaers, as well as **all** recomputation. For example, our models use Flash Attention, which requires including an extra recompute factor for its recomputation in the forward pass. Therefore, the attention multipler would be 5 instead of 4. + +## Results + +Below we include several configurations across different hardware platforms, sequence lengths and batch sizes. It is easy to benchmark configurations for your own use case. For example, using the Mosaic platform, to test MPT {13B, 30B} using fp16 with a batch size of 2M tokens and seq len {2k, 4k, 8k, 16k} run: +``` +python submit_benchmarks.py -m 13b.yaml 30b.yaml -t fp16 -b 21 21 -s 11 14 --RUN +``` +This will run 8 configs for 12 steps to get throughput numbers. `python collect_results.py` can then be used to parse all output training logs and create the tables below. + +Our microbatching engine enables microbatch sizes that do not divde Global Batchsize while being mathematically faithful to the global batch size. For example, a total batch size of 48, and a micro batch of 11, means we will accumulate gradients across microbatches of 11, 11, 11, 11, 4. + +[comment]: # (TODO: Update tables with torch 2.0 after next Composer release) + +## H100 80GB +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 30b | 8192 | 8 | h100_80gb | 27.87 | 37.16 | 1 | 21 | 168 | 1 | 10311 | 1288 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | h100_80gb | 34.61 | 46.15 | 1 | 21 | 168 | 3 | 13917 | 1739 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 8 | h100_80gb | 37.54 | 50.05 | 3 | 21 | 504 | 7 | 15781 | 1972 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | h100_80gb | 38.21 | 50.94 | 6 | 21 | 1008 | 16 | 16433 | 2054 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | h100_80gb | 38.64 | 51.52 | 12 | 21 | 2016 | 32 | 16816 | 2102 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | h100_80gb | 30.73 | 40.97 | 1 | 3 | 24 | 0 | 15338 | 1917 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 8192 | 8 | h100_80gb | 37.15 | 49.53 | 5 | 3 | 120 | 3 | 30179 | 3772 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 2048 | 8 | h100_80gb | 41.29 | 55.05 | 20 | 3 | 480 | 19 | 39779 | 4972 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 512 | 8 | h100_80gb | 42.63 | 56.83 | 80 | 3 | 1920 | 84 | 43074 | 5384 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 32768 | 8 | h100_80gb | 30.45 | 40.6 | 2 | 2 | 32 | 0 | 26127 | 3265 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 8192 | 8 | h100_80gb | 36.43 | 48.57 | 8 | 2 | 128 | 6 | 54419 | 6802 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 2048 | 8 | h100_80gb | 40.48 | 53.97 | 32 | 2 | 512 | 36 | 74217 | 9277 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81676 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 32768 | 8 | h100_80gb | 28.0 | 37.33 | 3 | 6 | 144 | 1 | 45607 | 5700 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 8192 | 8 | h100_80gb | 40.35 | 40.35 | 3 | 6 | 144 | 16 | 132753 | 16594 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 2048 | 8 | h100_80gb | 44.43 | 44.43 | 10 | 6 | 480 | 95 | 196229 | 24528 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 512 | 8 | h100_80gb | 46.38 | 46.38 | 40 | 6 | 1920 | 437 | 223994 | 27999 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | h100_80gb | 33.6 | 33.6 | 1 | 4 | 32 | 2 | 96354 | 12044 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 8192 | 8 | h100_80gb | 36.74 | 36.74 | 2 | 4 | 64 | 27 | 227183 | 28397 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 350m | 32768 | 8 | h100_80gb | 28.98 | 28.98 | 1 | 4 | 32 | 5 | 191350 | 23918 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | h100_80gb | 29.95 | 29.95 | 2 | 4 | 64 | 20 | 336016 | 42002 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 512 | 8 | h100_80gb | 32.79 | 32.79 | 56 | 4 | 1792 | 2226 | 1139870 | 142483 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | + +## A100 80GB with 1600 Gbps node-node interconnect (RoCE) + +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | a100_80gb | 42.66 | 56.89 | 1 | 21 | 168 | 0 | 4977 | 622 | 1376256 | bf16 | PURE | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | a100_80gb | 49.12 | 65.49 | 1 | 21 | 168 | 1 | 6227 | 778 | 688128 | bf16 | PURE | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 64 | a100_80gb | 52.93 | 70.57 | 16 | 3 | 3072 | 27 | 56126 | 876 | 6291456 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 32 | a100_80gb | 53.48 | 71.3 | 14 | 3 | 1344 | 13 | 28353 | 886 | 2752512 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 16 | a100_80gb | 53.4 | 71.2 | 10 | 3 | 480 | 6 | 14157 | 884 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | a100_80gb | 47.57 | 63.43 | 3 | 21 | 504 | 3 | 6305 | 788 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | a100_80gb | 51.69 | 68.92 | 6 | 21 | 1008 | 6 | 7010 | 876 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | a100_80gb | 49.23 | 65.63 | 12 | 21 | 2016 | 13 | 6754 | 844 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | a100_80gb | 49.53 | 66.04 | 1 | 3 | 24 | 0 | 7795 | 974 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | a100_80gb | 51.71 | 68.94 | 3 | 3 | 72 | 0 | 10953 | 1369 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 12927354880 | +| 13b | 8192 | 8 | a100_80gb | 52.83 | 70.44 | 5 | 3 | 120 | 1 | 13531 | 1691 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_80gb | 53.62 | 71.5 | 10 | 3 | 240 | 3 | 15339 | 1917 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 64 | a100_80gb | 52.51 | 70.01 | 32 | 1 | 2048 | 62 | 127624 | 1994 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 32 | a100_80gb | 52.86 | 70.48 | 32 | 1 | 1024 | 31 | 64241 | 2007 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 16 | a100_80gb | 53.14 | 70.86 | 24 | 1 | 384 | 15 | 32291 | 2018 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | a100_80gb | 54.38 | 72.51 | 20 | 3 | 480 | 8 | 16522 | 2065 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 1024 | 8 | a100_80gb | 55.23 | 73.63 | 40 | 3 | 960 | 16 | 17315 | 2164 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | +| 13b | 512 | 8 | a100_80gb | 54.99 | 73.32 | 80 | 3 | 1920 | 34 | 17521 | 2190 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 65536 | 8 | a100_80gb | 42.61 | 56.82 | 1 | 2 | 16 | 0 | 7355 | 919 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | a100_80gb | 48.18 | 64.24 | 2 | 2 | 32 | 0 | 13035 | 1629 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6784688128 | +| 7b | 16384 | 8 | a100_80gb | 49.5 | 66.0 | 4 | 2 | 64 | 1 | 18698 | 2337 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_80gb | 50.71 | 67.62 | 8 | 2 | 128 | 2 | 23887 | 2985 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_80gb | 52.05 | 69.4 | 16 | 2 | 256 | 6 | 27973 | 3496 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 64 | a100_80gb | 50.8 | 67.73 | 32 | 1 | 2048 | 114 | 234932 | 3670 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 32 | a100_80gb | 51.16 | 68.22 | 32 | 1 | 1024 | 57 | 118310 | 3697 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 16 | a100_80gb | 51.59 | 68.79 | 32 | 1 | 512 | 29 | 59653 | 3728 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_80gb | 52.92 | 70.56 | 32 | 2 | 512 | 14 | 30596 | 3824 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 1024 | 8 | a100_80gb | 53.66 | 71.55 | 64 | 2 | 1024 | 31 | 32243 | 4030 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | +| 7b | 512 | 8 | a100_80gb | 53.5 | 71.34 | 128 | 2 | 2048 | 64 | 32794 | 4099 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 65536 | 8 | a100_80gb | 46.17 | 61.57 | 1 | 2 | 16 | 0 | 14174 | 1771 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | a100_80gb | 46.73 | 62.31 | 3 | 6 | 144 | 0 | 24003 | 3000 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_80gb | 57.29 | 57.29 | 1 | 6 | 48 | 2 | 44356 | 5544 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | a100_80gb | 58.68 | 58.68 | 3 | 6 | 144 | 7 | 60883 | 7610 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_80gb | 59.51 | 59.51 | 5 | 6 | 240 | 18 | 74388 | 9298 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 64 | a100_80gb | 58.36 | 58.36 | 12 | 3 | 2304 | 317 | 650175 | 10158 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | a100_80gb | 59.22 | 59.22 | 12 | 3 | 1152 | 161 | 329856 | 10308 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | a100_80gb | 59.08 | 59.08 | 10 | 3 | 480 | 80 | 164543 | 10283 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_80gb | 59.77 | 59.77 | 10 | 6 | 480 | 40 | 83230 | 10403 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_80gb | 61.56 | 61.56 | 20 | 6 | 960 | 88 | 90906 | 11363 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_80gb | 62.09 | 62.09 | 40 | 6 | 1920 | 184 | 94553 | 11819 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | a100_80gb | 45.29 | 60.39 | 1 | 2 | 16 | 0 | 23885 | 2985 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | a100_80gb | 56.02 | 56.02 | 1 | 4 | 32 | 1 | 50657 | 6332 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | a100_80gb | 55.84 | 55.84 | 2 | 4 | 64 | 4 | 78591 | 9823 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_80gb | 56.38 | 56.38 | 3 | 4 | 96 | 13 | 109915 | 13739 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_80gb | 58.3 | 58.3 | 7 | 4 | 224 | 34 | 140767 | 17595 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 64 | a100_80gb | 56.67 | 56.67 | 20 | 1 | 1280 | 606 | 1243103 | 19423 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | a100_80gb | 56.74 | 56.74 | 20 | 1 | 640 | 303 | 622285 | 19446 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | a100_80gb | 57.47 | 57.47 | 20 | 1 | 320 | 153 | 315117 | 19694 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_80gb | 59.16 | 59.16 | 14 | 4 | 448 | 79 | 162214 | 20276 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_80gb | 58.98 | 58.98 | 18 | 4 | 576 | 169 | 173458 | 21682 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_80gb | 60.38 | 60.38 | 56 | 4 | 1792 | 359 | 184268 | 23033 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | +| 760m | 65536 | 8 | a100_80gb | 45.48 | 60.64 | 1 | 2 | 16 | 0 | 33252 | 4156 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 857988096 | +| 760m | 32768 | 8 | a100_80gb | 54.48 | 54.48 | 1 | 2 | 16 | 2 | 70305 | 8788 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | a100_80gb | 55.21 | 55.21 | 3 | 2 | 48 | 7 | 115383 | 14422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_80gb | 55.13 | 55.13 | 6 | 2 | 96 | 20 | 166928 | 20866 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_80gb | 55.2 | 55.2 | 12 | 2 | 192 | 52 | 215501 | 26937 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 64 | a100_80gb | 51.82 | 51.82 | 24 | 1 | 1536 | 923 | 1892166 | 29565 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 32 | a100_80gb | 53.27 | 53.27 | 24 | 1 | 768 | 474 | 972497 | 30390 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | a100_80gb | 53.56 | 53.56 | 24 | 1 | 384 | 238 | 488871 | 30554 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_80gb | 55.67 | 55.67 | 24 | 2 | 384 | 124 | 254104 | 31763 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_80gb | 55.98 | 55.98 | 48 | 2 | 768 | 272 | 279108 | 34888 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_80gb | 56.2 | 56.2 | 96 | 2 | 1536 | 573 | 293755 | 36719 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | +| 350m | 65536 | 8 | a100_80gb | 52.39 | 52.39 | 1 | 2 | 16 | 0 | 59835 | 7479 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 420997120 | +| 350m | 32768 | 8 | a100_80gb | 47.45 | 47.45 | 2 | 2 | 32 | 3 | 98793 | 12349 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_80gb | 53.01 | 53.01 | 4 | 2 | 64 | 11 | 187535 | 23441 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_80gb | 53.21 | 53.21 | 8 | 2 | 128 | 35 | 289398 | 36174 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_80gb | 52.46 | 52.46 | 16 | 2 | 256 | 95 | 390131 | 48766 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 64 | a100_80gb | 47.76 | 47.76 | 32 | 1 | 2048 | 1699 | 3480601 | 54384 | 4194304 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 32 | a100_80gb | 48.58 | 48.58 | 32 | 1 | 1024 | 864 | 1770287 | 55321 | 2097152 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 16 | a100_80gb | 50.53 | 50.53 | 32 | 1 | 512 | 449 | 920605 | 57537 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_80gb | 51.73 | 51.73 | 32 | 2 | 512 | 230 | 471290 | 58911 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_80gb | 51.28 | 51.28 | 64 | 2 | 1024 | 514 | 526393 | 65799 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_80gb | 51.18 | 51.18 | 128 | 2 | 2048 | 1095 | 560858 | 70107 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 125m | 65536 | 8 | a100_80gb | 54.31 | 54.31 | 1 | 2 | 16 | 2 | 163472 | 20434 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 174070272 | +| 125m | 32768 | 8 | a100_80gb | 53.15 | 53.15 | 2 | 2 | 32 | 8 | 293685 | 36710 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_80gb | 51.58 | 51.58 | 4 | 2 | 64 | 29 | 489578 | 61197 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_80gb | 49.18 | 49.18 | 8 | 2 | 128 | 88 | 727986 | 90998 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_80gb | 46.62 | 46.62 | 16 | 2 | 256 | 233 | 958343 | 119792 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 64 | a100_80gb | 40.77 | 40.77 | 32 | 1 | 2048 | 4063 | 8321727 | 130026 | 4194304 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 32 | a100_80gb | 41.22 | 41.22 | 32 | 1 | 1024 | 2053 | 4206041 | 131438 | 2097152 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 16 | a100_80gb | 41.92 | 41.92 | 32 | 1 | 512 | 1044 | 2139036 | 133689 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_80gb | 44.04 | 44.04 | 32 | 2 | 512 | 548 | 1123506 | 140438 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_80gb | 43.25 | 43.25 | 64 | 2 | 1024 | 1225 | 1254561 | 156820 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_80gb | 42.54 | 42.54 | 128 | 2 | 2048 | 2587 | 1325030 | 165628 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | + +## A100 40GB with 1600 Gbps node-node interconnect (RoCE) + +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | +| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | +| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | +| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | +| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | +| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | +| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | +| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | \ No newline at end of file diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index 64ca38b920..48dcb4ff20 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -5,6 +5,7 @@ import csv import math from typing import Any, Dict, List, Union +from composer.callbacks.speed_monitor import GPU_AVAILABLE_FLOPS as GPU_FLOP_DICT from mcli import sdk as msdk @@ -57,7 +58,7 @@ def sort_key(r: msdk.Run): print(model_name) raise ValueError model_size = int(model_name[:-1]) - return (r.gpu_type, r.image, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], + return (r.image, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], num_gpu, r.submitted_config.parameters['global_train_batch_size']) runs.sort(reverse=True, key=sort_key) @@ -93,7 +94,14 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: model_name = run.name.split('-')[2] gpus = run.gpus gpu_type = run.gpu_type - GPU_AVAILABLE_FLOPS = 312_000_000_000_000 if (gpu_type != "h100_80gb") else (1_979_000_000_000_000/2 if run.submitted_config.parameters['precision'] == 'amp_bf16' else 1_979_000_000_000_000)# NOTE: This is accurate for BF16 or FP8 only + + if 'h100'in gpu_type: + gpu_type = 'h100-sxm' + if 'a100' in gpu_type: + gpu_type = 'a100' + GPU_AVAILABLE_FLOPS = GPU_FLOP_DICT[gpu_type][run.submitted_config.parameters['precision']] + + gpu_type = run.gpu_type fsdp_config = run.submitted_config.parameters['fsdp_config'] seq_len = run.submitted_config.parameters['max_seq_len'] @@ -190,6 +198,8 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: str(fsdp_config['activation_cpu_offload']), 'NumParams': n_params, + 'Image': + image, # 'Compile Mode': # compile_mode, # 'Compile Fullgraph': diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index 1949bff4eb..a1036869b8 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -1,10 +1,115 @@ #!/bin/bash -PROJECT="opt30" +PROJECT="tput" GIT_COMMIT="v0.0.4" IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" # IMAGE="mosaicml/pytorch:2.1.0_cu121-nightly20230827-python3.10-ubuntu20.04" +CLUSTER_40GB=r1z1 CLUSTER_80GB=r1z1 +CLUSTER_H100=r9z1 + +for PRECISION in fp8 bf16 +do + + # H100 80GB + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 40 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 32 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 24 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 14 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 10 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 3 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 7 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE1 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 6 --accum 1 --image $IMAGE0 --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + + # INCREASE GPU COUNT + for GPU_NUM in 16 32 64 + do + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g $GPU_NUM --microbatch_size 24 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g $GPU_NUM --microbatch_size 20 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g $GPU_NUM --microbatch_size 32 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + done + + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 16 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 16 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 32 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 32 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 64 --microbatch_size 6 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 64 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 32 --microbatch_size 14 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 32 --microbatch_size 2 --accum 16 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 64 --microbatch_size 16 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 70b.yaml -g 64 --microbatch_size 8 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 11 11 --RUN -t ${PRECISION} + + # SCALE SEQUENCE LENGTH + # seqlen 512 + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --precision fp8 --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 128 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 96 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 56 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 40 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 20 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 12 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 9 9 --RUN -t ${PRECISION} + # seqlen 1024 + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 48 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 18 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 20 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 64 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 40 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 6 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 10 10 --RUN -t ${PRECISION} + # seqlen 4096 + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 12 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 7 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 5 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 16 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 10 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 1 --accum 21 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 12 12 --RUN -t ${PRECISION} + # seqlen 8192 + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 6 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 3 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 8 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 5 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 30b.yaml -g 8 --microbatch_size 2 --accum 1 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 13 13 --RUN -t ${PRECISION} + # seqlen 16384 + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 14 14 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 14 14 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 3 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 14 14 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 2 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 14 14 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 14 14 --RUN --fsdp_config_activation_checkpointing false -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 4 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 14 14 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 3 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 14 14 --RUN -t ${PRECISION} + # seqlen 32768 + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 15 15 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 15 15 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 15 15 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 4 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 15 15 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 3 --accum 6 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 15 15 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 2 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 15 15 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 13b.yaml -g 8 --microbatch_size 1 --accum 3 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 15 15 --RUN -t ${PRECISION} + # seqlen 65536 + python submit_benchmarks.py --project $PROJECT -m 125m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 16 16 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 350m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 16 16 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 16 16 --RUN --fsdp_config_activation_checkpointing true -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 16 16 --RUN --fsdp_config_activation_checkpointing true -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 16 16 --RUN -t ${PRECISION} + python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type h100_80gb --cluster $CLUSTER_H100 -s 16 16 --RUN -t ${PRECISION} +done # A100 80GB @@ -107,3 +212,4 @@ python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_si python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN + From 8306238a9266e060cd874dcc1a7975ccf0e54b16 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 13:17:01 -0700 Subject: [PATCH 30/41] use mosaicml llmf --- scripts/train/benchmarking/submit_benchmarks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 7a2df6361d..2c02223409 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -375,7 +375,7 @@ def get_integrations(project: str, } git_integration.update({ 'integration_type': 'git_repo', - 'git_repo': 'crinard/llm-foundry', + 'git_repo': 'mosaicml/llm-foundry', 'pip_install': '-e .[gpu]' }) From 4b482bd6f8865a1ddb4fb153a7671ea49590197d Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 13:32:22 -0700 Subject: [PATCH 31/41] updated a100 numbers --- scripts/train/benchmarking/README.md | 145 +++++++++++---------------- 1 file changed, 59 insertions(+), 86 deletions(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index e1fe4b2d36..a05266dbe2 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -109,92 +109,65 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 8192 | 8 | a100_80gb | 42.66 | 56.89 | 1 | 21 | 168 | 0 | 4977 | 622 | 1376256 | bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | a100_80gb | 49.12 | 65.49 | 1 | 21 | 168 | 1 | 6227 | 778 | 688128 | bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 64 | a100_80gb | 52.93 | 70.57 | 16 | 3 | 3072 | 27 | 56126 | 876 | 6291456 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 32 | a100_80gb | 53.48 | 71.3 | 14 | 3 | 1344 | 13 | 28353 | 886 | 2752512 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 16 | a100_80gb | 53.4 | 71.2 | 10 | 3 | 480 | 6 | 14157 | 884 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | a100_80gb | 47.57 | 63.43 | 3 | 21 | 504 | 3 | 6305 | 788 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | a100_80gb | 51.69 | 68.92 | 6 | 21 | 1008 | 6 | 7010 | 876 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | a100_80gb | 49.23 | 65.63 | 12 | 21 | 2016 | 13 | 6754 | 844 | 1032192 | bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | a100_80gb | 49.53 | 66.04 | 1 | 3 | 24 | 0 | 7795 | 974 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 16384 | 8 | a100_80gb | 51.71 | 68.94 | 3 | 3 | 72 | 0 | 10953 | 1369 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 12927354880 | -| 13b | 8192 | 8 | a100_80gb | 52.83 | 70.44 | 5 | 3 | 120 | 1 | 13531 | 1691 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_80gb | 53.62 | 71.5 | 10 | 3 | 240 | 3 | 15339 | 1917 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 64 | a100_80gb | 52.51 | 70.01 | 32 | 1 | 2048 | 62 | 127624 | 1994 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 32 | a100_80gb | 52.86 | 70.48 | 32 | 1 | 1024 | 31 | 64241 | 2007 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 16 | a100_80gb | 53.14 | 70.86 | 24 | 1 | 384 | 15 | 32291 | 2018 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | a100_80gb | 54.38 | 72.51 | 20 | 3 | 480 | 8 | 16522 | 2065 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 1024 | 8 | a100_80gb | 55.23 | 73.63 | 40 | 3 | 960 | 16 | 17315 | 2164 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | -| 13b | 512 | 8 | a100_80gb | 54.99 | 73.32 | 80 | 3 | 1920 | 34 | 17521 | 2190 | 983040 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 65536 | 8 | a100_80gb | 42.61 | 56.82 | 1 | 2 | 16 | 0 | 7355 | 919 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6918905856 | -| 7b | 32768 | 8 | a100_80gb | 48.18 | 64.24 | 2 | 2 | 32 | 0 | 13035 | 1629 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 16384 | 8 | a100_80gb | 49.5 | 66.0 | 4 | 2 | 64 | 1 | 18698 | 2337 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_80gb | 50.71 | 67.62 | 8 | 2 | 128 | 2 | 23887 | 2985 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_80gb | 52.05 | 69.4 | 16 | 2 | 256 | 6 | 27973 | 3496 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 64 | a100_80gb | 50.8 | 67.73 | 32 | 1 | 2048 | 114 | 234932 | 3670 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 32 | a100_80gb | 51.16 | 68.22 | 32 | 1 | 1024 | 57 | 118310 | 3697 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 16 | a100_80gb | 51.59 | 68.79 | 32 | 1 | 512 | 29 | 59653 | 3728 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | a100_80gb | 52.92 | 70.56 | 32 | 2 | 512 | 14 | 30596 | 3824 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 1024 | 8 | a100_80gb | 53.66 | 71.55 | 64 | 2 | 1024 | 31 | 32243 | 4030 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | -| 7b | 512 | 8 | a100_80gb | 53.5 | 71.34 | 128 | 2 | 2048 | 64 | 32794 | 4099 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 65536 | 8 | a100_80gb | 46.17 | 61.57 | 1 | 2 | 16 | 0 | 14174 | 1771 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2814366720 | -| 3b | 32768 | 8 | a100_80gb | 46.73 | 62.31 | 3 | 6 | 144 | 0 | 24003 | 3000 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_80gb | 57.29 | 57.29 | 1 | 6 | 48 | 2 | 44356 | 5544 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2688537600 | -| 3b | 8192 | 8 | a100_80gb | 58.68 | 58.68 | 3 | 6 | 144 | 7 | 60883 | 7610 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_80gb | 59.51 | 59.51 | 5 | 6 | 240 | 18 | 74388 | 9298 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 64 | a100_80gb | 58.36 | 58.36 | 12 | 3 | 2304 | 317 | 650175 | 10158 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | a100_80gb | 59.22 | 59.22 | 12 | 3 | 1152 | 161 | 329856 | 10308 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | a100_80gb | 59.08 | 59.08 | 10 | 3 | 480 | 80 | 164543 | 10283 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | a100_80gb | 59.77 | 59.77 | 10 | 6 | 480 | 40 | 83230 | 10403 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_80gb | 61.56 | 61.56 | 20 | 6 | 960 | 88 | 90906 | 11363 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_80gb | 62.09 | 62.09 | 40 | 6 | 1920 | 184 | 94553 | 11819 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 1b | 65536 | 8 | a100_80gb | 45.29 | 60.39 | 1 | 2 | 16 | 0 | 23885 | 2985 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1445974016 | -| 1b | 32768 | 8 | a100_80gb | 56.02 | 56.02 | 1 | 4 | 32 | 1 | 50657 | 6332 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 16384 | 8 | a100_80gb | 55.84 | 55.84 | 2 | 4 | 64 | 4 | 78591 | 9823 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_80gb | 56.38 | 56.38 | 3 | 4 | 96 | 13 | 109915 | 13739 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_80gb | 58.3 | 58.3 | 7 | 4 | 224 | 34 | 140767 | 17595 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 64 | a100_80gb | 56.67 | 56.67 | 20 | 1 | 1280 | 606 | 1243103 | 19423 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | a100_80gb | 56.74 | 56.74 | 20 | 1 | 640 | 303 | 622285 | 19446 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | a100_80gb | 57.47 | 57.47 | 20 | 1 | 320 | 153 | 315117 | 19694 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_80gb | 59.16 | 59.16 | 14 | 4 | 448 | 79 | 162214 | 20276 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_80gb | 58.98 | 58.98 | 18 | 4 | 576 | 169 | 173458 | 21682 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_80gb | 60.38 | 60.38 | 56 | 4 | 1792 | 359 | 184268 | 23033 | 917504 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | -| 760m | 65536 | 8 | a100_80gb | 45.48 | 60.64 | 1 | 2 | 16 | 0 | 33252 | 4156 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 857988096 | -| 760m | 32768 | 8 | a100_80gb | 54.48 | 54.48 | 1 | 2 | 16 | 2 | 70305 | 8788 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 807656448 | -| 760m | 16384 | 8 | a100_80gb | 55.21 | 55.21 | 3 | 2 | 48 | 7 | 115383 | 14422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_80gb | 55.13 | 55.13 | 6 | 2 | 96 | 20 | 166928 | 20866 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_80gb | 55.2 | 55.2 | 12 | 2 | 192 | 52 | 215501 | 26937 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 64 | a100_80gb | 51.82 | 51.82 | 24 | 1 | 1536 | 923 | 1892166 | 29565 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 32 | a100_80gb | 53.27 | 53.27 | 24 | 1 | 768 | 474 | 972497 | 30390 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | a100_80gb | 53.56 | 53.56 | 24 | 1 | 384 | 238 | 488871 | 30554 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_80gb | 55.67 | 55.67 | 24 | 2 | 384 | 124 | 254104 | 31763 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_80gb | 55.98 | 55.98 | 48 | 2 | 768 | 272 | 279108 | 34888 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_80gb | 56.2 | 56.2 | 96 | 2 | 1536 | 573 | 293755 | 36719 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | -| 350m | 65536 | 8 | a100_80gb | 52.39 | 52.39 | 1 | 2 | 16 | 0 | 59835 | 7479 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 420997120 | -| 350m | 32768 | 8 | a100_80gb | 47.45 | 47.45 | 2 | 2 | 32 | 3 | 98793 | 12349 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_80gb | 53.01 | 53.01 | 4 | 2 | 64 | 11 | 187535 | 23441 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_80gb | 53.21 | 53.21 | 8 | 2 | 128 | 35 | 289398 | 36174 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_80gb | 52.46 | 52.46 | 16 | 2 | 256 | 95 | 390131 | 48766 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 64 | a100_80gb | 47.76 | 47.76 | 32 | 1 | 2048 | 1699 | 3480601 | 54384 | 4194304 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 32 | a100_80gb | 48.58 | 48.58 | 32 | 1 | 1024 | 864 | 1770287 | 55321 | 2097152 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 16 | a100_80gb | 50.53 | 50.53 | 32 | 1 | 512 | 449 | 920605 | 57537 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_80gb | 51.73 | 51.73 | 32 | 2 | 512 | 230 | 471290 | 58911 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_80gb | 51.28 | 51.28 | 64 | 2 | 1024 | 514 | 526393 | 65799 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_80gb | 51.18 | 51.18 | 128 | 2 | 2048 | 1095 | 560858 | 70107 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 125m | 65536 | 8 | a100_80gb | 54.31 | 54.31 | 1 | 2 | 16 | 2 | 163472 | 20434 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 174070272 | -| 125m | 32768 | 8 | a100_80gb | 53.15 | 53.15 | 2 | 2 | 32 | 8 | 293685 | 36710 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_80gb | 51.58 | 51.58 | 4 | 2 | 64 | 29 | 489578 | 61197 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_80gb | 49.18 | 49.18 | 8 | 2 | 128 | 88 | 727986 | 90998 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_80gb | 46.62 | 46.62 | 16 | 2 | 256 | 233 | 958343 | 119792 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 64 | a100_80gb | 40.77 | 40.77 | 32 | 1 | 2048 | 4063 | 8321727 | 130026 | 4194304 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 32 | a100_80gb | 41.22 | 41.22 | 32 | 1 | 1024 | 2053 | 4206041 | 131438 | 2097152 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 16 | a100_80gb | 41.92 | 41.92 | 32 | 1 | 512 | 1044 | 2139036 | 133689 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_80gb | 44.04 | 44.04 | 32 | 2 | 512 | 548 | 1123506 | 140438 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_80gb | 43.25 | 43.25 | 64 | 2 | 1024 | 1225 | 1254561 | 156820 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_80gb | 42.54 | 42.54 | 128 | 2 | 2048 | 2587 | 1325030 | 165628 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | +| 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | a100_80gb | 56.4 | 75.2 | 12 | 21 | 2016 | 15 | 7739 | 967 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | a100_80gb | 51.69 | 68.92 | 1 | 3 | 24 | 0 | 8134 | 1016 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | a100_80gb | 54.07 | 72.1 | 3 | 3 | 72 | 0 | 11454 | 1431 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | +| 13b | 8192 | 8 | a100_80gb | 56.07 | 74.76 | 5 | 3 | 120 | 1 | 14362 | 1795 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_80gb | 57.62 | 76.82 | 10 | 3 | 240 | 4 | 16482 | 2060 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 8 | a100_80gb | 59.57 | 59.57 | 2 | 3 | 48 | 8 | 18097 | 2262 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 1024 | 8 | a100_80gb | 59.48 | 79.3 | 40 | 3 | 960 | 18 | 18647 | 2330 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | +| 7b | 65536 | 8 | a100_80gb | 46.97 | 62.63 | 1 | 2 | 16 | 0 | 8108 | 1013 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | a100_80gb | 49.46 | 65.94 | 2 | 2 | 32 | 0 | 13382 | 1672 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | +| 7b | 16384 | 8 | a100_80gb | 51.96 | 69.28 | 4 | 2 | 64 | 1 | 19629 | 2453 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_80gb | 54.47 | 72.62 | 8 | 2 | 128 | 3 | 25655 | 3206 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_80gb | 54.84 | 73.12 | 16 | 2 | 256 | 7 | 29472 | 3684 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 8 | a100_80gb | 64.23 | 64.23 | 6 | 2 | 96 | 18 | 37130 | 4641 | 196608 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | a100_80gb | 58.01 | 77.35 | 64 | 2 | 1024 | 34 | 34857 | 4357 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | +| 3b | 65536 | 8 | a100_80gb | 46.05 | 61.41 | 1 | 2 | 16 | 0 | 14137 | 1767 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | a100_80gb | 47.18 | 62.91 | 3 | 6 | 144 | 0 | 24235 | 3029 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_80gb | 57.13 | 57.13 | 1 | 6 | 48 | 2 | 44233 | 5529 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | a100_80gb | 59.34 | 59.34 | 3 | 6 | 144 | 7 | 61567 | 7695 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_80gb | 60.53 | 60.53 | 5 | 6 | 240 | 18 | 75658 | 9457 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 8 | a100_80gb | 62.11 | 62.11 | 10 | 2 | 160 | 42 | 86491 | 10811 | 327680 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_80gb | 62.73 | 62.73 | 20 | 6 | 960 | 90 | 92643 | 11580 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_80gb | 63.71 | 63.71 | 40 | 6 | 1920 | 189 | 97019 | 12127 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | a100_80gb | 46.18 | 61.57 | 1 | 2 | 16 | 0 | 24353 | 3044 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | a100_80gb | 55.52 | 55.52 | 1 | 4 | 32 | 1 | 50207 | 6275 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | a100_80gb | 56.6 | 56.6 | 2 | 4 | 64 | 4 | 79650 | 9956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_80gb | 56.69 | 56.69 | 3 | 4 | 96 | 13 | 110516 | 13814 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_80gb | 59.0 | 59.0 | 7 | 4 | 224 | 34 | 142457 | 17807 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 8 | a100_80gb | 59.86 | 59.86 | 14 | 4 | 448 | 80 | 164109 | 20513 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_80gb | 60.15 | 60.15 | 18 | 4 | 576 | 172 | 176898 | 22112 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_80gb | 60.68 | 60.68 | 56 | 4 | 1792 | 361 | 185186 | 23148 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 760m | 65536 | 8 | a100_80gb | 45.34 | 60.45 | 1 | 2 | 16 | 0 | 33150 | 4143 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 857988096 | +| 760m | 32768 | 8 | a100_80gb | 54.57 | 54.57 | 1 | 2 | 16 | 2 | 70417 | 8802 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | a100_80gb | 54.64 | 54.64 | 3 | 2 | 48 | 6 | 114198 | 14274 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_80gb | 55.31 | 55.31 | 6 | 2 | 96 | 20 | 167471 | 20933 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_80gb | 56.05 | 56.05 | 12 | 2 | 192 | 53 | 218808 | 27351 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 8 | a100_80gb | 56.85 | 56.85 | 24 | 2 | 384 | 126 | 259472 | 32434 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_80gb | 47.76 | 47.76 | 48 | 2 | 768 | 232 | 238122 | 29765 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_80gb | 45.07 | 45.07 | 96 | 2 | 1536 | 460 | 235571 | 29446 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | +| 350m | 65536 | 8 | a100_80gb | 52.7 | 52.7 | 1 | 2 | 16 | 0 | 60195 | 7524 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 420997120 | +| 350m | 32768 | 8 | a100_80gb | 52.46 | 52.46 | 2 | 2 | 32 | 3 | 109222 | 13652 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_80gb | 53.28 | 53.28 | 4 | 2 | 64 | 11 | 188478 | 23559 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_80gb | 53.8 | 53.8 | 8 | 2 | 128 | 35 | 292559 | 36569 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_80gb | 53.31 | 53.31 | 16 | 2 | 256 | 96 | 396442 | 49555 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 8 | a100_80gb | 51.62 | 51.62 | 32 | 2 | 512 | 229 | 470263 | 58782 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_80gb | 50.51 | 50.51 | 64 | 2 | 1024 | 506 | 518504 | 64813 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_80gb | 50.61 | 50.61 | 128 | 2 | 2048 | 1083 | 554643 | 69330 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354412544 | +| 125m | 65536 | 8 | a100_80gb | 54.13 | 54.13 | 1 | 2 | 16 | 2 | 162946 | 20368 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 174070272 | +| 125m | 32768 | 8 | a100_80gb | 52.71 | 52.71 | 2 | 2 | 32 | 8 | 291256 | 36407 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_80gb | 50.61 | 50.61 | 4 | 2 | 64 | 29 | 480322 | 60040 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_80gb | 48.85 | 48.85 | 8 | 2 | 128 | 88 | 723142 | 90392 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_80gb | 46.08 | 46.08 | 16 | 2 | 256 | 231 | 947172 | 118396 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 8 | a100_80gb | 44.45 | 44.45 | 32 | 2 | 512 | 553 | 1133901 | 141737 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_80gb | 43.15 | 43.15 | 64 | 2 | 1024 | 1222 | 1251751 | 156468 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_80gb | 42.56 | 42.56 | 128 | 2 | 2048 | 2588 | 1325455 | 165681 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124131840 | +| 125m | 2048 | 8 | a100_80gb | 44.79 | 44.79 | 40 | 2 | 640 | 557 | 1142641 | 142830 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | ## A100 40GB with 1600 Gbps node-node interconnect (RoCE) From 722c6c43fc96b22d8d8424c6de9527e91c8869b9 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 3 Oct 2023 13:34:03 -0700 Subject: [PATCH 32/41] added back old numbers that I didn't reproduce --- scripts/train/benchmarking/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index a05266dbe2..b0cc929c72 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -109,7 +109,9 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | a100_80gb | 42.66 | 56.89 | 1 | 21 | 168 | 0 | 4977 | 622 | 1376256 | bf16 | PURE | FULL_SHARD | True | False | 30019254272 | | 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | | 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | | 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | From 75722422e2e89bd6562ae0e9812da92f978be4f9 Mon Sep 17 00:00:00 2001 From: Chris Rinard <41345459+crinard@users.noreply.github.com> Date: Tue, 10 Oct 2023 10:54:42 -0700 Subject: [PATCH 33/41] Update submit_benchmarks.py -- enable fp8 deps iff h100 and fp8 --- scripts/train/benchmarking/submit_benchmarks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 2c02223409..14b72f3d74 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -412,7 +412,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], command += """pip install -U git+https://github.com/mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 pip uninstall torch==2.0.1 --yes pip install --no-cache-dir --pre --index-url https://download.pytorch.org/whl/nightly/cu121 torch==2.1.0.dev20230821+cu121""" - if gpu_type == 'h100_80gb': # Required for flash-attn and FP8 training + if gpu_type == 'h100_80gb' and 'fp8' in precision: # Required for flash-attn and FP8 training command += f""" pip install flash-attn==1.0.7 --no-build-isolation pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10 From 061f2c7ce64e655100286584a7629e2a09f827ba Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 17 Oct 2023 17:00:05 -0700 Subject: [PATCH 34/41] Added TFLOP column --- scripts/train/benchmarking/README.md | 384 ++++++++++-------- scripts/train/benchmarking/collect_results.py | 19 +- 2 files changed, 218 insertions(+), 185 deletions(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index b0cc929c72..0a349de3cb 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -69,187 +69,221 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch [comment]: # (TODO: Update tables with torch 2.0 after next Composer release) -## H100 80GB -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 30b | 8192 | 8 | h100_80gb | 27.87 | 37.16 | 1 | 21 | 168 | 1 | 10311 | 1288 | 1376256 | amp_bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | h100_80gb | 34.61 | 46.15 | 1 | 21 | 168 | 3 | 13917 | 1739 | 688128 | amp_bf16 | PURE | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 8 | h100_80gb | 37.54 | 50.05 | 3 | 21 | 504 | 7 | 15781 | 1972 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | h100_80gb | 38.21 | 50.94 | 6 | 21 | 1008 | 16 | 16433 | 2054 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | h100_80gb | 38.64 | 51.52 | 12 | 21 | 2016 | 32 | 16816 | 2102 | 1032192 | amp_bf16 | PURE | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | h100_80gb | 30.73 | 40.97 | 1 | 3 | 24 | 0 | 15338 | 1917 | 786432 | amp_bf16 | PURE | FULL_SHARD | True | False | 13011240960 | -| 13b | 8192 | 8 | h100_80gb | 37.15 | 49.53 | 5 | 3 | 120 | 3 | 30179 | 3772 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 2048 | 8 | h100_80gb | 41.29 | 55.05 | 20 | 3 | 480 | 19 | 39779 | 4972 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 512 | 8 | h100_80gb | 42.63 | 56.83 | 80 | 3 | 1920 | 84 | 43074 | 5384 | 983040 | amp_bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 32768 | 8 | h100_80gb | 30.45 | 40.6 | 2 | 2 | 32 | 0 | 26127 | 3265 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6784688128 | -| 7b | 8192 | 8 | h100_80gb | 36.43 | 48.57 | 8 | 2 | 128 | 6 | 54419 | 6802 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 2048 | 8 | h100_80gb | 40.48 | 53.97 | 32 | 2 | 512 | 36 | 74217 | 9277 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 512 | 8 | h100_80gb | 42.02 | 56.02 | 128 | 2 | 2048 | 159 | 81676 | 10209 | 1048576 | amp_bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 32768 | 8 | h100_80gb | 28.0 | 37.33 | 3 | 6 | 144 | 1 | 45607 | 5700 | 4718592 | amp_bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 8192 | 8 | h100_80gb | 40.35 | 40.35 | 3 | 6 | 144 | 16 | 132753 | 16594 | 1179648 | amp_bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 2048 | 8 | h100_80gb | 44.43 | 44.43 | 10 | 6 | 480 | 95 | 196229 | 24528 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 512 | 8 | h100_80gb | 46.38 | 46.38 | 40 | 6 | 1920 | 437 | 223994 | 27999 | 983040 | amp_bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | h100_80gb | 33.6 | 33.6 | 1 | 4 | 32 | 2 | 96354 | 12044 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 1378865152 | -| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 8192 | 8 | h100_80gb | 36.74 | 36.74 | 2 | 4 | 64 | 27 | 227183 | 28397 | 524288 | amp_bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 350m | 32768 | 8 | h100_80gb | 28.98 | 28.98 | 1 | 4 | 32 | 5 | 191350 | 23918 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | h100_80gb | 29.95 | 29.95 | 2 | 4 | 64 | 20 | 336016 | 42002 | 1048576 | amp_bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 512 | 8 | h100_80gb | 32.79 | 32.79 | 56 | 4 | 1792 | 2226 | 1139870 | 142483 | 917504 | amp_bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | +## H100 80GB BF16 +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 70b | 2048 | 64 | h100_80gb | 42.57 | 56.76 | 4.212583E+14 | 8 | 4 | 2048 | 32 | 66523 | 1039 | 4194304 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | h100_80gb | 36.15 | 48.2 | 3.576911E+14 | 2 | 16 | 1024 | 13 | 28242 | 882 | 2097152 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | h100_80gb | 29.92 | 39.9 | 2.961077E+14 | 1 | 21 | 168 | 1 | 11072 | 1384 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | h100_80gb | 35.86 | 47.81 | 3.548107E+14 | 1 | 21 | 168 | 3 | 14419 | 1802 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 32 | h100_80gb | 43.92 | 58.57 | 4.346371E+14 | 14 | 3 | 1344 | 36 | 73860 | 2308 | 2752512 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 16 | h100_80gb | 43.07 | 57.42 | 4.261622E+14 | 10 | 3 | 480 | 17 | 36209 | 2263 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | h100_80gb | 38.11 | 50.82 | 3.771361E+14 | 3 | 21 | 504 | 7 | 16022 | 2002 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | h100_80gb | 38.76 | 51.68 | 3.835386E+14 | 6 | 21 | 1008 | 16 | 16672 | 2084 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | +| 13b | 32768 | 8 | h100_80gb | 31.68 | 42.24 | 3.134795E+14 | 1 | 3 | 24 | 0 | 15812 | 1976 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | h100_80gb | 35.55 | 47.4 | 3.517379E+14 | 3 | 3 | 72 | 1 | 23881 | 2985 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | +| 13b | 4096 | 8 | h100_80gb | 41.6 | 55.47 | 4.116250E+14 | 10 | 3 | 240 | 9 | 37740 | 4717 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 64 | h100_80gb | 39.86 | 39.86 | 3.943653E+14 | 2 | 1 | 128 | 150 | 307209 | 4800 | 262144 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 32 | h100_80gb | 39.95 | 39.95 | 3.952796E+14 | 2 | 1 | 64 | 75 | 153960 | 4811 | 131072 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 16 | h100_80gb | 39.58 | 39.58 | 3.916861E+14 | 2 | 1 | 32 | 37 | 76280 | 4767 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 8 | h100_80gb | 39.79 | 39.79 | 3.937055E+14 | 2 | 1 | 16 | 18 | 38336 | 4792 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 1024 | 8 | h100_80gb | 44.27 | 59.03 | 4.380472E+14 | 40 | 3 | 960 | 42 | 44019 | 5502 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | +| 7b | 65536 | 8 | h100_80gb | 28.59 | 38.13 | 2.829422E+14 | 1 | 2 | 16 | 0 | 15654 | 1956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | h100_80gb | 30.94 | 41.25 | 3.061503E+14 | 2 | 2 | 32 | 0 | 26550 | 3318 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | +| 7b | 8192 | 8 | h100_80gb | 37.14 | 49.52 | 3.674893E+14 | 8 | 2 | 128 | 6 | 55481 | 6935 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | h100_80gb | 40.42 | 53.9 | 3.999793E+14 | 16 | 2 | 256 | 16 | 68893 | 8611 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 8 | h100_80gb | 46.44 | 46.44 | 4.595096E+14 | 6 | 1 | 48 | 41 | 85144 | 10643 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | h100_80gb | 42.83 | 57.11 | 4.238424E+14 | 64 | 2 | 1024 | 79 | 81628 | 10203 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | +| 3b | 65536 | 8 | h100_80gb | 26.81 | 35.74 | 2.652666E+14 | 1 | 2 | 16 | 0 | 26099 | 3262 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | h100_80gb | 28.84 | 38.46 | 2.854036E+14 | 3 | 6 | 144 | 1 | 46984 | 5873 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | h100_80gb | 36.34 | 36.34 | 3.595418E+14 | 1 | 6 | 48 | 5 | 89223 | 11152 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | h100_80gb | 40.31 | 40.31 | 3.988482E+14 | 3 | 6 | 144 | 16 | 132626 | 16578 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | h100_80gb | 42.31 | 42.31 | 4.186327E+14 | 5 | 6 | 240 | 40 | 167712 | 20964 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 64 | h100_80gb | 40.8 | 40.8 | 4.037625E+14 | 6 | 3 | 1152 | 703 | 1441663 | 22525 | 2359296 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | h100_80gb | 41.7 | 41.7 | 4.126519E+14 | 6 | 3 | 576 | 359 | 736701 | 23021 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | h100_80gb | 43.73 | 43.73 | 4.327437E+14 | 10 | 3 | 480 | 188 | 386285 | 24142 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | h100_80gb | 46.2 | 46.2 | 4.571338E+14 | 20 | 6 | 960 | 211 | 216369 | 27046 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | h100_80gb | 46.32 | 46.32 | 4.583697E+14 | 40 | 6 | 1920 | 436 | 223721 | 27965 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | h100_80gb | 26.34 | 35.12 | 2.606140E+14 | 1 | 2 | 16 | 0 | 44050 | 5506 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 3.319089E+14 | 1 | 4 | 32 | 2 | 96203 | 12025 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | h100_80gb | 35.22 | 35.22 | 3.484904E+14 | 2 | 4 | 64 | 9 | 157194 | 19649 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | h100_80gb | 37.73 | 37.73 | 3.732998E+14 | 3 | 4 | 96 | 28 | 233256 | 29157 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | h100_80gb | 40.26 | 40.26 | 3.983310E+14 | 7 | 4 | 224 | 75 | 308282 | 38535 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 64 | h100_80gb | 40.85 | 40.85 | 4.042246E+14 | 20 | 1 | 1280 | 1387 | 2841754 | 44402 | 2621440 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | h100_80gb | 41.52 | 41.52 | 4.108550E+14 | 20 | 1 | 640 | 705 | 1444183 | 45130 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | h100_80gb | 42.36 | 42.36 | 4.191080E+14 | 20 | 1 | 320 | 359 | 736596 | 46037 | 655360 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | h100_80gb | 41.82 | 41.82 | 4.138134E+14 | 14 | 1 | 112 | 177 | 363645 | 45455 | 229376 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | h100_80gb | 41.95 | 41.95 | 4.151125E+14 | 18 | 4 | 576 | 382 | 391287 | 48910 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | h100_80gb | 43.21 | 43.21 | 4.275497E+14 | 56 | 4 | 1792 | 816 | 418201 | 52275 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 760m | 32768 | 8 | h100_80gb | 31.84 | 31.84 | 3.151039E+14 | 1 | 2 | 16 | 3 | 130333 | 16291 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | h100_80gb | 33.57 | 33.57 | 3.321888E+14 | 3 | 2 | 48 | 13 | 222521 | 27815 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | h100_80gb | 34.84 | 34.84 | 3.447797E+14 | 6 | 2 | 96 | 40 | 334602 | 41825 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | h100_80gb | 35.83 | 35.83 | 3.545866E+14 | 12 | 2 | 192 | 108 | 443674 | 55459 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 32 | h100_80gb | 37.57 | 37.57 | 3.717227E+14 | 24 | 1 | 768 | 1062 | 2175091 | 67971 | 1572864 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | h100_80gb | 37.89 | 37.89 | 3.748925E+14 | 24 | 1 | 384 | 535 | 1096819 | 68551 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | h100_80gb | 34.9 | 34.9 | 3.453389E+14 | 24 | 2 | 384 | 246 | 505177 | 63147 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | h100_80gb | 39.76 | 39.76 | 3.934058E+14 | 48 | 2 | 768 | 613 | 628648 | 78581 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | h100_80gb | 40.42 | 40.42 | 3.999190E+14 | 96 | 2 | 1536 | 1308 | 669998 | 83749 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | + +## H100 80GB FP8 +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 2.846055E+14 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 4.606436E+14 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 5.482421E+14 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 5.987086E+14 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 3.472285E+14 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 4.098371E+14 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 5.750972E+14 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 2.929891E+14 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 3.029027E+14 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 3.516870E+14 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | ## A100 80GB with 1600 Gbps node-node interconnect (RoCE) -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 8192 | 8 | a100_80gb | 42.66 | 56.89 | 1 | 21 | 168 | 0 | 4977 | 622 | 1376256 | bf16 | PURE | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | a100_80gb | 56.4 | 75.2 | 12 | 21 | 2016 | 15 | 7739 | 967 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | a100_80gb | 51.69 | 68.92 | 1 | 3 | 24 | 0 | 8134 | 1016 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | -| 13b | 16384 | 8 | a100_80gb | 54.07 | 72.1 | 3 | 3 | 72 | 0 | 11454 | 1431 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | -| 13b | 8192 | 8 | a100_80gb | 56.07 | 74.76 | 5 | 3 | 120 | 1 | 14362 | 1795 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_80gb | 57.62 | 76.82 | 10 | 3 | 240 | 4 | 16482 | 2060 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 8 | a100_80gb | 59.57 | 59.57 | 2 | 3 | 48 | 8 | 18097 | 2262 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 1024 | 8 | a100_80gb | 59.48 | 79.3 | 40 | 3 | 960 | 18 | 18647 | 2330 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | -| 7b | 65536 | 8 | a100_80gb | 46.97 | 62.63 | 1 | 2 | 16 | 0 | 8108 | 1013 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | -| 7b | 32768 | 8 | a100_80gb | 49.46 | 65.94 | 2 | 2 | 32 | 0 | 13382 | 1672 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | -| 7b | 16384 | 8 | a100_80gb | 51.96 | 69.28 | 4 | 2 | 64 | 1 | 19629 | 2453 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_80gb | 54.47 | 72.62 | 8 | 2 | 128 | 3 | 25655 | 3206 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_80gb | 54.84 | 73.12 | 16 | 2 | 256 | 7 | 29472 | 3684 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 8 | a100_80gb | 64.23 | 64.23 | 6 | 2 | 96 | 18 | 37130 | 4641 | 196608 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 7b | 1024 | 8 | a100_80gb | 58.01 | 77.35 | 64 | 2 | 1024 | 34 | 34857 | 4357 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | -| 3b | 65536 | 8 | a100_80gb | 46.05 | 61.41 | 1 | 2 | 16 | 0 | 14137 | 1767 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | -| 3b | 32768 | 8 | a100_80gb | 47.18 | 62.91 | 3 | 6 | 144 | 0 | 24235 | 3029 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_80gb | 57.13 | 57.13 | 1 | 6 | 48 | 2 | 44233 | 5529 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | -| 3b | 8192 | 8 | a100_80gb | 59.34 | 59.34 | 3 | 6 | 144 | 7 | 61567 | 7695 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_80gb | 60.53 | 60.53 | 5 | 6 | 240 | 18 | 75658 | 9457 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 8 | a100_80gb | 62.11 | 62.11 | 10 | 2 | 160 | 42 | 86491 | 10811 | 327680 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_80gb | 62.73 | 62.73 | 20 | 6 | 960 | 90 | 92643 | 11580 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_80gb | 63.71 | 63.71 | 40 | 6 | 1920 | 189 | 97019 | 12127 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 65536 | 8 | a100_80gb | 46.18 | 61.57 | 1 | 2 | 16 | 0 | 24353 | 3044 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | -| 1b | 32768 | 8 | a100_80gb | 55.52 | 55.52 | 1 | 4 | 32 | 1 | 50207 | 6275 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 16384 | 8 | a100_80gb | 56.6 | 56.6 | 2 | 4 | 64 | 4 | 79650 | 9956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_80gb | 56.69 | 56.69 | 3 | 4 | 96 | 13 | 110516 | 13814 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_80gb | 59.0 | 59.0 | 7 | 4 | 224 | 34 | 142457 | 17807 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 8 | a100_80gb | 59.86 | 59.86 | 14 | 4 | 448 | 80 | 164109 | 20513 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_80gb | 60.15 | 60.15 | 18 | 4 | 576 | 172 | 176898 | 22112 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_80gb | 60.68 | 60.68 | 56 | 4 | 1792 | 361 | 185186 | 23148 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 760m | 65536 | 8 | a100_80gb | 45.34 | 60.45 | 1 | 2 | 16 | 0 | 33150 | 4143 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 857988096 | -| 760m | 32768 | 8 | a100_80gb | 54.57 | 54.57 | 1 | 2 | 16 | 2 | 70417 | 8802 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | -| 760m | 16384 | 8 | a100_80gb | 54.64 | 54.64 | 3 | 2 | 48 | 6 | 114198 | 14274 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_80gb | 55.31 | 55.31 | 6 | 2 | 96 | 20 | 167471 | 20933 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_80gb | 56.05 | 56.05 | 12 | 2 | 192 | 53 | 218808 | 27351 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 8 | a100_80gb | 56.85 | 56.85 | 24 | 2 | 384 | 126 | 259472 | 32434 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_80gb | 47.76 | 47.76 | 48 | 2 | 768 | 232 | 238122 | 29765 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_80gb | 45.07 | 45.07 | 96 | 2 | 1536 | 460 | 235571 | 29446 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | -| 350m | 65536 | 8 | a100_80gb | 52.7 | 52.7 | 1 | 2 | 16 | 0 | 60195 | 7524 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 420997120 | -| 350m | 32768 | 8 | a100_80gb | 52.46 | 52.46 | 2 | 2 | 32 | 3 | 109222 | 13652 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_80gb | 53.28 | 53.28 | 4 | 2 | 64 | 11 | 188478 | 23559 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_80gb | 53.8 | 53.8 | 8 | 2 | 128 | 35 | 292559 | 36569 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_80gb | 53.31 | 53.31 | 16 | 2 | 256 | 96 | 396442 | 49555 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 8 | a100_80gb | 51.62 | 51.62 | 32 | 2 | 512 | 229 | 470263 | 58782 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_80gb | 50.51 | 50.51 | 64 | 2 | 1024 | 506 | 518504 | 64813 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_80gb | 50.61 | 50.61 | 128 | 2 | 2048 | 1083 | 554643 | 69330 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354412544 | -| 125m | 65536 | 8 | a100_80gb | 54.13 | 54.13 | 1 | 2 | 16 | 2 | 162946 | 20368 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 174070272 | -| 125m | 32768 | 8 | a100_80gb | 52.71 | 52.71 | 2 | 2 | 32 | 8 | 291256 | 36407 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_80gb | 50.61 | 50.61 | 4 | 2 | 64 | 29 | 480322 | 60040 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_80gb | 48.85 | 48.85 | 8 | 2 | 128 | 88 | 723142 | 90392 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_80gb | 46.08 | 46.08 | 16 | 2 | 256 | 231 | 947172 | 118396 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 8 | a100_80gb | 44.45 | 44.45 | 32 | 2 | 512 | 553 | 1133901 | 141737 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_80gb | 43.15 | 43.15 | 64 | 2 | 1024 | 1222 | 1251751 | 156468 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_80gb | 42.56 | 42.56 | 128 | 2 | 2048 | 2588 | 1325455 | 165681 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124131840 | -| 125m | 2048 | 8 | a100_80gb | 44.79 | 44.79 | 40 | 2 | 640 | 557 | 1142641 | 142830 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 1.663896E+16 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 1.515072E+16 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 1.228583E+14 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 1.602714E+14 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 1.725420E+14 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 1.741706E+14 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | a100_80gb | 56.4 | 75.2 | 1.759659E+14 | 12 | 21 | 2016 | 15 | 7739 | 967 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | a100_80gb | 51.69 | 68.92 | 1.612741E+14 | 1 | 3 | 24 | 0 | 8134 | 1016 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | a100_80gb | 54.07 | 72.1 | 1.687104E+14 | 3 | 3 | 72 | 0 | 11454 | 1431 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | +| 13b | 8192 | 8 | a100_80gb | 56.07 | 74.76 | 1.749500E+14 | 5 | 3 | 120 | 1 | 14362 | 1795 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_80gb | 57.62 | 76.82 | 1.797680E+14 | 10 | 3 | 240 | 4 | 16482 | 2060 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 8 | a100_80gb | 59.57 | 59.57 | 1.858556E+14 | 2 | 3 | 48 | 8 | 18097 | 2262 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 1024 | 8 | a100_80gb | 59.48 | 79.3 | 1.855662E+14 | 40 | 3 | 960 | 18 | 18647 | 2330 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | +| 7b | 65536 | 8 | a100_80gb | 46.97 | 62.63 | 1.465467E+14 | 1 | 2 | 16 | 0 | 8108 | 1013 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | a100_80gb | 49.46 | 65.94 | 1.543088E+14 | 2 | 2 | 32 | 0 | 13382 | 1672 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | +| 7b | 16384 | 8 | a100_80gb | 51.96 | 69.28 | 1.621241E+14 | 4 | 2 | 64 | 1 | 19629 | 2453 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_80gb | 54.47 | 72.62 | 1.699318E+14 | 8 | 2 | 128 | 3 | 25655 | 3206 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_80gb | 54.84 | 73.12 | 1.711072E+14 | 16 | 2 | 256 | 7 | 29472 | 3684 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 8 | a100_80gb | 64.23 | 64.23 | 2.003836E+14 | 6 | 2 | 96 | 18 | 37130 | 4641 | 196608 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | a100_80gb | 58.01 | 77.35 | 1.809897E+14 | 64 | 2 | 1024 | 34 | 34857 | 4357 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | +| 3b | 65536 | 8 | a100_80gb | 46.05 | 61.41 | 1.436905E+14 | 1 | 2 | 16 | 0 | 14137 | 1767 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | a100_80gb | 47.18 | 62.91 | 1.472162E+14 | 3 | 6 | 144 | 0 | 24235 | 3029 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_80gb | 57.13 | 57.13 | 1.782465E+14 | 1 | 6 | 48 | 2 | 44233 | 5529 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | a100_80gb | 59.34 | 59.34 | 1.851516E+14 | 3 | 6 | 144 | 7 | 61567 | 7695 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_80gb | 60.53 | 60.53 | 1.888534E+14 | 5 | 6 | 240 | 18 | 75658 | 9457 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 8 | a100_80gb | 62.11 | 62.11 | 1.937863E+14 | 10 | 2 | 160 | 42 | 86491 | 10811 | 327680 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_80gb | 62.73 | 62.73 | 1.957319E+14 | 20 | 6 | 960 | 90 | 92643 | 11580 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_80gb | 63.71 | 63.71 | 1.987776E+14 | 40 | 6 | 1920 | 189 | 97019 | 12127 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | a100_80gb | 46.18 | 61.57 | 1.440850E+14 | 1 | 2 | 16 | 0 | 24353 | 3044 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | a100_80gb | 55.52 | 55.52 | 1.732203E+14 | 1 | 4 | 32 | 1 | 50207 | 6275 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | a100_80gb | 56.6 | 56.6 | 1.765798E+14 | 2 | 4 | 64 | 4 | 79650 | 9956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_80gb | 56.69 | 56.69 | 1.768689E+14 | 3 | 4 | 96 | 13 | 110516 | 13814 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_80gb | 59.0 | 59.0 | 1.840694E+14 | 7 | 4 | 224 | 34 | 142457 | 17807 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 8 | a100_80gb | 59.86 | 59.86 | 1.867501E+14 | 14 | 4 | 448 | 80 | 164109 | 20513 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_80gb | 60.15 | 60.15 | 1.876694E+14 | 18 | 4 | 576 | 172 | 176898 | 22112 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_80gb | 60.68 | 60.68 | 1.893257E+14 | 56 | 4 | 1792 | 361 | 185186 | 23148 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 760m | 65536 | 8 | a100_80gb | 45.34 | 60.45 | 1.414636E+14 | 1 | 2 | 16 | 0 | 33150 | 4143 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 857988096 | +| 760m | 32768 | 8 | a100_80gb | 54.57 | 54.57 | 1.702462E+14 | 1 | 2 | 16 | 2 | 70417 | 8802 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | a100_80gb | 54.64 | 54.64 | 1.704797E+14 | 3 | 2 | 48 | 6 | 114198 | 14274 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_80gb | 55.31 | 55.31 | 1.725649E+14 | 6 | 2 | 96 | 20 | 167471 | 20933 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_80gb | 56.05 | 56.05 | 1.748726E+14 | 12 | 2 | 192 | 53 | 218808 | 27351 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 8 | a100_80gb | 56.85 | 56.85 | 1.773749E+14 | 24 | 2 | 384 | 126 | 259472 | 32434 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_80gb | 47.76 | 47.76 | 1.490159E+14 | 48 | 2 | 768 | 232 | 238122 | 29765 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_80gb | 45.07 | 45.07 | 1.406117E+14 | 96 | 2 | 1536 | 460 | 235571 | 29446 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | +| 350m | 65536 | 8 | a100_80gb | 52.7 | 52.7 | 1.644340E+14 | 1 | 2 | 16 | 0 | 60195 | 7524 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 420997120 | +| 350m | 32768 | 8 | a100_80gb | 52.46 | 52.46 | 1.636742E+14 | 2 | 2 | 32 | 3 | 109222 | 13652 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_80gb | 53.28 | 53.28 | 1.662338E+14 | 4 | 2 | 64 | 11 | 188478 | 23559 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_80gb | 53.8 | 53.8 | 1.678405E+14 | 8 | 2 | 128 | 35 | 292559 | 36569 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_80gb | 53.31 | 53.31 | 1.663304E+14 | 16 | 2 | 256 | 96 | 396442 | 49555 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 8 | a100_80gb | 51.62 | 51.62 | 1.610589E+14 | 32 | 2 | 512 | 229 | 470263 | 58782 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_80gb | 50.51 | 50.51 | 1.576003E+14 | 64 | 2 | 1024 | 506 | 518504 | 64813 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_80gb | 50.61 | 50.61 | 1.578979E+14 | 128 | 2 | 2048 | 1083 | 554643 | 69330 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354412544 | +| 125m | 65536 | 8 | a100_80gb | 54.13 | 54.13 | 1.688979E+14 | 1 | 2 | 16 | 2 | 162946 | 20368 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 174070272 | +| 125m | 32768 | 8 | a100_80gb | 52.71 | 52.71 | 1.644619E+14 | 2 | 2 | 32 | 8 | 291256 | 36407 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_80gb | 50.61 | 50.61 | 1.578980E+14 | 4 | 2 | 64 | 29 | 480322 | 60040 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_80gb | 48.85 | 48.85 | 1.524158E+14 | 8 | 2 | 128 | 88 | 723142 | 90392 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_80gb | 46.08 | 46.08 | 1.437679E+14 | 16 | 2 | 256 | 231 | 947172 | 118396 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 8 | a100_80gb | 44.79 | 44.79 | 1.397395E+14 | 40 | 2 | 640 | 557 | 1142641 | 142830 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_80gb | 44.45 | 44.45 | 1.386706E+14 | 32 | 2 | 512 | 553 | 1133901 | 141737 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_80gb | 43.15 | 43.15 | 1.346253E+14 | 64 | 2 | 1024 | 1222 | 1251751 | 156468 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_80gb | 42.56 | 42.56 | 1.327798E+14 | 128 | 2 | 2048 | 2588 | 1325455 | 165681 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124131840 | ## A100 40GB with 1600 Gbps node-node interconnect (RoCE) | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | -| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | -| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | -| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | -| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | -| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | -| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | -| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | \ No newline at end of file +| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 1.525992E+16 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 1.119144E+16 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 1.630200E+16 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 1.614288E+16 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 1.371240E+16 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 1.399320E+16 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 1.620216E+16 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 1.623648E+16 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 1.641744E+16 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 1.638000E+16 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 1.370928E+16 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 1.374984E+16 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | +| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 1.381536E+16 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 1.486680E+16 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 1.530048E+16 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 1.563432E+16 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 1.564368E+16 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 1.582776E+16 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 1.608360E+16 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 1.573728E+16 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 1.588704E+16 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 1.600872E+16 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | +| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 1.586520E+16 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 1.436136E+16 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 1.439568E+16 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | +| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 1.720056E+16 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 1.752816E+16 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 1.709760E+16 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 1.745328E+16 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 1.777152E+16 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 1.747824E+16 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 1.803984E+16 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 1.813968E+16 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 1.856088E+16 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 1.406184E+16 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | +| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 1.723176E+16 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 1.725048E+16 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 1.742520E+16 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 1.697592E+16 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 1.729728E+16 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 1.416168E+16 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 1.737528E+16 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 1.754376E+16 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 1.779024E+16 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 1.781520E+16 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | +| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 1.389336E+16 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | +| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 1.661712E+16 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 1.657344E+16 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 1.653600E+16 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 1.582776E+16 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 1.604928E+16 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 1.621464E+16 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 1.619280E+16 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 1.650168E+16 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 1.673256E+16 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 1.668264E+16 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | +| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 1.608360E+16 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 1.615536E+16 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 1.603368E+16 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 1.571856E+16 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 1.423032E+16 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 1.443624E+16 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 1.474512E+16 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 1.518192E+16 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 1.534104E+16 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 1.520376E+16 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 1.509768E+16 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 1.474824E+16 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 1.459224E+16 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 1.464528E+16 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 1.398384E+16 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 1.212432E+16 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 1.225224E+16 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 1.243632E+16 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 1.277016E+16 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 1.333800E+16 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 1.275768E+16 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 1.256112E+16 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | \ No newline at end of file diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index 48dcb4ff20..e411f807f5 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -50,6 +50,8 @@ def get_runs(args: argparse.Namespace): def sort_key(r: msdk.Run): model_name = r.name.split('-')[2] num_gpu = r.gpus + gpu_type = r.gpu_type + model_precision = r.submitted_config.parameters['precision'] if model_name[-1] == 'm': model_name_size = 1e6 elif model_name[-1] == 'b': @@ -58,8 +60,10 @@ def sort_key(r: msdk.Run): print(model_name) raise ValueError model_size = int(model_name[:-1]) - return (r.image, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], + return (gpu_type, model_precision, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], num_gpu, r.submitted_config.parameters['global_train_batch_size']) + unique_runs = {sort_key(i):i for i in runs} + runs = [unique_runs[r] for r in unique_runs] runs.sort(reverse=True, key=sort_key) return runs @@ -100,7 +104,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: if 'a100' in gpu_type: gpu_type = 'a100' GPU_AVAILABLE_FLOPS = GPU_FLOP_DICT[gpu_type][run.submitted_config.parameters['precision']] - + gpu_type = run.gpu_type fsdp_config = run.submitted_config.parameters['fsdp_config'] @@ -154,6 +158,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: else: hfu_w_attn = mfu_w_attn + model_tflop = f"{float((3 * flops_per_seq + 3 * attn_flops_per_seq) * throughput / gpus): .6E}" # New things that we're testing for image = run.image # compile_fullg = run.submitted_config.parameters['compile_config']['fullgraph'] @@ -172,6 +177,8 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: round(mfu_w_attn * 100, 2), 'HFU': round(hfu_w_attn * 100, 2), + 'Model TFLOP': + model_tflop, 'MicroBatchSize': micro_batchsize, 'GradAccum': @@ -198,14 +205,6 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: str(fsdp_config['activation_cpu_offload']), 'NumParams': n_params, - 'Image': - image, - # 'Compile Mode': - # compile_mode, - # 'Compile Fullgraph': - # compile_fullg, - # 'Compile Dynamic': - # compile_dynamic, } From 669d1aa39047054650a5fb51d69c0f29954af029 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 17 Oct 2023 17:05:46 -0700 Subject: [PATCH 35/41] whoops -- fix --- scripts/train/benchmarking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index 0a349de3cb..c6b896f19d 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -142,7 +142,7 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch ## A100 80GB with 1600 Gbps node-node interconnect (RoCE) | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 1.663896E+16 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | | 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 1.515072E+16 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | | 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 1.228583E+14 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | From 33512df766b0ef5a4b16158f16634089e3cc46d0 Mon Sep 17 00:00:00 2001 From: Chris Rinard <41345459+crinard@users.noreply.github.com> Date: Tue, 17 Oct 2023 21:35:26 -0400 Subject: [PATCH 36/41] Correct TFLOP units --- scripts/train/benchmarking/README.md | 402 +++++++++++++-------------- 1 file changed, 201 insertions(+), 201 deletions(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index c6b896f19d..3e26897eed 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -72,218 +72,218 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch ## H100 80GB BF16 | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 64 | h100_80gb | 42.57 | 56.76 | 4.212583E+14 | 8 | 4 | 2048 | 32 | 66523 | 1039 | 4194304 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 32 | h100_80gb | 36.15 | 48.2 | 3.576911E+14 | 2 | 16 | 1024 | 13 | 28242 | 882 | 2097152 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | -| 30b | 8192 | 8 | h100_80gb | 29.92 | 39.9 | 2.961077E+14 | 1 | 21 | 168 | 1 | 11072 | 1384 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | h100_80gb | 35.86 | 47.81 | 3.548107E+14 | 1 | 21 | 168 | 3 | 14419 | 1802 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 32 | h100_80gb | 43.92 | 58.57 | 4.346371E+14 | 14 | 3 | 1344 | 36 | 73860 | 2308 | 2752512 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 16 | h100_80gb | 43.07 | 57.42 | 4.261622E+14 | 10 | 3 | 480 | 17 | 36209 | 2263 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | h100_80gb | 38.11 | 50.82 | 3.771361E+14 | 3 | 21 | 504 | 7 | 16022 | 2002 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | h100_80gb | 38.76 | 51.68 | 3.835386E+14 | 6 | 21 | 1008 | 16 | 16672 | 2084 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | -| 13b | 32768 | 8 | h100_80gb | 31.68 | 42.24 | 3.134795E+14 | 1 | 3 | 24 | 0 | 15812 | 1976 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | -| 13b | 16384 | 8 | h100_80gb | 35.55 | 47.4 | 3.517379E+14 | 3 | 3 | 72 | 1 | 23881 | 2985 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | -| 13b | 4096 | 8 | h100_80gb | 41.6 | 55.47 | 4.116250E+14 | 10 | 3 | 240 | 9 | 37740 | 4717 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 64 | h100_80gb | 39.86 | 39.86 | 3.943653E+14 | 2 | 1 | 128 | 150 | 307209 | 4800 | 262144 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 2048 | 32 | h100_80gb | 39.95 | 39.95 | 3.952796E+14 | 2 | 1 | 64 | 75 | 153960 | 4811 | 131072 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 2048 | 16 | h100_80gb | 39.58 | 39.58 | 3.916861E+14 | 2 | 1 | 32 | 37 | 76280 | 4767 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 2048 | 8 | h100_80gb | 39.79 | 39.79 | 3.937055E+14 | 2 | 1 | 16 | 18 | 38336 | 4792 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 1024 | 8 | h100_80gb | 44.27 | 59.03 | 4.380472E+14 | 40 | 3 | 960 | 42 | 44019 | 5502 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | -| 7b | 65536 | 8 | h100_80gb | 28.59 | 38.13 | 2.829422E+14 | 1 | 2 | 16 | 0 | 15654 | 1956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | -| 7b | 32768 | 8 | h100_80gb | 30.94 | 41.25 | 3.061503E+14 | 2 | 2 | 32 | 0 | 26550 | 3318 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | -| 7b | 8192 | 8 | h100_80gb | 37.14 | 49.52 | 3.674893E+14 | 8 | 2 | 128 | 6 | 55481 | 6935 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | h100_80gb | 40.42 | 53.9 | 3.999793E+14 | 16 | 2 | 256 | 16 | 68893 | 8611 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 8 | h100_80gb | 46.44 | 46.44 | 4.595096E+14 | 6 | 1 | 48 | 41 | 85144 | 10643 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 7b | 1024 | 8 | h100_80gb | 42.83 | 57.11 | 4.238424E+14 | 64 | 2 | 1024 | 79 | 81628 | 10203 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | -| 3b | 65536 | 8 | h100_80gb | 26.81 | 35.74 | 2.652666E+14 | 1 | 2 | 16 | 0 | 26099 | 3262 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | -| 3b | 32768 | 8 | h100_80gb | 28.84 | 38.46 | 2.854036E+14 | 3 | 6 | 144 | 1 | 46984 | 5873 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | h100_80gb | 36.34 | 36.34 | 3.595418E+14 | 1 | 6 | 48 | 5 | 89223 | 11152 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | -| 3b | 8192 | 8 | h100_80gb | 40.31 | 40.31 | 3.988482E+14 | 3 | 6 | 144 | 16 | 132626 | 16578 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | h100_80gb | 42.31 | 42.31 | 4.186327E+14 | 5 | 6 | 240 | 40 | 167712 | 20964 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 64 | h100_80gb | 40.8 | 40.8 | 4.037625E+14 | 6 | 3 | 1152 | 703 | 1441663 | 22525 | 2359296 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | h100_80gb | 41.7 | 41.7 | 4.126519E+14 | 6 | 3 | 576 | 359 | 736701 | 23021 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | h100_80gb | 43.73 | 43.73 | 4.327437E+14 | 10 | 3 | 480 | 188 | 386285 | 24142 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | h100_80gb | 46.2 | 46.2 | 4.571338E+14 | 20 | 6 | 960 | 211 | 216369 | 27046 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | h100_80gb | 46.32 | 46.32 | 4.583697E+14 | 40 | 6 | 1920 | 436 | 223721 | 27965 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 65536 | 8 | h100_80gb | 26.34 | 35.12 | 2.606140E+14 | 1 | 2 | 16 | 0 | 44050 | 5506 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | -| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 3.319089E+14 | 1 | 4 | 32 | 2 | 96203 | 12025 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 16384 | 8 | h100_80gb | 35.22 | 35.22 | 3.484904E+14 | 2 | 4 | 64 | 9 | 157194 | 19649 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | h100_80gb | 37.73 | 37.73 | 3.732998E+14 | 3 | 4 | 96 | 28 | 233256 | 29157 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | h100_80gb | 40.26 | 40.26 | 3.983310E+14 | 7 | 4 | 224 | 75 | 308282 | 38535 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 64 | h100_80gb | 40.85 | 40.85 | 4.042246E+14 | 20 | 1 | 1280 | 1387 | 2841754 | 44402 | 2621440 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | h100_80gb | 41.52 | 41.52 | 4.108550E+14 | 20 | 1 | 640 | 705 | 1444183 | 45130 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | h100_80gb | 42.36 | 42.36 | 4.191080E+14 | 20 | 1 | 320 | 359 | 736596 | 46037 | 655360 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | h100_80gb | 41.82 | 41.82 | 4.138134E+14 | 14 | 1 | 112 | 177 | 363645 | 45455 | 229376 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | h100_80gb | 41.95 | 41.95 | 4.151125E+14 | 18 | 4 | 576 | 382 | 391287 | 48910 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | h100_80gb | 43.21 | 43.21 | 4.275497E+14 | 56 | 4 | 1792 | 816 | 418201 | 52275 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 760m | 32768 | 8 | h100_80gb | 31.84 | 31.84 | 3.151039E+14 | 1 | 2 | 16 | 3 | 130333 | 16291 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | -| 760m | 16384 | 8 | h100_80gb | 33.57 | 33.57 | 3.321888E+14 | 3 | 2 | 48 | 13 | 222521 | 27815 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | h100_80gb | 34.84 | 34.84 | 3.447797E+14 | 6 | 2 | 96 | 40 | 334602 | 41825 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | h100_80gb | 35.83 | 35.83 | 3.545866E+14 | 12 | 2 | 192 | 108 | 443674 | 55459 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 32 | h100_80gb | 37.57 | 37.57 | 3.717227E+14 | 24 | 1 | 768 | 1062 | 2175091 | 67971 | 1572864 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | h100_80gb | 37.89 | 37.89 | 3.748925E+14 | 24 | 1 | 384 | 535 | 1096819 | 68551 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | h100_80gb | 34.9 | 34.9 | 3.453389E+14 | 24 | 2 | 384 | 246 | 505177 | 63147 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | h100_80gb | 39.76 | 39.76 | 3.934058E+14 | 48 | 2 | 768 | 613 | 628648 | 78581 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | h100_80gb | 40.42 | 40.42 | 3.999190E+14 | 96 | 2 | 1536 | 1308 | 669998 | 83749 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | +| 70b | 2048 | 64 | h100_80gb | 42.57 | 56.76 | 4.212583 | 8 | 4 | 2048 | 32 | 66523 | 1039 | 4194304 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | h100_80gb | 36.15 | 48.2 | 3.576911 | 2 | 16 | 1024 | 13 | 28242 | 882 | 2097152 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | h100_80gb | 29.92 | 39.9 | 2.961077 | 1 | 21 | 168 | 1 | 11072 | 1384 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | h100_80gb | 35.86 | 47.81 | 3.548107 | 1 | 21 | 168 | 3 | 14419 | 1802 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 32 | h100_80gb | 43.92 | 58.57 | 4.346371 | 14 | 3 | 1344 | 36 | 73860 | 2308 | 2752512 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 16 | h100_80gb | 43.07 | 57.42 | 4.261622 | 10 | 3 | 480 | 17 | 36209 | 2263 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | h100_80gb | 38.11 | 50.82 | 3.771361 | 3 | 21 | 504 | 7 | 16022 | 2002 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | h100_80gb | 38.76 | 51.68 | 3.835386 | 6 | 21 | 1008 | 16 | 16672 | 2084 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | +| 13b | 32768 | 8 | h100_80gb | 31.68 | 42.24 | 3.134795 | 1 | 3 | 24 | 0 | 15812 | 1976 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | h100_80gb | 35.55 | 47.4 | 3.517379 | 3 | 3 | 72 | 1 | 23881 | 2985 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | +| 13b | 4096 | 8 | h100_80gb | 41.6 | 55.47 | 4.116250 | 10 | 3 | 240 | 9 | 37740 | 4717 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 64 | h100_80gb | 39.86 | 39.86 | 3.943653 | 2 | 1 | 128 | 150 | 307209 | 4800 | 262144 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 32 | h100_80gb | 39.95 | 39.95 | 3.952796 | 2 | 1 | 64 | 75 | 153960 | 4811 | 131072 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 16 | h100_80gb | 39.58 | 39.58 | 3.916861 | 2 | 1 | 32 | 37 | 76280 | 4767 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 8 | h100_80gb | 39.79 | 39.79 | 3.937055 | 2 | 1 | 16 | 18 | 38336 | 4792 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 1024 | 8 | h100_80gb | 44.27 | 59.03 | 4.380472 | 40 | 3 | 960 | 42 | 44019 | 5502 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | +| 7b | 65536 | 8 | h100_80gb | 28.59 | 38.13 | 2.829422 | 1 | 2 | 16 | 0 | 15654 | 1956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | h100_80gb | 30.94 | 41.25 | 3.061503 | 2 | 2 | 32 | 0 | 26550 | 3318 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | +| 7b | 8192 | 8 | h100_80gb | 37.14 | 49.52 | 3.674893 | 8 | 2 | 128 | 6 | 55481 | 6935 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | h100_80gb | 40.42 | 53.9 | 3.999793 | 16 | 2 | 256 | 16 | 68893 | 8611 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 8 | h100_80gb | 46.44 | 46.44 | 4.595096 | 6 | 1 | 48 | 41 | 85144 | 10643 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | h100_80gb | 42.83 | 57.11 | 4.238424 | 64 | 2 | 1024 | 79 | 81628 | 10203 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | +| 3b | 65536 | 8 | h100_80gb | 26.81 | 35.74 | 2.652666 | 1 | 2 | 16 | 0 | 26099 | 3262 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | h100_80gb | 28.84 | 38.46 | 2.854036 | 3 | 6 | 144 | 1 | 46984 | 5873 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | h100_80gb | 36.34 | 36.34 | 3.595418 | 1 | 6 | 48 | 5 | 89223 | 11152 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | h100_80gb | 40.31 | 40.31 | 3.988482 | 3 | 6 | 144 | 16 | 132626 | 16578 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | h100_80gb | 42.31 | 42.31 | 4.186327 | 5 | 6 | 240 | 40 | 167712 | 20964 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 64 | h100_80gb | 40.8 | 40.8 | 4.037625 | 6 | 3 | 1152 | 703 | 1441663 | 22525 | 2359296 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | h100_80gb | 41.7 | 41.7 | 4.126519 | 6 | 3 | 576 | 359 | 736701 | 23021 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | h100_80gb | 43.73 | 43.73 | 4.327437 | 10 | 3 | 480 | 188 | 386285 | 24142 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | h100_80gb | 46.2 | 46.2 | 4.571338 | 20 | 6 | 960 | 211 | 216369 | 27046 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | h100_80gb | 46.32 | 46.32 | 4.583697 | 40 | 6 | 1920 | 436 | 223721 | 27965 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | h100_80gb | 26.34 | 35.12 | 2.606140 | 1 | 2 | 16 | 0 | 44050 | 5506 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 3.319089 | 1 | 4 | 32 | 2 | 96203 | 12025 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | h100_80gb | 35.22 | 35.22 | 3.484904 | 2 | 4 | 64 | 9 | 157194 | 19649 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | h100_80gb | 37.73 | 37.73 | 3.732998 | 3 | 4 | 96 | 28 | 233256 | 29157 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | h100_80gb | 40.26 | 40.26 | 3.983310 | 7 | 4 | 224 | 75 | 308282 | 38535 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 64 | h100_80gb | 40.85 | 40.85 | 4.042246 | 20 | 1 | 1280 | 1387 | 2841754 | 44402 | 2621440 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | h100_80gb | 41.52 | 41.52 | 4.108550 | 20 | 1 | 640 | 705 | 1444183 | 45130 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | h100_80gb | 42.36 | 42.36 | 4.191080 | 20 | 1 | 320 | 359 | 736596 | 46037 | 655360 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | h100_80gb | 41.82 | 41.82 | 4.138134 | 14 | 1 | 112 | 177 | 363645 | 45455 | 229376 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | h100_80gb | 41.95 | 41.95 | 4.151125 | 18 | 4 | 576 | 382 | 391287 | 48910 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | h100_80gb | 43.21 | 43.21 | 4.275497 | 56 | 4 | 1792 | 816 | 418201 | 52275 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 760m | 32768 | 8 | h100_80gb | 31.84 | 31.84 | 3.151039 | 1 | 2 | 16 | 3 | 130333 | 16291 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | h100_80gb | 33.57 | 33.57 | 3.321888 | 3 | 2 | 48 | 13 | 222521 | 27815 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | h100_80gb | 34.84 | 34.84 | 3.447797 | 6 | 2 | 96 | 40 | 334602 | 41825 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | h100_80gb | 35.83 | 35.83 | 3.545866 | 12 | 2 | 192 | 108 | 443674 | 55459 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 32 | h100_80gb | 37.57 | 37.57 | 3.717227 | 24 | 1 | 768 | 1062 | 2175091 | 67971 | 1572864 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | h100_80gb | 37.89 | 37.89 | 3.748925 | 24 | 1 | 384 | 535 | 1096819 | 68551 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | h100_80gb | 34.9 | 34.9 | 3.453389 | 24 | 2 | 384 | 246 | 505177 | 63147 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | h100_80gb | 39.76 | 39.76 | 3.934058 | 48 | 2 | 768 | 613 | 628648 | 78581 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | h100_80gb | 40.42 | 40.42 | 3.999190 | 96 | 2 | 1536 | 1308 | 669998 | 83749 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | ## H100 80GB FP8 | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 2.846055E+14 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 4.606436E+14 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 5.482421E+14 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 5.987086E+14 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 3.472285E+14 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 4.098371E+14 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 5.750972E+14 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 2.929891E+14 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 3.029027E+14 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 3.516870E+14 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | +| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 2.846055 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 4.606436 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 5.482421 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 5.987086 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 3.472285 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 4.098371 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 5.750972 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 2.929891 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 3.029027 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 3.516870 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | ## A100 80GB with 1600 Gbps node-node interconnect (RoCE) | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 1.663896E+16 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 1.515072E+16 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 1.228583E+14 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 1.602714E+14 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 1.725420E+14 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 1.741706E+14 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | a100_80gb | 56.4 | 75.2 | 1.759659E+14 | 12 | 21 | 2016 | 15 | 7739 | 967 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | a100_80gb | 51.69 | 68.92 | 1.612741E+14 | 1 | 3 | 24 | 0 | 8134 | 1016 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | -| 13b | 16384 | 8 | a100_80gb | 54.07 | 72.1 | 1.687104E+14 | 3 | 3 | 72 | 0 | 11454 | 1431 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | -| 13b | 8192 | 8 | a100_80gb | 56.07 | 74.76 | 1.749500E+14 | 5 | 3 | 120 | 1 | 14362 | 1795 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_80gb | 57.62 | 76.82 | 1.797680E+14 | 10 | 3 | 240 | 4 | 16482 | 2060 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 8 | a100_80gb | 59.57 | 59.57 | 1.858556E+14 | 2 | 3 | 48 | 8 | 18097 | 2262 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 1024 | 8 | a100_80gb | 59.48 | 79.3 | 1.855662E+14 | 40 | 3 | 960 | 18 | 18647 | 2330 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | -| 7b | 65536 | 8 | a100_80gb | 46.97 | 62.63 | 1.465467E+14 | 1 | 2 | 16 | 0 | 8108 | 1013 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | -| 7b | 32768 | 8 | a100_80gb | 49.46 | 65.94 | 1.543088E+14 | 2 | 2 | 32 | 0 | 13382 | 1672 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | -| 7b | 16384 | 8 | a100_80gb | 51.96 | 69.28 | 1.621241E+14 | 4 | 2 | 64 | 1 | 19629 | 2453 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_80gb | 54.47 | 72.62 | 1.699318E+14 | 8 | 2 | 128 | 3 | 25655 | 3206 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_80gb | 54.84 | 73.12 | 1.711072E+14 | 16 | 2 | 256 | 7 | 29472 | 3684 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 8 | a100_80gb | 64.23 | 64.23 | 2.003836E+14 | 6 | 2 | 96 | 18 | 37130 | 4641 | 196608 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 7b | 1024 | 8 | a100_80gb | 58.01 | 77.35 | 1.809897E+14 | 64 | 2 | 1024 | 34 | 34857 | 4357 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | -| 3b | 65536 | 8 | a100_80gb | 46.05 | 61.41 | 1.436905E+14 | 1 | 2 | 16 | 0 | 14137 | 1767 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | -| 3b | 32768 | 8 | a100_80gb | 47.18 | 62.91 | 1.472162E+14 | 3 | 6 | 144 | 0 | 24235 | 3029 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_80gb | 57.13 | 57.13 | 1.782465E+14 | 1 | 6 | 48 | 2 | 44233 | 5529 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | -| 3b | 8192 | 8 | a100_80gb | 59.34 | 59.34 | 1.851516E+14 | 3 | 6 | 144 | 7 | 61567 | 7695 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_80gb | 60.53 | 60.53 | 1.888534E+14 | 5 | 6 | 240 | 18 | 75658 | 9457 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 8 | a100_80gb | 62.11 | 62.11 | 1.937863E+14 | 10 | 2 | 160 | 42 | 86491 | 10811 | 327680 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_80gb | 62.73 | 62.73 | 1.957319E+14 | 20 | 6 | 960 | 90 | 92643 | 11580 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_80gb | 63.71 | 63.71 | 1.987776E+14 | 40 | 6 | 1920 | 189 | 97019 | 12127 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 65536 | 8 | a100_80gb | 46.18 | 61.57 | 1.440850E+14 | 1 | 2 | 16 | 0 | 24353 | 3044 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | -| 1b | 32768 | 8 | a100_80gb | 55.52 | 55.52 | 1.732203E+14 | 1 | 4 | 32 | 1 | 50207 | 6275 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 16384 | 8 | a100_80gb | 56.6 | 56.6 | 1.765798E+14 | 2 | 4 | 64 | 4 | 79650 | 9956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_80gb | 56.69 | 56.69 | 1.768689E+14 | 3 | 4 | 96 | 13 | 110516 | 13814 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_80gb | 59.0 | 59.0 | 1.840694E+14 | 7 | 4 | 224 | 34 | 142457 | 17807 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 8 | a100_80gb | 59.86 | 59.86 | 1.867501E+14 | 14 | 4 | 448 | 80 | 164109 | 20513 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_80gb | 60.15 | 60.15 | 1.876694E+14 | 18 | 4 | 576 | 172 | 176898 | 22112 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_80gb | 60.68 | 60.68 | 1.893257E+14 | 56 | 4 | 1792 | 361 | 185186 | 23148 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 760m | 65536 | 8 | a100_80gb | 45.34 | 60.45 | 1.414636E+14 | 1 | 2 | 16 | 0 | 33150 | 4143 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 857988096 | -| 760m | 32768 | 8 | a100_80gb | 54.57 | 54.57 | 1.702462E+14 | 1 | 2 | 16 | 2 | 70417 | 8802 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | -| 760m | 16384 | 8 | a100_80gb | 54.64 | 54.64 | 1.704797E+14 | 3 | 2 | 48 | 6 | 114198 | 14274 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_80gb | 55.31 | 55.31 | 1.725649E+14 | 6 | 2 | 96 | 20 | 167471 | 20933 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_80gb | 56.05 | 56.05 | 1.748726E+14 | 12 | 2 | 192 | 53 | 218808 | 27351 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 8 | a100_80gb | 56.85 | 56.85 | 1.773749E+14 | 24 | 2 | 384 | 126 | 259472 | 32434 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_80gb | 47.76 | 47.76 | 1.490159E+14 | 48 | 2 | 768 | 232 | 238122 | 29765 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_80gb | 45.07 | 45.07 | 1.406117E+14 | 96 | 2 | 1536 | 460 | 235571 | 29446 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | -| 350m | 65536 | 8 | a100_80gb | 52.7 | 52.7 | 1.644340E+14 | 1 | 2 | 16 | 0 | 60195 | 7524 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 420997120 | -| 350m | 32768 | 8 | a100_80gb | 52.46 | 52.46 | 1.636742E+14 | 2 | 2 | 32 | 3 | 109222 | 13652 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_80gb | 53.28 | 53.28 | 1.662338E+14 | 4 | 2 | 64 | 11 | 188478 | 23559 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_80gb | 53.8 | 53.8 | 1.678405E+14 | 8 | 2 | 128 | 35 | 292559 | 36569 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_80gb | 53.31 | 53.31 | 1.663304E+14 | 16 | 2 | 256 | 96 | 396442 | 49555 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 8 | a100_80gb | 51.62 | 51.62 | 1.610589E+14 | 32 | 2 | 512 | 229 | 470263 | 58782 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_80gb | 50.51 | 50.51 | 1.576003E+14 | 64 | 2 | 1024 | 506 | 518504 | 64813 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_80gb | 50.61 | 50.61 | 1.578979E+14 | 128 | 2 | 2048 | 1083 | 554643 | 69330 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354412544 | -| 125m | 65536 | 8 | a100_80gb | 54.13 | 54.13 | 1.688979E+14 | 1 | 2 | 16 | 2 | 162946 | 20368 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 174070272 | -| 125m | 32768 | 8 | a100_80gb | 52.71 | 52.71 | 1.644619E+14 | 2 | 2 | 32 | 8 | 291256 | 36407 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_80gb | 50.61 | 50.61 | 1.578980E+14 | 4 | 2 | 64 | 29 | 480322 | 60040 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_80gb | 48.85 | 48.85 | 1.524158E+14 | 8 | 2 | 128 | 88 | 723142 | 90392 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_80gb | 46.08 | 46.08 | 1.437679E+14 | 16 | 2 | 256 | 231 | 947172 | 118396 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 8 | a100_80gb | 44.79 | 44.79 | 1.397395E+14 | 40 | 2 | 640 | 557 | 1142641 | 142830 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_80gb | 44.45 | 44.45 | 1.386706E+14 | 32 | 2 | 512 | 553 | 1133901 | 141737 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_80gb | 43.15 | 43.15 | 1.346253E+14 | 64 | 2 | 1024 | 1222 | 1251751 | 156468 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_80gb | 42.56 | 42.56 | 1.327798E+14 | 128 | 2 | 2048 | 2588 | 1325455 | 165681 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124131840 | +| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 1.663896 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 1.515072 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 1.228583 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 1.602714 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 1.725420 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 1.741706 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | a100_80gb | 56.4 | 75.2 | 1.759659 | 12 | 21 | 2016 | 15 | 7739 | 967 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | a100_80gb | 51.69 | 68.92 | 1.612741 | 1 | 3 | 24 | 0 | 8134 | 1016 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | a100_80gb | 54.07 | 72.1 | 1.687104 | 3 | 3 | 72 | 0 | 11454 | 1431 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | +| 13b | 8192 | 8 | a100_80gb | 56.07 | 74.76 | 1.749500 | 5 | 3 | 120 | 1 | 14362 | 1795 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_80gb | 57.62 | 76.82 | 1.797680 | 10 | 3 | 240 | 4 | 16482 | 2060 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 8 | a100_80gb | 59.57 | 59.57 | 1.858556 | 2 | 3 | 48 | 8 | 18097 | 2262 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 1024 | 8 | a100_80gb | 59.48 | 79.3 | 1.855662 | 40 | 3 | 960 | 18 | 18647 | 2330 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | +| 7b | 65536 | 8 | a100_80gb | 46.97 | 62.63 | 1.465467 | 1 | 2 | 16 | 0 | 8108 | 1013 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | a100_80gb | 49.46 | 65.94 | 1.543088 | 2 | 2 | 32 | 0 | 13382 | 1672 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | +| 7b | 16384 | 8 | a100_80gb | 51.96 | 69.28 | 1.621241 | 4 | 2 | 64 | 1 | 19629 | 2453 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_80gb | 54.47 | 72.62 | 1.699318 | 8 | 2 | 128 | 3 | 25655 | 3206 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_80gb | 54.84 | 73.12 | 1.711072 | 16 | 2 | 256 | 7 | 29472 | 3684 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 8 | a100_80gb | 64.23 | 64.23 | 2.003836 | 6 | 2 | 96 | 18 | 37130 | 4641 | 196608 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | a100_80gb | 58.01 | 77.35 | 1.809897 | 64 | 2 | 1024 | 34 | 34857 | 4357 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | +| 3b | 65536 | 8 | a100_80gb | 46.05 | 61.41 | 1.436905 | 1 | 2 | 16 | 0 | 14137 | 1767 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | a100_80gb | 47.18 | 62.91 | 1.472162 | 3 | 6 | 144 | 0 | 24235 | 3029 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_80gb | 57.13 | 57.13 | 1.782465 | 1 | 6 | 48 | 2 | 44233 | 5529 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | a100_80gb | 59.34 | 59.34 | 1.851516 | 3 | 6 | 144 | 7 | 61567 | 7695 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_80gb | 60.53 | 60.53 | 1.888534 | 5 | 6 | 240 | 18 | 75658 | 9457 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 8 | a100_80gb | 62.11 | 62.11 | 1.937863 | 10 | 2 | 160 | 42 | 86491 | 10811 | 327680 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_80gb | 62.73 | 62.73 | 1.957319 | 20 | 6 | 960 | 90 | 92643 | 11580 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_80gb | 63.71 | 63.71 | 1.987776 | 40 | 6 | 1920 | 189 | 97019 | 12127 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | a100_80gb | 46.18 | 61.57 | 1.440850 | 1 | 2 | 16 | 0 | 24353 | 3044 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | a100_80gb | 55.52 | 55.52 | 1.732203 | 1 | 4 | 32 | 1 | 50207 | 6275 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | a100_80gb | 56.6 | 56.6 | 1.765798 | 2 | 4 | 64 | 4 | 79650 | 9956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_80gb | 56.69 | 56.69 | 1.768689 | 3 | 4 | 96 | 13 | 110516 | 13814 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_80gb | 59.0 | 59.0 | 1.840694 | 7 | 4 | 224 | 34 | 142457 | 17807 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 8 | a100_80gb | 59.86 | 59.86 | 1.867501 | 14 | 4 | 448 | 80 | 164109 | 20513 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_80gb | 60.15 | 60.15 | 1.876694 | 18 | 4 | 576 | 172 | 176898 | 22112 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_80gb | 60.68 | 60.68 | 1.893257 | 56 | 4 | 1792 | 361 | 185186 | 23148 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 760m | 65536 | 8 | a100_80gb | 45.34 | 60.45 | 1.414636 | 1 | 2 | 16 | 0 | 33150 | 4143 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 857988096 | +| 760m | 32768 | 8 | a100_80gb | 54.57 | 54.57 | 1.702462 | 1 | 2 | 16 | 2 | 70417 | 8802 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | a100_80gb | 54.64 | 54.64 | 1.704797 | 3 | 2 | 48 | 6 | 114198 | 14274 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_80gb | 55.31 | 55.31 | 1.725649 | 6 | 2 | 96 | 20 | 167471 | 20933 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_80gb | 56.05 | 56.05 | 1.748726 | 12 | 2 | 192 | 53 | 218808 | 27351 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 8 | a100_80gb | 56.85 | 56.85 | 1.773749 | 24 | 2 | 384 | 126 | 259472 | 32434 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_80gb | 47.76 | 47.76 | 1.490159 | 48 | 2 | 768 | 232 | 238122 | 29765 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_80gb | 45.07 | 45.07 | 1.406117 | 96 | 2 | 1536 | 460 | 235571 | 29446 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | +| 350m | 65536 | 8 | a100_80gb | 52.7 | 52.7 | 1.644340 | 1 | 2 | 16 | 0 | 60195 | 7524 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 420997120 | +| 350m | 32768 | 8 | a100_80gb | 52.46 | 52.46 | 1.636742 | 2 | 2 | 32 | 3 | 109222 | 13652 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_80gb | 53.28 | 53.28 | 1.662338 | 4 | 2 | 64 | 11 | 188478 | 23559 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_80gb | 53.8 | 53.8 | 1.678405 | 8 | 2 | 128 | 35 | 292559 | 36569 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_80gb | 53.31 | 53.31 | 1.663304 | 16 | 2 | 256 | 96 | 396442 | 49555 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 8 | a100_80gb | 51.62 | 51.62 | 1.610589 | 32 | 2 | 512 | 229 | 470263 | 58782 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_80gb | 50.51 | 50.51 | 1.576003 | 64 | 2 | 1024 | 506 | 518504 | 64813 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_80gb | 50.61 | 50.61 | 1.578979 | 128 | 2 | 2048 | 1083 | 554643 | 69330 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354412544 | +| 125m | 65536 | 8 | a100_80gb | 54.13 | 54.13 | 1.688979 | 1 | 2 | 16 | 2 | 162946 | 20368 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 174070272 | +| 125m | 32768 | 8 | a100_80gb | 52.71 | 52.71 | 1.644619 | 2 | 2 | 32 | 8 | 291256 | 36407 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_80gb | 50.61 | 50.61 | 1.578980 | 4 | 2 | 64 | 29 | 480322 | 60040 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_80gb | 48.85 | 48.85 | 1.524158 | 8 | 2 | 128 | 88 | 723142 | 90392 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_80gb | 46.08 | 46.08 | 1.437679 | 16 | 2 | 256 | 231 | 947172 | 118396 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 8 | a100_80gb | 44.79 | 44.79 | 1.397395 | 40 | 2 | 640 | 557 | 1142641 | 142830 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_80gb | 44.45 | 44.45 | 1.386706 | 32 | 2 | 512 | 553 | 1133901 | 141737 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_80gb | 43.15 | 43.15 | 1.346253 | 64 | 2 | 1024 | 1222 | 1251751 | 156468 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_80gb | 42.56 | 42.56 | 1.327798 | 128 | 2 | 2048 | 2588 | 1325455 | 165681 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124131840 | ## A100 40GB with 1600 Gbps node-node interconnect (RoCE) | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 1.525992E+16 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 1.119144E+16 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 1.630200E+16 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 1.614288E+16 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 1.371240E+16 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 1.399320E+16 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 1.620216E+16 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 1.623648E+16 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 1.641744E+16 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 1.638000E+16 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 1.370928E+16 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 1.374984E+16 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | -| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 1.381536E+16 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 1.486680E+16 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 1.530048E+16 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 1.563432E+16 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 1.564368E+16 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 1.582776E+16 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 1.608360E+16 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 1.573728E+16 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 1.588704E+16 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 1.600872E+16 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | -| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 1.586520E+16 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 1.436136E+16 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 1.439568E+16 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | -| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 1.720056E+16 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 1.752816E+16 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 1.709760E+16 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 1.745328E+16 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 1.777152E+16 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 1.747824E+16 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 1.803984E+16 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 1.813968E+16 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 1.856088E+16 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 1.406184E+16 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | -| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 1.723176E+16 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 1.725048E+16 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 1.742520E+16 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 1.697592E+16 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 1.729728E+16 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 1.416168E+16 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 1.737528E+16 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 1.754376E+16 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 1.779024E+16 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 1.781520E+16 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | -| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 1.389336E+16 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | -| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 1.661712E+16 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 1.657344E+16 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 1.653600E+16 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 1.582776E+16 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 1.604928E+16 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 1.621464E+16 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 1.619280E+16 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 1.650168E+16 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 1.673256E+16 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 1.668264E+16 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | -| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 1.608360E+16 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 1.615536E+16 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 1.603368E+16 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 1.571856E+16 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 1.423032E+16 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 1.443624E+16 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 1.474512E+16 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 1.518192E+16 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 1.534104E+16 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 1.520376E+16 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 1.509768E+16 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 1.474824E+16 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 1.459224E+16 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 1.464528E+16 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 1.398384E+16 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 1.212432E+16 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 1.225224E+16 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 1.243632E+16 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 1.277016E+16 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 1.333800E+16 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 1.275768E+16 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 1.256112E+16 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | \ No newline at end of file +| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 1.525992 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 1.119144 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 1.630200 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 1.614288 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 1.371240 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 1.399320 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 1.620216 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 1.623648 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 1.641744 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 1.638000 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 1.370928 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 1.374984 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | +| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 1.381536 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 1.486680 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 1.530048 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 1.563432 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 1.564368 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 1.582776 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 1.608360 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 1.573728 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 1.588704 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 1.600872 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | +| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 1.586520 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 1.436136 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 1.439568 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | +| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 1.720056 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 1.752816 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 1.709760 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 1.745328 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 1.777152 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 1.747824 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 1.803984 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 1.813968 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 1.856088 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 1.406184 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | +| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 1.723176 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 1.725048 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 1.742520 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 1.697592 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 1.729728 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 1.416168 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 1.737528 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 1.754376 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 1.779024 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 1.781520 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | +| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 1.389336 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | +| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 1.661712 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 1.657344 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 1.653600 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 1.582776 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 1.604928 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 1.621464 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 1.619280 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 1.650168 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 1.673256 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 1.668264 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | +| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 1.608360 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 1.615536 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 1.603368 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 1.571856 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 1.423032 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 1.443624 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 1.474512 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 1.518192 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 1.534104 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 1.520376 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 1.509768 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 1.474824 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 1.459224 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 1.464528 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 1.398384 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 1.212432 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 1.225224 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 1.243632 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 1.277016 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 1.333800 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 1.275768 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 1.256112 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | From 53a30285e104ed081c164c3b59a465ec1cc2f6fe Mon Sep 17 00:00:00 2001 From: Chris Rinard <41345459+crinard@users.noreply.github.com> Date: Tue, 17 Oct 2023 21:36:21 -0400 Subject: [PATCH 37/41] Punt H100 350m numbers --- scripts/train/benchmarking/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index 3e26897eed..17d87443d9 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -135,9 +135,6 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch | 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 3.472285 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | | 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 4.098371 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | | 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 5.750972 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 350m | 32768 | 8 | h100_80gb | 14.8 | 14.8 | 2.929891 | 1 | 4 | 32 | 5 | 195516 | 24439 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | h100_80gb | 15.31 | 15.31 | 3.029027 | 2 | 4 | 64 | 20 | 343435 | 42929 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 512 | 8 | h100_80gb | 17.77 | 17.77 | 3.516870 | 56 | 4 | 1792 | 2412 | 1235360 | 154420 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 354412544 | ## A100 80GB with 1600 Gbps node-node interconnect (RoCE) From 0a516dc5334040931f6d90284bebdd5a561cfd00 Mon Sep 17 00:00:00 2001 From: Chris Rinard Date: Tue, 17 Oct 2023 19:07:54 -0700 Subject: [PATCH 38/41] calculate TFLOPS not FLOPS --- scripts/train/benchmarking/README.md | 400 +++++++++--------- scripts/train/benchmarking/collect_results.py | 2 +- 2 files changed, 201 insertions(+), 201 deletions(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index 17d87443d9..f521b2c938 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -72,215 +72,215 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch ## H100 80GB BF16 | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 64 | h100_80gb | 42.57 | 56.76 | 4.212583 | 8 | 4 | 2048 | 32 | 66523 | 1039 | 4194304 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 32 | h100_80gb | 36.15 | 48.2 | 3.576911 | 2 | 16 | 1024 | 13 | 28242 | 882 | 2097152 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | -| 30b | 8192 | 8 | h100_80gb | 29.92 | 39.9 | 2.961077 | 1 | 21 | 168 | 1 | 11072 | 1384 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | h100_80gb | 35.86 | 47.81 | 3.548107 | 1 | 21 | 168 | 3 | 14419 | 1802 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 32 | h100_80gb | 43.92 | 58.57 | 4.346371 | 14 | 3 | 1344 | 36 | 73860 | 2308 | 2752512 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 16 | h100_80gb | 43.07 | 57.42 | 4.261622 | 10 | 3 | 480 | 17 | 36209 | 2263 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 8 | h100_80gb | 38.11 | 50.82 | 3.771361 | 3 | 21 | 504 | 7 | 16022 | 2002 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | h100_80gb | 38.76 | 51.68 | 3.835386 | 6 | 21 | 1008 | 16 | 16672 | 2084 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | -| 13b | 32768 | 8 | h100_80gb | 31.68 | 42.24 | 3.134795 | 1 | 3 | 24 | 0 | 15812 | 1976 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | -| 13b | 16384 | 8 | h100_80gb | 35.55 | 47.4 | 3.517379 | 3 | 3 | 72 | 1 | 23881 | 2985 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | -| 13b | 4096 | 8 | h100_80gb | 41.6 | 55.47 | 4.116250 | 10 | 3 | 240 | 9 | 37740 | 4717 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 64 | h100_80gb | 39.86 | 39.86 | 3.943653 | 2 | 1 | 128 | 150 | 307209 | 4800 | 262144 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 2048 | 32 | h100_80gb | 39.95 | 39.95 | 3.952796 | 2 | 1 | 64 | 75 | 153960 | 4811 | 131072 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 2048 | 16 | h100_80gb | 39.58 | 39.58 | 3.916861 | 2 | 1 | 32 | 37 | 76280 | 4767 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 2048 | 8 | h100_80gb | 39.79 | 39.79 | 3.937055 | 2 | 1 | 16 | 18 | 38336 | 4792 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 1024 | 8 | h100_80gb | 44.27 | 59.03 | 4.380472 | 40 | 3 | 960 | 42 | 44019 | 5502 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | -| 7b | 65536 | 8 | h100_80gb | 28.59 | 38.13 | 2.829422 | 1 | 2 | 16 | 0 | 15654 | 1956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | -| 7b | 32768 | 8 | h100_80gb | 30.94 | 41.25 | 3.061503 | 2 | 2 | 32 | 0 | 26550 | 3318 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | -| 7b | 8192 | 8 | h100_80gb | 37.14 | 49.52 | 3.674893 | 8 | 2 | 128 | 6 | 55481 | 6935 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | h100_80gb | 40.42 | 53.9 | 3.999793 | 16 | 2 | 256 | 16 | 68893 | 8611 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 8 | h100_80gb | 46.44 | 46.44 | 4.595096 | 6 | 1 | 48 | 41 | 85144 | 10643 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 7b | 1024 | 8 | h100_80gb | 42.83 | 57.11 | 4.238424 | 64 | 2 | 1024 | 79 | 81628 | 10203 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | -| 3b | 65536 | 8 | h100_80gb | 26.81 | 35.74 | 2.652666 | 1 | 2 | 16 | 0 | 26099 | 3262 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | -| 3b | 32768 | 8 | h100_80gb | 28.84 | 38.46 | 2.854036 | 3 | 6 | 144 | 1 | 46984 | 5873 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | h100_80gb | 36.34 | 36.34 | 3.595418 | 1 | 6 | 48 | 5 | 89223 | 11152 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | -| 3b | 8192 | 8 | h100_80gb | 40.31 | 40.31 | 3.988482 | 3 | 6 | 144 | 16 | 132626 | 16578 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | h100_80gb | 42.31 | 42.31 | 4.186327 | 5 | 6 | 240 | 40 | 167712 | 20964 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 64 | h100_80gb | 40.8 | 40.8 | 4.037625 | 6 | 3 | 1152 | 703 | 1441663 | 22525 | 2359296 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | h100_80gb | 41.7 | 41.7 | 4.126519 | 6 | 3 | 576 | 359 | 736701 | 23021 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | h100_80gb | 43.73 | 43.73 | 4.327437 | 10 | 3 | 480 | 188 | 386285 | 24142 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | h100_80gb | 46.2 | 46.2 | 4.571338 | 20 | 6 | 960 | 211 | 216369 | 27046 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | h100_80gb | 46.32 | 46.32 | 4.583697 | 40 | 6 | 1920 | 436 | 223721 | 27965 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 65536 | 8 | h100_80gb | 26.34 | 35.12 | 2.606140 | 1 | 2 | 16 | 0 | 44050 | 5506 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | -| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 3.319089 | 1 | 4 | 32 | 2 | 96203 | 12025 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 16384 | 8 | h100_80gb | 35.22 | 35.22 | 3.484904 | 2 | 4 | 64 | 9 | 157194 | 19649 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | h100_80gb | 37.73 | 37.73 | 3.732998 | 3 | 4 | 96 | 28 | 233256 | 29157 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | h100_80gb | 40.26 | 40.26 | 3.983310 | 7 | 4 | 224 | 75 | 308282 | 38535 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 64 | h100_80gb | 40.85 | 40.85 | 4.042246 | 20 | 1 | 1280 | 1387 | 2841754 | 44402 | 2621440 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | h100_80gb | 41.52 | 41.52 | 4.108550 | 20 | 1 | 640 | 705 | 1444183 | 45130 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | h100_80gb | 42.36 | 42.36 | 4.191080 | 20 | 1 | 320 | 359 | 736596 | 46037 | 655360 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | h100_80gb | 41.82 | 41.82 | 4.138134 | 14 | 1 | 112 | 177 | 363645 | 45455 | 229376 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | h100_80gb | 41.95 | 41.95 | 4.151125 | 18 | 4 | 576 | 382 | 391287 | 48910 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | h100_80gb | 43.21 | 43.21 | 4.275497 | 56 | 4 | 1792 | 816 | 418201 | 52275 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 760m | 32768 | 8 | h100_80gb | 31.84 | 31.84 | 3.151039 | 1 | 2 | 16 | 3 | 130333 | 16291 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | -| 760m | 16384 | 8 | h100_80gb | 33.57 | 33.57 | 3.321888 | 3 | 2 | 48 | 13 | 222521 | 27815 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | h100_80gb | 34.84 | 34.84 | 3.447797 | 6 | 2 | 96 | 40 | 334602 | 41825 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | h100_80gb | 35.83 | 35.83 | 3.545866 | 12 | 2 | 192 | 108 | 443674 | 55459 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 32 | h100_80gb | 37.57 | 37.57 | 3.717227 | 24 | 1 | 768 | 1062 | 2175091 | 67971 | 1572864 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | h100_80gb | 37.89 | 37.89 | 3.748925 | 24 | 1 | 384 | 535 | 1096819 | 68551 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | h100_80gb | 34.9 | 34.9 | 3.453389 | 24 | 2 | 384 | 246 | 505177 | 63147 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | h100_80gb | 39.76 | 39.76 | 3.934058 | 48 | 2 | 768 | 613 | 628648 | 78581 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | h100_80gb | 40.42 | 40.42 | 3.999190 | 96 | 2 | 1536 | 1308 | 669998 | 83749 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | +| 70b | 2048 | 64 | h100_80gb | 42.57 | 56.76 | 421 | 8 | 4 | 2048 | 32 | 66523 | 1039 | 4194304 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | h100_80gb | 36.15 | 48.2 | 357 | 2 | 16 | 1024 | 13 | 28242 | 882 | 2097152 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | h100_80gb | 29.92 | 39.9 | 296 | 1 | 21 | 168 | 1 | 11072 | 1384 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | h100_80gb | 35.86 | 47.81 | 354 | 1 | 21 | 168 | 3 | 14419 | 1802 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 32 | h100_80gb | 43.92 | 58.57 | 434 | 14 | 3 | 1344 | 36 | 73860 | 2308 | 2752512 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 16 | h100_80gb | 43.07 | 57.42 | 426 | 10 | 3 | 480 | 17 | 36209 | 2263 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 8 | h100_80gb | 38.11 | 50.82 | 377 | 3 | 21 | 504 | 7 | 16022 | 2002 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | h100_80gb | 38.76 | 51.68 | 383 | 6 | 21 | 1008 | 16 | 16672 | 2084 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | +| 13b | 32768 | 8 | h100_80gb | 31.68 | 42.24 | 313 | 1 | 3 | 24 | 0 | 15812 | 1976 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | h100_80gb | 35.55 | 47.4 | 351 | 3 | 3 | 72 | 1 | 23881 | 2985 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | +| 13b | 4096 | 8 | h100_80gb | 41.6 | 55.47 | 411 | 10 | 3 | 240 | 9 | 37740 | 4717 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 64 | h100_80gb | 39.86 | 39.86 | 394 | 2 | 1 | 128 | 150 | 307209 | 4800 | 262144 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 32 | h100_80gb | 39.95 | 39.95 | 395 | 2 | 1 | 64 | 75 | 153960 | 4811 | 131072 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 16 | h100_80gb | 39.58 | 39.58 | 391 | 2 | 1 | 32 | 37 | 76280 | 4767 | 65536 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 2048 | 8 | h100_80gb | 39.79 | 39.79 | 393 | 2 | 1 | 16 | 18 | 38336 | 4792 | 32768 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 1024 | 8 | h100_80gb | 44.27 | 59.03 | 438 | 40 | 3 | 960 | 42 | 44019 | 5502 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | +| 7b | 65536 | 8 | h100_80gb | 28.59 | 38.13 | 282 | 1 | 2 | 16 | 0 | 15654 | 1956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | h100_80gb | 30.94 | 41.25 | 306 | 2 | 2 | 32 | 0 | 26550 | 3318 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | +| 7b | 8192 | 8 | h100_80gb | 37.14 | 49.52 | 367 | 8 | 2 | 128 | 6 | 55481 | 6935 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | h100_80gb | 40.42 | 53.9 | 399 | 16 | 2 | 256 | 16 | 68893 | 8611 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 8 | h100_80gb | 46.44 | 46.44 | 459 | 6 | 1 | 48 | 41 | 85144 | 10643 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | h100_80gb | 42.83 | 57.11 | 423 | 64 | 2 | 1024 | 79 | 81628 | 10203 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | +| 3b | 65536 | 8 | h100_80gb | 26.81 | 35.74 | 265 | 1 | 2 | 16 | 0 | 26099 | 3262 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | h100_80gb | 28.84 | 38.46 | 285 | 3 | 6 | 144 | 1 | 46984 | 5873 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | h100_80gb | 36.34 | 36.34 | 359 | 1 | 6 | 48 | 5 | 89223 | 11152 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | h100_80gb | 40.31 | 40.31 | 398 | 3 | 6 | 144 | 16 | 132626 | 16578 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | h100_80gb | 42.31 | 42.31 | 418 | 5 | 6 | 240 | 40 | 167712 | 20964 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 64 | h100_80gb | 40.8 | 40.8 | 403 | 6 | 3 | 1152 | 703 | 1441663 | 22525 | 2359296 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | h100_80gb | 41.7 | 41.7 | 412 | 6 | 3 | 576 | 359 | 736701 | 23021 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | h100_80gb | 43.73 | 43.73 | 432 | 10 | 3 | 480 | 188 | 386285 | 24142 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | h100_80gb | 46.2 | 46.2 | 457 | 20 | 6 | 960 | 211 | 216369 | 27046 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | h100_80gb | 46.32 | 46.32 | 458 | 40 | 6 | 1920 | 436 | 223721 | 27965 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | h100_80gb | 26.34 | 35.12 | 260 | 1 | 2 | 16 | 0 | 44050 | 5506 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | h100_80gb | 33.54 | 33.54 | 331 | 1 | 4 | 32 | 2 | 96203 | 12025 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | h100_80gb | 35.22 | 35.22 | 348 | 2 | 4 | 64 | 9 | 157194 | 19649 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | h100_80gb | 37.73 | 37.73 | 373 | 3 | 4 | 96 | 28 | 233256 | 29157 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | h100_80gb | 40.26 | 40.26 | 398 | 7 | 4 | 224 | 75 | 308282 | 38535 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 64 | h100_80gb | 40.85 | 40.85 | 404 | 20 | 1 | 1280 | 1387 | 2841754 | 44402 | 2621440 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | h100_80gb | 41.52 | 41.52 | 410 | 20 | 1 | 640 | 705 | 1444183 | 45130 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | h100_80gb | 42.36 | 42.36 | 419 | 20 | 1 | 320 | 359 | 736596 | 46037 | 655360 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | h100_80gb | 41.82 | 41.82 | 413 | 14 | 1 | 112 | 177 | 363645 | 45455 | 229376 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | h100_80gb | 41.95 | 41.95 | 415 | 18 | 4 | 576 | 382 | 391287 | 48910 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | h100_80gb | 43.21 | 43.21 | 427 | 56 | 4 | 1792 | 816 | 418201 | 52275 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 760m | 32768 | 8 | h100_80gb | 31.84 | 31.84 | 315 | 1 | 2 | 16 | 3 | 130333 | 16291 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | h100_80gb | 33.57 | 33.57 | 332 | 3 | 2 | 48 | 13 | 222521 | 27815 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | h100_80gb | 34.84 | 34.84 | 344 | 6 | 2 | 96 | 40 | 334602 | 41825 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | h100_80gb | 35.83 | 35.83 | 354 | 12 | 2 | 192 | 108 | 443674 | 55459 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 32 | h100_80gb | 37.57 | 37.57 | 371 | 24 | 1 | 768 | 1062 | 2175091 | 67971 | 1572864 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | h100_80gb | 37.89 | 37.89 | 374 | 24 | 1 | 384 | 535 | 1096819 | 68551 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | h100_80gb | 34.9 | 34.9 | 345 | 24 | 2 | 384 | 246 | 505177 | 63147 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | h100_80gb | 39.76 | 39.76 | 393 | 48 | 2 | 768 | 613 | 628648 | 78581 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | h100_80gb | 40.42 | 40.42 | 399 | 96 | 2 | 1536 | 1308 | 669998 | 83749 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | ## H100 80GB FP8 | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 2.846055 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 4.606436 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 5.482421 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 5.987086 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 3.472285 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 4.098371 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 5.750972 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 3b | 32768 | 8 | h100_80gb | 14.38 | 19.18 | 284 | 3 | 6 | 144 | 1 | 46853 | 5856 | 4718592 | amp_fp8 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 8192 | 8 | h100_80gb | 23.28 | 23.28 | 460 | 3 | 6 | 144 | 18 | 153174 | 19146 | 1179648 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 2048 | 8 | h100_80gb | 27.7 | 27.7 | 548 | 10 | 6 | 480 | 119 | 244692 | 30586 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 512 | 8 | h100_80gb | 30.25 | 30.25 | 598 | 40 | 6 | 1920 | 570 | 292217 | 36527 | 983040 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | h100_80gb | 17.55 | 17.55 | 347 | 1 | 4 | 32 | 3 | 100643 | 12580 | 1048576 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 8192 | 8 | h100_80gb | 20.71 | 20.71 | 409 | 2 | 4 | 64 | 31 | 256087 | 32010 | 524288 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 512 | 8 | h100_80gb | 29.06 | 29.06 | 575 | 56 | 4 | 1792 | 1098 | 562523 | 70315 | 917504 | amp_fp8 | DEFAULT | FULL_SHARD | False | False | 1312804864 | ## A100 80GB with 1600 Gbps node-node interconnect (RoCE) | Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 1.663896 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 1.515072 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 1.228583 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | -| 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 1.602714 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | -| 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 1.725420 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | -| 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 1.741706 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | -| 30b | 512 | 8 | a100_80gb | 56.4 | 75.2 | 1.759659 | 12 | 21 | 2016 | 15 | 7739 | 967 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29964204032 | -| 13b | 32768 | 8 | a100_80gb | 51.69 | 68.92 | 1.612741 | 1 | 3 | 24 | 0 | 8134 | 1016 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | -| 13b | 16384 | 8 | a100_80gb | 54.07 | 72.1 | 1.687104 | 3 | 3 | 72 | 0 | 11454 | 1431 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | -| 13b | 8192 | 8 | a100_80gb | 56.07 | 74.76 | 1.749500 | 5 | 3 | 120 | 1 | 14362 | 1795 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_80gb | 57.62 | 76.82 | 1.797680 | 10 | 3 | 240 | 4 | 16482 | 2060 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 8 | a100_80gb | 59.57 | 59.57 | 1.858556 | 2 | 3 | 48 | 8 | 18097 | 2262 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | -| 13b | 1024 | 8 | a100_80gb | 59.48 | 79.3 | 1.855662 | 40 | 3 | 960 | 18 | 18647 | 2330 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | -| 7b | 65536 | 8 | a100_80gb | 46.97 | 62.63 | 1.465467 | 1 | 2 | 16 | 0 | 8108 | 1013 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | -| 7b | 32768 | 8 | a100_80gb | 49.46 | 65.94 | 1.543088 | 2 | 2 | 32 | 0 | 13382 | 1672 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | -| 7b | 16384 | 8 | a100_80gb | 51.96 | 69.28 | 1.621241 | 4 | 2 | 64 | 1 | 19629 | 2453 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_80gb | 54.47 | 72.62 | 1.699318 | 8 | 2 | 128 | 3 | 25655 | 3206 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_80gb | 54.84 | 73.12 | 1.711072 | 16 | 2 | 256 | 7 | 29472 | 3684 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 8 | a100_80gb | 64.23 | 64.23 | 2.003836 | 6 | 2 | 96 | 18 | 37130 | 4641 | 196608 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | -| 7b | 1024 | 8 | a100_80gb | 58.01 | 77.35 | 1.809897 | 64 | 2 | 1024 | 34 | 34857 | 4357 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | -| 3b | 65536 | 8 | a100_80gb | 46.05 | 61.41 | 1.436905 | 1 | 2 | 16 | 0 | 14137 | 1767 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | -| 3b | 32768 | 8 | a100_80gb | 47.18 | 62.91 | 1.472162 | 3 | 6 | 144 | 0 | 24235 | 3029 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_80gb | 57.13 | 57.13 | 1.782465 | 1 | 6 | 48 | 2 | 44233 | 5529 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | -| 3b | 8192 | 8 | a100_80gb | 59.34 | 59.34 | 1.851516 | 3 | 6 | 144 | 7 | 61567 | 7695 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_80gb | 60.53 | 60.53 | 1.888534 | 5 | 6 | 240 | 18 | 75658 | 9457 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 8 | a100_80gb | 62.11 | 62.11 | 1.937863 | 10 | 2 | 160 | 42 | 86491 | 10811 | 327680 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_80gb | 62.73 | 62.73 | 1.957319 | 20 | 6 | 960 | 90 | 92643 | 11580 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_80gb | 63.71 | 63.71 | 1.987776 | 40 | 6 | 1920 | 189 | 97019 | 12127 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | -| 1b | 65536 | 8 | a100_80gb | 46.18 | 61.57 | 1.440850 | 1 | 2 | 16 | 0 | 24353 | 3044 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | -| 1b | 32768 | 8 | a100_80gb | 55.52 | 55.52 | 1.732203 | 1 | 4 | 32 | 1 | 50207 | 6275 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | -| 1b | 16384 | 8 | a100_80gb | 56.6 | 56.6 | 1.765798 | 2 | 4 | 64 | 4 | 79650 | 9956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_80gb | 56.69 | 56.69 | 1.768689 | 3 | 4 | 96 | 13 | 110516 | 13814 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_80gb | 59.0 | 59.0 | 1.840694 | 7 | 4 | 224 | 34 | 142457 | 17807 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 8 | a100_80gb | 59.86 | 59.86 | 1.867501 | 14 | 4 | 448 | 80 | 164109 | 20513 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_80gb | 60.15 | 60.15 | 1.876694 | 18 | 4 | 576 | 172 | 176898 | 22112 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_80gb | 60.68 | 60.68 | 1.893257 | 56 | 4 | 1792 | 361 | 185186 | 23148 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | -| 760m | 65536 | 8 | a100_80gb | 45.34 | 60.45 | 1.414636 | 1 | 2 | 16 | 0 | 33150 | 4143 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 857988096 | -| 760m | 32768 | 8 | a100_80gb | 54.57 | 54.57 | 1.702462 | 1 | 2 | 16 | 2 | 70417 | 8802 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | -| 760m | 16384 | 8 | a100_80gb | 54.64 | 54.64 | 1.704797 | 3 | 2 | 48 | 6 | 114198 | 14274 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_80gb | 55.31 | 55.31 | 1.725649 | 6 | 2 | 96 | 20 | 167471 | 20933 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_80gb | 56.05 | 56.05 | 1.748726 | 12 | 2 | 192 | 53 | 218808 | 27351 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 8 | a100_80gb | 56.85 | 56.85 | 1.773749 | 24 | 2 | 384 | 126 | 259472 | 32434 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_80gb | 47.76 | 47.76 | 1.490159 | 48 | 2 | 768 | 232 | 238122 | 29765 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_80gb | 45.07 | 45.07 | 1.406117 | 96 | 2 | 1536 | 460 | 235571 | 29446 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | -| 350m | 65536 | 8 | a100_80gb | 52.7 | 52.7 | 1.644340 | 1 | 2 | 16 | 0 | 60195 | 7524 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 420997120 | -| 350m | 32768 | 8 | a100_80gb | 52.46 | 52.46 | 1.636742 | 2 | 2 | 32 | 3 | 109222 | 13652 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_80gb | 53.28 | 53.28 | 1.662338 | 4 | 2 | 64 | 11 | 188478 | 23559 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_80gb | 53.8 | 53.8 | 1.678405 | 8 | 2 | 128 | 35 | 292559 | 36569 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_80gb | 53.31 | 53.31 | 1.663304 | 16 | 2 | 256 | 96 | 396442 | 49555 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 8 | a100_80gb | 51.62 | 51.62 | 1.610589 | 32 | 2 | 512 | 229 | 470263 | 58782 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_80gb | 50.51 | 50.51 | 1.576003 | 64 | 2 | 1024 | 506 | 518504 | 64813 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_80gb | 50.61 | 50.61 | 1.578979 | 128 | 2 | 2048 | 1083 | 554643 | 69330 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354412544 | -| 125m | 65536 | 8 | a100_80gb | 54.13 | 54.13 | 1.688979 | 1 | 2 | 16 | 2 | 162946 | 20368 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 174070272 | -| 125m | 32768 | 8 | a100_80gb | 52.71 | 52.71 | 1.644619 | 2 | 2 | 32 | 8 | 291256 | 36407 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_80gb | 50.61 | 50.61 | 1.578980 | 4 | 2 | 64 | 29 | 480322 | 60040 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_80gb | 48.85 | 48.85 | 1.524158 | 8 | 2 | 128 | 88 | 723142 | 90392 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_80gb | 46.08 | 46.08 | 1.437679 | 16 | 2 | 256 | 231 | 947172 | 118396 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 8 | a100_80gb | 44.79 | 44.79 | 1.397395 | 40 | 2 | 640 | 557 | 1142641 | 142830 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_80gb | 44.45 | 44.45 | 1.386706 | 32 | 2 | 512 | 553 | 1133901 | 141737 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_80gb | 43.15 | 43.15 | 1.346253 | 64 | 2 | 1024 | 1222 | 1251751 | 156468 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_80gb | 42.56 | 42.56 | 1.327798 | 128 | 2 | 2048 | 2588 | 1325455 | 165681 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124131840 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 70b | 2048 | 64 | a100_80gb | 53.33 | 71.1 | 166 | 8 | 4 | 2048 | 12 | 26274 | 410 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 32 | a100_80gb | 48.56 | 64.75 | 151 | 2 | 16 | 1024 | 5 | 11962 | 373 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 8192 | 8 | a100_80gb | 39.38 | 52.5 | 122 | 1 | 21 | 168 | 0 | 4594 | 574 | 1376256 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 30019254272 | +| 30b | 4096 | 8 | a100_80gb | 51.37 | 68.49 | 160 | 1 | 21 | 168 | 1 | 6513 | 814 | 688128 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29989894144 | +| 30b | 2048 | 8 | a100_80gb | 55.3 | 73.74 | 172 | 3 | 21 | 504 | 3 | 7330 | 916 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29975214080 | +| 30b | 1024 | 8 | a100_80gb | 55.82 | 74.43 | 174 | 6 | 21 | 1008 | 7 | 7571 | 946 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29967874048 | +| 30b | 512 | 8 | a100_80gb | 56.4 | 75.2 | 175 | 12 | 21 | 2016 | 15 | 7739 | 967 | 1032192 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 29964204032 | +| 13b | 32768 | 8 | a100_80gb | 51.69 | 68.92 | 161 | 1 | 3 | 24 | 0 | 8134 | 1016 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 13011240960 | +| 13b | 16384 | 8 | a100_80gb | 54.07 | 72.1 | 168 | 3 | 3 | 72 | 0 | 11454 | 1431 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12927354880 | +| 13b | 8192 | 8 | a100_80gb | 56.07 | 74.76 | 174 | 5 | 3 | 120 | 1 | 14362 | 1795 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_80gb | 57.62 | 76.82 | 179 | 10 | 3 | 240 | 4 | 16482 | 2060 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 8 | a100_80gb | 59.57 | 59.57 | 185 | 2 | 3 | 48 | 8 | 18097 | 2262 | 98304 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 12853954560 | +| 13b | 1024 | 8 | a100_80gb | 59.48 | 79.3 | 185 | 40 | 3 | 960 | 18 | 18647 | 2330 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 12848711680 | +| 7b | 65536 | 8 | a100_80gb | 46.97 | 62.63 | 146 | 1 | 2 | 16 | 0 | 8108 | 1013 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6918905856 | +| 7b | 32768 | 8 | a100_80gb | 49.46 | 65.94 | 154 | 2 | 2 | 32 | 0 | 13382 | 1672 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6784688128 | +| 7b | 16384 | 8 | a100_80gb | 51.96 | 69.28 | 162 | 4 | 2 | 64 | 1 | 19629 | 2453 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_80gb | 54.47 | 72.62 | 169 | 8 | 2 | 128 | 3 | 25655 | 3206 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_80gb | 54.84 | 73.12 | 171 | 16 | 2 | 256 | 7 | 29472 | 3684 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 8 | a100_80gb | 64.23 | 64.23 | 200 | 6 | 2 | 96 | 18 | 37130 | 4641 | 196608 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 6658859008 | +| 7b | 1024 | 8 | a100_80gb | 58.01 | 77.35 | 180 | 64 | 2 | 1024 | 34 | 34857 | 4357 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 6654664704 | +| 3b | 65536 | 8 | a100_80gb | 46.05 | 61.41 | 143 | 1 | 2 | 16 | 0 | 14137 | 1767 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2814366720 | +| 3b | 32768 | 8 | a100_80gb | 47.18 | 62.91 | 147 | 3 | 6 | 144 | 0 | 24235 | 3029 | 4718592 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_80gb | 57.13 | 57.13 | 178 | 1 | 6 | 48 | 2 | 44233 | 5529 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2688537600 | +| 3b | 8192 | 8 | a100_80gb | 59.34 | 59.34 | 185 | 3 | 6 | 144 | 7 | 61567 | 7695 | 1179648 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_80gb | 60.53 | 60.53 | 188 | 5 | 6 | 240 | 18 | 75658 | 9457 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 8 | a100_80gb | 62.11 | 62.11 | 193 | 10 | 2 | 160 | 42 | 86491 | 10811 | 327680 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_80gb | 62.73 | 62.73 | 195 | 20 | 6 | 960 | 90 | 92643 | 11580 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_80gb | 63.71 | 63.71 | 198 | 40 | 6 | 1920 | 189 | 97019 | 12127 | 983040 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 2647905280 | +| 1b | 65536 | 8 | a100_80gb | 46.18 | 61.57 | 144 | 1 | 2 | 16 | 0 | 24353 | 3044 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 1445974016 | +| 1b | 32768 | 8 | a100_80gb | 55.52 | 55.52 | 173 | 1 | 4 | 32 | 1 | 50207 | 6275 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1378865152 | +| 1b | 16384 | 8 | a100_80gb | 56.6 | 56.6 | 176 | 2 | 4 | 64 | 4 | 79650 | 9956 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_80gb | 56.69 | 56.69 | 176 | 3 | 4 | 96 | 13 | 110516 | 13814 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_80gb | 59.0 | 59.0 | 184 | 7 | 4 | 224 | 34 | 142457 | 17807 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 8 | a100_80gb | 59.86 | 59.86 | 186 | 14 | 4 | 448 | 80 | 164109 | 20513 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_80gb | 60.15 | 60.15 | 187 | 18 | 4 | 576 | 172 | 176898 | 22112 | 589824 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_80gb | 60.68 | 60.68 | 189 | 56 | 4 | 1792 | 361 | 185186 | 23148 | 917504 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 1312804864 | +| 760m | 65536 | 8 | a100_80gb | 45.34 | 60.45 | 141 | 1 | 2 | 16 | 0 | 33150 | 4143 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | True | False | 857988096 | +| 760m | 32768 | 8 | a100_80gb | 54.57 | 54.57 | 170 | 1 | 2 | 16 | 2 | 70417 | 8802 | 524288 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 807656448 | +| 760m | 16384 | 8 | a100_80gb | 54.64 | 54.64 | 170 | 3 | 2 | 48 | 6 | 114198 | 14274 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_80gb | 55.31 | 55.31 | 172 | 6 | 2 | 96 | 20 | 167471 | 20933 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_80gb | 56.05 | 56.05 | 174 | 12 | 2 | 192 | 53 | 218808 | 27351 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 8 | a100_80gb | 56.85 | 56.85 | 177 | 24 | 2 | 384 | 126 | 259472 | 32434 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_80gb | 47.76 | 47.76 | 149 | 48 | 2 | 768 | 232 | 238122 | 29765 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_80gb | 45.07 | 45.07 | 140 | 96 | 2 | 1536 | 460 | 235571 | 29446 | 786432 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 758111232 | +| 350m | 65536 | 8 | a100_80gb | 52.7 | 52.7 | 164 | 1 | 2 | 16 | 0 | 60195 | 7524 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 420997120 | +| 350m | 32768 | 8 | a100_80gb | 52.46 | 52.46 | 163 | 2 | 2 | 32 | 3 | 109222 | 13652 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_80gb | 53.28 | 53.28 | 166 | 4 | 2 | 64 | 11 | 188478 | 23559 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_80gb | 53.8 | 53.8 | 167 | 8 | 2 | 128 | 35 | 292559 | 36569 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_80gb | 53.31 | 53.31 | 166 | 16 | 2 | 256 | 96 | 396442 | 49555 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 8 | a100_80gb | 51.62 | 51.62 | 161 | 32 | 2 | 512 | 229 | 470263 | 58782 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_80gb | 50.51 | 50.51 | 157 | 64 | 2 | 1024 | 506 | 518504 | 64813 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_80gb | 50.61 | 50.61 | 157 | 128 | 2 | 2048 | 1083 | 554643 | 69330 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 354412544 | +| 125m | 65536 | 8 | a100_80gb | 54.13 | 54.13 | 168 | 1 | 2 | 16 | 2 | 162946 | 20368 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 174070272 | +| 125m | 32768 | 8 | a100_80gb | 52.71 | 52.71 | 164 | 2 | 2 | 32 | 8 | 291256 | 36407 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_80gb | 50.61 | 50.61 | 157 | 4 | 2 | 64 | 29 | 480322 | 60040 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_80gb | 48.85 | 48.85 | 152 | 8 | 2 | 128 | 88 | 723142 | 90392 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_80gb | 46.08 | 46.08 | 143 | 16 | 2 | 256 | 231 | 947172 | 118396 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 8 | a100_80gb | 44.79 | 44.79 | 139 | 40 | 2 | 640 | 557 | 1142641 | 142830 | 1310720 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_80gb | 44.45 | 44.45 | 138 | 32 | 2 | 512 | 553 | 1133901 | 141737 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_80gb | 43.15 | 43.15 | 134 | 64 | 2 | 1024 | 1222 | 1251751 | 156468 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_80gb | 42.56 | 42.56 | 132 | 128 | 2 | 2048 | 2588 | 1325455 | 165681 | 1048576 | amp_bf16 | DEFAULT | FULL_SHARD | False | False | 124131840 | ## A100 40GB with 1600 Gbps node-node interconnect (RoCE) -| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | +| Model | SeqLen (T) | # GPUs | GPU | MFU | HFU | Model TFLOP| MicroBatchSize | GradAccum | GlobalBatchSize | Throughput (S/s) | Throughput (T/s) | Throughput (T/s/GPU) | GlobalBatchSize (T) | Precision | MP Mode | Sharding Strategy | Activation Checkpointing | Activation CPUOffload | NumParams | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 1.525992 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 1.119144 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | -| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 1.630200 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 1.614288 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | -| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 1.371240 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | -| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 1.399320 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | -| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 1.620216 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 1.623648 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 1.641744 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 1.638000 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 1.370928 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | -| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 1.374984 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | -| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 1.381536 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | -| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 1.486680 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | -| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 1.530048 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | -| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 1.563432 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | -| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 1.564368 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 1.582776 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 1.608360 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 1.573728 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 1.588704 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | -| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 1.600872 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | -| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 1.586520 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | -| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 1.436136 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | -| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 1.439568 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | -| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 1.720056 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | -| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 1.752816 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | -| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 1.709760 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 1.745328 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 1.777152 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 1.747824 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 1.803984 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | -| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 1.813968 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | -| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 1.856088 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | -| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 1.406184 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | -| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 1.723176 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | -| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 1.725048 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | -| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 1.742520 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | -| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 1.697592 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 1.729728 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 1.416168 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 1.737528 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 1.754376 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | -| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 1.779024 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | -| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 1.781520 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | -| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 1.389336 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | -| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 1.661712 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | -| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 1.657344 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | -| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 1.653600 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | -| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 1.582776 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 1.604928 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 1.621464 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 1.619280 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 1.650168 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | -| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 1.673256 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | -| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 1.668264 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | -| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 1.608360 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | -| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 1.615536 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | -| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 1.603368 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | -| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 1.571856 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | -| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 1.423032 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 1.443624 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 1.474512 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 1.518192 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 1.534104 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | -| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 1.520376 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | -| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 1.509768 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | -| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 1.474824 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | -| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 1.459224 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | -| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 1.464528 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | -| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 1.398384 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | -| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 1.212432 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 1.225224 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 1.243632 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 1.277016 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 1.333800 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | -| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 1.275768 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 1.256112 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | +| 70b | 2048 | 128 | a100_40gb | 48.91 | 65.21 | 152 | 4 | 1 | 512 | 23 | 48194 | 376 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 70b | 2048 | 64 | a100_40gb | 35.87 | 47.82 | 111 | 2 | 1 | 128 | 8 | 17672 | 276 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 64862437376 | +| 30b | 2048 | 128 | a100_40gb | 52.25 | 69.66 | 163 | 6 | 1 | 768 | 54 | 110803 | 865 | 1572864 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 30b | 2048 | 32 | a100_40gb | 51.74 | 68.98 | 161 | 4 | 1 | 128 | 13 | 27431 | 857 | 262144 | bf16 | PURE | FULL_SHARD | True | False | 29975214080 | +| 13b | 8192 | 8 | a100_40gb | 43.95 | 58.6 | 137 | 1 | 16 | 128 | 1 | 11258 | 1407 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12885411840 | +| 13b | 4096 | 8 | a100_40gb | 44.85 | 59.8 | 139 | 2 | 16 | 256 | 3 | 12830 | 1603 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12864440320 | +| 13b | 2048 | 128 | a100_40gb | 51.93 | 69.24 | 162 | 16 | 1 | 2048 | 123 | 252444 | 1972 | 4194304 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 64 | a100_40gb | 52.04 | 69.39 | 162 | 16 | 1 | 1024 | 61 | 126479 | 1976 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 32 | a100_40gb | 52.62 | 70.16 | 164 | 14 | 1 | 448 | 31 | 63946 | 1998 | 917504 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 16 | a100_40gb | 52.5 | 70.0 | 163 | 10 | 1 | 160 | 15 | 31900 | 1993 | 327680 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 2048 | 8 | a100_40gb | 43.94 | 58.58 | 137 | 4 | 16 | 512 | 6 | 13347 | 1668 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12853954560 | +| 13b | 1024 | 8 | a100_40gb | 44.07 | 58.76 | 137 | 8 | 16 | 1024 | 13 | 13817 | 1727 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12848711680 | +| 13b | 512 | 8 | a100_40gb | 44.28 | 59.04 | 138 | 16 | 16 | 2048 | 27 | 14108 | 1763 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 12846090240 | +| 7b | 16384 | 8 | a100_40gb | 47.65 | 63.53 | 148 | 1 | 4 | 32 | 1 | 17998 | 2249 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6717579264 | +| 7b | 8192 | 8 | a100_40gb | 49.04 | 65.38 | 153 | 3 | 4 | 96 | 2 | 23098 | 2887 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6684024832 | +| 7b | 4096 | 8 | a100_40gb | 50.11 | 66.82 | 156 | 6 | 4 | 192 | 6 | 26930 | 3366 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6667247616 | +| 7b | 2048 | 128 | a100_40gb | 50.14 | 66.85 | 156 | 18 | 1 | 2304 | 226 | 463749 | 3623 | 4718592 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 64 | a100_40gb | 50.73 | 67.64 | 158 | 18 | 1 | 1152 | 114 | 234614 | 3665 | 2359296 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 32 | a100_40gb | 51.55 | 68.73 | 160 | 18 | 1 | 576 | 58 | 119202 | 3725 | 1179648 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 16 | a100_40gb | 50.44 | 67.26 | 157 | 16 | 1 | 256 | 28 | 58322 | 3645 | 524288 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 2048 | 8 | a100_40gb | 50.92 | 67.89 | 158 | 12 | 4 | 384 | 14 | 29436 | 3679 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6658859008 | +| 7b | 1024 | 8 | a100_40gb | 51.31 | 68.42 | 160 | 24 | 4 | 768 | 30 | 30833 | 3854 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6654664704 | +| 7b | 512 | 8 | a100_40gb | 50.85 | 67.8 | 158 | 48 | 4 | 1536 | 60 | 31167 | 3895 | 786432 | bf16 | PURE | FULL_SHARD | True | False | 6652567552 | +| 3b | 32768 | 8 | a100_40gb | 46.03 | 61.37 | 143 | 1 | 4 | 32 | 0 | 23640 | 2955 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 2730480640 | +| 3b | 16384 | 8 | a100_40gb | 46.14 | 61.52 | 143 | 2 | 8 | 128 | 2 | 35726 | 4465 | 2097152 | bf16 | PURE | FULL_SHARD | True | False | 2688537600 | +| 3b | 8192 | 8 | a100_40gb | 55.13 | 55.13 | 172 | 1 | 8 | 64 | 6 | 57193 | 7149 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2667566080 | +| 3b | 4096 | 8 | a100_40gb | 56.18 | 56.18 | 175 | 2 | 8 | 128 | 17 | 70223 | 8777 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 2657080320 | +| 3b | 2048 | 128 | a100_40gb | 54.8 | 54.8 | 170 | 6 | 1 | 768 | 596 | 1220885 | 9538 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 64 | a100_40gb | 55.94 | 55.94 | 174 | 6 | 1 | 384 | 304 | 623167 | 9736 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 32 | a100_40gb | 56.96 | 56.96 | 177 | 6 | 1 | 192 | 154 | 317261 | 9914 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 16 | a100_40gb | 56.02 | 56.02 | 174 | 5 | 1 | 80 | 76 | 156013 | 9750 | 163840 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 2048 | 8 | a100_40gb | 57.82 | 57.82 | 180 | 5 | 8 | 320 | 39 | 80520 | 10065 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2651837440 | +| 3b | 1024 | 8 | a100_40gb | 58.14 | 58.14 | 181 | 10 | 8 | 640 | 83 | 85854 | 10731 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2649216000 | +| 3b | 512 | 8 | a100_40gb | 59.49 | 59.49 | 185 | 20 | 8 | 1280 | 176 | 90596 | 11324 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 2647905280 | +| 1b | 32768 | 8 | a100_40gb | 45.07 | 60.1 | 140 | 1 | 4 | 32 | 1 | 40762 | 5095 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 1378865152 | +| 1b | 16384 | 8 | a100_40gb | 55.23 | 55.23 | 172 | 1 | 8 | 64 | 4 | 77723 | 9715 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1345310720 | +| 1b | 8192 | 8 | a100_40gb | 55.29 | 55.29 | 172 | 2 | 8 | 128 | 13 | 107799 | 13474 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1328533504 | +| 1b | 4096 | 8 | a100_40gb | 55.85 | 55.85 | 174 | 4 | 8 | 256 | 32 | 134851 | 16856 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1320144896 | +| 1b | 2048 | 128 | a100_40gb | 54.41 | 54.41 | 169 | 10 | 1 | 1280 | 1165 | 2386897 | 18647 | 2621440 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 64 | a100_40gb | 55.44 | 55.44 | 172 | 10 | 1 | 640 | 593 | 1216104 | 19001 | 1310720 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 32 | a100_40gb | 45.39 | 45.39 | 141 | 10 | 1 | 320 | 243 | 497782 | 15555 | 655360 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 16 | a100_40gb | 55.69 | 55.69 | 173 | 8 | 1 | 128 | 149 | 305372 | 19085 | 262144 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 2048 | 8 | a100_40gb | 56.23 | 56.23 | 175 | 8 | 8 | 512 | 75 | 154171 | 19271 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1315950592 | +| 1b | 1024 | 8 | a100_40gb | 57.02 | 57.02 | 177 | 16 | 8 | 1024 | 163 | 167677 | 20959 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1313853440 | +| 1b | 512 | 8 | a100_40gb | 57.1 | 57.1 | 178 | 32 | 8 | 2048 | 340 | 174256 | 21782 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 1312804864 | +| 760m | 32768 | 8 | a100_40gb | 44.53 | 59.37 | 138 | 1 | 4 | 32 | 1 | 57464 | 7183 | 1048576 | bf16 | PURE | FULL_SHARD | True | False | 807656448 | +| 760m | 16384 | 8 | a100_40gb | 53.26 | 53.26 | 166 | 1 | 4 | 32 | 6 | 111316 | 13914 | 524288 | bf16 | PURE | FULL_SHARD | False | False | 782490624 | +| 760m | 8192 | 8 | a100_40gb | 53.12 | 53.12 | 165 | 3 | 4 | 96 | 19 | 160853 | 20106 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 769907712 | +| 760m | 4096 | 8 | a100_40gb | 53.0 | 53.0 | 165 | 6 | 4 | 192 | 50 | 206909 | 25863 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 763616256 | +| 760m | 2048 | 128 | a100_40gb | 50.73 | 50.73 | 158 | 12 | 1 | 1536 | 1808 | 3704382 | 28940 | 3145728 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 64 | a100_40gb | 51.44 | 51.44 | 160 | 12 | 1 | 768 | 917 | 1878030 | 29344 | 1572864 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 32 | a100_40gb | 51.97 | 51.97 | 162 | 12 | 1 | 384 | 463 | 948745 | 29648 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 16 | a100_40gb | 51.9 | 51.9 | 161 | 12 | 1 | 192 | 231 | 473723 | 29607 | 393216 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 2048 | 8 | a100_40gb | 52.89 | 52.89 | 165 | 12 | 4 | 384 | 117 | 241389 | 30173 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 760470528 | +| 760m | 1024 | 8 | a100_40gb | 53.63 | 53.63 | 167 | 24 | 4 | 768 | 261 | 267376 | 33422 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758897664 | +| 760m | 512 | 8 | a100_40gb | 53.47 | 53.47 | 166 | 48 | 4 | 1536 | 545 | 279504 | 34938 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 758111232 | +| 350m | 32768 | 8 | a100_40gb | 51.55 | 51.55 | 160 | 1 | 4 | 32 | 3 | 107329 | 13416 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 387442688 | +| 350m | 16384 | 8 | a100_40gb | 51.78 | 51.78 | 161 | 2 | 4 | 64 | 11 | 183175 | 22896 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 370665472 | +| 350m | 8192 | 8 | a100_40gb | 51.39 | 51.39 | 160 | 4 | 4 | 128 | 34 | 279466 | 34933 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 362276864 | +| 350m | 4096 | 8 | a100_40gb | 50.38 | 50.38 | 157 | 8 | 4 | 256 | 91 | 374670 | 46833 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 358082560 | +| 350m | 2048 | 128 | a100_40gb | 45.61 | 45.61 | 142 | 18 | 1 | 2304 | 3245 | 6647647 | 51934 | 4718592 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 64 | a100_40gb | 46.27 | 46.27 | 144 | 18 | 1 | 1152 | 1646 | 3372118 | 52689 | 2359296 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 32 | a100_40gb | 47.26 | 47.26 | 147 | 18 | 1 | 576 | 840 | 1721978 | 53811 | 1179648 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 16 | a100_40gb | 48.66 | 48.66 | 151 | 18 | 1 | 288 | 432 | 886622 | 55413 | 589824 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 2048 | 8 | a100_40gb | 49.17 | 49.17 | 153 | 16 | 4 | 512 | 218 | 447963 | 55995 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 355985408 | +| 350m | 1024 | 8 | a100_40gb | 48.73 | 48.73 | 152 | 32 | 4 | 1024 | 488 | 500184 | 62523 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354936832 | +| 350m | 512 | 8 | a100_40gb | 48.39 | 48.39 | 150 | 64 | 4 | 2048 | 1035 | 530277 | 66284 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 354412544 | +| 125m | 32768 | 8 | a100_40gb | 47.27 | 47.27 | 147 | 1 | 4 | 32 | 7 | 261208 | 32651 | 1048576 | bf16 | PURE | FULL_SHARD | False | False | 148904448 | +| 125m | 16384 | 8 | a100_40gb | 46.77 | 46.77 | 145 | 2 | 3 | 48 | 27 | 443876 | 55484 | 786432 | bf16 | PURE | FULL_SHARD | False | False | 136321536 | +| 125m | 8192 | 8 | a100_40gb | 46.94 | 46.94 | 146 | 5 | 3 | 120 | 84 | 694868 | 86858 | 983040 | bf16 | PURE | FULL_SHARD | False | False | 130030080 | +| 125m | 4096 | 8 | a100_40gb | 44.82 | 44.82 | 139 | 13 | 3 | 312 | 224 | 921297 | 115162 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 126884352 | +| 125m | 2048 | 128 | a100_40gb | 38.86 | 38.86 | 121 | 26 | 1 | 3328 | 7746 | 15863837 | 123936 | 6815744 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 64 | a100_40gb | 39.27 | 39.27 | 122 | 26 | 1 | 1664 | 3913 | 8015010 | 125234 | 3407872 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 32 | a100_40gb | 39.86 | 39.86 | 124 | 26 | 1 | 832 | 1986 | 4067922 | 127122 | 1703936 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 127 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 133 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | +| 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 127 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | +| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 125 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | \ No newline at end of file diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index e411f807f5..f053a6ca4e 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -158,7 +158,7 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: else: hfu_w_attn = mfu_w_attn - model_tflop = f"{float((3 * flops_per_seq + 3 * attn_flops_per_seq) * throughput / gpus): .6E}" + model_tflop = int((3 * flops_per_seq + 3 * attn_flops_per_seq) * throughput / gpus / 1e12) # New things that we're testing for image = run.image # compile_fullg = run.submitted_config.parameters['compile_config']['fullgraph'] From a17455f3e52643e2864aef162509d73fbc61f203 Mon Sep 17 00:00:00 2001 From: Vitaliy Chiley Date: Tue, 17 Oct 2023 21:13:04 -0700 Subject: [PATCH 39/41] lint & pyright --- scripts/train/benchmarking/README.md | 2 +- scripts/train/benchmarking/collect_results.py | 39 +++++--- .../train/benchmarking/submit_benchmarks.py | 93 +++++++++++-------- scripts/train/benchmarking/sweep.sh | 1 - 4 files changed, 77 insertions(+), 58 deletions(-) diff --git a/scripts/train/benchmarking/README.md b/scripts/train/benchmarking/README.md index f521b2c938..1bbf399e88 100644 --- a/scripts/train/benchmarking/README.md +++ b/scripts/train/benchmarking/README.md @@ -283,4 +283,4 @@ Our microbatching engine enables microbatch sizes that do not divde Global Batch | 125m | 2048 | 16 | a100_40gb | 40.93 | 40.93 | 127 | 26 | 1 | 416 | 1019 | 2088560 | 130535 | 851968 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | | 125m | 2048 | 8 | a100_40gb | 42.75 | 42.75 | 133 | 26 | 3 | 624 | 532 | 1090678 | 136334 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 125311488 | | 125m | 1024 | 8 | a100_40gb | 40.89 | 40.89 | 127 | 52 | 3 | 1248 | 1158 | 1186314 | 148289 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124525056 | -| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 125 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | \ No newline at end of file +| 125m | 512 | 8 | a100_40gb | 40.26 | 40.26 | 125 | 104 | 3 | 2496 | 2448 | 1253886 | 156735 | 1277952 | bf16 | PURE | FULL_SHARD | False | False | 124131840 | diff --git a/scripts/train/benchmarking/collect_results.py b/scripts/train/benchmarking/collect_results.py index f053a6ca4e..d3691e951c 100644 --- a/scripts/train/benchmarking/collect_results.py +++ b/scripts/train/benchmarking/collect_results.py @@ -5,10 +5,13 @@ import csv import math from typing import Any, Dict, List, Union -from composer.callbacks.speed_monitor import GPU_AVAILABLE_FLOPS as GPU_FLOP_DICT + +from composer.callbacks.speed_monitor import \ + GPU_AVAILABLE_FLOPS as GPU_FLOP_DICT from mcli import sdk as msdk + def str_to_bool(value: Union[bool, str]): # helper fn if isinstance(value, bool): @@ -44,9 +47,14 @@ def parse_args(): def get_runs(args: argparse.Namespace): - runs = [r for r in msdk.get_runs(include_details=True) if args.project in r.name.split('-')[0] and r.status == msdk.RunStatus("COMPLETED")] + runs = [ + r for r in msdk.get_runs(include_details=True) + if args.project in r.name.split('-')[0] and + r.status == msdk.RunStatus('COMPLETED') + ] for filter in args.filters: runs = [r for r in runs if filter in r.name] + def sort_key(r: msdk.Run): model_name = r.name.split('-')[2] num_gpu = r.gpus @@ -60,9 +68,11 @@ def sort_key(r: msdk.Run): print(model_name) raise ValueError model_size = int(model_name[:-1]) - return (gpu_type, model_precision, model_name_size, model_size, r.submitted_config.parameters['max_seq_len'], - num_gpu, r.submitted_config.parameters['global_train_batch_size']) - unique_runs = {sort_key(i):i for i in runs} + return (gpu_type, model_precision, model_name_size, model_size, + r.submitted_config.parameters['max_seq_len'], num_gpu, + r.submitted_config.parameters['global_train_batch_size']) + + unique_runs = {sort_key(i): i for i in runs} runs = [unique_runs[r] for r in unique_runs] runs.sort(reverse=True, key=sort_key) @@ -83,7 +93,7 @@ def filter_runs(runs: List[msdk.Run]): pop_runs = [] for run in runs: - if run.status != msdk.RunStatus("COMPLETED"): + if run.status != msdk.RunStatus('COMPLETED'): print(f'run {run.name} has run status {run.status}') pop_runs.append(run) for run in pop_runs: @@ -99,17 +109,19 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: gpus = run.gpus gpu_type = run.gpu_type - if 'h100'in gpu_type: + if 'h100' in gpu_type: gpu_type = 'h100-sxm' if 'a100' in gpu_type: gpu_type = 'a100' - GPU_AVAILABLE_FLOPS = GPU_FLOP_DICT[gpu_type][run.submitted_config.parameters['precision']] + GPU_AVAILABLE_FLOPS = GPU_FLOP_DICT[gpu_type][ + run.submitted_config.parameters['precision']] gpu_type = run.gpu_type fsdp_config = run.submitted_config.parameters['fsdp_config'] seq_len = run.submitted_config.parameters['max_seq_len'] - global_train_batch_size = run.submitted_config.parameters['global_train_batch_size'] + global_train_batch_size = run.submitted_config.parameters[ + 'global_train_batch_size'] activation_checkpointing = fsdp_config['activation_checkpointing'] logs = msdk.get_run_logs(run) @@ -158,12 +170,9 @@ def parse_run(run: msdk.Run) -> Dict[str, Any]: else: hfu_w_attn = mfu_w_attn - model_tflop = int((3 * flops_per_seq + 3 * attn_flops_per_seq) * throughput / gpus / 1e12) - # New things that we're testing for - image = run.image - # compile_fullg = run.submitted_config.parameters['compile_config']['fullgraph'] - # compile_dynamic = run.submitted_config.parameters['compile_config']['dynamic'] - # compile_mode = run.submitted_config.parameters['compile_config']['mode'] + model_tflop = int( + (3 * flops_per_seq + 3 * attn_flops_per_seq) * throughput / gpus / 1e12) + return { 'Model': model_name, diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 14b72f3d74..136629f6d1 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -8,7 +8,8 @@ import requests import yaml from mcli.models.run_config import SchedulingConfig -from mcli.sdk import RunConfig, create_run, get_clusters, follow_run_logs +from mcli.sdk import RunConfig, create_run, get_clusters + def _get_cluster_info(): clusters = get_clusters() @@ -35,6 +36,7 @@ def str_to_bool(value: Union[bool, str]): return True raise ValueError(f'{value} is not a valid boolean value') + def parse_args(): parser = argparse.ArgumentParser( description= @@ -183,8 +185,12 @@ def parse_args(): parser.add_argument('--priority', type=str, default='lowest') - parser.add_argument('--torch_compile_fullgraph', type=str_to_bool, default=None) - parser.add_argument('--torch_compile_dynamic', type=str_to_bool, default=None) + parser.add_argument('--torch_compile_fullgraph', + type=str_to_bool, + default=None) + parser.add_argument('--torch_compile_dynamic', + type=str_to_bool, + default=None) parser.add_argument('--torch_compile_mode', type=str, default=None) parser.add_argument('--torch_compile', type=str_to_bool, default=False) parser.add_argument('--RUN', @@ -283,8 +289,7 @@ def mod_parameters(parameters: Dict[str, Any], torch_compile_fullgraph: Optional[bool] = None, torch_compile_dynamic: Optional[bool] = None, torch_compile_mode: Optional[str] = None, - torch_compile: bool = False - ): + torch_compile: bool = False): if run_name: parameters['run_name'] = run_name if data_remote is not None: @@ -295,7 +300,8 @@ def mod_parameters(parameters: Dict[str, Any], 'data_remote'] parameters['data_local'] = '/tmp/c4' - parameters['train_loader']['dataset']['local'] = parameters['data_local'] + parameters['train_loader']['dataset']['local'] = parameters[ + 'data_local'] parameters['eval_loader']['dataset']['local'] = parameters['data_local'] else: parameters['train_loader']['dataset'][ @@ -308,7 +314,7 @@ def mod_parameters(parameters: Dict[str, Any], parameters['model']['attn_config']['attn_impl'] = args.attn_impl - parameters['model']['norm_type'] = "low_precision_layernorm" + parameters['model']['norm_type'] = 'low_precision_layernorm' # Pad vocab size to multiple of N for A100 perf if pad_vocab_multiple: @@ -338,17 +344,23 @@ def mod_parameters(parameters: Dict[str, Any], parameters['precision'] = precision parameters['fsdp_config']['mixed_precision'] = fsdp_config_mixed_precision if fsdp_config_activation_checkpointing is not None: - parameters['fsdp_config']['activation_checkpointing'] = fsdp_config_activation_checkpointing + parameters['fsdp_config'][ + 'activation_checkpointing'] = fsdp_config_activation_checkpointing if fsdp_config_shard_strategy is not None: - parameters['fsdp_config']['sharding_strategy'] = fsdp_config_shard_strategy + parameters['fsdp_config'][ + 'sharding_strategy'] = fsdp_config_shard_strategy if fsdp_config_limit_all_gathers is not None: - parameters['fsdp_config']['limit_all_gathers'] = fsdp_config_limit_all_gathers + parameters['fsdp_config'][ + 'limit_all_gathers'] = fsdp_config_limit_all_gathers if fsdp_config_forward_prefetch is not None: - parameters['fsdp_config']['forward_prefetch'] = fsdp_config_forward_prefetch + parameters['fsdp_config'][ + 'forward_prefetch'] = fsdp_config_forward_prefetch if fsdp_config_backward_prefetch is not None: - parameters['fsdp_config']['backward_prefetch'] = fsdp_config_backward_prefetch + parameters['fsdp_config'][ + 'backward_prefetch'] = fsdp_config_backward_prefetch if activation_cpu_offload is not None: - parameters['fsdp_config']['activation_cpu_offload'] = activation_cpu_offload + parameters['fsdp_config'][ + 'activation_cpu_offload'] = activation_cpu_offload # parameters['fsdp_config']['verbose'] = True parameters['compile_config'] = {} if torch_compile else None @@ -394,25 +406,23 @@ def get_integrations(project: str, def run_config(config: Tuple[str, int, int, str, str, int, str], args: argparse.Namespace): model_yaml, max_seq_len, global_train_batch_size, cluster, gpu_type, gpu_num, precision = config - integrations = [ - { - 'integration_type': 'git_repo', - 'git_repo': 'crinard/llm-foundry', - 'git_branch': 'add_attns', - 'pip_install': '-e .[gpu]', - }, { - 'integration_type': 'wandb', - 'entity': 'mosaic-ml', - 'project': args.project - } - ] - - command = "" - if 'nightly' in args.image: # Fix older composer deps. TODO: this should be removed once mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 is merged + integrations = [{ + 'integration_type': 'git_repo', + 'git_repo': 'crinard/llm-foundry', + 'git_branch': 'add_attns', + 'pip_install': '-e .[gpu]', + }, { + 'integration_type': 'wandb', + 'entity': 'mosaic-ml', + 'project': args.project + }] + + command = '' + if 'nightly' in args.image: # Fix older composer deps. TODO: this should be removed once mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 is merged command += """pip install -U git+https://github.com/mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 pip uninstall torch==2.0.1 --yes - pip install --no-cache-dir --pre --index-url https://download.pytorch.org/whl/nightly/cu121 torch==2.1.0.dev20230821+cu121""" - if gpu_type == 'h100_80gb' and 'fp8' in precision: # Required for flash-attn and FP8 training + pip install --no-cache-dir --pre --index-url https://download.pytorch.org/whl/nightly/cu121 torch==2.1.0.dev20230821+cu121""" + if gpu_type == 'h100_80gb' and 'fp8' in precision: # Required for flash-attn and FP8 training command += f""" pip install flash-attn==1.0.7 --no-build-isolation pip install git+https://github.com/NVIDIA/TransformerEngine.git@v0.10 @@ -432,7 +442,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], composer train/train.py /mnt/config/parameters.yaml """ - path = os.path.join('../yamls/pretrain', "mpt-" + model_yaml) + path = os.path.join('../yamls/pretrain', 'mpt-' + model_yaml) parameters = get_parameters(path) model_name = '-'.join(model_yaml.split('.')[-2].split('/')[-2:]).replace( @@ -455,8 +465,9 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], parameters, max_seq_len, global_train_batch_size, - "amp_" + precision, - fsdp_config_activation_checkpointing=args.fsdp_config_activation_checkpointing, + 'amp_' + precision, + fsdp_config_activation_checkpointing=args. + fsdp_config_activation_checkpointing, fsdp_config_limit_all_gathers=args.fsdp_config_limit_all_gathers, fsdp_config_shard_strategy=args.fsdp_config_shard_strategy, fsdp_config_forward_prefetch=args.fsdp_config_forward_prefetch, @@ -467,13 +478,12 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], microbatch_size=microbatch_size, wandb=args.wandb, pad_vocab_multiple=args.pad_vocab_multiple, - torch_compile_fullgraph = args.torch_compile_fullgraph, - torch_compile_dynamic = args.torch_compile_dynamic, - torch_compile_mode = args.torch_compile_mode, - torch_compile = args.torch_compile - ) - if args.torch_compile: - assert(parameters['model']['attn_config']['attn_impl'] != 'triton') + torch_compile_fullgraph=args.torch_compile_fullgraph, + torch_compile_dynamic=args.torch_compile_dynamic, + torch_compile_mode=args.torch_compile_mode, + torch_compile=args.torch_compile) + if args.torch_compile: + assert (parameters['model']['attn_config']['attn_impl'] != 'triton') if gpu_type == 'h100_80gb' and precision == 'fp8': parameters['model']['fc_type'] = 'te' # Create run config mcli sdk/api @@ -485,7 +495,8 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], integrations=integrations, command=command, parameters=parameters, - scheduling=SchedulingConfig(priority=args.priority, resumable=True)) + scheduling=SchedulingConfig(priority=args.priority, + resumable=True)) if args.RUN: # Create the run from a config run = create_run(config) diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index a1036869b8..b4821fd382 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -212,4 +212,3 @@ python submit_benchmarks.py --project $PROJECT -m 760m.yaml -g 8 --microbatch_si python submit_benchmarks.py --project $PROJECT -m 1b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN --fsdp_config_activation_checkpointing true python submit_benchmarks.py --project $PROJECT -m 3b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN python submit_benchmarks.py --project $PROJECT -m 7b.yaml -g 8 --microbatch_size 1 --accum 2 --image $IMAGE --git_commit $GIT_COMMIT --gpu_type a100_80gb --cluster $CLUSTER_80GB -s 16 16 --RUN - From a7c7567712c700e28303a10761e54706f15f976c Mon Sep 17 00:00:00 2001 From: Vitaliy Chiley Date: Wed, 18 Oct 2023 22:49:47 -0700 Subject: [PATCH 40/41] daniel review v1 --- .../train/benchmarking/submit_benchmarks.py | 33 +++++++++---------- scripts/train/benchmarking/sweep.sh | 7 ++-- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 136629f6d1..3cd3730891 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -361,7 +361,6 @@ def mod_parameters(parameters: Dict[str, Any], if activation_cpu_offload is not None: parameters['fsdp_config'][ 'activation_cpu_offload'] = activation_cpu_offload - # parameters['fsdp_config']['verbose'] = True parameters['compile_config'] = {} if torch_compile else None if wandb: @@ -406,22 +405,21 @@ def get_integrations(project: str, def run_config(config: Tuple[str, int, int, str, str, int, str], args: argparse.Namespace): model_yaml, max_seq_len, global_train_batch_size, cluster, gpu_type, gpu_num, precision = config - integrations = [{ - 'integration_type': 'git_repo', - 'git_repo': 'crinard/llm-foundry', - 'git_branch': 'add_attns', - 'pip_install': '-e .[gpu]', - }, { - 'integration_type': 'wandb', - 'entity': 'mosaic-ml', - 'project': args.project - }] + integrations = [ + { + 'integration_type': 'git_repo', + 'git_repo': 'mosaicml/llm-foundry', + 'git_branch': 'v0.3.0', + 'pip_install': '-e .[gpu]', + }, + { + 'integration_type': 'wandb', + 'entity': 'mosaic-ml', + 'project': args.project + }, + ] command = '' - if 'nightly' in args.image: # Fix older composer deps. TODO: this should be removed once mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 is merged - command += """pip install -U git+https://github.com/mvpatel2000/composer.git@784f50be7fa8617ed562704c0207316ca2284e71 - pip uninstall torch==2.0.1 --yes - pip install --no-cache-dir --pre --index-url https://download.pytorch.org/whl/nightly/cu121 torch==2.1.0.dev20230821+cu121""" if gpu_type == 'h100_80gb' and 'fp8' in precision: # Required for flash-attn and FP8 training command += f""" pip install flash-attn==1.0.7 --no-build-isolation @@ -482,8 +480,9 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], torch_compile_dynamic=args.torch_compile_dynamic, torch_compile_mode=args.torch_compile_mode, torch_compile=args.torch_compile) - if args.torch_compile: - assert (parameters['model']['attn_config']['attn_impl'] != 'triton') + if args.torch_compile and (parameters['model']['attn_config']['attn_impl'] + == 'triton'): + raise ValueError(f'Cannot use torch compile with attn_impl=triton.') if gpu_type == 'h100_80gb' and precision == 'fp8': parameters['model']['fc_type'] = 'te' # Create run config mcli sdk/api diff --git a/scripts/train/benchmarking/sweep.sh b/scripts/train/benchmarking/sweep.sh index b4821fd382..97372ee6fd 100755 --- a/scripts/train/benchmarking/sweep.sh +++ b/scripts/train/benchmarking/sweep.sh @@ -2,11 +2,8 @@ PROJECT="tput" GIT_COMMIT="v0.0.4" -IMAGE="mosaicml/pytorch:2.0.1_cu118-python3.10-ubuntu20.04" -# IMAGE="mosaicml/pytorch:2.1.0_cu121-nightly20230827-python3.10-ubuntu20.04" -CLUSTER_40GB=r1z1 -CLUSTER_80GB=r1z1 -CLUSTER_H100=r9z1 +IMAGE="mosaicml/pytorch:2.1.0_cu121-python3.10-ubuntu20.04" +CLUSTER_40GB= # TODO for PRECISION in fp8 bf16 do From 83db3f0fbb7e074a3ee973c807ee5b82ed60c4d6 Mon Sep 17 00:00:00 2001 From: Vitaliy Chiley Date: Thu, 19 Oct 2023 11:39:08 -0700 Subject: [PATCH 41/41] rm compile support in profiling --- .../train/benchmarking/submit_benchmarks.py | 59 +++++++------------ 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/scripts/train/benchmarking/submit_benchmarks.py b/scripts/train/benchmarking/submit_benchmarks.py index 3cd3730891..6530e79b0b 100644 --- a/scripts/train/benchmarking/submit_benchmarks.py +++ b/scripts/train/benchmarking/submit_benchmarks.py @@ -185,14 +185,6 @@ def parse_args(): parser.add_argument('--priority', type=str, default='lowest') - parser.add_argument('--torch_compile_fullgraph', - type=str_to_bool, - default=None) - parser.add_argument('--torch_compile_dynamic', - type=str_to_bool, - default=None) - parser.add_argument('--torch_compile_mode', type=str, default=None) - parser.add_argument('--torch_compile', type=str_to_bool, default=False) parser.add_argument('--RUN', type=str_to_bool, nargs='?', @@ -268,28 +260,26 @@ def get_valid_gpu_lim(cluster: str, gpu_type: str): raise ValueError -def mod_parameters(parameters: Dict[str, Any], - max_seq_len: int, - global_train_batch_size: int, - precision: str, - fsdp_config_mixed_precision: str = 'DEFAULT', - fsdp_config_activation_checkpointing: Optional[bool] = None, - fsdp_config_shard_strategy: Optional[str] = None, - fsdp_config_forward_prefetch: Optional[bool] = None, - fsdp_config_backward_prefetch: Optional[str] = None, - fsdp_config_limit_all_gathers: Optional[bool] = None, - activation_cpu_offload: Optional[bool] = None, - run_name: str = '', - data_remote: Optional[str] = None, - max_duration: str = '30ba', - eval_interval: int = 0, - microbatch_size: Optional[Union[int, str]] = None, - wandb: bool = True, - pad_vocab_multiple: Optional[int] = None, - torch_compile_fullgraph: Optional[bool] = None, - torch_compile_dynamic: Optional[bool] = None, - torch_compile_mode: Optional[str] = None, - torch_compile: bool = False): +def mod_parameters( + parameters: Dict[str, Any], + max_seq_len: int, + global_train_batch_size: int, + precision: str, + fsdp_config_mixed_precision: str = 'DEFAULT', + fsdp_config_activation_checkpointing: Optional[bool] = None, + fsdp_config_shard_strategy: Optional[str] = None, + fsdp_config_forward_prefetch: Optional[bool] = None, + fsdp_config_backward_prefetch: Optional[str] = None, + fsdp_config_limit_all_gathers: Optional[bool] = None, + activation_cpu_offload: Optional[bool] = None, + run_name: str = '', + data_remote: Optional[str] = None, + max_duration: str = '30ba', + eval_interval: int = 0, + microbatch_size: Optional[Union[int, str]] = None, + wandb: bool = True, + pad_vocab_multiple: Optional[int] = None, +): if run_name: parameters['run_name'] = run_name if data_remote is not None: @@ -361,7 +351,6 @@ def mod_parameters(parameters: Dict[str, Any], if activation_cpu_offload is not None: parameters['fsdp_config'][ 'activation_cpu_offload'] = activation_cpu_offload - parameters['compile_config'] = {} if torch_compile else None if wandb: # add wandb @@ -476,13 +465,7 @@ def run_config(config: Tuple[str, int, int, str, str, int, str], microbatch_size=microbatch_size, wandb=args.wandb, pad_vocab_multiple=args.pad_vocab_multiple, - torch_compile_fullgraph=args.torch_compile_fullgraph, - torch_compile_dynamic=args.torch_compile_dynamic, - torch_compile_mode=args.torch_compile_mode, - torch_compile=args.torch_compile) - if args.torch_compile and (parameters['model']['attn_config']['attn_impl'] - == 'triton'): - raise ValueError(f'Cannot use torch compile with attn_impl=triton.') + ) if gpu_type == 'h100_80gb' and precision == 'fp8': parameters['model']['fc_type'] = 'te' # Create run config mcli sdk/api