From 4bed7075e98fe9252cec2f12f2541dbdcd7c31ab Mon Sep 17 00:00:00 2001 From: Felix Dangel <48687646+f-dangel@users.noreply.github.com> Date: Wed, 1 Jan 2025 13:05:29 -0500 Subject: [PATCH] [OPT] Improve benchmark results (#163) * [REF] Increase batch sizes, update results with more efficient matvecs * [ADD] Update benchmark figures --- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...akmem_synthetic_imagenet_resnet50_cuda.pdf | Bin 82049 -> 117612 bytes ...mem_synthetic_shakespeare_nanogpt_cuda.pdf | Bin 81999 -> 81983 bytes ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- ...genet_resnet50_cuda_gradient_and_loss.json | 2 +- ...nthetic_imagenet_resnet50_cuda_matvec.json | 2 +- ...tic_imagenet_resnet50_cuda_precompute.json | 2 +- ...speare_nanogpt_cuda_gradient_and_loss.json | 2 +- ...hetic_shakespeare_nanogpt_cuda_matvec.json | 2 +- ...c_shakespeare_nanogpt_cuda_precompute.json | 2 +- .../time_synthetic_imagenet_resnet50_cuda.pdf | Bin 117860 -> 117850 bytes ...ime_synthetic_shakespeare_nanogpt_cuda.pdf | Bin 117862 -> 117863 bytes docs/examples/basic_usage/benchmark_utils.py | 8 ++++---- 69 files changed, 68 insertions(+), 68 deletions(-) diff --git a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json index 82242016..f1fdb0b9 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 2.821939468383789} \ No newline at end of file +{"peakmem": 5.408483028411865} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json index a401d29d..24c52cd0 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 8.144813060760498} \ No newline at end of file +{"peakmem": 12.137713432312012} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json index 708a2a45..824ba899 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 3.9029364585876465} \ No newline at end of file +{"peakmem": 6.572415828704834} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json index dd6092db..5a53ac79 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Empirical-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 14.977922916412354} \ No newline at end of file +{"peakmem": 18.18963098526001} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json index 82242016..f1fdb0b9 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 2.821939468383789} \ No newline at end of file +{"peakmem": 5.408483028411865} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_matvec.json index a401d29d..24c52cd0 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_imagenet_resnet50_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 8.144813060760498} \ No newline at end of file +{"peakmem": 12.137713432312012} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json index 708a2a45..824ba899 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 3.9029364585876465} \ No newline at end of file +{"peakmem": 6.572415828704834} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_matvec.json index f8cfbded..81d06578 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Generalized-Gauss-Newton_synthetic_shakespeare_nanogpt_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 14.97962474822998} \ No newline at end of file +{"peakmem": 18.191569328308105} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json index 82242016..f1fdb0b9 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 2.821939468383789} \ No newline at end of file +{"peakmem": 5.408483028411865} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_matvec.json index 81e045ca..c674187b 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_imagenet_resnet50_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 14.854530334472656} \ No newline at end of file +{"peakmem": 15.885180950164795} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json index 708a2a45..824ba899 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 3.9029364585876465} \ No newline at end of file +{"peakmem": 6.572415828704834} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_matvec.json index 5cc1d992..4a4d6de2 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Hessian_synthetic_shakespeare_nanogpt_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 23.27983283996582} \ No newline at end of file +{"peakmem": 27.734885215759277} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json index 3248b121..4b71162e 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 2.8216772079467773} \ No newline at end of file +{"peakmem": 5.4073052406311035} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_matvec.json index 5285676f..587955ec 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 3.334245204925537} \ No newline at end of file +{"peakmem": 5.881683826446533} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_precompute.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_precompute.json index 42f905b8..2c0ebd0a 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_precompute.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_imagenet_resnet50_cuda_precompute.json @@ -1 +1 @@ -{"peakmem": 3.238542079925537} \ No newline at end of file +{"peakmem": 5.785980701446533} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json index 18dd3687..7ba3ea8f 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 3.6108012199401855} \ No newline at end of file +{"peakmem": 6.280280590057373} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_matvec.json index 8055bf37..aa0e9126 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 4.11228084564209} \ No newline at end of file +{"peakmem": 6.78189754486084} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_precompute.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_precompute.json index 56d79f50..3d1aceb3 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_precompute.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC-inverse_synthetic_shakespeare_nanogpt_cuda_precompute.json @@ -1 +1 @@ -{"peakmem": 3.795565605163574} \ No newline at end of file +{"peakmem": 6.465182304382324} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json index 3248b121..4b71162e 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 2.8216772079467773} \ No newline at end of file +{"peakmem": 5.4073052406311035} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_matvec.json index 5285676f..587955ec 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 3.334245204925537} \ No newline at end of file +{"peakmem": 5.881683826446533} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_precompute.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_precompute.json index 42f905b8..2c0ebd0a 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_precompute.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_imagenet_resnet50_cuda_precompute.json @@ -1 +1 @@ -{"peakmem": 3.238542079925537} \ No newline at end of file +{"peakmem": 5.785980701446533} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json index 18dd3687..7ba3ea8f 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 3.6108012199401855} \ No newline at end of file +{"peakmem": 6.280280590057373} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_matvec.json index 8055bf37..aa0e9126 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 4.11228084564209} \ No newline at end of file +{"peakmem": 6.78189754486084} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_precompute.json b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_precompute.json index 56d79f50..3d1aceb3 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_precompute.json +++ b/docs/examples/basic_usage/benchmark/peakmem_KFAC_synthetic_shakespeare_nanogpt_cuda_precompute.json @@ -1 +1 @@ -{"peakmem": 3.795565605163574} \ No newline at end of file +{"peakmem": 6.465182304382324} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json index 82242016..f1fdb0b9 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 2.821939468383789} \ No newline at end of file +{"peakmem": 5.408483028411865} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json index 6de957a2..36a518e5 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_imagenet_resnet50_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 8.144932270050049} \ No newline at end of file +{"peakmem": 12.137951850891113} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json index 708a2a45..824ba899 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_gradient_and_loss.json @@ -1 +1 @@ -{"peakmem": 3.9029364585876465} \ No newline at end of file +{"peakmem": 6.572415828704834} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json index c058e053..fc159dcf 100644 --- a/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json +++ b/docs/examples/basic_usage/benchmark/peakmem_Monte-Carlo-Fisher_synthetic_shakespeare_nanogpt_cuda_matvec.json @@ -1 +1 @@ -{"peakmem": 15.361834049224854} \ No newline at end of file +{"peakmem": 18.95720911026001} \ No newline at end of file diff --git a/docs/examples/basic_usage/benchmark/peakmem_synthetic_imagenet_resnet50_cuda.pdf b/docs/examples/basic_usage/benchmark/peakmem_synthetic_imagenet_resnet50_cuda.pdf index 6df48312f2cbd0a8717e070bf9eba2f713d0fbf2..25c3b09d4f629d88abced075e43e9ac6edb7e264 100644 GIT binary patch delta 37442 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%0AR|8T6ZkqpA|* z=smvq3S9+<2o9{T4IINdd%rY;ALoVxDxEf+7h^6HJ~I^yaQp&t>W&-OOzV-V*I0Fb zUy0J;4f2?2%&laFRHD@HX|YLqJzrdJ^NBi5`&7;2+ou;tybVx*dx?oJO4x+s_Ng<3 zXF>g(A4SrDE^=*w04kuwoLcGL05=0NZIqIPltM;ZLaL$%hDejtXD5l-n^ZYn}0asycBA~Xw3Y_qlkGOf(?*u+JS)WIGNL+U7 z=T!%UNq~fc9m;14PFf+Bd$|v>D71>lX-!0wWP<_gBw;d}*AEaom({7X-Li4!D$cWF zvnl`=d6(_t?jmD>?W{ncRWqrB*%`D8omnk@KN1=cGjYq zX}0G0BisKaJng6Buu`i76e)IsIAZMb>OL~C|NWz9#CMGc7N{%dBZ6spn9K6U6#p}y z6p%(9-1ObQQrdh0TabE^oivn|XY<(IBt1jtA9zbza6G}1tPsGcL;1L#NrNXPCv+W5 zQXwgEWr(SPKLV`@E=YG%k))P?$iw%YXniZc67{%i^7LYnLCe>lynRNi`b!rjyz zK5s72D=x&Qr$!CW6+$GcCM$nx9nz1_lz3W12~QFvt|DFT|#74qFf z(k{0Bzxtv)1+Ztzo&_4z%3W?%r~chWp%Ppe^BU?7uX~+E1p_dOXip zmzcu%U-fRVw(E%V(iCQYZ&|2E|I;&4kQp0zQAJv1ia~L04q?2eES5nvWP_p14`Q`~ zFqTbskJwAgJ+JuBaFjMEgfyFYH$e~8D%EW*)F>lorlUq$pz#~Stye^{i8f#zmflO3 zFxl0II_}`gk01fLqj1{d<*wKPtWiMlE9U3%T9itR-FRNw+#vdYaE8?Fex0l4O|%Zb zZS(mP1Gcvg3PpeINk}{u{B~@-vUY+N;({#{>b9wp7_%IXy+vEJ$D&`>zv+&F&`g*q zLyz=;v+h~CjB87*$gSak?~#0KW&YHEq{&}Fm!Q?}jd@$|+s~?`d}Ct|4Wn#`^gsGf z2M`+JlwZAF$^wah?TTACYr(HXo49{AK73e}wabf}u8_K~RgDPlQ?xWTDsSTHQFZG; z_mC(9kX0JNwMVpd|MUWms)e*jy@ue|0y;my;pnmAV}kH}a^qksqUd`FN;xz36=}A& zq01BxaDEgF_fRD*q6lZL2o_c843Qw}eA4HFL35;U!OOsOu8&$fo{R)VmkDS=h(`}3i-2Po}BV(D9*)|NDIxz9Xp-%9D0V%>p!J93oh6-kL|oDEE-f6>6!=&7VQ15w1QYe^4^ zJVbBHKi$WFuctwL@a8=)J%hdVC;+sxGLGCLJE9_<4Dw%%t(SwEg1{;5cGRx_?0x9n zFWxdFp=I3}3`0uwy?$}SlUp9vbm+okACQ#35*`Xq&KT%!MJhl}Uq62Q6GiiLWh2IW z(F*2GUxIgJ?s8^I^qt7Zc5W0f9Y>;5N0pl*ZVHNSKVJAs zYZSPg?6K{0PhlnTT90R7oAXnxnR9fcd+p10j$m*)c8IBXF?t@ut`JJH9jAT{!q=L- z?Ai$QI7m?WZYZJegKUmi{7Vq40^5XI7RpV3Uj?9k5H7*FV%DA$JZ|ttr#uwxfkB_$ zz=Hd=OsVzG2^PA*!ryBi&*P{r0jyhIgmJxFqjfM^GfCLk9sqe0jKNmB{EAg?O^oy6#=V*wl8VtZc$GLHAk5O&xl12 z`ez&%IC;xCc3kyao)cx2+4b{m-?sO3hfGw>>MlP^QFFHOhZBx^hx!O$$twwB=IT~6OEeh`z;i*S%|DvMN}7v@qipC^GA z%Bm1KOpAROC0gCv4HqUfI6LACW5^}t<>oH-cJ90o> z3%dNWu#egFg$3K9A-FWq#Yps6O6IEoqijx6-r4yaP!NiBWvV-~aWROhztI|vVePFB zykjtH{s^T*EG)Cik(kT3HP`tGOb~KNgT1$oNQ$z9{t3v}=z1?^CVL@N!1G{#hxaL4 zWvGmQjqT+hmKAQlTYX}oAJ(Ige|+}29ExUHK~S@OGB>Em`<1=7XM13g_jbGso|TLB zd>)B!5Ry(VU#YvVClhU3wHK)w#P?^~(^nc)&(PkUoA7BN zLLVrIhoSEY&D+hEHFwvJ4GUPO`=?ch`1qrfKw^C4U+iN%Fu zY8~~$B3WzdABg2i_L95TK~@TLGJq!IT1J#8LeG9jHMN({(7YcSVi|H1`- zwL2{BX)wl%vGbLRv(M(ON(&_`wO`yQH4dkN^iOn0iheO}Iz#vrer33v75WyIIh#PJ z=m<2q6J*c2%~tMud{Bj~O?2+xgAA=_PLiBA%ocp;&dZPMZp9#k@tPH^UtZUxCh4%p zMvQr_klhz?!Ai_E8MJ*$6Aa6rJ7*_s%!@V=yg$M! zYSQ6SSr+4Tv@D>rcmQAw2&Pn;5;uo&Zp8ykvzZ5hR4|~5!{vu_9!f1BjhEvUJP{7c z>>yG_GxR0Y5<81$(6zSaXyS5za;g#OAvpSHXI3Lf9WTwwR|p?)0H6jk`Ulw2?e*ix zj(sn~33}PaHlj1g>o!ZfRCxBq&PTnv2aBz={6P(bwk48)>EpLL#gAToFKF#KiJE7=bMqn`(!7*H;sz~9HS*c~o^;qYdreyQBN zbP-^-Di*wQDkNa%4D0e9RW^#&ISg+V7D@F4;5&|gv%by#$euj>D}feGhV)5@GPd1e zrC87~kP>gyrn9m%+JzZwlgW&HnqGA0Z>(F3m-jk}O02JJL*tF{OPfZ?LnL z!-|_ATiKcLv$gNB+-~UelV{Wyh4fZv~t=8vaSY_e#{E+;4YQ^doB~1 zy{T&F4Z81M$*18EEA2c`@?E9f4^gNvH4vutSCiUD>Xhh5kFgMcsfju=sr!QLaXcnr>l&QHh%;L^-yRsFkC)Rh!DRR4A9#g|KWKl(bhR7RDhuXD7rt}ot*r6Y3 zDqy|H{q6B`Rx1r>fitL_DFL|rib~$5Tq9-v#_PlVCzItkAtkMA1X5)=vgJQ9$_)~N zhvV&@n9Nl?J^Oeh{%=bajOUAcmW%eBXgXjq(AW3UZ-5^BIM&)znSs-D<3-jArzaX< z0mqI7K0d^MT&=@_#~Jv`5+;K^YhH8V#yR+i&XPM2kq>dB{^1r}7|i$*Gg$&#);QQ| zjWyXm!UDB2@9y37@&6n6+>0<9$G{y#SRio(^=?=hXZ&wq!o9E|=!K-4xiNm`O&91^ z%G}hjH(512?FCor2B&zm9R-+-m#BsQ)#s{#H)G^~g6S&JHk=9IT^IxYXD!BW%lZY^D53|RjjPLvsUmkh=T|0zKOC$)A3m;$@?&D0_0H|YE*qtGtOw1H6JmAm zks?rDpp8p|4F)4CRdT#rRKE)9>r!W29mTSLJ^jo47+{fhQ)qdAOEYSN_8M;UJDWQi zbq9Sg_la1vkrzS|69TOqE0*?=8ojGx0V+Y1zrH7_8F?liP^V(FdNbI91^ndhz!HZo z&k3=EOjR@U39s!uQv|=ykIQ^}VoN-;iv zKog6n#5<_n&>4ZF%^KB|}lE=(Z55Ak%YH1b3 z(Ymbt5l;e^>&#TAel*CbR0LiLwxTgh;d4A*^tSUfaEf%*!B47&&<~~I7Wu$`?tSc} ziFe=(($=A~Cc)V6%<(zm@?pD-yfeA{$-H>#d`6Wt)AJyLfe?-v-CV|)0EKIhbagVb z^=i^^1S#Y&n+(XvKS55#@qA>ZZIN>k;r&%WFS{ZQQz`)G@I?B)FjW0=)w3{rIujh%VwM%gcqYR+B!c*_S4)GfX4e& zj#25{DI_EN$*XDA0R4^|Y-YS=PhJ1oj9h=9*dgFX)L#pVC31G;O4f6NSid2MvY zCGsL977eAXA&?#%78oE1D*h5EmwXrRV0xyZdvLV1W_+fv5q$Xh-62SSwW^;+=R-g+ zjNh-m{4*PB+$_mYjlP9N+|WTxTgLvr_`74A!?DmcW@-yA%n0Hm^v zzcL&7LtJ@zvg{3QP9{&s{OOTc+5Q$YG(0GGF@2}wF#WC^No!pWe91MQG6}DNwau6X zi?ml7&_{3?RJEeeZhr#(dZa^(Nw?QlN3JAi`7YpOo*P=_D{eS{&tQI$8?LSxtBP$Y zeZV?AL=wysD#hB8NdqDZwnpMeh}xGi6;QapwMQP&*1^Rsa!c5+PfNVz2|ghyw~*<@ z|88^F`*X_cHf1w+4vr7DsJZRm7CHg0?#HLxQTn#~j$eA6AL=D?gtpg3BVABBbbJ;9 z%~i0#i1v@5dlv?Ox+(bWgSXro(=Vys{q|vmdFKt zg#B(79J=vfuRxl9a~coDwkIH7&x0$6n0pencage;K^HYCZ&8FyPq^FLB+wixoe`jk z3+Lw*EHQ1#n_zo!npkCwPV&;qjDtP;rR!#;bXp2AE3U79JC#y9rb45gYaNgB6{=(V zPy^+;*NO1?XprZ%6ksy0Cvqd_e%+BM9O#EYF3=qfu_poowu}>#F-V=a*vJorCmTt3 zJ1|0pX?E;XcfwIGeBW1;`L(l-%a~*bni&y^Nb*8*w1)$48-!_AX4F`^Qk3l4nf2Z= z3hy=gPHgFaFy<9f`3v|@vQaAt;`n230vbPY29hW=%xl&-K|+4{Y_a!K0rm#0gsA%F zio#Y)L!gN2agmo8QB#;?cde!}d4<8q^{4Le44fA8D+Av}OE=~#-PS6wV+R2e1P#h;(FQ?^u426Lbd_()X!BTb247yEgo)x#4< z5Gdi7UGGb%ape2ZHO|P0rTtUHkUvc%iCu|Td)Ed;!c+GLvw62PgW;-#gt}%aLgwpM zn`VW7w#A(M9w1S?@0)oN8(#tA@zQg3!q7l(Y46UgjqhdDm#SkGPhUIAC0>Z;$#@u+ zzmg!{Q&Za;>AW0bEhe%J!DNRgX+eyBq;~R!`BEu}%s4OGdE3*P!_xDt&1qUYY zRu-!G(5Vj~nKZRT(Lhl8MK|+!JElLNM@-0n!(h4ILjzAKS)0ifML2Y*+Tj5AX=;UN zQhhRhPvSx;&su_9A6Q_-U;1{bY z87fmD?3&k(#X8U;#4Pd=pr5Gb;7tb2Ok45Q-vnd#_KPAwm1k`wO2&Aw0E6>%edV<`h^s5bda$wKj?I{Q%LtMDO7XPlaj1y6sa zgw1og$+HKxod*q@6e_1%I~OIF6c`g#6Qs6`2iiO*T?}xPRK}=B|MHQ3dxge-!;RT+ z10f}=*~~4cMdZV!=a!HAeN^@Sn@^0j6=!RRE^~|PU8BHH#8-{=mU$C1b=gMQX&l7Z zJ7P?YrBej^{RRhxJiE_Auq(^D?gF3b^dkSv*z#qt_mnLvfs4vCbgTTMd=57hfpgg^ zSdjfk%Mtbwa^7w)>*;%Zl%=?T-U9|(6Krw~T2vg;4SZh+7&Vp1<^%ROY@T!29QQ^a z&G~B#1cJP!{dSa_K(2TBBhi>laM^h*fqUTY*x@-3gp?Zi8+@?ms80R@s{Qh7(Orgy zjUICrYE)SfHtOz?6Zg3Sp_W;Iv)c4xe`{`kw_JP0chBYDxV?a zSj9f7JG>$*m(R)eJzJr&s`NmTuPnY?I%QPo&O2D7mA*Xm+xj(z+|;=;0<`xI9;V4* zk+9#j?6dz6S555GeJn+*?3?DnZ$df~8T(8a0F@iE3xbx2?}?1|5mMqNzKB(en*^CR zShg9`n-N0j(!`Z*f?TM77vIv^r1ASYmwe;(q8!`(@sV{nt$k=<XO$$0K0X7Lrb==E0=5Ip0@zfs&nWQ z!9jj(k$--h0OQQi^|h1VSOK7p6B*vhphjoeCBjbVIVbI~pD&*Y8Khc% zS{7{Knf%uqEYk6RCP*6kaenK{kFmel?`WeNs%VQHBYCI7oozPd*TKT7O~HL_`I zc4Wc6&#@soF?r#0Xy<6-8}hgM;H^}VO(GZ$ukkU3uO{lu$H4b7FXD{-IIo}JgZy&{ z_PemC4zcVF_qFeO_i^BhyhX{c&Lw_nD%n0&PCg@- z_ZU^w?C(6OyGOYStS}VVH=u5dye=WRO6;%_N%^Pr zU^^`|`e5!vuV%5Pxx9nt;H6XT92R!%SozP-Ar?Ca&W*ebJ_}3{JdZfW9jsn#uc4$W z6UAnbQRm_Omd<0OC1?%I`C-FC<3%83B-SZ)Imp_7R!N*FswZrgP|+mp-&Hur`%;xM z&Br#BiyN3B?O(mlfK%2;Cb9}DB*jWTO|mDtaF~e)Dqts~^y|n*EQ)~$(ImfnL9Gbhd^s!kJY70DR(gE4-8-nIf9UkdvO(1GdRk@0Mh_qWSM_K#x` zXrE8*z`F!#Ov3%Slo$&Wn7?S(U~q+qnMdkPyQs@vonPw#Xp^zN4ywzy)_2Nj$Y3Xt zyxue+`!YI}OXAq#jeM;)b>dFWz--qG=j7@(IsQCLqE%yZh{h8`2ol*pQAXXlOJ zW1cExnShB9HI_V?P3)iFEN39sgKy_Tcw2C@`mIDz5+&{4((vvnY>_gD{Vd{bWNH`r zZPBv6#IaLIs+&8j$3UtlY{#6_TZ8L!0CBmVL?&kRor4{VXcLKkpAzu zq$&~_{x;nP4*MKg0t>d?KAEK>2~xT_WWphpa5W!YS`%-G!!Tfxii*GVXzwGW-QN0f z#1$6Go!`p5@2!dYsofEad7S$xWkC?hy zkqFRmf-gEz7*)vntX9O$2ca2%Dplz7u*-E_5u2Eysdi<4Si5-gV{NsmoO);GiWcPT z{@uiDJeYNPWpTDCfT$RuV|PcW2MTs@k2eC_yu`f`ih-@Y;F_KuozA` zz_`0VY$ z-xWhY(k+)W*B+gJmD)|k2(Q}!5I^gDqcRS5=1#!ug0j7N+A{VnpO?4f-=`-N zhCT?3+p&zkchtgFY9GNkVmMSnf{)%LrshM=1T>-M1~0l#ah3OP!|*0I6Su`j=k`jw z0g44Ka_!j7VlJ;BSm)z)rzR2?I9>ojMtQk=p*o=%mUa*WnIPJKIbF~vuLBd-Ha*ft zC@8HbFcx>}i#|Vx7F>1lsJ*~Tbm^ImIb_r{LiDk?JB{JcXTZSk9io8wD%MQI?6Q;g zWG)xj{3>8wvzMTMpTvuPpWTeDWUFg=l8q4ki_Uh8$1fCELJ}cOcUY@h8sT0>hmhuG zNEF_qNz4rxQ_Q2dUy?W;7V>_FCdA$wz4m~{0a3#EA=*6wMz~ysE|z1YdizKzZxY)l zrp@n!Rm1Qbi&Vnk1xTAGbJJ4YHgptK%jv~ArBkL;-|pIfZN_I28ZHg4TRfEie-Q`W z4lB9BE?CKsO1V(!O#vSN>Zrjsj^EvFW%uX=di|Q`##n>f0cQOV38X0}XihM8HTcjH zYCp8ZjAEI%XRWZkOR{wqTIt>MItLJ}3peeHCA7q_I{lzPYyctXP?TZs4(OStPi zY)`mgEm7uw48u@kW(m0?V4LdAG^Jp6AuRH-p1|M>W)KaT2D(-dtnQr;0m71EQ(5hT zf~At0l?5S%%z$${TiRcDLv>M~-#XQHbygdMAR(9$GOA^gtSIIaz)z$E-2`4s(SiA zs?m^=#>r8sn}Sg=k2R=SOs%PKx}#Ks%5LyETgwelO?#e< z+yg6reDG&)Cq%k{SUS`2{<`)ASSsVWnjG?h;@vDq$@*OC8Frm_T*lF-c90ev&a#l7KMnZ@m#IjT*EktTY38r?!J1NT!jp*OQV4R;0T04cKaX2L>?gPFJ_D5Cg!>wQ z;mRbKGml&i&9A+e1;ZF|)%2~n4tkb5(ZPfOcqC$1SxBwTk5zA|ymK3hR}HIE@n?2?hbAOFT})^Qdl z#hHTSwfAR&tVxi^d@67dWp|ofAI)P}X!6>sO8%Wsa!N5H8DQncWOV2*OQz*v)MFCX zbY;}gVaRMb!oxQ+JC8n%<*Cs)axQs^g$G?xqM3GAj_ox8&}obU_O@<&v&lezFrMAg z6t$!i#GAH~F#W}(=|A8cWBy~Yf1aSHdhRP4`(0BfT)DR@g21P!J-5AIj&#aw;E%GG zlco7g&m%aZtLde6;!Z=Hdau$`Ez(U;B5>dAX5)vVH`J@~_^)H7*Vm*ktT8Q-Dk13l zr8jW?=MT7Ir(8+_!f^S+kPL8tuHK9cGmkXJPYr3~jqmsKWV(3LdlB9v=`NPOE}%x4 zeVwzPi7Capi{c}qEN3)=Kp^gqRv`8bROi+$veZ!*w=*w2DJx|MNL&?fkU9(HW{<<078lAD4x;@=`wG6})evrqY zA+EGvKtCSkpFtZ`G9?AcgrSJuBsJ*eR(+LfzR)7J1zULXEh-&7`0$E0vK(W0vetdM zPPxjJQE{YfD_xr$0xipl6GigzZTePT`7JH1QKiDRA%E93=|OFOM+Q%RDw9=z!~3LSKrz0!sswK} zd(-9%>z1^5W9wdj>ub#Qmc)fsa)WH%aU`L*!S*Hsm0!CrJ@pd zJ(!9R9Bd|2{2@;=bON4i&EXtYR9EzvFylV_mtIoXQ%M+RyH_5a)fN+dp*egJs$XF+ zYDoCGJ~x7C4>S}N*7EKnJp$%n#{xZYMO8MaLxQH-VF4P8n%o}^6m2s))$y6-Aq71` z^ya}~_7u~9Q56-~!q6Vi7rfs4e7}D1qOKGB+#hae+LTCgz0>(SjuMh?Hv90s#Vfy$ z@l}pd`{s$Q*ca**Hqa%FrMGu!Mx#V%=7JeRZX9qR{Ws2=-{^i-2KG z@W@+bKk%z7>2h_y$X08rZocJ-bhh(bhokZEWQjF@;1E(l+lNC6Df{7L}ZKG{ZWg4FfTIh^sD))SC*iDc6|tD>6b8eA%j|kOv%|VQs%Ch#S$2^n*-B`OrvxWZV>r#=W{MJ**afYB zMGkWiqsJRQEKtw}7_Lfg_c4lSR2F7ge!qeQEIm9FJLqOr1)JcD+z1|9mwyfm#3_){ z*Jny%D6||ZnrK?i^N)XI+H*G8-itTGuKn6_;nm$UY>^~ifvy;nmLRWo%=;U1tqGtn9%FbOgEGa(Fs^-tyUA-gKotDuG z?~>kLp)M3D+bS{cPQYke3pP}y?k-~Zvq2{QU!NtL|2g?*Vh1%@HRKAuNV7upY5d&~%p~`qI zhxivcEt!ay3_9zL7ouL^5SoX7Q&*xIcux28uj840WJ~EXQI68Gm$S#J0j^v{i2FJj zGu}fFQ`vT>Eqa_e3>Ugf@d}Jqk0v@Xq4X`H-UE9s3e&g>zE^mLvFx{PrUn!Q4Vvf% zPL>|w!gRLTIE#x|u1(ceAJey$kjl5pGS=q&tNwQys=)w1D?~*dyjTE#{-bO`BESgp z+AY2+qFPJCJLV=qm?9c=(4>4sge*Q=hi;SNw0)+iVA9NQa`}7dTj~VD6gXLx7QZ|y z&=mPDg!?51SjS&`N1B1>Jyhn)n<8#=2+n#MLSH{ycU*6ikur;mw_shVhTlieC%?b&v6QN@BJ5#_(;^0S9*#nxQOklM(rZhEFSV z68hwf(keITHq9Ov`3(ubj*ncf=CDYD)(NWfeijG$6Lp5!vS#>yi5Ya%{DSPRGdb=S zT98{QRAbduA*z>`aOZ(3-*1;a+Ujhz#qQeHVGx8#hAdsIMh2(i@lnvVirI4B95^}K zwU^K}p>Vl+=FJoYw%AkP009NL?W&6_!gLnsQYKxoH{-+Z5kCGR32}4c9RFTJ7n=w= z($|1e#H$be{6YbL7MWrE|0~RPI6xf7exB8~@<%4sESUxhZzpMt8#K7JTmUII^1|Cu zSOD$(X=|-c6eg!G68>`Fx+>boRlhlV#-KvFhv9}rd5B!85KyOSFxKP$=`hMh5w$=r zenwPK6QlHg2{zyBMCGhwHYQH zR-?KY-5kfNl#J2r zI4XrGFL~jALYo`b#MRC%tC7TBnu7$NjA2cGS3O%UxA2^c8Y0T;3~0Z$ARltma#3fK z*pcP~JzsqE+it?uoC3-~!8oZcBR?A=OE^p&NtaLZMdcn$ip{J;gTcven22=Jk;IWH}*9`~;l71@%V?6Q+JLXxbH?*H?7KKI@KId9H&zUN%ub1mo1d2?Mqg(8i%etwN^ zA5i7PJw2WEv)w8bGH6h0BflEVad=EliQ<^VUJ+l`*Pq1%!<)2qZL`FM4n&nBLbt~ zPX#A)snMft45`%_Jda3G z?5G<3>j9oFsC#Xlc|B2Y^W}!?DhC}{(0~}7C2z%6Fp^4W=!;P5p={*>(=iW&y`XYe z(g~IFXDf;E8EWxQ z0Z!cPz@^;D)449oYZo1(M6emZ65H+?tSa)kmo_Bex%c^KP=nOjM+qfsqWh7c0f@uD zE4;y-G)uS2k!(O9b(4V0^s4$^?IX*HcK1`nmISZwFvw|k&*kW_z6s+uzg2DBAQlMF zDuOv?rlhGi`o5MwjYxR^q)LgwOFbC;Dw@hj>G|c-rq?*SZHhic$9%>J;A@EZ>zXA# z&GX6W2^#+MgnZulphaifZ+O#(GeDe=*}_t6_2sUNi%vYU6Y6fZp~saA(RN4==ySe# zflbqfOH6jToDB?H>hFp{(1!sX(Ofl)1q|78gUc0I#@eWvu{=LEJ}27;*U$}bF2;W) z*QGsejM(lKbb4YHOUyJPv;8z-MAn@~jh?81=uRy9tLGO+puKXg>o^zpzXiS@W4QGf z8g=xwY`LF67jw-Mqs%yt(-I1LO75-X%GlUAMsQxHD14W1_sKmkC@gu)j8E9Z?S*%! zd!xii;g^@L4)aW^ehsDEN<-O{SF`G>ngi(Tit-`;E(mK|kmtK0=6VgxSQo^?_%g0ZWT$8{R1*=FeHN45heCVh{RP(A4 zChG7vGMz!)_^wvh)|Pb{=dKz4L!Vl?ktpmh-|fZsgTIKC@gr&_We{L9R$ctLL##3N zc57l&enotS_6zb5Yj*mb)q%A(%|qmlab94T6#vb8lx3uOrU$vR7TyZf`=La&j?a|s z?Zk>p^E~9M9Gn}8mjlb>!Y*8RA4&H{gP3@=zV9xU?NLocRoqsTVRtf@fe{yzHHA(8 zq^_O!lmx2E>$$gp>tO-FrJJ1)fl8gf{RT7?RKz0nJh10mlqXd#HwJsdSz(rFXN2C+ZVJ3m6w5m#VS5p-}OfA%cE^&6R9i$aLjYtN@E zEe%53vn!PT*01zEXBV{By>c!JztT;WI`09@jK0F@X4dnhaLv60QhD$8DSc5p-jwJ| zH!0a`?k{Nxb*rKYW;9D*9DUSW>FD`3Q9R;jpB^ZcHIJewTLwC$b?Td$m{5tWW?IG z(~m4o$hV&VdIvo1E!Oqg4+CmZsycNhpI)vf>FFS^=70wPG;awvu#9V=5tl*; z+jH7zs1k9$ z&f6gvEAggW8<;BlGOaA%x7GGrnR9MvL(UHl2WHoR0=B}R2)=+pS>?QrYl(^Lh(3Jk zZ1KAz#-*Vg7hE-EBY&Dg7Jt}gnQEQ9*$Pc(dhmgIIj+N;pYXbtVN!LBcQ4?o zhMlFpE#n93yIbu<6H1)Acl~XMZtnNL?q${WQJR)>LrL z!8f(Q$0}KwM|u%09f6>+%l^3iMcL4oH_Ul2sM=SJc&Ai22`SXtij0`JX%Ui2VCwPo z%i@;~Shel%fcBA^$CZK(UcWT&CJ~QBN2OB)fLl!r&m5vs7Y8M;)KxrWF{GPnC=RqZ zC|PkF^O(E(Q_yZMd7%)R61Qi~R8n^23UNW&39+P2uQn%cJPM5vZ-??$hln)O8V-52 zdRPe%6Xg$b>9nj<<_NRK-$h0nzZr&>jsDf6S&RqD*@#V#Z7Xl5DIg#L7#s6>xIqjR z&@cRjDPd9hl)bI^lCSPH>@Xc6=ymILgm}lLrzvS)#6hd?{ZEZePPGq_ylfS;SH5ma ziAq|OYWl?;jFJpBCj?pV>6e9cS;?9pKRkBLT9l#rwuinN`GW`5Hv5=zjeeliKJ2d* zA?$%d<2P`p$DOd7j|yFnO`RFW5tyg_8$cH9tVSc`Z4JvwObG)YKgTJ;%Dc3WJ9zxo zfImq@Iah;kL?UK_JT1pc`N0Qs<6uQFp%q7^qw~a^TW`o+6N4N!^3m)Y&Rupd5LvBD zS=zl&)%vQr66_SCXYOT6Rh^eL$IWsmZ$DPGJ3dhTATppoyeQsMZ*5?Ph+@m81I%(9 zbc!XK{oox176zF%$j51lFNe75akYK1N5U22X6 znUrK!f6nf6FAn=^Nm8^=?UF&l?Hl1k56G=iL(LMu+}QJxz0TnoKP)bD`=k>(>#`bd zni5(cm&infA&gD)Otr@Egc*adYqAz(seYH`q~?zAy<$`BVWe`HD2`4rY8sI*(s6xk zxlS>Zvelql^N>5&;x#}MCDu53^h^Q3776<559w0&ipyp5D||^d8q$~BBm6AhoCVCHFYIf@^2FF(_1}c(W6jC9>+fZP4wMoHssxgig z=4;W(OhdjQ3KR`r^Iy6W^qwZzhekOvckG4Kl$YOAu0@KtY$?94~#?fwd|Q+R_X$4(rso?AF-GpH=H(Pu;ASY z){l+u>}^`b8G20Of;UvXGn$m#9ZUo;=?@MkxXyW`LXPHx>d7?2edFxxpG3g$^hMq0 zm-ly^f063mUfjn1!cmBnFYk8UGNCQU^+KH9px-qvd2%R!4r#Y?kYXIyTC#ZNB`y`{Xp&TLl3+N=Fb(c@(T1iWoV;_da_ zav2nwuc)J(G8$;XbXzqD>NM(9?UZ2lyD7Bityd6B~f3JVfmo7nMwGj|F>hFD7Z8!vu`CkzUIivY@3A724 zOP^K(MG3*-2qX*!mxiIlU@$T9f3OALa(1DIK@jrk(aIoc01lT&W6v0W4~Q3p{`Y)_ z$)V4ve~*7)@<_ygVQ3`$zcIQ0=N$UXi+}R{mgVIj=`t!HVG0ZknQp2A5(O}SXr9^f zcRc>3iA2L;=s(#INclf3hQSc>us`{bXaw>sJ^$j9$G}nl@dEficVS30`p*!+keD-@ z|4SKx{^Jrj9EJRynSWn`MVz_&Cng8~SNLfEjy*;Wl@3=0U6hlD$QpZl`$NvooIMCx joR^C?1aU_4pV#5%Z-2}G?`*>1=(C*Bi->3$YSaG@f0=Il delta 1890 zcmZutX;4##7Vc#W2^xt;!9q)HSwsxx-mEMWgaSbnp)3kjP!=IzB&>mok2?tRq%47i z_6mqWs}Mi}2rVsJYbleYg-Wop1dzlE0s>-KR776!^>sQU@BBLFn{&SJJKyYAsEiEV z1_1yc_u`t+4LhFIt3I{Aa!tLkXxx^Qizk-49>lt1FLuNi|B|rJ4y`;jF8%VB#o*IG zJuS2IhJ?WmS$+FO&{?vwAsr+Ksw;ZDXA2uJr zen%u(h(#VO*V|R?k4!C!dCsgS<^wlgux|}poeRgC+4NehI+kWC1np5NR`$3?s&4y! zHJe)UxVj)IhsmFrN){M8DDadQOA!`HCs6Od9qfYE)+Fj0P(wZBi`sW>o^^X|| zFYWxvK|i?Xy*i_)dE##_Ht{a@dPuSHTzjGFy1|$-{T#il`$7P#g^kwyBs*L)m9_+) z=eYRy{TSgjk8x==kOj5H3@%PQ8ed5;%4vEv*gHAJ=hft8!s@&H;4NUa{KZJwgD#wg zWURv+@(klMEfuM$`T7s@BZ{TyW^CJ3isz{iIOw*K(c;9>C$-&^er@T2K9}GBT;?ym z%`(g1-Cq=T+I$Z-Y(d60JAHj%_RjQ+vIpnVlI%|%;9_@vX;alCQ+WDs@M3;@-2REO zjZ>AQD)Lx|3FtTSW509jEB6hZtdYv8lcKrCY$>3pFV!YhS4w%U?JNsGo{eobb#H_VY z{if>V)0)BDoOFuQ#5Z%w#u{|3<=)eoKC@OYLoe>Jw!Z#tAQvJZ`Nbr(SrvPBafhQ> zu}tws{9-yTopR6A7e9K|P=rhGl=92y6R|FOYr5$Sr!MRGo3aYeHZVPrKkk;*lc3RF z*Mea!r&!mE6-ClBlmc{NnpPOk`!2O%@|oJIk9F0Bgxs~d5mhuG;*_wS7oNEP<5 z!CD-UeaK-cS**Lz3<46Pg@aXs?Q450)?XVJb_r^4=CYF`PMo}RsPi1MIMPiKbr%a* z-kAl!06m~EKP@S#FL!|5KcA=JoywLBSS`_?;` z{sUFed*P1_pHqbD!W~;60*Sy4i@|_okR;Sb?QO~|GSm_}qiuzEg%`9yn$W43F5HLN z)s$C!BU!jq7=q+s0K71&$fTtW0}N;j1wtayi3JJ(65_QDa1f>x<6Ew712htZhyk3C z-cDeP7D#Uy=>&NChzJAVOv(R~baW&fa0dw>Wn=c;Xdwc~KyswOJOCo8G9Uv*0!dVe zLjOt*m;exBDhG%#iLqgH!}HrB#1b(7Z5SX(qHo5iq)iw^vD=K%|IeNs_|D#j5RFPe zWOBe2mkvBOeK~yqz(=CJat`j}xG4^JXsU*3TvF{XGEF;QThU{Za7|E`P zZo-`uhQoA?BsYZ?+s%@#uED+C{RWVA@A96@5 zvB(hbW-pl5Ln&{w3T$m-R$s3LyL)r8_Hd4l5qH2F1Iu!uj@)Yk4{kE z#8n;)bbHxi+KWteD<04SH;rtyOss>4!v2*dYXvBKaItV)Bv4f?q48@IWC~vG<@3$z#D)-j>du~M z`}oDIRK#xDA)-xXpKuihAh(}kewg9s3HMGJiG|RlsQe1Evzld^!Wv1L@|+yEj|=bO z7b6d!AOcarsV$807BYj*~=EIbJV;xXn)xzQSw)FreN zO|<+Kg9J(1=?4Z6G+%K@|jzpLl%m_@TMT+EEEmoXKfr_y!2r>uy)VX=7W z-YF?$|G8wTfXeB$^6!<#EqRCX%1_#;OSmK{=vaqN0Tj}GMawr0xA&_$NG4CLX*g|= zW}0VdMNU4EVnMsLY*1+EYEAGLZ_%vl;tS2MYjfI`G`Z6uTNSMFeueqW z$w*-@x)25cq-ADgyBGHDw1&>mZvms+XU6dBbfHePr8y%Kj@pF7(O+1GPQc1gZ8-1B z?Sv$0=F_!Sc+UcF)R#gbehLm@_>QCDO=>|GPsht5*u>~xy`WRo`%fy?`{t~K*qxk- z93?sMTzul>OFJkqPUl}JBs^vi_l*jn2J>wmjm-SsLA_*BGg;;GD5@IJ>Wt+fM;QAm_%><@F)7zel1t2WA z&5Hx|1TwH7D9{-T;`ImuUI@3n3#1R}|ICH{e*z8%f%@CcI07Vi91g3;+%kb#N$BB_ L>gpDDmdJkq>awi4 delta 1631 zcmZXPc{mhk9LLRMh)C{oEVTxMrZM-7D_cypJD41?u24pzDax$Ej3bj{O^lv#=4eSt zj+q|Ulq*RX+7UDB4zZ=7XB0Wt)*rhM?_clpeLwH-^ZPc@LA`WPRUv?;KwiGW9TD0k zYY_eQ8O^dSqu8+XxI1~$A1miQA%A9M=yV<(Kc*D-ltP`c+RLB>GHDl@(kh2)HSfQh z^9~>O_3qV%Q=N+xj@@NZAIuyioBLSxT%l??>39y*%7);b1o zkcXW!g?znj(hgpMC;#YKa7_QB0pUGVX9jpT^Rh~cP0O1|=xa79Kd#5R)Zr>$cuqaZ z3JYn@dt}d!daSlJ%-E3N<{trZ$=OrqLYz9R+-R&lN@~71(qY8oKJ=_=1%}4SwbtRM zh z^BP4}LUV7@6Z3v0T8G(r70RlzBB5yL>gSr)O((OpL&36J;+;-OWB$fmqpNpn(A zUQ`cfSFTQfw);@skO`VmDVghY!1P_e!h3>^bt7c=6Oc;1Zt>I~FevE2mx~q!Oo9MU zYqX=h*LWA#s~*i1-|H|m*rhm?(D+47vXtP(6-1zOQa3{>ZrOGFqqBRN8$paj^%-WS z`gB&$_|RnA;@=9O%)=^rB^knds|I0Ja<3Lb!a{&Ac9G`%-67G}HX|*yeVK-)`7@JW z??-&$7G{~LqMP_0OmUBgJ>czH;cgBsYrk2^zMJVSuBi15Sab-JZ_nv$D=NlopRxVj zt@!%Y0%NdCTJanz5H1qEG~SryEKo^J`AWo0J~qFOUW|xm6@7xOC}=JTohUM7N7LsQ zs`Ff(OR5MsTv}4kb$>gkGpF8fq=or(y2G zND$?Az#>P(77I>y5f9#bGd039y=pF(BS_Cj zcyjXH9x);jo)I(TV9%WNBZGt==&|yX@=?^F-6vXyflsr#WInzs(Hpc{h(I?Ss1NeM=l_xYN+o)YW%VR4;6PwdCO3tR#f@*UE>!OS<5Dkk@mZ?pa0kAN#Fmo6R zj>NJJtN}zC8mgkl361)eu@|fX z2Z1;&Th#_&NW*Lw!^|<}*lnK?aP$rd3=ZG1G;FKmcgcU{5O54?`!X0T2KU{I`5%bD eAd%a}2pn!_I|Llgp0@!I-F>KBv=OFh{#?i<* z<;YR)NT_AjQ8R8~+#y!K-|zK%y;jdZ&+GMmJiqpPZT zWp!BNDt&dP*If9xvb}6nh(@RyXPS@5TYnV{_?EULVR_1Zt=z5YBAG`}RwmxJFRi^{ zdS&6m_B7FgM6Va5=~=rohnz1fv-!up^go?w{K+87Wyq|M-{^I`=F{{AcjTv~mN_}vQYsTP z(B>B0^v-KNVG08M#|wO`CU>3c1?LHV>Ko5$u##@c)lt>&Nbf4-%3udmH86YHeP!F} z8Bg0v3VHZXa+P&&oJV55hVh9|pWKOz{3jn5suBH|*E+Mmz6g0FC19Np8{3uE+fQ-1 z9Per={vPVpR4-iqVA4J`v487ffl{l{ks!@Hv)IR}zdx8XFpAB>@3lvwlHDbe-?gPI zU=bHKL`>B%B=;E-W+ytSO4ssc>n_|On`ssmL}gcMLok8qqT=$-Tp3npa|^)Gt_!7{ zx9gGz-~khN{GZkd5g$YgoHioK$FJlYbQ+w=+nBn7L@kB)Th6_-SH5G0WwI*H(`^7Q;ygPD+w#EKHy`6Z zb%exBZ85^#bHbUtIU0Aq=*?;1>Sv_!1yeh7&jme+qtAO~U8rljieQ@AJu?1p*QktZ zpxxNuCAKj?M_cpzXb?_eeP#tqG0Of!(IRtkcmp6zHDEE!X6r^M11!H0K6d8*W;)G~af>6Q8W)Qj2+%^ZnO3hxyNwJmiX5#XJYL2 zpPzlUh~yU=jO?6m<%=oS1A4mmn0)+%Ms|n#O$FfOtIzsvWX^|5x)Cm@C*6$9{k!i= z{B+86Z8F0t!;eai^kWh06ZiQn^CX{#2C6MyHQyF+u#z7M?9aOPW4nNi{FUaEbpqB> zg5DwG3YcnF{K*IxE<#NRmU0fEy?=^RNtcpdi_LAjJ&dBoxYnO;+eGfXpp4yJnspXg znZzE0g)G@Pom^dLG80f8GP%B@PYhT!pw4hxz2}wc>HeE~D)9!l7-@x};U1t^)8F73 zjLia#*OL2h=K7uGrMebKPyF5p+j1+|U|&C5GN#gyHojkaJi^h?#};nOZ2MTQo8Dt_ zL@B{AYjE~xfp8wbzt_&=9KRsq6UH!0_fmKto5^H~6l|(mL+kV!N1|vJMX8ABTM~M$ zad9-nu6jB`oVzxg6f$fEZdPp=Jj{FZJ{r}hl6U^ab0XX^~&3DTP y)uNDK=2ukrtUq2IoY0x%Sz9*EJ82n>&c!nxnDJpTZe=XPuW delta 2011 zcmZXQc{tm79>?oU92->KQR=4J{t`J&cbU4GjE*{r79Ht`I)b=MW2DZ`2tlYL)i~;i zqNUEFTha=(b>G^mDq;k2ZBY-VawII@wzv9$8qnQ|D z;(VV<;lA6!m9xuIISO-IFP8n=+*zm3w7+YSw~cwerC#6E6?RpBdd3l-H4MEQG=`6u z-0o2Rt&i94Jd(4#0=>jqC-+}>iqaIq`naZN_bHYQb)6{PSjv_OfIIq~`-{c(!GiZE zM5gmTxo_H6ljakbvZOfRSB5G2ktnvij7>Dr@wLC|9j7y2jyGyVRd!dBn)fqEkVqj> z?_O6s1*q<6q3L;G&Py(7QDP7~8FK5KM{-z0i~QbYcg^3QOip&WWs)6Nz^7E+=_E~X z2v1REUWLUEuD$XQ{Y6%EP={c|#HF?91%TNJ@uW0H;$vN3CMgeHg7o6Sn|j`Pl`xoMp*1GKTfy~sblL(?Ed35IMUP6KXT;=(qZ z461gk%!uU;9A~PU#ds#feN0+TeTnpEVtV2>ZqsP#LQdLdNO*TyrK3W5kkm*w%lKxM zh~VO1LHK#at`)n4g8M%V8z>8##)%cT5RyJx_C2gj$s?yupxbP|BPyqqs3BA7eD!S6 zgGWkjeu-Mm)}#79Grt6(`T4FREzZ7jox*lpiF+Ztga`F-ntv$$L{*SO%_iMN-kY`4 z5_-d&y3-RWW;f~1`;mJ*pn1Nq9tuusTGOXcBRFQ~BNNCfv=!`qm$J>&dRo5-@2dVV ze3wu|uI1vvc`OZ!g%Xd6*(!RT%*mQ^RI@2LApEB;q81j1ae(WU7*k?OhxYDu;Zbs; zlOPJqp}#iQkhokCX~F86ANs_1jFEpF;r*6fLK#!%8$L2{$cVoXFl>uFE`ML&*ReLEx1Rj?-PBtBF z7$!b2SqAu0|X9fjgj6DcND zP*h=Vf%lY^|4qCGMFjct#wXx8b5Tl?&pg1GQR0c`eI_2v(AM0u z#0bVd%Y_^57W>dx&EtYtSe_Oc`AQI$c=DgZV~QbWZe6x1RnA5JVdJ(oTJ_e!RS%_t z21cCKNLyxeSIc5JDfb3Vr-oL!%|yu7wBkWQ|5HTg zbSyPJ1J7R&UEAmQ;Tft;J=dyly5z^uptCXd25tg{NI?)E9^qlYt$qbocS?AYd&_g= zPHR5TWR=^_NLy{h^^@0Z{NL}C@s*<3dOhQWrnNA0371nZ|2XEe&Uu>?+|Wq$HlMX+ z%=Yofqj$_I?_*d>KPY0LqgI(%@wimZDSHQF!KK^j&jQ1yeJjNn#75)25YM}^)JC;a zu5EV+a~iF&+goX|@q?*)nDE|PiE2bOV}%dB(n?gP8LPN(Fu7>7yi;B_OBnuHN%-Pg z-K?|*y9C!@*SR7MzFl-pGw+O`(icg=@z)VMwUx(%agkY0Jh;<2o%{Y>^MFkZzYZZ#L7%%NcU~RBK-Vk^B`>3X`+` z05h$ioQp2#F?bD3OI7lsksWTMjXOh?t-ME4Wqu-j%aZ!7Tf39%2bDX#DzZQk8!Vmq z0Hi8_rgVcEyFmgPe+L0D00~E+b5?rQ%*2dax7-Y^&njWPO$VT{nG6VuM7hm z^%QD)dFq(UO243QB=tRPAtD0?X& zGAc5KvVy6Mgwe1?5CPj*wEE6_=bh5~&%Nh&zVqGhTe>TL%&k&w7e7d?6hJ8b@+p5X2Bvz0yS1>) z@4M;R+1YWt_JYgFm#iRc_8)1p)s71~aT4*}h`8pwE*4|l(z;zmHLXF2i{t=N2;#(2RANYmZ|4(;HE{OL_N6$ygKp@2?G0QcikftBF0z?4VL*_3L$I51II$QVOhP06z$A(C`7WF=Pcc zdk|MGrt44RYAr8Nk(f0GPcr?8(6YRd#Enc%%jN#E{o=Y&Uf!?s>dA*~m?h4H(ukc! zcejgIE$*^KkT@=;?)GAbphn4i*FNZ-*o;o13Fa+Ctxiyj-sL1ceXJE4$#2tHB;7QX0t#!4=GharRy~E( zWGEzsrkY0|YFsqi$4i+rR+L*cgDls1Il@)<7spqs~$Y*Ef$ zfLXa&GL6ZX(M<+^AY|k6v4m4;3frB{6el@BE{L!-&Sy7!t?iP}WAoSZwI($Os9|S^ zBvzc4>f21Hhqc(&L;RN1{;2jUH`evfKg6>7=E?ln_PAYx1xB?CFqtK+$dEIdnbpnw zz8@cBBs3z_1Bgvykf2mhuP`&o4EBQE^j)(L|N8sjj(a0zb|W7)ZtgQZ&uCB*$(3T2 zUcEua57Mu6vyT0`gSKjJS>OuqsO@iD%_mR8**lnHc5nG|J=xNG{($~QXigwGLT37Kf zYh2xsRi*Q=D=aO$;qK($YNf?pRbJ33+0Y)I1fysf2- zD!&lTKw`!cVLGNfe&eJXI(Mj;?ea$`Jm(rGJh_&6MOf>pb6r-y^Rglmh-4*SYG!JQOCmWWt zq^vZ|Prr4&VPJ>o`o!7WaD1l|v9P*lZK7on6cZV?lodPGNC}A-AIi-z!(Vv$06**Q zS7t1KBBMuHfSgIy@OKQ1pH$A8A5ofXi{zOm207150vc_MeSR0Z>9b?sG`z(UD-ASo zkFqVt7?@KRox2P-uB{i7uv_H>t9zruPsGb|E?FOMt1VdFzgej5(7jiNE6#LU=@a-F zE-XsevbYVIvRd2yRK3!QwF_C=-H!8!8sW_MMOJ%q{1TgHi02$XdoAu|t|`jwfq*~) z(KjM8oPZDhc7=Ec03lE%u+o1H1PYcgF488G#Ezb4*=}75K7>0qeN5! ze%lZT5`{+oi=p9Qde|#~wANS0Z}WdS3Jiw*n?d39>Q?{*0EE8!3ZO240n?=h0n$d0 ze=5N+6by1802mBKpbiB1%Fqxn9skvWf;wP<$w8I7Ui7|O9UvYarO-|U0zgt2Ek_Ct0Z+{=?@e zNVP)E-YIeFd`0qtS3`CEe*D`i(?#LPGn&ahhkkOm7&>lx`sDlA5bxUGhK?vaw#z0? z6>Fs6fJBAK{pIFz6-vKzzN;LRc5tai5* z+U#{kxT$3QlQA3qR;ew-y|lRu$V_dWi)C_qkGW*2ZKYEGCpF?qlp@mEm*}$^Q|FZ_ z|9T0z*f9|QfqRTN6Bw!Jm=OG=S%7MT)*q|9+i44y=Q-%0sK(}rG$16xj4Wz~S=%)Y zj+{O+^$)V3EL~o(r zYc?N~P4NTz*p~~U91v5#K@>kWOmMTwz>AI?Z9lsl_u=D&}* z9Pc973V~5b!$M!2dL89@CNB%v3rD2)g0+aRVKsDVTf6GNL@t>eQu${0?JDwF9I4O= z$tSphZDZY$dHMBZ(zw7KJ6d9wB%1;MfWGE!i%jT*`K~}|vu1EuS+(@UGduZ8+T3iE zuSjf8_@g_DFrBIz?dRM`W*K5;;ZkD15!T!lIH1HU4$aXe(>Cwxb_R+)Fn{NSOWC6W zV@;mZGJSsIP3s3k54=k)ZDk%|>{cK~#PHg(1bwVyS|Hzeh_PAd<;;Mwi`|{{d#L@Z zX5`N-sL!dm;qrlxWwkPma=M=sE!;L&%cn_<8c<>i;9;qwTpn%^2b%c%&)8yyPnWKC zFJ%jPW}$U3m87rB+<6{4Z%-J3sybNE)MKW2uLvGT{aJ47EvcevM(&L(F?@MZ9B}g^ z*OXp0ef~C1vT}T{sK*l}$d0D!R>Eir=Z4Pi+O(pq5?PGh73MxddLzDr=Psyw`65!N z4itfM=OYPoiw-K+ZW^!6tGJHmL=ukz8e1PbwG~$9wp`JFuS$kzeXZ})|2-wkmHD|U z)mB@o&C5FcYMuD**IDM~CTrgnrds;!!!LtkErO2{PV*bM?0g|~zwU=ZgMQm4XvHLp z`(wJjq$uvQDKwtbaI5(`zn1G7IPdUUdR{lZJ?B`uODVIXFvTpD%G_(E%nok+KTKw z&%)pxn{Q|7FP~1{ScP!3Q?0yjl*Dv>keW@{>?rxYw?v}8jR__Dv*mt97YS5w33{(>aJDVR^PUF(fYN^R=c{aVNOqC9Tof62>D#Unk zKM-}{s+f2+d?jTwa__LAKf<23=p7^Vu|Rn7-pBqhLNpuuju=Rja?6@vFv=SZrEr35 zRIcG{>ZO~s*k6c6TVON%uPL*m4u#n5XI7^1Avo~qQ3a5QOn_C%v?F$DRjIp31I{Vr zd=8Knwf{+lM(N361Sdx`@5GvTv@D$_cceut$z>rrsm*uiM*1FYX(Rka5r+We$OfL# zd+I*4nczZeh`e|d>C^0IJ)U>7t@XV1o1n%6mczO=UaUmEaaK6f1xLdDUA!Rx7LSS@2RDv`LE>FtB!I-CFnIdcevq*n29Eqba6dTY`wIX#JOTTI zMnDsP(1--!q=rW#kCET!e|dN$3Qeyb04alz^tAzyG=*>?>ez!sBmduqMB~xGiE77t zSp11<#~J~7G7pW%U~nh$a0E1l@Gp(>-)_ec;>lZ)XaWjA|6s=8Pe1?wgGHSzgCk<_ kC+ Tensor: def setup_synthetic_shakespeare_nanogpt( - batch_size: int = 2, + batch_size: int = 4, ) -> Tuple[GPTWrapper, CrossEntropyLoss, List[Tuple[Tensor, Tensor]]]: """Set up the nanoGPT model and synthetic Shakespeare dataset for the benchmark. Args: - batch_size: The batch size to use. Default is ``2``. + batch_size: The batch size to use. Default is ``4``. Returns: A tuple containing the nanoGPT model, the loss function, and the data. @@ -98,12 +98,12 @@ def setup_synthetic_shakespeare_nanogpt( def setup_synthetic_imagenet_resnet50( - batch_size: int = 32, + batch_size: int = 64, ) -> Tuple[Module, CrossEntropyLoss, List[Tuple[Tensor, Tensor]]]: """Set up ResNet50 on synthetic ImageNet for the benchmark. Args: - batch_size: The batch size to use. Default is ``32``. + batch_size: The batch size to use. Default is ``64``. Returns: A tuple containing the ResNet50 model, the loss function