diff --git a/.gitignore b/.gitignore index 09f1e665..987517a6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ __pycache__/ # Scoring output artifacts (see README "Scoring") scoring_results*/ *.egg-info/ + +# Virtual environments (uv.lock is committed; the venv itself is not) +.venv/ diff --git a/README.md b/README.md index 57af0d0b..a0c33cfd 100644 --- a/README.md +++ b/README.md @@ -82,8 +82,10 @@ pip3 install -e . # installs the scoring tooling (numpy, pandas, scipy, > definitions in [algorithmic-efficiency](https://github.com/mlcommons/algorithmic-efficiency) > (`scoring/generate_workload_targets.py`) and commited here. Each file is > frozen for one benchmark version, carrying that version's base/held-out -> workload sets and per-workload targets. Regenerate and re-copy when a -> benchmark version changes the workloads or targets. +> workload sets and per-workload metric names, optimization goals, targets, +> and step hints. Regenerate and re-copy when a benchmark version changes the +> workloads or targets; the generator must emit `target_metric_goal` as either +> `minimize` or `maximize` for every workload. ### Regenerating the leaderboard @@ -112,6 +114,50 @@ python -m scoring.score_submissions \ --output_dir scoring_results_v05_external ``` +### Exploring relaxed convergence targets + +To measure how leaderboard scores would change under easier convergence +targets, pass `--target_relaxations`. The value is a comma-separated list of +`SELECTOR=FRACTION` assignments. Fractions are relative: `0.05` means a 5% +relaxation. Use `all` to select every workload, or name a workload to select +only that workload. Naming a base workload also selects all of its held-out +variants. + +```bash +# Relax every convergence target by 5%. +python -m scoring.score_submissions \ + --submission_directory logs/self_tuning \ + --compute_performance_profiles \ + --self_tuning_ruleset \ + --target_relaxations=all=0.05 \ + --output_dir scoring_results_relaxed + +# Relax only WMT by 5% and the ImageNet ResNet family by 10%. +python -m scoring.score_submissions \ + --submission_directory logs/self_tuning \ + --compute_performance_profiles \ + --self_tuning_ruleset \ + --target_relaxations=wmt=0.05,imagenet_resnet=0.10 \ + --output_dir scoring_results_selected_relaxations + +# Apply 5% globally, with a 10% override for ImageNet ResNet. +--target_relaxations=all=0.05,imagenet_resnet=0.10 +``` + +For lower-is-better metrics such as loss, a relaxation increases the target; +for higher-is-better metrics such as accuracy, it decreases the target. A 5% +relaxation therefore changes a loss target of `0.2` to `0.21`, and an accuracy +target of `0.8` to `0.76`. + +The command parses the submission logs once, then scores the official and +relaxed workload configurations serially. Unsuffixed artifacts remain the +official results; the exploratory artifacts use a `_relaxed` suffix. For +example, the run produces `scores.csv` and `scores_relaxed.csv`, along with +`time_to_targets.csv` and `time_to_targets_relaxed.csv`. + +Target relaxation is an exploratory analysis feature. It does not modify the +frozen `workload_targets*.json` files or the official scoring definition. + See the [scoring methodology](https://github.com/mlcommons/algorithmic-efficiency/blob/main/docs/DOCUMENTATION.md#scoring) in the benchmark documentation for details on how scores are computed. diff --git a/artifacts/leaderboard_v2/ademamix_summary.csv b/artifacts/leaderboard_v2/ademamix_summary.csv new file mode 100644 index 00000000..1c327422 --- /dev/null +++ b/artifacts/leaderboard_v2/ademamix_summary.csv @@ -0,0 +1,27 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +7,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1236847321358005,7839.193164110184,7839.193164110184,1.0010825763927422,10666 +16,criteo1tb_pytorch,trial_1,validation/loss,0.123735,False,0.1242111736866617,13214.635874271393,inf,1.0010825763927422,10666 +24,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1236501955610997,7835.540827274322,7479.550709962845,1.0010825763927422,10666 +5,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7248104441078714,1311.1073644161224,1311.1073644161224,0.9420394021221715,18094 +14,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7249505124067952,1517.7321906089785,1517.7321906089785,0.9420394021221715,18094 +22,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.724893770663337,1555.3687834739685,1555.3687834739685,0.9420394021221715,18094 +1,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,22.14082852319187,18025.636202573776,18025.636202573776,0.40403201664468946,72000 +10,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,22.23496029572029,18027.61917901039,18027.61917901039,0.40403201664468946,72000 +19,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,22.247438140097906,18025.89689064026,18025.89689064026,0.40403201664468946,72000 +6,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.60218,59997.68517279625,inf,0.6740027356507963,195999 +15,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.61658,73926.78414797783,inf,0.6740027356507963,195999 +23,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.61518,73948.011013031,inf,0.6740027356507963,195999 +4,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.61544,95268.04540586472,inf,0.802424341129202,167999 +13,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.61512,92620.5374662876,inf,0.802424341129202,167999 +2,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,True,0.0848356104861681,54136.87689781189,54136.87689781189,0.7305170534584913,76000 +11,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,True,0.0838990006276251,48894.85426735878,48894.85426735878,0.7305170534584913,76000 +20,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,True,0.0842659199536522,48888.971920251846,48888.971920251846,0.7305170534584913,76000 +8,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.1200695215565104,34737.411699295044,inf,0.7884586655586601,38400 +17,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,True,0.1185245980785014,28953.85911822319,28953.85911822319,0.7884586655586601,38400 +25,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.1215758219475691,33312.74022984505,inf,0.7884586655586601,38400 +3,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2872654622003903,7232.420216321945,6329.966245889664,0.2304398308491926,52000 +12,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2920392515125629,8137.10068655014,6332.58651471138,0.2304398308491926,52000 +21,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.283304967314845,5891.7984273433685,5891.7984273433685,0.2304398308491926,52000 +0,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.87605698677609,17399.639942407608,17399.639942407608,0.1538000967767499,120000 +9,wmt_pytorch,trial_1,validation/bleu,30.8491,False,30.80807424915632,19338.09857201576,inf,0.1538000967767499,120000 +18,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.867059390411267,16752.356283187866,16752.356283187866,0.1538000967767499,120000 diff --git a/artifacts/leaderboard_v2/cautious_nadamw_summary.csv b/artifacts/leaderboard_v2/cautious_nadamw_summary.csv new file mode 100644 index 00000000..2640ad99 --- /dev/null +++ b/artifacts/leaderboard_v2/cautious_nadamw_summary.csv @@ -0,0 +1,26 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +1,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1256997472383533,2863.6579899787903,inf,0.9266347767470695,10666 +9,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1258371449566668,1792.0047852993011,inf,0.9266347767470695,10666 +18,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1246944847459977,9989.461620092392,inf,0.9266347767470695,10666 +4,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7244385315181837,1608.188658952713,1608.188658952713,0.6559752236253,18094 +12,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7238933024409117,1383.1596400737762,1383.1596400737762,0.6559752236253,18094 +21,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7236819978369443,2571.815328359604,2571.815328359604,0.6559752236253,18094 +17,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.63268571712524,25738.981688261032,25738.981688261032,0.44144648333990966,72000 +6,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.7466,69885.5102982521,inf,0.25149491638964216,195999 +14,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.74748,67896.18414497375,inf,0.25149491638964216,195999 +23,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.74964,61917.01934456825,inf,0.25149491638964216,195999 +5,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.7506,87452.66640520096,inf,0.49596923795226744,167999 +13,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.75158,82308.66560220718,inf,0.49596923795226744,167999 +22,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.75034,87448.36735343933,inf,0.49596923795226744,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1421619272920388,64988.59479641914,inf,2.589838852085477,76000 +8,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1426254043354415,65012.818663835526,inf,2.589838852085477,76000 +16,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1444986240525274,64979.35094237328,inf,2.589838852085477,76000 +2,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.2943175783324482,10338.725378990172,inf,2.7988120351912658,38400 +10,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.2872881765075074,10334.769649744034,inf,2.7988120351912658,38400 +19,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.2853473663882586,14680.395282268524,inf,2.7988120351912658,38400 +3,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2845644139519467,5444.764040708542,4992.686820983887,0.1979359465075458,52000 +11,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2874222775151546,5446.810508966446,4542.640103340149,0.1979359465075458,52000 +20,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2809900831846614,4995.647005558014,4995.647005558014,0.1979359465075458,52000 +7,wmt_jax,trial_1,validation/bleu,30.8491,True,30.876108999624343,12943.72738480568,12943.72738480568,0.1255462995675322,120000 +15,wmt_jax,trial_1,validation/bleu,30.8491,True,31.02074381397432,14876.415894269943,14232.458706855774,0.1255462995675322,120000 +24,wmt_jax,trial_1,validation/bleu,30.8491,True,30.91251520933702,15517.656443834305,15517.656443834305,0.1255462995675322,120000 diff --git a/artifacts/leaderboard_v2/framework_comparison.pdf b/artifacts/leaderboard_v2/framework_comparison.pdf new file mode 100644 index 00000000..555bb48b Binary files /dev/null and b/artifacts/leaderboard_v2/framework_comparison.pdf differ diff --git a/artifacts/leaderboard_v2/framework_comparison.png b/artifacts/leaderboard_v2/framework_comparison.png new file mode 100644 index 00000000..93349e85 Binary files /dev/null and b/artifacts/leaderboard_v2/framework_comparison.png differ diff --git a/artifacts/leaderboard_v2/leaderboard_steps_table.tex b/artifacts/leaderboard_v2/leaderboard_steps_table.tex new file mode 100644 index 00000000..c35ee3f0 --- /dev/null +++ b/artifacts/leaderboard_v2/leaderboard_steps_table.tex @@ -0,0 +1,27 @@ +\begin{table}[htbp] + \centering + \caption{Wall-clock vs.\ step-based benchmark scores. Both use the same performance-profile scoring; only the notion of training time differs (seconds vs.\ optimizer steps to target). $\Delta$ is the rank change when moving from wall-clock to step-based scoring; Cautious NAdamW and Muon (JAX) tie exactly under step-based scoring.} + \label{tab:leaderboard_steps} + \begin{tabular}{lrrrrc} + \toprule + & \multicolumn{2}{c}{Wall-clock} & \multicolumn{2}{c}{Steps} & \\ + \cmidrule(lr){2-3}\cmidrule(lr){4-5} + Submission & Score & Rank & Score & Rank & $\Delta$ \\ + \midrule + Schedule-Free AdamW v2 & \textbf{0.5679} & 1 & 0.5253 & 2 & $\downarrow$1 \\ + AdEMAMix & 0.5191 & 2 & \textbf{0.5258} & 1 & $\uparrow$1 \\ + Schedule-Free AdamW & 0.4669 & 3 & 0.4461 & 4 & $\downarrow$1 \\ + NAdamW (Baseline v0.5) & 0.4506 & 4 & 0.4545 & 3 & $\uparrow$1 \\ + Schedule-Free AdamW (JAX v2) & 0.4405 & 5 & 0.4125 & 6 & $\downarrow$1 \\ + Muon (PyTorch) & 0.4231 & 6 & 0.4327 & 5 & $\uparrow$1 \\ + Schedule-Free AdamW (JAX) & 0.4108 & 7 & 0.4091 & 7 & -- \\ + NAdamW & 0.3844 & 8 & 0.4040 & 8 & -- \\ + Cautious NAdamW & 0.3143 & 9 & 0.3199 & 9 & -- \\ + Muon (JAX) & 0.2845 & 10 & 0.3199 & 9 & $\uparrow$1 \\ + Lion & 0.2783 & 11 & 0.2733 & 11 & -- \\ + NAdamW (ResNet) & 0.1857 & 12 & 0.1953 & 12 & -- \\ + DiLoCo (Single Worker) & 0.1369 & 13 & 0.1863 & 13 & -- \\ + DiLoCo v2 (Single Worker) & 0.1302 & 14 & 0.1829 & 14 & -- \\ + \bottomrule + \end{tabular} +\end{table} \ No newline at end of file diff --git a/artifacts/leaderboard_v2/lion_summary.csv b/artifacts/leaderboard_v2/lion_summary.csv new file mode 100644 index 00000000..2ccb772e --- /dev/null +++ b/artifacts/leaderboard_v2/lion_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +7,criteo1tb_pytorch,trial_1,validation/loss,0.123735,False,0.1241905161220999,9978.416061878204,inf,0.91592558011244,10666 +16,criteo1tb_pytorch,trial_1,validation/loss,0.123735,False,0.1242616643239586,12466.455169200895,inf,0.91592558011244,10666 +25,criteo1tb_pytorch,trial_1,validation/loss,0.123735,False,0.1242412303757036,12106.893656492231,inf,0.91592558011244,10666 +5,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7238031751195836,619.9493722915649,619.9493722915649,0.27376442936493867,18094 +14,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7243804158826322,1421.2225756645205,1421.2225756645205,0.27376442936493867,18094 +23,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7239882383845667,1394.1750195026398,1394.1750195026398,0.27376442936493867,18094 +1,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,21.261897266260053,23164.569310188293,23164.569310188293,0.38839825067830164,72000 +10,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,21.110008038411504,23177.09142231941,23177.09142231941,0.38839825067830164,72000 +19,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,21.130699319951358,23172.039316177368,23172.039316177368,0.38839825067830164,72000 +6,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.61338,73980.61954474449,inf,0.6743097256486612,195999 +15,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.61892,67952.96683573723,inf,0.6743097256486612,195999 +24,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.62902,67951.73512744904,inf,0.6743097256486612,195999 +4,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.6242,87448.87829089165,inf,0.8120775926593171,167999 +13,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.63292,95191.34969496728,inf,0.8120775926593171,167999 +22,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.6418,95165.0220131874,inf,0.8120775926593171,167999 +2,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.1153188818616327,57621.20974063873,inf,0.7231872968606753,76000 +11,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.1507845314536764,54127.30689024925,inf,0.7231872968606753,76000 +20,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.1264423309032974,57621.14528346062,inf,0.7231872968606753,76000 +8,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.1247042919905373,31862.61851024628,inf,0.7694697594617248,38400 +17,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.126799594457587,31838.147053956985,inf,0.7694697594617248,38400 +26,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.1238063052189446,31852.81674218177,inf,0.7694697594617248,38400 +3,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2857323411413317,7223.987207174301,7223.987207174301,0.21286914966307793,52000 +12,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2812007204404579,6782.790376663208,6782.790376663208,0.21286914966307793,52000 +21,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.283014990979593,8582.123725652695,8582.123725652695,0.21286914966307793,52000 +0,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.948023339872734,15475.552730083466,15475.552730083466,0.1413890021270408,120000 +9,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.87531810470684,17401.493114233017,15474.955520391464,0.1413890021270408,120000 +18,wmt_pytorch,trial_1,validation/bleu,30.8491,False,30.76188896433939,17388.50763297081,inf,0.1413890021270408,120000 diff --git a/artifacts/leaderboard_v2/muon_summary.csv b/artifacts/leaderboard_v2/muon_summary.csv new file mode 100644 index 00000000..1ab06d0f --- /dev/null +++ b/artifacts/leaderboard_v2/muon_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1245190224490917,13217.0788064003,inf,1.80744596371582,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1246482386019362,12154.283058166504,inf,1.80744596371582,10666 +20,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1245746128447548,13221.646473169329,inf,1.80744596371582,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7239323209763646,1145.923245429993,1145.923245429993,0.15300968625117742,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7238764035681626,2594.490219116211,2594.490219116211,0.15300968625117742,18094 +23,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7247154394696117,1869.765276670456,1869.765276670456,0.15300968625117742,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.808373188667463,20594.037749767303,20594.037749767303,0.504613462023225,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.85239511139204,20594.19531917572,20594.19531917572,0.504613462023225,72000 +19,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.82093364841247,20593.710190296173,20593.710190296173,0.504613462023225,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.73021996,73908.46513557434,inf,0.34063982264727855,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.73056,53931.644364357,inf,0.34063982264727855,195999 +25,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.71808,65941.6421945095,inf,0.34063982264727855,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77518,77162.91657114029,77162.91657114029,0.5145936103030498,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.75193995,95183.25943279266,inf,0.5145936103030498,167999 +24,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77476,74592.82279109955,74592.82279109955,0.5145936103030498,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1673441799835852,64973.90770673752,inf,2.486110555855915,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1665524067011055,64973.39529895783,inf,2.486110555855915,76000 +18,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1644281369188432,64948.560970783234,inf,2.486110555855915,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.174721189591078,55211.92119574547,inf,2.709749883580429,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1775792980253946,55245.24317121506,inf,2.709749883580429,38400 +21,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1763819823299377,53775.95950937271,inf,2.709749883580429,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.279643299276242,1828.2280414104464,inf,0.19192375124386668,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2754040150725418,1378.5888230800629,inf,0.19192375124386668,52000 +22,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2761794983317486,1827.266467809677,inf,0.19192375124386668,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,False,28.997438769958425,12296.452765226364,inf,0.173934285073483,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,False,28.65403612242089,11011.619378566742,inf,0.173934285073483,120000 +26,wmt_jax,trial_1,validation/bleu,30.8491,False,28.777579127157672,12941.239448785782,inf,0.173934285073483,120000 diff --git a/artifacts/leaderboard_v2/muon_torch_summary.csv b/artifacts/leaderboard_v2/muon_torch_summary.csv new file mode 100644 index 00000000..8958a4f6 --- /dev/null +++ b/artifacts/leaderboard_v2/muon_torch_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +7,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1236454748378366,6087.019835233688,6087.019835233688,1.18504582454593,10666 +16,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.123726612990728,12517.356907844543,12517.356907844543,1.18504582454593,10666 +25,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1236812508354591,7497.393135547638,7141.604691028595,1.18504582454593,10666 +5,fastmri_pytorch,trial_1,validation/ssim,0.723653,False,0.7231757872951252,2142.100114107132,inf,0.3866886620807985,18094 +14,fastmri_pytorch,trial_1,validation/ssim,0.723653,False,0.7233615375061551,1624.206672668457,inf,0.3866886620807985,18094 +23,fastmri_pytorch,trial_1,validation/ssim,0.723653,False,0.7231143056239449,1617.665590763092,inf,0.3866886620807985,18094 +1,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,21.744761208603,15471.447128295898,15471.447128295898,0.39309072483558477,72000 +10,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,21.75125219421063,15471.922557115557,15471.922557115557,0.39309072483558477,72000 +19,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,True,21.584650980529226,15476.685742616652,15476.685742616652,0.39309072483558477,72000 +6,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.64264,73922.64334130287,inf,0.6849873571941311,195999 +15,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.64258,65897.92681455612,inf,0.6849873571941311,195999 +24,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.63724,69833.61887001991,inf,0.6849873571941311,195999 +4,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.60662,92532.04569506644,inf,0.8496337869111144,167999 +13,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.59968,95203.29775571825,inf,0.8496337869111144,167999 +22,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.59224,77203.51195073128,inf,0.8496337869111144,167999 +2,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.0921064066045478,52374.13884854317,inf,0.7507184025867658,76000 +11,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.093863757060783,52373.02536725998,inf,0.7507184025867658,76000 +20,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.0908318447351904,50630.20197486877,inf,0.7507184025867658,76000 +8,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.1670545068314585,30413.91596698761,inf,0.789905564129319,38400 +17,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.1314826437503017,30405.68972826004,inf,0.789905564129319,38400 +26,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,False,0.1342635060107179,28934.32774949073,inf,0.789905564129319,38400 +3,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.282273613537902,1833.473667144776,1833.473667144776,0.2350472339184847,52000 +12,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2846925562359295,1848.3308384418488,1848.3308384418488,0.2350472339184847,52000 +21,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2937916287114694,2281.462235212326,1830.406593322754,0.2350472339184847,52000 +0,wmt_pytorch,trial_1,validation/bleu,30.8491,False,30.691327352494376,17533.78046321869,inf,0.14536654309265207,120000 +9,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.897467563003804,14200.647830486298,14200.647830486298,0.14536654309265207,120000 +18,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.89810474410816,14214.779582500458,14214.779582500458,0.14536654309265207,120000 diff --git a/artifacts/leaderboard_v2/nadamw_baselinev05_summary.csv b/artifacts/leaderboard_v2/nadamw_baselinev05_summary.csv new file mode 100644 index 00000000..a9c14875 --- /dev/null +++ b/artifacts/leaderboard_v2/nadamw_baselinev05_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236356907515324,7854.423001766205,7854.423001766205,0.900927458493366,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236637634250791,8206.103132247925,8206.103132247925,0.900927458493366,10666 +20,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236501173016314,8568.097370386124,8568.097370386124,0.900927458493366,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7238203487707513,1615.2845153808594,1615.2845153808594,0.3907451132582269,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7247785698113042,2271.625893354416,2271.625893354416,0.3907451132582269,18094 +23,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7241842240916925,1620.5153810977936,1620.5153810977936,0.3907451132582269,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.796921650781453,20589.321794748303,20589.321794748303,0.4369074667928172,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.228251216355208,20593.007669210438,20593.007669210438,0.4369074667928172,72000 +19,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.457129478766408,20589.912857055664,20589.912857055664,0.4369074667928172,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.74972,59916.65886712074,inf,0.25078913028372907,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.75031996,59922.17208194733,inf,0.25078913028372907,195999 +25,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.74909997,61908.166714668274,inf,0.25078913028372907,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.74781996,77159.16147780418,inf,0.465805622122026,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.74799997,74587.84833478928,inf,0.465805622122026,167999 +24,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.74992,79731.53126645088,inf,0.465805622122026,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1414184328682469,64979.31014919281,inf,2.5370693297275118,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1456186935740839,64975.10295176506,inf,2.5370693297275118,76000 +18,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1461787283348621,61490.05108809471,inf,2.5370693297275118,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1594457587022642,53800.03012371063,inf,2.7372216326849665,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1626514749191329,55243.57709980011,inf,2.7372216326849665,38400 +21,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1540578380727079,55276.91480922699,inf,2.7372216326849665,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2813744785227667,3634.618623733521,3634.618623733521,0.1910767921026944,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2853125566948717,4089.775626659393,4089.775626659393,0.1910767921026944,52000 +22,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2887430901808062,4991.965915679932,4991.965915679932,0.1910767921026944,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,False,30.658883813091023,14227.413651227953,inf,0.12590835478998,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,True,30.863299473481064,12939.180624485016,12939.180624485016,0.12590835478998,120000 +26,wmt_jax,trial_1,validation/bleu,30.8491,True,30.9476160953902,14865.7885992527,14865.7885992527,0.12590835478998,120000 diff --git a/artifacts/leaderboard_v2/nadamw_resnet_summary.csv b/artifacts/leaderboard_v2/nadamw_resnet_summary.csv new file mode 100644 index 00000000..e75d1828 --- /dev/null +++ b/artifacts/leaderboard_v2/nadamw_resnet_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1242694401308509,12867.50927901268,inf,1.550644798382469,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.124093955634715,12860.401985406876,inf,1.550644798382469,10666 +20,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1239534508040601,9635.864085197449,inf,1.550644798382469,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7239255202105023,1920.545307636261,1920.545307636261,0.10992968284881317,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7236956680632738,1035.743106365204,1035.743106365204,0.10992968284881317,18094 +23,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7242662454496693,2579.977390766144,2579.977390766144,0.10992968284881317,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,20.93162548018871,23164.03602838516,23164.03602838516,0.43626168098213475,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.17004626898918,23163.02198767662,23163.02198767662,0.43626168098213475,72000 +19,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.151323902362865,23162.07039999962,23162.07039999962,0.43626168098213475,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.75211996,65897.27553248405,inf,0.3472091664416975,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.73622,73915.94854426384,inf,0.3472091664416975,195999 +25,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.7528,71884.30445122719,inf,0.3472091664416975,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.74579996,95155.82486248016,inf,0.5355774306471934,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.56424,95249.69734692574,inf,0.5355774306471934,167999 +24,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.74872,84874.52632522583,inf,0.5355774306471934,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.4221310288224786,64933.15110611916,inf,2.2596808752887014,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.4616327910008207,64948.66587519646,inf,2.2596808752887014,76000 +18,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.4679959445758702,64947.58217930794,inf,2.2596808752887014,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1568869791918119,55250.44359540939,inf,2.301104343183848,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1707430116352049,55216.43422389031,inf,2.301104343183848,38400 +21,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1596099068218027,55259.41744112968,inf,2.301104343183848,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2846638875587433,6349.506216049194,6349.506216049194,0.1920906659445254,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2875478149042345,6800.483803510666,6800.483803510666,0.1920906659445254,52000 +22,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2823420118969963,5894.730070829392,5894.730070829392,0.1920906659445254,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,False,30.751545467615685,15515.51091647148,inf,0.1251175539318001,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,False,30.456213206014148,14867.072550296783,inf,0.1251175539318001,120000 +26,wmt_jax,trial_1,validation/bleu,30.8491,False,30.6280545403418,14868.256608009338,inf,0.1251175539318001,120000 diff --git a/artifacts/leaderboard_v2/nadamw_summary.csv b/artifacts/leaderboard_v2/nadamw_summary.csv new file mode 100644 index 00000000..81036870 --- /dev/null +++ b/artifacts/leaderboard_v2/nadamw_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236922431841871,6425.629549503326,6425.629549503326,0.9130992993330321,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236408078557955,8208.519079446793,7851.880496025085,0.9130992993330321,10666 +20,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236922586345227,7492.6946766376495,7492.6946766376495,0.9130992993330321,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7244943802317811,924.8731529712676,924.8731529712676,0.10824602795398142,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7240358437456036,1800.7732002735138,1800.7732002735138,0.10824602795398142,18094 +23,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7236940193927617,2041.2998707294464,2041.2998707294464,0.10824602795398142,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.52338881789557,23164.181562185287,23164.181562185287,0.4370215902234469,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.9808280658622,25733.847669363025,25733.847669363025,0.4370215902234469,72000 +19,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.64191985260924,25735.729759454727,25735.729759454727,0.4370215902234469,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.75258,61911.16003417969,inf,0.2521924206204958,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.75536,47948.21336722374,inf,0.2521924206204958,195999 +25,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.75413996,61916.83682227135,inf,0.2521924206204958,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77342,66879.37250804901,66879.37250804901,0.4629556156426727,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77594,74585.6678788662,74585.6678788662,0.4629556156426727,167999 +24,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77709997,72015.5787293911,72015.5787293911,0.4629556156426727,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1473663882585815,64933.09971880913,inf,2.4926909356311806,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1492878868343552,64943.34402728081,inf,2.4926909356311806,76000 +18,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1461207937044368,64944.95679020882,inf,2.4926909356311806,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1603727127890696,55220.70586013794,inf,2.5031315810127652,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.154337855453097,55216.42438077927,inf,2.5031315810127652,38400 +21,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1529088012359387,55258.113032102585,inf,2.5031315810127652,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2776481983560332,4085.9088344573975,inf,0.1904826010022041,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2740576238043504,4088.2416999340057,inf,0.1904826010022041,52000 +22,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2746764525264623,5444.092821359634,inf,0.1904826010022041,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,False,29.846879082437127,12936.535746574402,inf,0.12476112412788223,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,False,30.024632086852844,12292.1887114048,inf,0.12476112412788223,120000 +26,wmt_jax,trial_1,validation/bleu,30.8491,False,29.301186266855005,14222.570494651794,inf,0.12476112412788223,120000 diff --git a/artifacts/leaderboard_v2/performance_profile_by_global_step.pdf b/artifacts/leaderboard_v2/performance_profile_by_global_step.pdf new file mode 100644 index 00000000..17c33e8a Binary files /dev/null and b/artifacts/leaderboard_v2/performance_profile_by_global_step.pdf differ diff --git a/artifacts/leaderboard_v2/performance_profile_by_global_step.png b/artifacts/leaderboard_v2/performance_profile_by_global_step.png new file mode 100644 index 00000000..54a827cc Binary files /dev/null and b/artifacts/leaderboard_v2/performance_profile_by_global_step.png differ diff --git a/artifacts/leaderboard_v2/performance_profile_by_score.pdf b/artifacts/leaderboard_v2/performance_profile_by_score.pdf new file mode 100644 index 00000000..3875ee7d Binary files /dev/null and b/artifacts/leaderboard_v2/performance_profile_by_score.pdf differ diff --git a/artifacts/leaderboard_v2/performance_profile_by_score.png b/artifacts/leaderboard_v2/performance_profile_by_score.png new file mode 100644 index 00000000..d9159124 Binary files /dev/null and b/artifacts/leaderboard_v2/performance_profile_by_score.png differ diff --git a/artifacts/leaderboard_v2/performance_profile_global_step.csv b/artifacts/leaderboard_v2/performance_profile_global_step.csv new file mode 100644 index 00000000..6f452125 --- /dev/null +++ b/artifacts/leaderboard_v2/performance_profile_global_step.csv @@ -0,0 +1,15 @@ +submission,1.0,1.0303030303030303,1.0606060606060606,1.0909090909090908,1.121212121212121,1.1515151515151516,1.1818181818181819,1.2121212121212122,1.2424242424242424,1.2727272727272727,1.303030303030303,1.3333333333333335,1.3636363636363638,1.393939393939394,1.4242424242424243,1.4545454545454546,1.4848484848484849,1.5151515151515151,1.5454545454545454,1.5757575757575757,1.606060606060606,1.6363636363636362,1.6666666666666667,1.696969696969697,1.7272727272727273,1.7575757575757576,1.7878787878787878,1.8181818181818183,1.8484848484848486,1.878787878787879,1.9090909090909092,1.9393939393939394,1.9696969696969697,2.0,2.0303030303030303,2.0606060606060606,2.090909090909091,2.121212121212121,2.1515151515151514,2.1818181818181817,2.212121212121212,2.242424242424242,2.2727272727272725,2.3030303030303028,2.3333333333333335,2.3636363636363638,2.393939393939394,2.4242424242424243,2.4545454545454546,2.484848484848485,2.515151515151515,2.5454545454545454,2.5757575757575757,2.6060606060606064,2.6363636363636367,2.666666666666667,2.6969696969696972,2.7272727272727275,2.757575757575758,2.787878787878788,2.8181818181818183,2.8484848484848486,2.878787878787879,2.909090909090909,2.9393939393939394,2.9696969696969697,3.0,3.0303030303030303,3.0606060606060606,3.090909090909091,3.121212121212121,3.1515151515151514,3.1818181818181817,3.2121212121212124,3.2424242424242427,3.272727272727273,3.303030303030303,3.3333333333333335,3.3636363636363638,3.393939393939394,3.4242424242424243,3.4545454545454546,3.484848484848485,3.515151515151515,3.5454545454545454,3.5757575757575757,3.606060606060606,3.6363636363636362,3.666666666666667,3.6969696969696972,3.7272727272727275,3.757575757575758,3.787878787878788,3.8181818181818183,3.8484848484848486,3.878787878787879,3.909090909090909,3.9393939393939394,3.9696969696969697,4.0 +AdEMAMix,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666 +Cautious NAdamW,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444 +Lion,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333 +Muon (JAX),0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333 +Muon (PyTorch),0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444 +NAdamW,0.0,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444 +NAdamW (Baseline v0.5),0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +NAdamW (ResNet),0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222 +Schedule-Free AdamW,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +Schedule-Free AdamW (JAX),0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +Schedule-Free AdamW (JAX v2),0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +Schedule-Free AdamW v2,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666 +DiLoCo (Single Worker),0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222 +DiLoCo v2 (Single Worker),0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222 diff --git a/artifacts/leaderboard_v2/performance_profile_score.csv b/artifacts/leaderboard_v2/performance_profile_score.csv new file mode 100644 index 00000000..a18e50f5 --- /dev/null +++ b/artifacts/leaderboard_v2/performance_profile_score.csv @@ -0,0 +1,15 @@ +submission,1.0,1.0303030303030303,1.0606060606060606,1.0909090909090908,1.121212121212121,1.1515151515151516,1.1818181818181819,1.2121212121212122,1.2424242424242424,1.2727272727272727,1.303030303030303,1.3333333333333335,1.3636363636363638,1.393939393939394,1.4242424242424243,1.4545454545454546,1.4848484848484849,1.5151515151515151,1.5454545454545454,1.5757575757575757,1.606060606060606,1.6363636363636362,1.6666666666666667,1.696969696969697,1.7272727272727273,1.7575757575757576,1.7878787878787878,1.8181818181818183,1.8484848484848486,1.878787878787879,1.9090909090909092,1.9393939393939394,1.9696969696969697,2.0,2.0303030303030303,2.0606060606060606,2.090909090909091,2.121212121212121,2.1515151515151514,2.1818181818181817,2.212121212121212,2.242424242424242,2.2727272727272725,2.3030303030303028,2.3333333333333335,2.3636363636363638,2.393939393939394,2.4242424242424243,2.4545454545454546,2.484848484848485,2.515151515151515,2.5454545454545454,2.5757575757575757,2.6060606060606064,2.6363636363636367,2.666666666666667,2.6969696969696972,2.7272727272727275,2.757575757575758,2.787878787878788,2.8181818181818183,2.8484848484848486,2.878787878787879,2.909090909090909,2.9393939393939394,2.9696969696969697,3.0,3.0303030303030303,3.0606060606060606,3.090909090909091,3.121212121212121,3.1515151515151514,3.1818181818181817,3.2121212121212124,3.2424242424242427,3.272727272727273,3.303030303030303,3.3333333333333335,3.3636363636363638,3.393939393939394,3.4242424242424243,3.4545454545454546,3.484848484848485,3.515151515151515,3.5454545454545454,3.5757575757575757,3.606060606060606,3.6363636363636362,3.666666666666667,3.6969696969696972,3.7272727272727275,3.757575757575758,3.787878787878788,3.8181818181818183,3.8484848484848486,3.878787878787879,3.909090909090909,3.9393939393939394,3.9696969696969697,4.0 +AdEMAMix,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666 +Cautious NAdamW,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444 +Lion,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444 +Muon (JAX),0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333 +Muon (PyTorch),0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444 +NAdamW,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444 +NAdamW (Baseline v0.5),0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +NAdamW (ResNet),0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333 +Schedule-Free AdamW,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +Schedule-Free AdamW (JAX),0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +Schedule-Free AdamW (JAX v2),0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.2222222222222222,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.3333333333333333,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556 +Schedule-Free AdamW v2,0.2222222222222222,0.2222222222222222,0.4444444444444444,0.4444444444444444,0.4444444444444444,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.5555555555555556,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666,0.6666666666666666 +DiLoCo (Single Worker),0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222 +DiLoCo v2 (Single Worker),0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1111111111111111,0.1111111111111111,0.1111111111111111,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222,0.2222222222222222 diff --git a/artifacts/leaderboard_v2/schedule_free_adamw_jax_summary.csv b/artifacts/leaderboard_v2/schedule_free_adamw_jax_summary.csv new file mode 100644 index 00000000..cc86b995 --- /dev/null +++ b/artifacts/leaderboard_v2/schedule_free_adamw_jax_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236780861794127,7853.642936706543,7140.8094828128815,1.7633445439952435,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1238261394401308,13222.375915288923,inf,1.7633445439952435,10666 +20,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1237888046626876,13213.711726427078,inf,1.7633445439952435,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7237302214494232,1731.1340837478638,1731.1340837478638,1.1496743187308311,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7237188181450478,2594.667304039001,2594.667304039001,1.1496743187308311,18094 +23,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7238083272149338,2397.40203499794,2397.40203499794,1.1496743187308311,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.63105596611465,12875.024502277374,12875.024502277374,0.22480757398142498,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.74279164065674,12876.279433250427,12876.279433250427,0.22480757398142498,72000 +19,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.683878980951235,12875.283079862596,12875.283079862596,0.22480757398142498,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.32668,2046.26813864708,inf,0.25022096920710724,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.37228,12025.559068441393,inf,0.25022096920710724,195999 +25,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.3381,43958.733882665634,inf,0.25022096920710724,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77448,82325.32389187813,82325.32389187813,0.522412035514241,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.75714,87510.92576980591,inf,0.522412035514241,167999 +24,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77344,87468.86081624031,87468.86081624031,0.522412035514241,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1549944479312509,65011.38493800163,inf,2.5689073843042243,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.5567904214744364,65011.67010974884,inf,2.5689073843042243,76000 +18,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1187177135132525,64999.67829537392,inf,2.5689073843042243,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1350263119779848,55134.126436948776,inf,1.2618603325971023,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1357311833148264,55131.02417516709,inf,1.2618603325971023,38400 +21,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1353352966735866,55139.79888033867,inf,1.2618603325971023,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2882117430802368,5446.973826885223,5446.973826885223,0.2001300537781464,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2861864452395915,5446.995653152466,5446.995653152466,0.2001300537781464,52000 +22,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2842350234539836,5446.266435623169,5446.266435623169,0.2001300537781464,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,True,30.85016934441424,16161.202248096466,16161.202248096466,0.1313800575391753,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,True,30.857123789991796,21309.901624917984,21309.901624917984,0.1313800575391753,120000 +26,wmt_jax,trial_1,validation/bleu,30.8491,True,30.921054351078247,12938.92156648636,12938.92156648636,0.1313800575391753,120000 diff --git a/artifacts/leaderboard_v2/schedule_free_adamw_jax_v2_summary.csv b/artifacts/leaderboard_v2/schedule_free_adamw_jax_v2_summary.csv new file mode 100644 index 00000000..c658d8b5 --- /dev/null +++ b/artifacts/leaderboard_v2/schedule_free_adamw_jax_v2_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236824611515756,7494.73098731041,7494.73098731041,0.8966913763762121,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236955728693145,8204.54053902626,8204.54053902626,0.8966913763762121,10666 +20,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1237031599809202,8561.992237091064,8205.83998131752,0.8966913763762121,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7237456777354742,1850.625381946564,1850.625381946564,0.3698403887300683,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7239381600177617,1854.5847795009613,1854.5847795009613,0.3698403887300683,18094 +23,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7237980917188379,1610.791705369949,1610.791705369949,0.3698403887300683,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,22.063707391204822,15451.99134683609,15451.99134683609,0.22534573858673873,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,22.084079790540933,15451.332998037338,15451.332998037338,0.22534573858673873,72000 +19,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.41176473745201,18017.74631667137,18017.74631667137,0.22534573858673873,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.03464,2051.405519247055,inf,0.44776864374720626,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.04014,2058.181893348694,inf,0.44776864374720626,195999 +25,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.036059998,2058.049063682556,inf,0.44776864374720626,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77356,84891.75501847267,84891.75501847267,0.49135053230701276,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.7732,90041.78416395187,90041.78416395187,0.49135053230701276,167999 +24,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,True,0.77349997,79757.28538060188,79757.28538060188,0.49135053230701276,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.123883551392845,65000.42595148087,inf,2.6878856915000933,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.5209675083281031,64987.36187624931,inf,2.6878856915000933,76000 +18,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.8858494665186115,65011.33872246742,inf,2.6878856915000933,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1574759812678028,55212.78796505928,inf,2.8562571235897436,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1543088881378844,55199.30320453644,inf,2.8562571235897436,38400 +21,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1572828658330517,55205.010649204254,inf,2.8562571235897436,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.286413382088369,5445.974807500839,5445.974807500839,0.19452367417783623,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2833401175109442,4543.061010599136,4543.061010599136,0.19452367417783623,52000 +22,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,True,0.2839604337758715,5444.019295454025,5444.019295454025,0.19452367417783623,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,False,30.80719747887025,18087.94602179528,inf,0.13178440840034025,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,False,30.82293691746224,18733.534309864044,inf,0.13178440840034025,120000 +26,wmt_jax,trial_1,validation/bleu,30.8491,True,30.89861759064164,12937.488843202593,12937.488843202593,0.13178440840034025,120000 diff --git a/artifacts/leaderboard_v2/schedule_free_adamw_summary.csv b/artifacts/leaderboard_v2/schedule_free_adamw_summary.csv new file mode 100644 index 00000000..aa258ddf --- /dev/null +++ b/artifacts/leaderboard_v2/schedule_free_adamw_summary.csv @@ -0,0 +1,28 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +7,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.123695969072577,10693.990020275116,10337.671689033508,1.0176147447313595,10666 +16,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1237318931772052,7484.81304359436,7484.81304359436,1.0176147447313595,10666 +25,criteo1tb_pytorch,trial_1,validation/loss,0.123735,False,0.1238283343342011,13201.571621894836,inf,1.0176147447313595,10666 +5,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7243006614466094,1188.9131379127502,1188.9131379127502,0.37200399077668483,18094 +14,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7241639591833146,1084.00980591774,1084.00980591774,0.37200399077668483,18094 +23,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7237026749129502,1414.2303750514984,1414.2303750514984,0.37200399077668483,18094 +1,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,False,26.85374456024656,18022.233601808548,inf,0.39088582110865655,72000 +10,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,False,27.82547828346764,38578.81546521187,inf,0.39088582110865655,72000 +19,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,False,26.96230657281026,28299.942929506306,inf,0.39088582110865655,72000 +6,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.47426,20031.86983823776,inf,0.7580861347745502,195999 +15,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.4676,4114.095727682114,inf,0.7580861347745502,195999 +24,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.4552,20045.60598516464,inf,0.7580861347745502,195999 +4,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.66804,84876.44285774231,inf,0.798625143555511,167999 +13,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.66444,87409.16011619568,inf,0.798625143555511,167999 +22,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.6597,89980.17051744461,inf,0.798625143555511,167999 +2,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.0877323420074349,64552.02477765083,inf,0.636074872542087,76000 +11,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.1268092502293245,64541.00859761238,inf,0.636074872542087,76000 +20,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,True,0.0847969873992178,55843.257081747055,55843.257081747055,0.636074872542087,76000 +8,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,True,0.1198474388065466,36135.45188999176,36135.45188999176,0.4369991325858944,38400 +17,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,True,0.1197798484043837,40477.75217223168,40477.75217223168,0.4369991325858944,38400 +26,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,True,0.1190170424371167,40463.388149023056,40463.388149023056,0.4369991325858944,38400 +3,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.28535290526426,3640.148542404175,3640.148542404175,0.23042852374871498,52000 +12,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.283665861188384,4969.322802782059,4969.322802782059,0.23042852374871498,52000 +21,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2823012178053458,3624.553771257401,3624.553771257401,0.23042852374871498,52000 +0,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.88398743654469,21238.623005867004,21238.623005867004,0.1480193403642912,120000 +9,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.914680764174825,16745.45179581642,15461.67885351181,0.1480193403642912,120000 +18,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.954489013105448,19957.71787595749,19957.71787595749,0.1480193403642912,120000 diff --git a/artifacts/leaderboard_v2/schedule_free_adamw_v2_summary.csv b/artifacts/leaderboard_v2/schedule_free_adamw_v2_summary.csv new file mode 100644 index 00000000..ce4b86fb --- /dev/null +++ b/artifacts/leaderboard_v2/schedule_free_adamw_v2_summary.csv @@ -0,0 +1,27 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +7,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1236836366985733,7836.119033813477,7480.571330547333,0.909490487405232,10666 +16,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1236888022091851,8195.66323542595,7483.040989398956,0.909490487405232,10666 +24,criteo1tb_pytorch,trial_1,validation/loss,0.123735,True,0.1236981323330379,6768.513046264648,6768.513046264648,0.909490487405232,10666 +5,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7243824080261677,1018.5896019935608,1018.5896019935608,0.2531965345361251,18094 +14,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7242272269142164,1279.6873631477356,1279.6873631477356,0.2531965345361251,18094 +22,fastmri_pytorch,trial_1,validation/ssim,0.723653,True,0.7240946463272018,1128.837876081467,1128.837876081467,0.2531965345361251,18094 +1,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,False,22.907429657990484,46293.00692868233,inf,0.39557035112902283,72000 +10,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,False,23.1486231732884,46274.09501791,inf,0.39557035112902283,72000 +19,finewebedu_lm_pytorch,trial_1,validation/ppl,22.2995,False,23.129587841090785,43710.66011118889,inf,0.39557035112902283,72000 +6,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.67248,55976.22831273079,inf,0.8173056068837263,195999 +15,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.67436,73961.89125466347,inf,0.8173056068837263,195999 +23,imagenet_resnet_pytorch,trial_1,validation/accuracy,0.77431,False,0.68412,69928.90233135223,inf,0.8173056068837263,195999 +4,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.65356,95099.52543473244,inf,0.8838809331652617,167999 +13,imagenet_vit_pytorch,trial_1,validation/accuracy,0.77309,False,0.64404,92544.23992848396,inf,0.8838809331652617,167999 +2,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,False,0.0894317578332448,64575.97684216499,inf,0.6624823705895609,76000 +11,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,True,0.0854922029643219,55846.44081497192,55846.44081497192,0.6624823705895609,76000 +20,librispeech_conformer_pytorch,trial_1,validation/wer,0.085884,True,0.0855018587360594,54098.90682005882,54098.90682005882,0.6624823705895609,76000 +8,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,True,0.119316371360981,36138.43036651611,36138.43036651611,0.5242204456710123,38400 +17,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,True,0.1196350118283203,43377.43124747276,43377.43124747276,0.5242204456710123,38400 +25,librispeech_deepspeech_pytorch,trial_1,validation/wer,0.119936,True,0.119750881089171,41911.17554831505,41911.17554831505,0.5242204456710123,38400 +3,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2844002947409835,6330.916296482086,6330.916296482086,0.21809077900113122,52000 +12,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2829456743930914,5872.041952133179,5872.041952133179,0.21809077900113122,52000 +21,ogbg_pytorch,trial_1,validation/mean_average_precision,0.28098,True,0.2842687873347874,6325.430662155151,6325.430662155151,0.21809077900113122,52000 +0,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.968261630078437,10325.45705485344,10325.45705485344,0.14011229786067375,120000 +9,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.90527060487547,11614.250758886335,11614.250758886335,0.14011229786067375,120000 +18,wmt_pytorch,trial_1,validation/bleu,30.8491,True,30.96477125743624,8397.619731426239,7755.601474523544,0.14011229786067375,120000 diff --git a/artifacts/leaderboard_v2/scores.csv b/artifacts/leaderboard_v2/scores.csv new file mode 100644 index 00000000..3500d874 --- /dev/null +++ b/artifacts/leaderboard_v2/scores.csv @@ -0,0 +1,15 @@ +submission,score +AdEMAMix,0.5190796857463527 +Cautious NAdamW,0.31425364758698043 +Lion,0.27833894500561146 +Muon (JAX),0.2845117845117842 +Muon (PyTorch),0.4231200897867556 +NAdamW,0.384399551066217 +NAdamW (Baseline v0.5),0.4506172839506181 +NAdamW (ResNet),0.18574635241301896 +Schedule-Free AdamW,0.466891133557801 +Schedule-Free AdamW (JAX),0.4107744107744111 +Schedule-Free AdamW (JAX v2),0.4405162738496074 +Schedule-Free AdamW v2,0.5679012345679016 +DiLoCo (Single Worker),0.1369248035914701 +DiLoCo v2 (Single Worker),0.1301907968574634 diff --git a/artifacts/leaderboard_v2/scores_steps.csv b/artifacts/leaderboard_v2/scores_steps.csv new file mode 100644 index 00000000..904f40b2 --- /dev/null +++ b/artifacts/leaderboard_v2/scores_steps.csv @@ -0,0 +1,15 @@ +submission,score +AdEMAMix,0.5258136924803595 +Cautious NAdamW,0.31986531986531946 +Lion,0.2732884399551064 +Muon (JAX),0.31986531986531946 +Muon (PyTorch),0.4326599326599318 +NAdamW,0.40404040404040326 +NAdamW (Baseline v0.5),0.45454545454545503 +NAdamW (ResNet),0.19528619528619492 +Schedule-Free AdamW,0.4461279461279469 +Schedule-Free AdamW (JAX),0.4090909090909087 +Schedule-Free AdamW (JAX v2),0.41245791245791213 +Schedule-Free AdamW v2,0.5252525252525259 +DiLoCo (Single Worker),0.18630751964085265 +DiLoCo v2 (Single Worker),0.1829405162738493 diff --git a/artifacts/leaderboard_v2/scores_table.tex b/artifacts/leaderboard_v2/scores_table.tex new file mode 100644 index 00000000..f14b06d6 --- /dev/null +++ b/artifacts/leaderboard_v2/scores_table.tex @@ -0,0 +1,25 @@ +\begin{table}[h] + \centering + \caption{AlgoPerf Self-Tuning Leaderboard} + \label{tab:scores} + \begin{tabular}{rlr} + \toprule + Rank & Submission & Score \\ + \midrule + 1 & Schedule-Free AdamW v2 & \textbf{0.5679} \\ + 2 & AdEMAMix & 0.5191 \\ + 3 & Schedule-Free AdamW & 0.4669 \\ + 4 & NAdamW (Baseline v0.5) & 0.4506 \\ + 5 & Schedule-Free AdamW (JAX v2) & 0.4405 \\ + 6 & Muon (PyTorch) & 0.4231 \\ + 7 & Schedule-Free AdamW (JAX) & 0.4108 \\ + 8 & NAdamW & 0.3844 \\ + 9 & Cautious NAdamW & 0.3143 \\ + 10 & Muon (JAX) & 0.2845 \\ + 11 & Lion & 0.2783 \\ + 12 & NAdamW (ResNet) & 0.1857 \\ + 13 & DiLoCo (Single Worker) & 0.1369 \\ + 14 & DiLoCo v2 (Single Worker) & 0.1302 \\ + \bottomrule + \end{tabular} +\end{table} \ No newline at end of file diff --git a/artifacts/leaderboard_v2/scores_wallclock_vs_steps.csv b/artifacts/leaderboard_v2/scores_wallclock_vs_steps.csv new file mode 100644 index 00000000..9bca9058 --- /dev/null +++ b/artifacts/leaderboard_v2/scores_wallclock_vs_steps.csv @@ -0,0 +1,15 @@ +submission,wallclock,steps,rank_wallclock,rank_steps,rank_shift +Schedule-Free AdamW v2,0.5679012345679016,0.5252525252525259,1,2,-1 +AdEMAMix,0.5190796857463527,0.5258136924803595,2,1,1 +Schedule-Free AdamW,0.466891133557801,0.4461279461279469,3,4,-1 +NAdamW (Baseline v0.5),0.4506172839506181,0.45454545454545503,4,3,1 +Schedule-Free AdamW (JAX v2),0.4405162738496074,0.41245791245791213,5,6,-1 +Muon (PyTorch),0.4231200897867556,0.4326599326599318,6,5,1 +Schedule-Free AdamW (JAX),0.4107744107744111,0.4090909090909087,7,7,0 +NAdamW,0.384399551066217,0.40404040404040326,8,8,0 +Cautious NAdamW,0.31425364758698043,0.31986531986531946,9,9,0 +Muon (JAX),0.2845117845117842,0.31986531986531946,10,9,1 +Lion,0.27833894500561146,0.2732884399551064,11,11,0 +NAdamW (ResNet),0.18574635241301896,0.19528619528619492,12,12,0 +DiLoCo (Single Worker),0.1369248035914701,0.18630751964085265,13,13,0 +DiLoCo v2 (Single Worker),0.1301907968574634,0.1829405162738493,14,14,0 diff --git a/artifacts/leaderboard_v2/single_worker_diloco_summary.csv b/artifacts/leaderboard_v2/single_worker_diloco_summary.csv new file mode 100644 index 00000000..1f413b49 --- /dev/null +++ b/artifacts/leaderboard_v2/single_worker_diloco_summary.csv @@ -0,0 +1,27 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1240051719548662,12536.648544311523,inf,2.029253848574378,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1241770580473042,13238.60691356659,inf,2.029253848574378,10666 +20,criteo1tb_jax,trial_1,validation/loss,0.123735,True,0.1236790314233259,8951.699251413345,8951.699251413345,2.029253848574378,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7243454503288548,1824.361733198166,1824.361733198166,1.0101386800818486,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7240330959614167,2934.3234000206,2934.3234000206,1.0101386800818486,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.299927329840155,28315.804240703583,28315.804240703583,0.46192917255577687,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.323351155823907,28314.819189310077,28314.819189310077,0.46192917255577687,72000 +19,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.30258852443628,28313.505344867703,28313.505344867703,0.46192917255577687,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.75864,59924.7624270916,inf,0.2547951958011423,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.76084,73905.25310635567,inf,0.2547951958011423,195999 +24,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.76207995,57916.22069811821,inf,0.2547951958011423,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.732,87449.53238081932,inf,0.49808267468873035,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.69314,92609.95464468002,inf,0.49808267468873035,167999 +23,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.73982,82302.74896216393,inf,0.49808267468873035,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.896190798049534,15938.47878575325,inf,2.739086131503963,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1782552020470236,63227.4588804245,inf,2.739086131503963,76000 +18,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.1883068604258195,64987.82690048218,inf,2.739086131503963,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1556993192680925,53798.12966442108,inf,2.648808918364061,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1608168782889972,55242.17136979103,inf,2.648808918364061,38400 +21,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.160256843528219,55258.4434466362,inf,2.648808918364061,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2752502023880646,4991.95076751709,inf,0.19546009999048936,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2770207933431546,5446.170157909393,inf,0.19546009999048936,52000 +22,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2721272001835208,4542.065598726273,inf,0.19546009999048936,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,False,30.060962305551648,15523.899386644363,inf,0.1408422923478924,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,False,29.21444071534188,17454.147111177444,inf,0.1408422923478924,120000 +25,wmt_jax,trial_1,validation/bleu,30.8491,False,30.1649320836006,16168.221429347992,inf,0.1408422923478924,120000 diff --git a/artifacts/leaderboard_v2/single_worker_dilocov2_summary.csv b/artifacts/leaderboard_v2/single_worker_dilocov2_summary.csv new file mode 100644 index 00000000..5df19345 --- /dev/null +++ b/artifacts/leaderboard_v2/single_worker_dilocov2_summary.csv @@ -0,0 +1,27 @@ +,workload,trial,val target metric name,val target metric value,val target reached,best metric value on val,time to best eval on val (s),time to target on val (s),step_time (s),step_hint +2,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1242709456268029,13033.471937417984,inf,1.9572563744633575,10666 +11,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1243268175997028,12450.281544446943,inf,1.9572563744633575,10666 +19,criteo1tb_jax,trial_1,validation/loss,0.123735,False,0.1243662101918146,12143.230377197266,inf,1.9572563744633575,10666 +5,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7246792374129502,3013.444573879242,3013.444573879242,1.2131462696771385,18094 +14,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7237136660496976,2578.1419467926025,2578.1419467926025,1.2131462696771385,18094 +22,fastmri_jax,trial_1,validation/ssim,0.723653,True,0.7237209476777926,2561.646829843521,2561.646829843521,1.2131462696771385,18094 +1,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.83711947316281,28313.97388148308,28313.97388148308,0.47487529266350237,72000 +10,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,21.66829751540793,28312.441186904907,28312.441186904907,0.47487529266350237,72000 +18,finewebedu_lm_jax,trial_1,validation/ppl,22.2995,True,22.06385468283391,28316.03405380249,28316.03405380249,0.47487529266350237,72000 +7,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.73524,71938.87695384026,inf,0.49430486468060464,195999 +16,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.76023996,63908.86873793602,inf,0.49430486468060464,195999 +24,imagenet_resnet_jax,trial_1,validation/accuracy,0.77431,False,0.67983997,73927.91577363014,inf,0.49430486468060464,195999 +6,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.6832,82303.60297131538,inf,0.5116912722504399,167999 +15,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.68395996,84880.63724040985,inf,0.5116912722504399,167999 +23,imagenet_vit_jax,trial_1,validation/accuracy,0.77309,False,0.69978,82310.41092848778,inf,0.5116912722504399,167999 +0,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.2844686911601409,64958.12221217156,inf,2.5898517384196813,76000 +9,librispeech_conformer_jax,trial_1,validation/wer,0.085884,False,0.2280886399845507,65014.05562067032,inf,2.5898517384196813,76000 +3,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1654419929512866,55277.98472857475,inf,2.603047242070443,38400 +12,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1633370347124993,55251.850288152695,inf,2.603047242070443,38400 +20,librispeech_deepspeech_jax,trial_1,validation/wer,0.119936,False,0.1682904456138657,55264.86380052567,inf,2.603047242070443,38400 +4,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2719100741047621,5445.762615919113,inf,0.19557801595903612,52000 +13,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.2654756685490676,5895.114526987076,inf,0.19557801595903612,52000 +21,ogbg_jax,trial_1,validation/mean_average_precision,0.28098,False,0.257423756373387,7250.969809532165,inf,0.19557801595903612,52000 +8,wmt_jax,trial_1,validation/bleu,30.8491,False,29.73364555536789,15524.697182416916,inf,0.13540160135260415,120000 +17,wmt_jax,trial_1,validation/bleu,30.8491,False,29.61076013509891,17455.57430243492,inf,0.13540160135260415,120000 +25,wmt_jax,trial_1,validation/bleu,30.8491,False,29.5711685494686,14879.0592045784,inf,0.13540160135260415,120000 diff --git a/artifacts/leaderboard_v2/steps_to_target_table.tex b/artifacts/leaderboard_v2/steps_to_target_table.tex new file mode 100644 index 00000000..6c515ae8 --- /dev/null +++ b/artifacts/leaderboard_v2/steps_to_target_table.tex @@ -0,0 +1,27 @@ +\begin{table}[htbp] + \centering + \caption{Median number of optimizer steps to reach the validation target. \textemdash{} = target not reached. Submissions choose their own batch sizes, so step counts compare optimizer updates, not examples seen.} + \label{tab:steps_to_target} + \resizebox{\textwidth}{!}{% + \begin{tabular}{lrrrrrrrrr} + \toprule + Submission & \criteo & \fastmri & \finewebedu & \resnet & \vit & \conformer & \deepspeech & \ogbg & \wmt \\ + \midrule + AdEMAMix & 8,371 & 10,206 & 44,503 & \textemdash{} & \textemdash{} & 67,706 & \textemdash{} & 27,247 & 112,742 \\ + Cautious NAdamW & \textemdash{} & 7,518 & 58,199 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 24,948 & 112,372 \\ + Lion & \textemdash{} & 10,645 & 59,524 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 33,386 & 109,080 \\ + Muon (JAX) & \textemdash{} & 8,801 & 40,724 & \textemdash{} & 151,926 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + Muon (PyTorch) & 7,716 & \textemdash{} & 39,220 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 7,711 & 97,224 \\ + NAdamW & 8,286 & 9,924 & 58,784 & \textemdash{} & 152,461 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + NAdamW (Baseline v0.5) & 9,145 & 6,648 & 47,039 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 20,879 & 118,600 \\ + NAdamW (ResNet) & \textemdash{} & 9,220 & 53,029 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 32,738 & \textemdash{} \\ + Schedule-Free AdamW & 10,346 & 10,599 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 90,588 & 15,853 & 133,517 \\ + Schedule-Free AdamW (JAX) & \textemdash{} & 7,160 & 57,242 & \textemdash{} & 175,889 & \textemdash{} & \textemdash{} & 27,341 & 122,198 \\ + Schedule-Free AdamW (JAX v2) & 9,005 & 8,750 & 68,640 & \textemdash{} & 164,206 & \textemdash{} & \textemdash{} & 27,457 & \textemdash{} \\ + Schedule-Free AdamW v2 & 7,951 & 12,431 & \textemdash{} & \textemdash{} & \textemdash{} & 83,184 & 78,669 & 28,449 & 73,222 \\ + DiLoCo (Single Worker) & \textemdash{} & 9,342 & 61,209 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + DiLoCo v2 (Single Worker) & \textemdash{} & 10,140 & 59,550 & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + \bottomrule + \end{tabular}% + } +\end{table} \ No newline at end of file diff --git a/artifacts/leaderboard_v2/time_to_target_table.tex b/artifacts/leaderboard_v2/time_to_target_table.tex new file mode 100644 index 00000000..5947d013 --- /dev/null +++ b/artifacts/leaderboard_v2/time_to_target_table.tex @@ -0,0 +1,27 @@ +\begin{table}[htbp] + \centering + \caption{Time to target (seconds). \textemdash{} = target not reached.} + \label{tab:time_to_target} + \resizebox{\textwidth}{!}{% + \begin{tabular}{lrrrrrrrrr} + \toprule + Submission & \criteo & \fastmri & \finewebedu & \resnet & \vit & \conformer & \deepspeech & \ogbg & \wmt \\ + \midrule + AdEMAMix & 7,839s & 1,518s & 18,026s & \textemdash{} & \textemdash{} & 48,895s & \textemdash{} & 6,330s & 17,400s \\ + Cautious NAdamW & \textemdash{} & 1,608s & 25,739s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 4,993s & 14,232s \\ + Lion & \textemdash{} & 1,394s & 23,172s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 7,224s & 15,476s \\ + Muon (JAX) & \textemdash{} & 1,870s & 20,594s & \textemdash{} & 77,163s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + Muon (PyTorch) & 7,142s & \textemdash{} & 15,472s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 1,833s & 14,215s \\ + NAdamW & 7,493s & 1,801s & 25,734s & \textemdash{} & 72,016s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + NAdamW (Baseline v0.5) & 8,206s & 1,621s & 20,590s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 4,090s & 14,866s \\ + NAdamW (ResNet) & \textemdash{} & 1,921s & 23,163s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 6,350s & \textemdash{} \\ + Schedule-Free AdamW & 10,338s & 1,189s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & 40,463s & 3,640s & 19,958s \\ + Schedule-Free AdamW (JAX) & \textemdash{} & 2,397s & 12,875s & \textemdash{} & 87,469s & \textemdash{} & \textemdash{} & 5,447s & 16,161s \\ + Schedule-Free AdamW (JAX v2) & 8,205s & 1,851s & 15,452s & \textemdash{} & 84,892s & \textemdash{} & \textemdash{} & 5,444s & \textemdash{} \\ + Schedule-Free AdamW v2 & 7,481s & 1,129s & \textemdash{} & \textemdash{} & \textemdash{} & 55,846s & 41,911s & 6,325s & 10,325s \\ + DiLoCo (Single Worker) & \textemdash{} & 2,379s & 28,315s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + DiLoCo v2 (Single Worker) & \textemdash{} & 2,578s & 28,314s & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} & \textemdash{} \\ + \bottomrule + \end{tabular}% + } +\end{table} \ No newline at end of file diff --git a/artifacts/leaderboard_v2/time_to_targets.csv b/artifacts/leaderboard_v2/time_to_targets.csv new file mode 100644 index 00000000..bea4d674 --- /dev/null +++ b/artifacts/leaderboard_v2/time_to_targets.csv @@ -0,0 +1,15 @@ +submission,criteo1tb,fastmri,finewebedu_lm,imagenet_resnet,imagenet_vit,librispeech_conformer,librispeech_deepspeech,ogbg,wmt +AdEMAMix,7839.193164110184,1517.7321906089785,18025.89689064026,inf,inf,48894.85426735878,inf,6329.966245889664,17399.639942407608 +Cautious NAdamW,inf,1608.188658952713,25738.981688261032,inf,inf,inf,inf,4992.686820983887,14232.458706855774 +Lion,inf,1394.1750195026398,23172.039316177368,inf,inf,inf,inf,7223.987207174301,15475.552730083466 +Muon (JAX),inf,1869.765276670456,20594.037749767303,inf,77162.91657114029,inf,inf,inf,inf +Muon (PyTorch),7141.604691028595,inf,15471.922557115557,inf,inf,inf,inf,1833.473667144776,14214.779582500458 +NAdamW,7492.6946766376495,1800.7732002735138,25733.847669363025,inf,72015.5787293911,inf,inf,inf,inf +NAdamW (Baseline v0.5),8206.103132247925,1620.5153810977936,20589.912857055664,inf,inf,inf,inf,4089.775626659393,14865.7885992527 +NAdamW (ResNet),inf,1920.545307636261,23163.02198767662,inf,inf,inf,inf,6349.506216049194,inf +Schedule-Free AdamW,10337.671689033508,1188.9131379127502,inf,inf,inf,inf,40463.388149023056,3640.148542404175,19957.71787595749 +Schedule-Free AdamW (JAX),inf,2397.40203499794,12875.283079862596,inf,87468.86081624031,inf,inf,5446.973826885223,16161.202248096466 +Schedule-Free AdamW (JAX v2),8204.54053902626,1850.625381946564,15451.99134683609,inf,84891.75501847267,inf,inf,5444.019295454025,inf +Schedule-Free AdamW v2,7480.571330547333,1128.837876081467,inf,inf,inf,55846.44081497192,41911.17554831505,6325.430662155151,10325.45705485344 +DiLoCo (Single Worker),inf,2379.3425666093826,28314.819189310077,inf,inf,inf,inf,inf,inf +DiLoCo v2 (Single Worker),inf,2578.1419467926025,28313.97388148308,inf,inf,inf,inf,inf,inf diff --git a/artifacts/leaderboard_v2/time_to_targets_steps.csv b/artifacts/leaderboard_v2/time_to_targets_steps.csv new file mode 100644 index 00000000..9c6df884 --- /dev/null +++ b/artifacts/leaderboard_v2/time_to_targets_steps.csv @@ -0,0 +1,15 @@ +submission,criteo1tb,fastmri,finewebedu_lm,imagenet_resnet,imagenet_vit,librispeech_conformer,librispeech_deepspeech,ogbg,wmt +AdEMAMix,8371.0,10206.0,44503.0,inf,inf,67706.0,inf,27247.0,112742.0 +Cautious NAdamW,inf,7518.0,58199.0,inf,inf,inf,inf,24948.0,112372.0 +Lion,inf,10645.0,59524.0,inf,inf,inf,inf,33386.0,109080.0 +Muon (JAX),inf,8801.0,40724.0,inf,151926.0,inf,inf,inf,inf +Muon (PyTorch),7716.0,inf,39220.0,inf,inf,inf,inf,7711.0,97224.0 +NAdamW,8286.0,9924.0,58784.0,inf,152461.0,inf,inf,inf,inf +NAdamW (Baseline v0.5),9145.0,6648.0,47039.0,inf,inf,inf,inf,20879.0,118600.0 +NAdamW (ResNet),inf,9220.0,53029.0,inf,inf,inf,inf,32738.0,inf +Schedule-Free AdamW,10346.0,10599.0,inf,inf,inf,inf,90588.0,15853.0,133517.0 +Schedule-Free AdamW (JAX),inf,7160.0,57242.0,inf,175889.0,inf,inf,27341.0,122198.0 +Schedule-Free AdamW (JAX v2),9005.0,8750.0,68640.0,inf,164206.0,inf,inf,27457.0,inf +Schedule-Free AdamW v2,7951.0,12431.0,inf,inf,inf,83184.0,78669.0,28449.0,73222.0 +DiLoCo (Single Worker),inf,9342.0,61209.0,inf,inf,inf,inf,inf,inf +DiLoCo v2 (Single Worker),inf,10140.0,59550.0,inf,inf,inf,inf,inf,inf diff --git a/artifacts/leaderboard_v2/wallclock_vs_steps.pdf b/artifacts/leaderboard_v2/wallclock_vs_steps.pdf new file mode 100644 index 00000000..b3685084 Binary files /dev/null and b/artifacts/leaderboard_v2/wallclock_vs_steps.pdf differ diff --git a/artifacts/leaderboard_v2/wallclock_vs_steps.png b/artifacts/leaderboard_v2/wallclock_vs_steps.png new file mode 100644 index 00000000..c7abb1f9 Binary files /dev/null and b/artifacts/leaderboard_v2/wallclock_vs_steps.png differ diff --git a/artifacts/tech_report_v1/leaderboard/score_submissions_colab.ipynb b/artifacts/tech_report_v1/leaderboard/score_submissions_colab.ipynb index 2a7a6885..c87a543f 100644 --- a/artifacts/tech_report_v1/leaderboard/score_submissions_colab.ipynb +++ b/artifacts/tech_report_v1/leaderboard/score_submissions_colab.ipynb @@ -45,7 +45,8 @@ "from IPython.display import display\n", "from tabulate import tabulate\n", "\n", - "from scoring import performance_profile, scoring_utils" + "from scoring import performance_profile, scoring_utils\n", + "from scoring.config import DEFAULT_TARGETS_PATH, WorkloadConfig" ] }, { @@ -102,6 +103,7 @@ "SELF_TUNING_RULESET = True\n", "# Set True to compute and plot performance profiles after building summaries.\n", "COMPUTE_PERFORMANCE_PROFILES = True\n", + "WORKLOAD_CONFIG = WorkloadConfig.from_json(DEFAULT_TARGETS_PATH)\n", "\n", "# ── Performance profile parameters ────────────────────────────────────────────\n", "MIN_TAU = 1.0\n", @@ -178,10 +180,8 @@ "source": [ "def get_summary_df(workload, workload_df):\n", " \"\"\"Build a per-trial summary for one workload.\"\"\"\n", - " validation_metric, validation_target = (\n", - " scoring_utils.get_workload_metrics_and_targets(workload)\n", - " )\n", - " is_minimized = performance_profile.check_if_minimized(validation_metric)\n", + " validation_metric, validation_target = WORKLOAD_CONFIG.metric_and_target(workload)\n", + " is_minimized = WORKLOAD_CONFIG.target_is_minimized(workload)\n", " target_op = operator.le if is_minimized else operator.ge\n", " best_op = min if is_minimized else max\n", " idx_op = np.argmin if is_minimized else np.argmax\n", @@ -8225,6 +8225,7 @@ "if COMPUTE_PERFORMANCE_PROFILES:\n", " performance_profile_df = performance_profile.compute_performance_profiles(\n", " results,\n", + " WORKLOAD_CONFIG,\n", " time_col='score',\n", " min_tau=MIN_TAU,\n", " max_tau=MAX_TAU,\n", diff --git a/artifacts/tech_report_v2/leaderboard/score_submissions.ipynb b/artifacts/tech_report_v2/leaderboard/score_submissions.ipynb new file mode 100644 index 00000000..62ac08a3 --- /dev/null +++ b/artifacts/tech_report_v2/leaderboard/score_submissions.ipynb @@ -0,0 +1,9333 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AlgoPerf Scoring v2: Tables & Performance Profiles\n", + "\n", + "Second scoring iteration for the tech report. Unlike `tech_report_v1` (which\n", + "ran against the pre-vendoring `algorithmic-efficiency` scoring code and its\n", + "stale hardcoded 8-workload denominator), this notebook runs **locally against\n", + "the repo's self-contained `scoring/` package**, so scores always match\n", + "`python -m scoring.score_submissions` and divide by the config's full base\n", + "workload count (9, including the never-yet-solved ImageNet ResNet).\n", + "\n", + "Outputs (CSVs, plots, LaTeX tables) are written to `artifacts/leaderboard_v2/`.\n", + "\n", + "Run from anywhere inside the repo:\n", + "\n", + "```bash\n", + "uv run --with jupyter jupyter lab # interactive\n", + "uv run --with jupyter,nbclient jupyter nbconvert --to notebook --execute \\\n", + " artifacts/tech_report_v2/leaderboard/score_submissions.ipynb # headless\n", + "```\n", + "\n", + "**Input format** — your submission data must follow this directory structure:\n", + "```\n", + "submission_directory/\n", + " /\n", + " /\n", + " /\n", + " /\n", + " eval_measurements.csv\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Imports & Repo Root\n", + "\n", + "Locates the repo root (so the notebook works whether launched from the root or\n", + "from this folder), then imports the scoring package.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pickle\n", + "import sys\n", + "from pathlib import Path\n", + "\n", + "# Run everything relative to the repo root so `scoring` imports and the\n", + "# repo-relative paths in Section 3 work from any launch directory.\n", + "REPO_ROOT = next(\n", + " p for p in [Path.cwd(), *Path.cwd().parents]\n", + " if (p / 'scoring' / 'score_submissions.py').exists()\n", + ")\n", + "os.chdir(REPO_ROOT)\n", + "sys.path.insert(0, str(REPO_ROOT))\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from IPython.display import display\n", + "from tabulate import tabulate\n", + "\n", + "from scoring import performance_profile, scoring_utils\n", + "from scoring.config import DEFAULT_TARGETS_PATH, WorkloadConfig\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Mount Google Drive (Colab only)\n", + "\n", + "Only needed when running on Colab with data in Drive; skip locally.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# from google.colab import drive\n", + "# drive.mount('/content/drive')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Configuration\n", + "\n", + "Set the paths and flags below before running the rest of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# ── Required ──────────────────────────────────────────────────────────────────\n", + "# Path to the directory that contains one sub-folder per submission\n", + "# (relative to the repo root).\n", + "SUBMISSION_DIRECTORY = 'logs/self_tuning'\n", + "\n", + "# Where to write output CSVs, plots, and LaTeX tables. This is the committed\n", + "# artifact directory for the second scoring iteration.\n", + "OUTPUT_DIR = 'artifacts/leaderboard_v2'\n", + "\n", + "# ── Submission filters (leave empty strings to include/exclude nothing) ───────\n", + "# Comma-separated names to include (empty = include all).\n", + "INCLUDE_SUBMISSIONS = ''\n", + "# Comma-separated names to exclude.\n", + "EXCLUDE_SUBMISSIONS = 'muon_torch_jax_hps,muon_torch_jax_hps_achandr,muon_torch_jax_hps_lr_fix,muon_torch_replicated_jax_hps,muon_torch_replicated_torch_hps'\n", + "\n", + "# ── Scoring flags ─────────────────────────────────────────────────────────────\n", + "# Set True to enforce the competition's strict trial/study count rules.\n", + "STRICT = False\n", + "# Set True when scoring the self-tuning ruleset.\n", + "SELF_TUNING_RULESET = True\n", + "# Set True to compute and plot performance profiles after building summaries.\n", + "COMPUTE_PERFORMANCE_PROFILES = True\n", + "# Benchmark version config: base/held-out workloads, targets, step hints.\n", + "# The score divides by the number of base workloads in this config.\n", + "WORKLOAD_CONFIG = WorkloadConfig.from_json(DEFAULT_TARGETS_PATH)\n", + "\n", + "# ── Performance profile parameters ────────────────────────────────────────────\n", + "MIN_TAU = 1.0\n", + "MAX_TAU = 4.0 # set None to auto-detect from data\n", + "NUM_POINTS = 100\n", + "SCALE = 'linear' # 'linear' or 'log'\n", + "\n", + "# ── Caching (optional) ────────────────────────────────────────────────────────\n", + "# Save the parsed results dict so you can reload it later without re-parsing.\n", + "SAVE_RESULTS_TO = None # e.g. 'results.pkl'\n", + "# Load a previously saved results dict instead of re-parsing.\n", + "LOAD_RESULTS_FROM = None # e.g. 'results.pkl'\n", + "\n", + "os.makedirs(OUTPUT_DIR, exist_ok=True)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3b. Submission Display-Name Map\n", + "Edit the right-hand side to control how names appear in tables and plots.\\nAny submission not listed here will be shown with its raw folder name." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Maps raw folder names → display names used in tables, plots, and LaTeX output.\n", + "# Add or edit entries freely; unlisted names fall back to their raw folder name.\n", + "SUBMISSION_NAME_MAP = {\n", + " 'ademamix': 'AdEMAMix',\n", + " 'cautious_nadamw': 'Cautious NAdamW',\n", + " 'lion': 'Lion',\n", + " 'muon': 'Muon (JAX)',\n", + " 'muon_torch': 'Muon (PyTorch)',\n", + " 'muon_torch_jax_hps': 'Muon (PyTorch, JAX HPs)',\n", + " 'muon_torch_jax_hps_achandr': 'Muon (PyTorch, JAX HPs, achandr)',\n", + " 'muon_torch_jax_hps_lr_fix': 'Muon (PyTorch, JAX HPs, LR Fix)',\n", + " 'muon_torch_replicated_jax_hps': 'Muon (Replicated, JAX HPs)',\n", + " 'muon_torch_replicated_torch_hps': 'Muon (Replicated, Torch HPs)',\n", + " 'nadamw': 'NAdamW',\n", + " 'nadamw_baselinev05': 'NAdamW (Baseline v0.5)',\n", + " 'nadamw_resnet': 'NAdamW (ResNet)',\n", + " 'schedule_free_adamw': 'Schedule-Free AdamW',\n", + " 'schedule_free_adamw_jax': 'Schedule-Free AdamW (JAX)',\n", + " 'schedule_free_adamw_jax_v2': 'Schedule-Free AdamW (JAX v2)',\n", + " 'schedule_free_adamw_v2': 'Schedule-Free AdamW v2',\n", + " 'single_worker_diloco': 'DiLoCo (Single Worker)',\n", + " 'single_worker_dilocov2': 'DiLoCo v2 (Single Worker)',\n", + "}\n", + "\n", + "def pretty(name):\n", + " \"\"\"Return the display name for a submission, falling back to the raw name.\"\"\"\n", + " return SUBMISSION_NAME_MAP.get(name, name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Helpers: Submission Summary & Leaderboard Score\n", + "\n", + "Imported directly from `scoring/score_submissions.py` so the notebook can never\n", + "drift from the official pipeline.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from scoring.score_submissions import (\n", + " compute_leaderboard_score,\n", + " get_submission_summary as _get_submission_summary,\n", + ")\n", + "\n", + "\n", + "def get_submission_summary(df):\n", + " \"\"\"Canonical per-workload summary, bound to this notebook's config.\"\"\"\n", + " return _get_submission_summary(df, WORKLOAD_CONFIG)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4b. Plot Theme\n", + "\n", + "Sets a publication-quality matplotlib style and defines `plot_performance_profiles_styled`.\\nWith 19 submissions the plot cycles through 10 colorblind-safe colors × 4 line styles so it stays readable in greyscale and print." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "import math\n", + "import matplotlib as mpl\n", + "\n", + "# ── Colorblind-safe 10-color palette (Paul Tol \"bright\") ──────────────────────\n", + "_COLORS = [\n", + " '#4477AA', # blue\n", + " '#EE6677', # red\n", + " '#228833', # green\n", + " '#CCBB44', # yellow\n", + " '#66CCEE', # cyan\n", + " '#AA3377', # purple\n", + " '#BBBBBB', # grey\n", + " '#EE7733', # orange\n", + " '#009988', # teal\n", + " '#CC3311', # vermillion\n", + "]\n", + "_LINE_STYLES = ['-', '--', '-.', ':']\n", + "\n", + "# 10 solid lines, then 9 dashed, etc. — enough for 19 submissions.\n", + "_STYLE_CYCLE = list(itertools.islice(\n", + " ((c, ls) for ls in _LINE_STYLES for c in _COLORS),\n", + " 40,\n", + "))\n", + "\n", + "# ── rcParams: tuned for a two-column tech-report (e.g. NeurIPS / ICML) ────────\n", + "mpl.rcParams.update({\n", + " 'figure.figsize': (9, 4.5),\n", + " 'figure.dpi': 150,\n", + " 'savefig.dpi': 300,\n", + " 'savefig.bbox': 'tight',\n", + " 'savefig.pad_inches': 0.05,\n", + " 'font.family': 'serif',\n", + " 'font.serif': ['Times New Roman', 'DejaVu Serif'],\n", + " 'font.size': 11,\n", + " 'axes.titlesize': 11,\n", + " 'axes.labelsize': 11,\n", + " 'xtick.labelsize': 10,\n", + " 'ytick.labelsize': 10,\n", + " 'legend.fontsize': 8.5,\n", + " 'legend.title_fontsize': 9,\n", + " 'legend.framealpha': 0.92,\n", + " 'legend.edgecolor': '#cccccc',\n", + " 'legend.borderpad': 0.5,\n", + " 'legend.labelspacing': 0.35,\n", + " 'axes.grid': True,\n", + " 'grid.alpha': 0.3,\n", + " 'grid.linestyle': '--',\n", + " 'grid.linewidth': 0.6,\n", + " 'axes.spines.top': False,\n", + " 'axes.spines.right': False,\n", + " 'axes.linewidth': 0.8,\n", + " 'lines.linewidth': 1.6,\n", + "})\n", + "\n", + "\n", + "def plot_performance_profiles_styled(\n", + " perf_df,\n", + " df_col,\n", + " scale='linear',\n", + " save_dir=None,\n", + " figsize=(9, 4.5),\n", + " title=None,\n", + "):\n", + " \"\"\"\n", + " Publication-quality performance profile plot for a tech report.\n", + "\n", + " Each submission gets a unique (color, line-style) pair so the figure\n", + " remains legible in greyscale and for colorblind readers.\n", + " The legend is placed below the plot.\n", + " Saves both a vector PDF and a 300-dpi PNG.\n", + " \"\"\"\n", + " style_iter = iter(_STYLE_CYCLE)\n", + "\n", + " fig, ax = plt.subplots(figsize=figsize)\n", + "\n", + " for submission in perf_df.index:\n", + " color, linestyle = next(style_iter)\n", + " ax.plot(\n", + " perf_df.columns,\n", + " perf_df.loc[submission],\n", + " label=submission,\n", + " color=color,\n", + " linestyle=linestyle,\n", + " linewidth=1.6,\n", + " alpha=0.92,\n", + " )\n", + "\n", + " ax.set_xlabel('Performance ratio τ (relative to best submission)')\n", + " ax.set_ylabel('Fraction of workloads solved ρ(τ)')\n", + " ax.set_xlim(perf_df.columns.min(), perf_df.columns.max())\n", + " ax.set_ylim(-0.02, 1.05)\n", + " ax.yaxis.set_major_formatter(mpl.ticker.PercentFormatter(xmax=1, decimals=0))\n", + "\n", + " if title:\n", + " ax.set_title(title, pad=8)\n", + "\n", + " # ── Legend below the axes ──────────────────────────────────────────────────\n", + " n = len(perf_df.index)\n", + " ncol = max(3, math.ceil(n / 4)) # ~4 rows for any submission count\n", + " ax.legend(\n", + " loc='upper center',\n", + " bbox_to_anchor=(0.5, -0.16),\n", + " ncol=ncol,\n", + " borderaxespad=0,\n", + " frameon=True,\n", + " handlelength=2.0,\n", + " handleheight=0.9,\n", + " columnspacing=1.0,\n", + " labelspacing=0.35,\n", + " )\n", + "\n", + " # Reserve vertical space proportional to the number of legend rows so the\n", + " # legend never overlaps the x-axis label.\n", + " n_rows = math.ceil(n / ncol)\n", + " pts_per_row = mpl.rcParams['legend.fontsize'] * 1.55\n", + " fig_height_pts = figsize[1] * 72\n", + " legend_frac = (n_rows * pts_per_row + 28) / fig_height_pts\n", + " fig.subplots_adjust(\n", + " left=0.07,\n", + " right=0.98,\n", + " top=0.91 if title else 0.97,\n", + " bottom=min(0.10 + legend_frac, 0.55),\n", + " )\n", + "\n", + " if save_dir:\n", + " base = os.path.join(save_dir, f'performance_profile_by_{df_col}')\n", + " fig.savefig(f'{base}.pdf', format='pdf')\n", + " fig.savefig(f'{base}.png', format='png', dpi=300)\n", + " print(f'Saved → {base}.pdf / .png')\n", + "\n", + " return fig, ax" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Load & Summarize Submissions" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Excluding (5): ['muon_torch_jax_hps', 'muon_torch_jax_hps_achandr', 'muon_torch_jax_hps_lr_fix', 'muon_torch_replicated_jax_hps', 'muon_torch_replicated_torch_hps']\n", + "Including (0): (all)\n", + "\n", + "Found 19 folders:\n", + " ✓ ademamix\n", + " ✓ cautious_nadamw\n", + " ✓ lion\n", + " ✓ muon\n", + " ✓ muon_torch\n", + " ✗ ← excluded muon_torch_jax_hps\n", + " ✗ ← excluded muon_torch_jax_hps_achandr\n", + " ✗ ← excluded muon_torch_jax_hps_lr_fix\n", + " ✗ ← excluded muon_torch_replicated_jax_hps\n", + " ✗ ← excluded muon_torch_replicated_torch_hps\n", + " ✓ nadamw\n", + " ✓ nadamw_baselinev05\n", + " ✓ nadamw_resnet\n", + " ✓ schedule_free_adamw\n", + " ✓ schedule_free_adamw_jax\n", + " ✓ schedule_free_adamw_jax_v2\n", + " ✓ schedule_free_adamw_v2\n", + " ✓ single_worker_diloco\n", + " ✓ single_worker_dilocov2\n", + "\n", + "\n", + "=== AdEMAMix (ademamix) ===\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + " Workload: criteo1tb_pytorch\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-07-08 17:40:55.479604: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:467] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", + "E0000 00:00:1783532455.503891 709114 cuda_dnn.cc:8579] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "E0000 00:00:1783532455.511874 709114 cuda_blas.cc:1407] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "W0000 00:00:1783532455.533675 709114 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\n", + "W0000 00:00:1783532455.533708 709114 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\n", + "W0000 00:00:1783532455.533710 709114 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\n", + "W0000 00:00:1783532455.533712 709114 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Workload: fastmri_pytorch\n", + " Workload: finewebedu_lm_pytorch\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "I0000 00:00:1783532460.611908 709114 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 38367 MB memory: -> device: 0, name: NVIDIA A100-SXM4-40GB, pci bus id: 0000:00:04.0, compute capability: 8.0\n", + "I0000 00:00:1783532460.613816 709114 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:1 with 38367 MB memory: -> device: 1, name: NVIDIA A100-SXM4-40GB, pci bus id: 0000:00:05.0, compute capability: 8.0\n", + "I0000 00:00:1783532460.616117 709114 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:2 with 38367 MB memory: -> device: 2, name: NVIDIA A100-SXM4-40GB, pci bus id: 0000:00:06.0, compute capability: 8.0\n", + "I0000 00:00:1783532460.617874 709114 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:3 with 38367 MB memory: -> device: 3, name: NVIDIA A100-SXM4-40GB, pci bus id: 0000:00:07.0, compute capability: 8.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Workload: imagenet_resnet_pytorch\n", + " Workload: imagenet_vit_pytorch\n", + " Workload: librispeech_conformer_pytorch\n", + " Workload: librispeech_deepspeech_pytorch\n", + " Workload: ogbg_pytorch\n", + " Workload: wmt_pytorch\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
7criteo1tb_pytorchtrial_1validation/loss0.123735True0.1236857839.1931647.839193e+031.00108310666
16criteo1tb_pytorchtrial_1validation/loss0.123735False0.12421113214.635874inf1.00108310666
24criteo1tb_pytorchtrial_1validation/loss0.123735True0.1236507835.5408277.479551e+031.00108310666
1fastmri_pytorchtrial_1validation/ssim0.723653True0.7248101311.1073641.311107e+030.94203918094
10fastmri_pytorchtrial_1validation/ssim0.723653True0.7249511517.7321911.517732e+030.94203918094
19fastmri_pytorchtrial_1validation/ssim0.723653True0.7248941555.3687831.555369e+030.94203918094
8finewebedu_lm_pytorchtrial_1validation/ppl22.432000True22.14082918025.6362031.802564e+040.40403272000
17finewebedu_lm_pytorchtrial_1validation/ppl22.432000True22.23496018027.6191791.802762e+040.40403272000
25finewebedu_lm_pytorchtrial_1validation/ppl22.432000True22.24743818025.8968911.802590e+040.40403272000
0imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.60218059997.685173inf0.674003195999
9imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.61658073926.784148inf0.674003195999
18imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.61518073948.011013inf0.674003195999
2imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.61544095268.045406inf0.802424167999
11imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.61512092620.537466inf0.802424167999
3librispeech_conformer_pytorchtrial_1validation/wer0.085884True0.08483654136.8768985.413688e+040.73051776000
12librispeech_conformer_pytorchtrial_1validation/wer0.085884True0.08389948894.8542674.889485e+040.73051776000
20librispeech_conformer_pytorchtrial_1validation/wer0.085884True0.08426648888.9719204.888897e+040.73051776000
5librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.12007034737.411699inf0.78845938400
14librispeech_deepspeech_pytorchtrial_1validation/wer0.119936True0.11852528953.8591182.895386e+040.78845938400
22librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.12157633312.740230inf0.78845938400
4ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2872657232.4202166.329966e+030.23044052000
13ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2920398137.1006876.332587e+030.23044052000
21ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2833055891.7984275.891798e+030.23044052000
6wmt_pytorchtrial_1validation/bleu30.849100True30.87605717399.6399421.739964e+040.153800120000
15wmt_pytorchtrial_1validation/bleu30.849100False30.80807419338.098572inf0.153800120000
23wmt_pytorchtrial_1validation/bleu30.849100True30.86705916752.3562831.675236e+040.153800120000
\n", + "
" + ], + "text/plain": [ + " workload trial \\\n", + "7 criteo1tb_pytorch trial_1 \n", + "16 criteo1tb_pytorch trial_1 \n", + "24 criteo1tb_pytorch trial_1 \n", + "1 fastmri_pytorch trial_1 \n", + "10 fastmri_pytorch trial_1 \n", + "19 fastmri_pytorch trial_1 \n", + "8 finewebedu_lm_pytorch trial_1 \n", + "17 finewebedu_lm_pytorch trial_1 \n", + "25 finewebedu_lm_pytorch trial_1 \n", + "0 imagenet_resnet_pytorch trial_1 \n", + "9 imagenet_resnet_pytorch trial_1 \n", + "18 imagenet_resnet_pytorch trial_1 \n", + "2 imagenet_vit_pytorch trial_1 \n", + "11 imagenet_vit_pytorch trial_1 \n", + "3 librispeech_conformer_pytorch trial_1 \n", + "12 librispeech_conformer_pytorch trial_1 \n", + "20 librispeech_conformer_pytorch trial_1 \n", + "5 librispeech_deepspeech_pytorch trial_1 \n", + "14 librispeech_deepspeech_pytorch trial_1 \n", + "22 librispeech_deepspeech_pytorch trial_1 \n", + "4 ogbg_pytorch trial_1 \n", + "13 ogbg_pytorch trial_1 \n", + "21 ogbg_pytorch trial_1 \n", + "6 wmt_pytorch trial_1 \n", + "15 wmt_pytorch trial_1 \n", + "23 wmt_pytorch trial_1 \n", + "\n", + " val target metric name val target metric value \\\n", + "7 validation/loss 0.123735 \n", + "16 validation/loss 0.123735 \n", + "24 validation/loss 0.123735 \n", + "1 validation/ssim 0.723653 \n", + "10 validation/ssim 0.723653 \n", + "19 validation/ssim 0.723653 \n", + "8 validation/ppl 22.432000 \n", + "17 validation/ppl 22.432000 \n", + "25 validation/ppl 22.432000 \n", + "0 validation/accuracy 0.774310 \n", + "9 validation/accuracy 0.774310 \n", + "18 validation/accuracy 0.774310 \n", + "2 validation/accuracy 0.773090 \n", + "11 validation/accuracy 0.773090 \n", + "3 validation/wer 0.085884 \n", + "12 validation/wer 0.085884 \n", + "20 validation/wer 0.085884 \n", + "5 validation/wer 0.119936 \n", + "14 validation/wer 0.119936 \n", + "22 validation/wer 0.119936 \n", + "4 validation/mean_average_precision 0.280980 \n", + "13 validation/mean_average_precision 0.280980 \n", + "21 validation/mean_average_precision 0.280980 \n", + "6 validation/bleu 30.849100 \n", + "15 validation/bleu 30.849100 \n", + "23 validation/bleu 30.849100 \n", + "\n", + " val target reached best metric value on val \\\n", + "7 True 0.123685 \n", + "16 False 0.124211 \n", + "24 True 0.123650 \n", + "1 True 0.724810 \n", + "10 True 0.724951 \n", + "19 True 0.724894 \n", + "8 True 22.140829 \n", + "17 True 22.234960 \n", + "25 True 22.247438 \n", + "0 False 0.602180 \n", + "9 False 0.616580 \n", + "18 False 0.615180 \n", + "2 False 0.615440 \n", + "11 False 0.615120 \n", + "3 True 0.084836 \n", + "12 True 0.083899 \n", + "20 True 0.084266 \n", + "5 False 0.120070 \n", + "14 True 0.118525 \n", + "22 False 0.121576 \n", + "4 True 0.287265 \n", + "13 True 0.292039 \n", + "21 True 0.283305 \n", + "6 True 30.876057 \n", + "15 False 30.808074 \n", + "23 True 30.867059 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "7 7839.193164 7.839193e+03 1.001083 \n", + "16 13214.635874 inf 1.001083 \n", + "24 7835.540827 7.479551e+03 1.001083 \n", + "1 1311.107364 1.311107e+03 0.942039 \n", + "10 1517.732191 1.517732e+03 0.942039 \n", + "19 1555.368783 1.555369e+03 0.942039 \n", + "8 18025.636203 1.802564e+04 0.404032 \n", + "17 18027.619179 1.802762e+04 0.404032 \n", + "25 18025.896891 1.802590e+04 0.404032 \n", + "0 59997.685173 inf 0.674003 \n", + "9 73926.784148 inf 0.674003 \n", + "18 73948.011013 inf 0.674003 \n", + "2 95268.045406 inf 0.802424 \n", + "11 92620.537466 inf 0.802424 \n", + "3 54136.876898 5.413688e+04 0.730517 \n", + "12 48894.854267 4.889485e+04 0.730517 \n", + "20 48888.971920 4.888897e+04 0.730517 \n", + "5 34737.411699 inf 0.788459 \n", + "14 28953.859118 2.895386e+04 0.788459 \n", + "22 33312.740230 inf 0.788459 \n", + "4 7232.420216 6.329966e+03 0.230440 \n", + "13 8137.100687 6.332587e+03 0.230440 \n", + "21 5891.798427 5.891798e+03 0.230440 \n", + "6 17399.639942 1.739964e+04 0.153800 \n", + "15 19338.098572 inf 0.153800 \n", + "23 16752.356283 1.675236e+04 0.153800 \n", + "\n", + " step_hint \n", + "7 10666 \n", + "16 10666 \n", + "24 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "8 72000 \n", + "17 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "2 167999 \n", + "11 167999 \n", + "3 76000 \n", + "12 76000 \n", + "20 76000 \n", + "5 38400 \n", + "14 38400 \n", + "22 38400 \n", + "4 52000 \n", + "13 52000 \n", + "21 52000 \n", + "6 120000 \n", + "15 120000 \n", + "23 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:2026-07-08 17:41:01,911:jax._src.xla_bridge:850: An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n", + "WARNING:jax._src.xla_bridge:An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Cautious NAdamW (cautious_nadamw) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
7criteo1tb_jaxtrial_1validation/loss0.123735False0.1257002863.657990inf0.92663510666
15criteo1tb_jaxtrial_1validation/loss0.123735False0.1258371792.004785inf0.92663510666
24criteo1tb_jaxtrial_1validation/loss0.123735False0.1246949989.461620inf0.92663510666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7244391608.1886591.608189e+030.65597518094
9fastmri_jaxtrial_1validation/ssim0.723653True0.7238931383.1596401.383160e+030.65597518094
17fastmri_jaxtrial_1validation/ssim0.723653True0.7236822571.8153282.571815e+030.65597518094
23finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.63268625738.9816882.573898e+040.44144672000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.74660069885.510298inf0.251495195999
8imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.74748067896.184145inf0.251495195999
16imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.74964061917.019345inf0.251495195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.75060087452.666405inf0.495969167999
14imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.75158082308.665602inf0.495969167999
22imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.75034087448.367353inf0.495969167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14216264988.594796inf2.58983976000
12librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14262565012.818664inf2.58983976000
20librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14449964979.350942inf2.58983976000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.29431810338.725379inf2.79881238400
13librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.28728810334.769650inf2.79881238400
21librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.28534714680.395282inf2.79881238400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2845645444.7640414.992687e+030.19793652000
11ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2874225446.8105094.542640e+030.19793652000
19ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2809904995.6470064.995647e+030.19793652000
2wmt_jaxtrial_1validation/bleu30.849100True30.87610912943.7273851.294373e+040.125546120000
10wmt_jaxtrial_1validation/bleu30.849100True31.02074414876.4158941.423246e+040.125546120000
18wmt_jaxtrial_1validation/bleu30.849100True30.91251515517.6564441.551766e+040.125546120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "7 criteo1tb_jax trial_1 validation/loss \n", + "15 criteo1tb_jax trial_1 validation/loss \n", + "24 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "9 fastmri_jax trial_1 validation/ssim \n", + "17 fastmri_jax trial_1 validation/ssim \n", + "23 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "8 imagenet_resnet_jax trial_1 validation/accuracy \n", + "16 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "14 imagenet_vit_jax trial_1 validation/accuracy \n", + "22 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "12 librispeech_conformer_jax trial_1 validation/wer \n", + "20 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "13 librispeech_deepspeech_jax trial_1 validation/wer \n", + "21 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "11 ogbg_jax trial_1 validation/mean_average_precision \n", + "19 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "10 wmt_jax trial_1 validation/bleu \n", + "18 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "7 0.123735 False 0.125700 \n", + "15 0.123735 False 0.125837 \n", + "24 0.123735 False 0.124694 \n", + "1 0.723653 True 0.724439 \n", + "9 0.723653 True 0.723893 \n", + "17 0.723653 True 0.723682 \n", + "23 22.432000 True 21.632686 \n", + "0 0.774310 False 0.746600 \n", + "8 0.774310 False 0.747480 \n", + "16 0.774310 False 0.749640 \n", + "6 0.773090 False 0.750600 \n", + "14 0.773090 False 0.751580 \n", + "22 0.773090 False 0.750340 \n", + "4 0.085884 False 0.142162 \n", + "12 0.085884 False 0.142625 \n", + "20 0.085884 False 0.144499 \n", + "5 0.119936 False 0.294318 \n", + "13 0.119936 False 0.287288 \n", + "21 0.119936 False 0.285347 \n", + "3 0.280980 True 0.284564 \n", + "11 0.280980 True 0.287422 \n", + "19 0.280980 True 0.280990 \n", + "2 30.849100 True 30.876109 \n", + "10 30.849100 True 31.020744 \n", + "18 30.849100 True 30.912515 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "7 2863.657990 inf 0.926635 \n", + "15 1792.004785 inf 0.926635 \n", + "24 9989.461620 inf 0.926635 \n", + "1 1608.188659 1.608189e+03 0.655975 \n", + "9 1383.159640 1.383160e+03 0.655975 \n", + "17 2571.815328 2.571815e+03 0.655975 \n", + "23 25738.981688 2.573898e+04 0.441446 \n", + "0 69885.510298 inf 0.251495 \n", + "8 67896.184145 inf 0.251495 \n", + "16 61917.019345 inf 0.251495 \n", + "6 87452.666405 inf 0.495969 \n", + "14 82308.665602 inf 0.495969 \n", + "22 87448.367353 inf 0.495969 \n", + "4 64988.594796 inf 2.589839 \n", + "12 65012.818664 inf 2.589839 \n", + "20 64979.350942 inf 2.589839 \n", + "5 10338.725379 inf 2.798812 \n", + "13 10334.769650 inf 2.798812 \n", + "21 14680.395282 inf 2.798812 \n", + "3 5444.764041 4.992687e+03 0.197936 \n", + "11 5446.810509 4.542640e+03 0.197936 \n", + "19 4995.647006 4.995647e+03 0.197936 \n", + "2 12943.727385 1.294373e+04 0.125546 \n", + "10 14876.415894 1.423246e+04 0.125546 \n", + "18 15517.656444 1.551766e+04 0.125546 \n", + "\n", + " step_hint \n", + "7 10666 \n", + "15 10666 \n", + "24 10666 \n", + "1 18094 \n", + "9 18094 \n", + "17 18094 \n", + "23 72000 \n", + "0 195999 \n", + "8 195999 \n", + "16 195999 \n", + "6 167999 \n", + "14 167999 \n", + "22 167999 \n", + "4 76000 \n", + "12 76000 \n", + "20 76000 \n", + "5 38400 \n", + "13 38400 \n", + "21 38400 \n", + "3 52000 \n", + "11 52000 \n", + "19 52000 \n", + "2 120000 \n", + "10 120000 \n", + "18 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Lion (lion) ===\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + " Workload: criteo1tb_pytorch\n", + " Workload: fastmri_pytorch\n", + " Workload: finewebedu_lm_pytorch\n", + " Workload: imagenet_resnet_pytorch\n", + " Workload: imagenet_vit_pytorch\n", + " Workload: librispeech_conformer_pytorch\n", + " Workload: librispeech_deepspeech_pytorch\n", + " Workload: ogbg_pytorch\n", + " Workload: wmt_pytorch\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
7criteo1tb_pytorchtrial_1validation/loss0.123735False0.1241919978.416062inf0.91592610666
16criteo1tb_pytorchtrial_1validation/loss0.123735False0.12426212466.455169inf0.91592610666
25criteo1tb_pytorchtrial_1validation/loss0.123735False0.12424112106.893656inf0.91592610666
1fastmri_pytorchtrial_1validation/ssim0.723653True0.723803619.9493726.199494e+020.27376418094
10fastmri_pytorchtrial_1validation/ssim0.723653True0.7243801421.2225761.421223e+030.27376418094
19fastmri_pytorchtrial_1validation/ssim0.723653True0.7239881394.1750201.394175e+030.27376418094
8finewebedu_lm_pytorchtrial_1validation/ppl22.432000True21.26189723164.5693102.316457e+040.38839872000
17finewebedu_lm_pytorchtrial_1validation/ppl22.432000True21.11000823177.0914222.317709e+040.38839872000
26finewebedu_lm_pytorchtrial_1validation/ppl22.432000True21.13069923172.0393162.317204e+040.38839872000
0imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.61338073980.619545inf0.674310195999
9imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.61892067952.966836inf0.674310195999
18imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.62902067951.735127inf0.674310195999
2imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.62420087448.878291inf0.812078167999
11imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.63292095191.349695inf0.812078167999
20imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.64180095165.022013inf0.812078167999
3librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.11531957621.209741inf0.72318776000
12librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.15078554127.306890inf0.72318776000
21librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.12644257621.145283inf0.72318776000
5librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.12470431862.618510inf0.76947038400
14librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.12680031838.147054inf0.76947038400
23librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.12380631852.816742inf0.76947038400
4ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2857327223.9872077.223987e+030.21286952000
13ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2812016782.7903776.782790e+030.21286952000
22ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2830158582.1237268.582124e+030.21286952000
6wmt_pytorchtrial_1validation/bleu30.849100True30.94802315475.5527301.547555e+040.141389120000
15wmt_pytorchtrial_1validation/bleu30.849100True30.87531817401.4931141.547496e+040.141389120000
24wmt_pytorchtrial_1validation/bleu30.849100False30.76188917388.507633inf0.141389120000
\n", + "
" + ], + "text/plain": [ + " workload trial \\\n", + "7 criteo1tb_pytorch trial_1 \n", + "16 criteo1tb_pytorch trial_1 \n", + "25 criteo1tb_pytorch trial_1 \n", + "1 fastmri_pytorch trial_1 \n", + "10 fastmri_pytorch trial_1 \n", + "19 fastmri_pytorch trial_1 \n", + "8 finewebedu_lm_pytorch trial_1 \n", + "17 finewebedu_lm_pytorch trial_1 \n", + "26 finewebedu_lm_pytorch trial_1 \n", + "0 imagenet_resnet_pytorch trial_1 \n", + "9 imagenet_resnet_pytorch trial_1 \n", + "18 imagenet_resnet_pytorch trial_1 \n", + "2 imagenet_vit_pytorch trial_1 \n", + "11 imagenet_vit_pytorch trial_1 \n", + "20 imagenet_vit_pytorch trial_1 \n", + "3 librispeech_conformer_pytorch trial_1 \n", + "12 librispeech_conformer_pytorch trial_1 \n", + "21 librispeech_conformer_pytorch trial_1 \n", + "5 librispeech_deepspeech_pytorch trial_1 \n", + "14 librispeech_deepspeech_pytorch trial_1 \n", + "23 librispeech_deepspeech_pytorch trial_1 \n", + "4 ogbg_pytorch trial_1 \n", + "13 ogbg_pytorch trial_1 \n", + "22 ogbg_pytorch trial_1 \n", + "6 wmt_pytorch trial_1 \n", + "15 wmt_pytorch trial_1 \n", + "24 wmt_pytorch trial_1 \n", + "\n", + " val target metric name val target metric value \\\n", + "7 validation/loss 0.123735 \n", + "16 validation/loss 0.123735 \n", + "25 validation/loss 0.123735 \n", + "1 validation/ssim 0.723653 \n", + "10 validation/ssim 0.723653 \n", + "19 validation/ssim 0.723653 \n", + "8 validation/ppl 22.432000 \n", + "17 validation/ppl 22.432000 \n", + "26 validation/ppl 22.432000 \n", + "0 validation/accuracy 0.774310 \n", + "9 validation/accuracy 0.774310 \n", + "18 validation/accuracy 0.774310 \n", + "2 validation/accuracy 0.773090 \n", + "11 validation/accuracy 0.773090 \n", + "20 validation/accuracy 0.773090 \n", + "3 validation/wer 0.085884 \n", + "12 validation/wer 0.085884 \n", + "21 validation/wer 0.085884 \n", + "5 validation/wer 0.119936 \n", + "14 validation/wer 0.119936 \n", + "23 validation/wer 0.119936 \n", + "4 validation/mean_average_precision 0.280980 \n", + "13 validation/mean_average_precision 0.280980 \n", + "22 validation/mean_average_precision 0.280980 \n", + "6 validation/bleu 30.849100 \n", + "15 validation/bleu 30.849100 \n", + "24 validation/bleu 30.849100 \n", + "\n", + " val target reached best metric value on val \\\n", + "7 False 0.124191 \n", + "16 False 0.124262 \n", + "25 False 0.124241 \n", + "1 True 0.723803 \n", + "10 True 0.724380 \n", + "19 True 0.723988 \n", + "8 True 21.261897 \n", + "17 True 21.110008 \n", + "26 True 21.130699 \n", + "0 False 0.613380 \n", + "9 False 0.618920 \n", + "18 False 0.629020 \n", + "2 False 0.624200 \n", + "11 False 0.632920 \n", + "20 False 0.641800 \n", + "3 False 0.115319 \n", + "12 False 0.150785 \n", + "21 False 0.126442 \n", + "5 False 0.124704 \n", + "14 False 0.126800 \n", + "23 False 0.123806 \n", + "4 True 0.285732 \n", + "13 True 0.281201 \n", + "22 True 0.283015 \n", + "6 True 30.948023 \n", + "15 True 30.875318 \n", + "24 False 30.761889 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "7 9978.416062 inf 0.915926 \n", + "16 12466.455169 inf 0.915926 \n", + "25 12106.893656 inf 0.915926 \n", + "1 619.949372 6.199494e+02 0.273764 \n", + "10 1421.222576 1.421223e+03 0.273764 \n", + "19 1394.175020 1.394175e+03 0.273764 \n", + "8 23164.569310 2.316457e+04 0.388398 \n", + "17 23177.091422 2.317709e+04 0.388398 \n", + "26 23172.039316 2.317204e+04 0.388398 \n", + "0 73980.619545 inf 0.674310 \n", + "9 67952.966836 inf 0.674310 \n", + "18 67951.735127 inf 0.674310 \n", + "2 87448.878291 inf 0.812078 \n", + "11 95191.349695 inf 0.812078 \n", + "20 95165.022013 inf 0.812078 \n", + "3 57621.209741 inf 0.723187 \n", + "12 54127.306890 inf 0.723187 \n", + "21 57621.145283 inf 0.723187 \n", + "5 31862.618510 inf 0.769470 \n", + "14 31838.147054 inf 0.769470 \n", + "23 31852.816742 inf 0.769470 \n", + "4 7223.987207 7.223987e+03 0.212869 \n", + "13 6782.790377 6.782790e+03 0.212869 \n", + "22 8582.123726 8.582124e+03 0.212869 \n", + "6 15475.552730 1.547555e+04 0.141389 \n", + "15 17401.493114 1.547496e+04 0.141389 \n", + "24 17388.507633 inf 0.141389 \n", + "\n", + " step_hint \n", + "7 10666 \n", + "16 10666 \n", + "25 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "8 72000 \n", + "17 72000 \n", + "26 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "2 167999 \n", + "11 167999 \n", + "20 167999 \n", + "3 76000 \n", + "12 76000 \n", + "21 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "4 52000 \n", + "13 52000 \n", + "22 52000 \n", + "6 120000 \n", + "15 120000 \n", + "24 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Muon (JAX) (muon) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735False0.12451913217.078806inf1.80744610666
17criteo1tb_jaxtrial_1validation/loss0.123735False0.12464812154.283058inf1.80744610666
26criteo1tb_jaxtrial_1validation/loss0.123735False0.12457513221.646473inf1.80744610666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7239321145.9232451.145923e+030.15301018094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7238762594.4902192.594490e+030.15301018094
19fastmri_jaxtrial_1validation/ssim0.723653True0.7247151869.7652771.869765e+030.15301018094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.80837320594.0377502.059404e+040.50461372000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.85239520594.1953192.059420e+040.50461372000
25finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.82093420593.7101902.059371e+040.50461372000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.73022073908.465136inf0.340640195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.73056053931.644364inf0.340640195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.71808065941.642195inf0.340640195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77518077162.9165717.716292e+040.514594167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.75194095183.259433inf0.514594167999
24imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77476074592.8227917.459282e+040.514594167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.16734464973.907707inf2.48611176000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.16655264973.395299inf2.48611176000
22librispeech_conformer_jaxtrial_1validation/wer0.085884False0.16442864948.560971inf2.48611176000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.17472155211.921196inf2.70975038400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.17757955245.243171inf2.70975038400
23librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.17638253775.959509inf2.70975038400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2796431828.228041inf0.19192452000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2754041378.588823inf0.19192452000
21ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2761791827.266468inf0.19192452000
2wmt_jaxtrial_1validation/bleu30.849100False28.99743912296.452765inf0.173934120000
11wmt_jaxtrial_1validation/bleu30.849100False28.65403611011.619379inf0.173934120000
20wmt_jaxtrial_1validation/bleu30.849100False28.77757912941.239449inf0.173934120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "26 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "19 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "25 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "24 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "22 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "23 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "21 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "20 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 False 0.124519 \n", + "17 0.123735 False 0.124648 \n", + "26 0.123735 False 0.124575 \n", + "1 0.723653 True 0.723932 \n", + "10 0.723653 True 0.723876 \n", + "19 0.723653 True 0.724715 \n", + "7 22.432000 True 21.808373 \n", + "16 22.432000 True 21.852395 \n", + "25 22.432000 True 21.820934 \n", + "0 0.774310 False 0.730220 \n", + "9 0.774310 False 0.730560 \n", + "18 0.774310 False 0.718080 \n", + "6 0.773090 True 0.775180 \n", + "15 0.773090 False 0.751940 \n", + "24 0.773090 True 0.774760 \n", + "4 0.085884 False 0.167344 \n", + "13 0.085884 False 0.166552 \n", + "22 0.085884 False 0.164428 \n", + "5 0.119936 False 0.174721 \n", + "14 0.119936 False 0.177579 \n", + "23 0.119936 False 0.176382 \n", + "3 0.280980 False 0.279643 \n", + "12 0.280980 False 0.275404 \n", + "21 0.280980 False 0.276179 \n", + "2 30.849100 False 28.997439 \n", + "11 30.849100 False 28.654036 \n", + "20 30.849100 False 28.777579 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 13217.078806 inf 1.807446 \n", + "17 12154.283058 inf 1.807446 \n", + "26 13221.646473 inf 1.807446 \n", + "1 1145.923245 1.145923e+03 0.153010 \n", + "10 2594.490219 2.594490e+03 0.153010 \n", + "19 1869.765277 1.869765e+03 0.153010 \n", + "7 20594.037750 2.059404e+04 0.504613 \n", + "16 20594.195319 2.059420e+04 0.504613 \n", + "25 20593.710190 2.059371e+04 0.504613 \n", + "0 73908.465136 inf 0.340640 \n", + "9 53931.644364 inf 0.340640 \n", + "18 65941.642195 inf 0.340640 \n", + "6 77162.916571 7.716292e+04 0.514594 \n", + "15 95183.259433 inf 0.514594 \n", + "24 74592.822791 7.459282e+04 0.514594 \n", + "4 64973.907707 inf 2.486111 \n", + "13 64973.395299 inf 2.486111 \n", + "22 64948.560971 inf 2.486111 \n", + "5 55211.921196 inf 2.709750 \n", + "14 55245.243171 inf 2.709750 \n", + "23 53775.959509 inf 2.709750 \n", + "3 1828.228041 inf 0.191924 \n", + "12 1378.588823 inf 0.191924 \n", + "21 1827.266468 inf 0.191924 \n", + "2 12296.452765 inf 0.173934 \n", + "11 11011.619379 inf 0.173934 \n", + "20 12941.239449 inf 0.173934 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "26 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "7 72000 \n", + "16 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "24 167999 \n", + "4 76000 \n", + "13 76000 \n", + "22 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "3 52000 \n", + "12 52000 \n", + "21 52000 \n", + "2 120000 \n", + "11 120000 \n", + "20 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Muon (PyTorch) (muon_torch) ===\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + " Workload: criteo1tb_pytorch\n", + " Workload: fastmri_pytorch\n", + " Workload: finewebedu_lm_pytorch\n", + " Workload: imagenet_resnet_pytorch\n", + " Workload: imagenet_vit_pytorch\n", + " Workload: librispeech_conformer_pytorch\n", + " Workload: librispeech_deepspeech_pytorch\n", + " Workload: ogbg_pytorch\n", + " Workload: wmt_pytorch\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
7criteo1tb_pytorchtrial_1validation/loss0.123735True0.1236456087.0198356.087020e+031.18504610666
16criteo1tb_pytorchtrial_1validation/loss0.123735True0.12372712517.3569081.251736e+041.18504610666
25criteo1tb_pytorchtrial_1validation/loss0.123735True0.1236817497.3931367.141605e+031.18504610666
1fastmri_pytorchtrial_1validation/ssim0.723653False0.7231762142.100114inf0.38668918094
10fastmri_pytorchtrial_1validation/ssim0.723653False0.7233621624.206673inf0.38668918094
19fastmri_pytorchtrial_1validation/ssim0.723653False0.7231141617.665591inf0.38668918094
8finewebedu_lm_pytorchtrial_1validation/ppl22.432000True21.74476115471.4471281.547145e+040.39309172000
17finewebedu_lm_pytorchtrial_1validation/ppl22.432000True21.75125215471.9225571.547192e+040.39309172000
26finewebedu_lm_pytorchtrial_1validation/ppl22.432000True21.58465115476.6857431.547669e+040.39309172000
0imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.64264073922.643341inf0.684987195999
9imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.64258065897.926815inf0.684987195999
18imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.63724069833.618870inf0.684987195999
2imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.60662092532.045695inf0.849634167999
11imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.59968095203.297756inf0.849634167999
20imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.59224077203.511951inf0.849634167999
3librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.09210652374.138849inf0.75071876000
12librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.09386452373.025367inf0.75071876000
21librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.09083250630.201975inf0.75071876000
5librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.16705530413.915967inf0.78990638400
14librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.13148330405.689728inf0.78990638400
23librispeech_deepspeech_pytorchtrial_1validation/wer0.119936False0.13426428934.327749inf0.78990638400
4ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2822741833.4736671.833474e+030.23504752000
13ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2846931848.3308381.848331e+030.23504752000
22ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2937922281.4622351.830407e+030.23504752000
6wmt_pytorchtrial_1validation/bleu30.849100False30.69132717533.780463inf0.145367120000
15wmt_pytorchtrial_1validation/bleu30.849100True30.89746814200.6478301.420065e+040.145367120000
24wmt_pytorchtrial_1validation/bleu30.849100True30.89810514214.7795831.421478e+040.145367120000
\n", + "
" + ], + "text/plain": [ + " workload trial \\\n", + "7 criteo1tb_pytorch trial_1 \n", + "16 criteo1tb_pytorch trial_1 \n", + "25 criteo1tb_pytorch trial_1 \n", + "1 fastmri_pytorch trial_1 \n", + "10 fastmri_pytorch trial_1 \n", + "19 fastmri_pytorch trial_1 \n", + "8 finewebedu_lm_pytorch trial_1 \n", + "17 finewebedu_lm_pytorch trial_1 \n", + "26 finewebedu_lm_pytorch trial_1 \n", + "0 imagenet_resnet_pytorch trial_1 \n", + "9 imagenet_resnet_pytorch trial_1 \n", + "18 imagenet_resnet_pytorch trial_1 \n", + "2 imagenet_vit_pytorch trial_1 \n", + "11 imagenet_vit_pytorch trial_1 \n", + "20 imagenet_vit_pytorch trial_1 \n", + "3 librispeech_conformer_pytorch trial_1 \n", + "12 librispeech_conformer_pytorch trial_1 \n", + "21 librispeech_conformer_pytorch trial_1 \n", + "5 librispeech_deepspeech_pytorch trial_1 \n", + "14 librispeech_deepspeech_pytorch trial_1 \n", + "23 librispeech_deepspeech_pytorch trial_1 \n", + "4 ogbg_pytorch trial_1 \n", + "13 ogbg_pytorch trial_1 \n", + "22 ogbg_pytorch trial_1 \n", + "6 wmt_pytorch trial_1 \n", + "15 wmt_pytorch trial_1 \n", + "24 wmt_pytorch trial_1 \n", + "\n", + " val target metric name val target metric value \\\n", + "7 validation/loss 0.123735 \n", + "16 validation/loss 0.123735 \n", + "25 validation/loss 0.123735 \n", + "1 validation/ssim 0.723653 \n", + "10 validation/ssim 0.723653 \n", + "19 validation/ssim 0.723653 \n", + "8 validation/ppl 22.432000 \n", + "17 validation/ppl 22.432000 \n", + "26 validation/ppl 22.432000 \n", + "0 validation/accuracy 0.774310 \n", + "9 validation/accuracy 0.774310 \n", + "18 validation/accuracy 0.774310 \n", + "2 validation/accuracy 0.773090 \n", + "11 validation/accuracy 0.773090 \n", + "20 validation/accuracy 0.773090 \n", + "3 validation/wer 0.085884 \n", + "12 validation/wer 0.085884 \n", + "21 validation/wer 0.085884 \n", + "5 validation/wer 0.119936 \n", + "14 validation/wer 0.119936 \n", + "23 validation/wer 0.119936 \n", + "4 validation/mean_average_precision 0.280980 \n", + "13 validation/mean_average_precision 0.280980 \n", + "22 validation/mean_average_precision 0.280980 \n", + "6 validation/bleu 30.849100 \n", + "15 validation/bleu 30.849100 \n", + "24 validation/bleu 30.849100 \n", + "\n", + " val target reached best metric value on val \\\n", + "7 True 0.123645 \n", + "16 True 0.123727 \n", + "25 True 0.123681 \n", + "1 False 0.723176 \n", + "10 False 0.723362 \n", + "19 False 0.723114 \n", + "8 True 21.744761 \n", + "17 True 21.751252 \n", + "26 True 21.584651 \n", + "0 False 0.642640 \n", + "9 False 0.642580 \n", + "18 False 0.637240 \n", + "2 False 0.606620 \n", + "11 False 0.599680 \n", + "20 False 0.592240 \n", + "3 False 0.092106 \n", + "12 False 0.093864 \n", + "21 False 0.090832 \n", + "5 False 0.167055 \n", + "14 False 0.131483 \n", + "23 False 0.134264 \n", + "4 True 0.282274 \n", + "13 True 0.284693 \n", + "22 True 0.293792 \n", + "6 False 30.691327 \n", + "15 True 30.897468 \n", + "24 True 30.898105 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "7 6087.019835 6.087020e+03 1.185046 \n", + "16 12517.356908 1.251736e+04 1.185046 \n", + "25 7497.393136 7.141605e+03 1.185046 \n", + "1 2142.100114 inf 0.386689 \n", + "10 1624.206673 inf 0.386689 \n", + "19 1617.665591 inf 0.386689 \n", + "8 15471.447128 1.547145e+04 0.393091 \n", + "17 15471.922557 1.547192e+04 0.393091 \n", + "26 15476.685743 1.547669e+04 0.393091 \n", + "0 73922.643341 inf 0.684987 \n", + "9 65897.926815 inf 0.684987 \n", + "18 69833.618870 inf 0.684987 \n", + "2 92532.045695 inf 0.849634 \n", + "11 95203.297756 inf 0.849634 \n", + "20 77203.511951 inf 0.849634 \n", + "3 52374.138849 inf 0.750718 \n", + "12 52373.025367 inf 0.750718 \n", + "21 50630.201975 inf 0.750718 \n", + "5 30413.915967 inf 0.789906 \n", + "14 30405.689728 inf 0.789906 \n", + "23 28934.327749 inf 0.789906 \n", + "4 1833.473667 1.833474e+03 0.235047 \n", + "13 1848.330838 1.848331e+03 0.235047 \n", + "22 2281.462235 1.830407e+03 0.235047 \n", + "6 17533.780463 inf 0.145367 \n", + "15 14200.647830 1.420065e+04 0.145367 \n", + "24 14214.779583 1.421478e+04 0.145367 \n", + "\n", + " step_hint \n", + "7 10666 \n", + "16 10666 \n", + "25 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "8 72000 \n", + "17 72000 \n", + "26 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "2 167999 \n", + "11 167999 \n", + "20 167999 \n", + "3 76000 \n", + "12 76000 \n", + "21 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "4 52000 \n", + "13 52000 \n", + "22 52000 \n", + "6 120000 \n", + "15 120000 \n", + "24 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== NAdamW (nadamw) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735True0.1236926425.6295506.425630e+030.91309910666
17criteo1tb_jaxtrial_1validation/loss0.123735True0.1236418208.5190797.851880e+030.91309910666
26criteo1tb_jaxtrial_1validation/loss0.123735True0.1236927492.6946777.492695e+030.91309910666
1fastmri_jaxtrial_1validation/ssim0.723653True0.724494924.8731539.248732e+020.10824618094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7240361800.7732001.800773e+030.10824618094
19fastmri_jaxtrial_1validation/ssim0.723653True0.7236942041.2998712.041300e+030.10824618094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.52338923164.1815622.316418e+040.43702272000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.98082825733.8476692.573385e+040.43702272000
25finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.64192025735.7297592.573573e+040.43702272000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.75258061911.160034inf0.252192195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.75536047948.213367inf0.252192195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.75414061916.836822inf0.252192195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77342066879.3725086.687937e+040.462956167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77594074585.6678797.458567e+040.462956167999
24imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77710072015.5787297.201558e+040.462956167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14736664933.099719inf2.49269176000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14928864943.344027inf2.49269176000
22librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14612164944.956790inf2.49269176000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.16037355220.705860inf2.50313238400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15433855216.424381inf2.50313238400
23librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15290955258.113032inf2.50313238400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2776484085.908834inf0.19048352000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2740584088.241700inf0.19048352000
21ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2746765444.092821inf0.19048352000
2wmt_jaxtrial_1validation/bleu30.849100False29.84687912936.535747inf0.124761120000
11wmt_jaxtrial_1validation/bleu30.849100False30.02463212292.188711inf0.124761120000
20wmt_jaxtrial_1validation/bleu30.849100False29.30118614222.570495inf0.124761120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "26 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "19 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "25 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "24 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "22 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "23 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "21 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "20 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 True 0.123692 \n", + "17 0.123735 True 0.123641 \n", + "26 0.123735 True 0.123692 \n", + "1 0.723653 True 0.724494 \n", + "10 0.723653 True 0.724036 \n", + "19 0.723653 True 0.723694 \n", + "7 22.432000 True 21.523389 \n", + "16 22.432000 True 21.980828 \n", + "25 22.432000 True 21.641920 \n", + "0 0.774310 False 0.752580 \n", + "9 0.774310 False 0.755360 \n", + "18 0.774310 False 0.754140 \n", + "6 0.773090 True 0.773420 \n", + "15 0.773090 True 0.775940 \n", + "24 0.773090 True 0.777100 \n", + "4 0.085884 False 0.147366 \n", + "13 0.085884 False 0.149288 \n", + "22 0.085884 False 0.146121 \n", + "5 0.119936 False 0.160373 \n", + "14 0.119936 False 0.154338 \n", + "23 0.119936 False 0.152909 \n", + "3 0.280980 False 0.277648 \n", + "12 0.280980 False 0.274058 \n", + "21 0.280980 False 0.274676 \n", + "2 30.849100 False 29.846879 \n", + "11 30.849100 False 30.024632 \n", + "20 30.849100 False 29.301186 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 6425.629550 6.425630e+03 0.913099 \n", + "17 8208.519079 7.851880e+03 0.913099 \n", + "26 7492.694677 7.492695e+03 0.913099 \n", + "1 924.873153 9.248732e+02 0.108246 \n", + "10 1800.773200 1.800773e+03 0.108246 \n", + "19 2041.299871 2.041300e+03 0.108246 \n", + "7 23164.181562 2.316418e+04 0.437022 \n", + "16 25733.847669 2.573385e+04 0.437022 \n", + "25 25735.729759 2.573573e+04 0.437022 \n", + "0 61911.160034 inf 0.252192 \n", + "9 47948.213367 inf 0.252192 \n", + "18 61916.836822 inf 0.252192 \n", + "6 66879.372508 6.687937e+04 0.462956 \n", + "15 74585.667879 7.458567e+04 0.462956 \n", + "24 72015.578729 7.201558e+04 0.462956 \n", + "4 64933.099719 inf 2.492691 \n", + "13 64943.344027 inf 2.492691 \n", + "22 64944.956790 inf 2.492691 \n", + "5 55220.705860 inf 2.503132 \n", + "14 55216.424381 inf 2.503132 \n", + "23 55258.113032 inf 2.503132 \n", + "3 4085.908834 inf 0.190483 \n", + "12 4088.241700 inf 0.190483 \n", + "21 5444.092821 inf 0.190483 \n", + "2 12936.535747 inf 0.124761 \n", + "11 12292.188711 inf 0.124761 \n", + "20 14222.570495 inf 0.124761 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "26 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "7 72000 \n", + "16 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "24 167999 \n", + "4 76000 \n", + "13 76000 \n", + "22 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "3 52000 \n", + "12 52000 \n", + "21 52000 \n", + "2 120000 \n", + "11 120000 \n", + "20 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== NAdamW (Baseline v0.5) (nadamw_baselinev05) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735True0.1236367854.4230027.854423e+030.90092710666
17criteo1tb_jaxtrial_1validation/loss0.123735True0.1236648206.1031328.206103e+030.90092710666
26criteo1tb_jaxtrial_1validation/loss0.123735True0.1236508568.0973708.568097e+030.90092710666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7238201615.2845151.615285e+030.39074518094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7247792271.6258932.271626e+030.39074518094
19fastmri_jaxtrial_1validation/ssim0.723653True0.7241841620.5153811.620515e+030.39074518094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.79692220589.3217952.058932e+040.43690772000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.22825120593.0076692.059301e+040.43690772000
25finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.45712920589.9128572.058991e+040.43690772000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.74972059916.658867inf0.250789195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.75032059922.172082inf0.250789195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.74910061908.166715inf0.250789195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.74782077159.161478inf0.465806167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.74800074587.848335inf0.465806167999
24imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.74992079731.531266inf0.465806167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14141864979.310149inf2.53706976000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14561964975.102952inf2.53706976000
22librispeech_conformer_jaxtrial_1validation/wer0.085884False0.14617961490.051088inf2.53706976000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15944653800.030124inf2.73722238400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.16265155243.577100inf2.73722238400
23librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15405855276.914809inf2.73722238400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2813743634.6186243.634619e+030.19107752000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2853134089.7756274.089776e+030.19107752000
21ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2887434991.9659164.991966e+030.19107752000
2wmt_jaxtrial_1validation/bleu30.849100False30.65888414227.413651inf0.125908120000
11wmt_jaxtrial_1validation/bleu30.849100True30.86329912939.1806241.293918e+040.125908120000
20wmt_jaxtrial_1validation/bleu30.849100True30.94761614865.7885991.486579e+040.125908120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "26 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "19 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "25 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "24 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "22 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "23 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "21 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "20 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 True 0.123636 \n", + "17 0.123735 True 0.123664 \n", + "26 0.123735 True 0.123650 \n", + "1 0.723653 True 0.723820 \n", + "10 0.723653 True 0.724779 \n", + "19 0.723653 True 0.724184 \n", + "7 22.432000 True 21.796922 \n", + "16 22.432000 True 21.228251 \n", + "25 22.432000 True 21.457129 \n", + "0 0.774310 False 0.749720 \n", + "9 0.774310 False 0.750320 \n", + "18 0.774310 False 0.749100 \n", + "6 0.773090 False 0.747820 \n", + "15 0.773090 False 0.748000 \n", + "24 0.773090 False 0.749920 \n", + "4 0.085884 False 0.141418 \n", + "13 0.085884 False 0.145619 \n", + "22 0.085884 False 0.146179 \n", + "5 0.119936 False 0.159446 \n", + "14 0.119936 False 0.162651 \n", + "23 0.119936 False 0.154058 \n", + "3 0.280980 True 0.281374 \n", + "12 0.280980 True 0.285313 \n", + "21 0.280980 True 0.288743 \n", + "2 30.849100 False 30.658884 \n", + "11 30.849100 True 30.863299 \n", + "20 30.849100 True 30.947616 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 7854.423002 7.854423e+03 0.900927 \n", + "17 8206.103132 8.206103e+03 0.900927 \n", + "26 8568.097370 8.568097e+03 0.900927 \n", + "1 1615.284515 1.615285e+03 0.390745 \n", + "10 2271.625893 2.271626e+03 0.390745 \n", + "19 1620.515381 1.620515e+03 0.390745 \n", + "7 20589.321795 2.058932e+04 0.436907 \n", + "16 20593.007669 2.059301e+04 0.436907 \n", + "25 20589.912857 2.058991e+04 0.436907 \n", + "0 59916.658867 inf 0.250789 \n", + "9 59922.172082 inf 0.250789 \n", + "18 61908.166715 inf 0.250789 \n", + "6 77159.161478 inf 0.465806 \n", + "15 74587.848335 inf 0.465806 \n", + "24 79731.531266 inf 0.465806 \n", + "4 64979.310149 inf 2.537069 \n", + "13 64975.102952 inf 2.537069 \n", + "22 61490.051088 inf 2.537069 \n", + "5 53800.030124 inf 2.737222 \n", + "14 55243.577100 inf 2.737222 \n", + "23 55276.914809 inf 2.737222 \n", + "3 3634.618624 3.634619e+03 0.191077 \n", + "12 4089.775627 4.089776e+03 0.191077 \n", + "21 4991.965916 4.991966e+03 0.191077 \n", + "2 14227.413651 inf 0.125908 \n", + "11 12939.180624 1.293918e+04 0.125908 \n", + "20 14865.788599 1.486579e+04 0.125908 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "26 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "7 72000 \n", + "16 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "24 167999 \n", + "4 76000 \n", + "13 76000 \n", + "22 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "3 52000 \n", + "12 52000 \n", + "21 52000 \n", + "2 120000 \n", + "11 120000 \n", + "20 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== NAdamW (ResNet) (nadamw_resnet) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735False0.12426912867.509279inf1.55064510666
17criteo1tb_jaxtrial_1validation/loss0.123735False0.12409412860.401985inf1.55064510666
26criteo1tb_jaxtrial_1validation/loss0.123735False0.1239539635.864085inf1.55064510666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7239261920.5453081.920545e+030.10993018094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7236961035.7431061.035743e+030.10993018094
19fastmri_jaxtrial_1validation/ssim0.723653True0.7242662579.9773912.579977e+030.10993018094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True20.93162523164.0360282.316404e+040.43626272000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.17004623163.0219882.316302e+040.43626272000
25finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.15132423162.0704002.316207e+040.43626272000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.75212065897.275532inf0.347209195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.73622073915.948544inf0.347209195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.75280071884.304451inf0.347209195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.74580095155.824862inf0.535577167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.56424095249.697347inf0.535577167999
24imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.74872084874.526325inf0.535577167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.42213164933.151106inf2.25968176000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.46163364948.665875inf2.25968176000
22librispeech_conformer_jaxtrial_1validation/wer0.085884False0.46799664947.582179inf2.25968176000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15688755250.443595inf2.30110438400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.17074355216.434224inf2.30110438400
23librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15961055259.417441inf2.30110438400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2846646349.5062166.349506e+030.19209152000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2875486800.4838046.800484e+030.19209152000
21ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2823425894.7300715.894730e+030.19209152000
2wmt_jaxtrial_1validation/bleu30.849100False30.75154515515.510916inf0.125118120000
11wmt_jaxtrial_1validation/bleu30.849100False30.45621314867.072550inf0.125118120000
20wmt_jaxtrial_1validation/bleu30.849100False30.62805514868.256608inf0.125118120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "26 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "19 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "25 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "24 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "22 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "23 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "21 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "20 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 False 0.124269 \n", + "17 0.123735 False 0.124094 \n", + "26 0.123735 False 0.123953 \n", + "1 0.723653 True 0.723926 \n", + "10 0.723653 True 0.723696 \n", + "19 0.723653 True 0.724266 \n", + "7 22.432000 True 20.931625 \n", + "16 22.432000 True 21.170046 \n", + "25 22.432000 True 21.151324 \n", + "0 0.774310 False 0.752120 \n", + "9 0.774310 False 0.736220 \n", + "18 0.774310 False 0.752800 \n", + "6 0.773090 False 0.745800 \n", + "15 0.773090 False 0.564240 \n", + "24 0.773090 False 0.748720 \n", + "4 0.085884 False 0.422131 \n", + "13 0.085884 False 0.461633 \n", + "22 0.085884 False 0.467996 \n", + "5 0.119936 False 0.156887 \n", + "14 0.119936 False 0.170743 \n", + "23 0.119936 False 0.159610 \n", + "3 0.280980 True 0.284664 \n", + "12 0.280980 True 0.287548 \n", + "21 0.280980 True 0.282342 \n", + "2 30.849100 False 30.751545 \n", + "11 30.849100 False 30.456213 \n", + "20 30.849100 False 30.628055 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 12867.509279 inf 1.550645 \n", + "17 12860.401985 inf 1.550645 \n", + "26 9635.864085 inf 1.550645 \n", + "1 1920.545308 1.920545e+03 0.109930 \n", + "10 1035.743106 1.035743e+03 0.109930 \n", + "19 2579.977391 2.579977e+03 0.109930 \n", + "7 23164.036028 2.316404e+04 0.436262 \n", + "16 23163.021988 2.316302e+04 0.436262 \n", + "25 23162.070400 2.316207e+04 0.436262 \n", + "0 65897.275532 inf 0.347209 \n", + "9 73915.948544 inf 0.347209 \n", + "18 71884.304451 inf 0.347209 \n", + "6 95155.824862 inf 0.535577 \n", + "15 95249.697347 inf 0.535577 \n", + "24 84874.526325 inf 0.535577 \n", + "4 64933.151106 inf 2.259681 \n", + "13 64948.665875 inf 2.259681 \n", + "22 64947.582179 inf 2.259681 \n", + "5 55250.443595 inf 2.301104 \n", + "14 55216.434224 inf 2.301104 \n", + "23 55259.417441 inf 2.301104 \n", + "3 6349.506216 6.349506e+03 0.192091 \n", + "12 6800.483804 6.800484e+03 0.192091 \n", + "21 5894.730071 5.894730e+03 0.192091 \n", + "2 15515.510916 inf 0.125118 \n", + "11 14867.072550 inf 0.125118 \n", + "20 14868.256608 inf 0.125118 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "26 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "7 72000 \n", + "16 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "24 167999 \n", + "4 76000 \n", + "13 76000 \n", + "22 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "3 52000 \n", + "12 52000 \n", + "21 52000 \n", + "2 120000 \n", + "11 120000 \n", + "20 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Schedule-Free AdamW (schedule_free_adamw) ===\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + " Workload: criteo1tb_pytorch\n", + " Workload: fastmri_pytorch\n", + " Workload: finewebedu_lm_pytorch\n", + " Workload: imagenet_resnet_pytorch\n", + " Workload: imagenet_vit_pytorch\n", + " Workload: librispeech_conformer_pytorch\n", + " Workload: librispeech_deepspeech_pytorch\n", + " Workload: ogbg_pytorch\n", + " Workload: wmt_pytorch\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
7criteo1tb_pytorchtrial_1validation/loss0.123735True0.12369610693.9900201.033767e+041.01761510666
16criteo1tb_pytorchtrial_1validation/loss0.123735True0.1237327484.8130447.484813e+031.01761510666
25criteo1tb_pytorchtrial_1validation/loss0.123735False0.12382813201.571622inf1.01761510666
1fastmri_pytorchtrial_1validation/ssim0.723653True0.7243011188.9131381.188913e+030.37200418094
10fastmri_pytorchtrial_1validation/ssim0.723653True0.7241641084.0098061.084010e+030.37200418094
19fastmri_pytorchtrial_1validation/ssim0.723653True0.7237031414.2303751.414230e+030.37200418094
8finewebedu_lm_pytorchtrial_1validation/ppl22.432000False26.85374518022.233602inf0.39088672000
17finewebedu_lm_pytorchtrial_1validation/ppl22.432000False27.82547838578.815465inf0.39088672000
26finewebedu_lm_pytorchtrial_1validation/ppl22.432000False26.96230728299.942930inf0.39088672000
0imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.47426020031.869838inf0.758086195999
9imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.4676004114.095728inf0.758086195999
18imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.45520020045.605985inf0.758086195999
2imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.66804084876.442858inf0.798625167999
11imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.66444087409.160116inf0.798625167999
20imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.65970089980.170517inf0.798625167999
3librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.08773264552.024778inf0.63607576000
12librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.12680964541.008598inf0.63607576000
21librispeech_conformer_pytorchtrial_1validation/wer0.085884True0.08479755843.2570825.584326e+040.63607576000
5librispeech_deepspeech_pytorchtrial_1validation/wer0.119936True0.11984736135.4518903.613545e+040.43699938400
14librispeech_deepspeech_pytorchtrial_1validation/wer0.119936True0.11978040477.7521724.047775e+040.43699938400
23librispeech_deepspeech_pytorchtrial_1validation/wer0.119936True0.11901740463.3881494.046339e+040.43699938400
4ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2853533640.1485423.640149e+030.23042952000
13ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2836664969.3228034.969323e+030.23042952000
22ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2823013624.5537713.624554e+030.23042952000
6wmt_pytorchtrial_1validation/bleu30.849100True30.88398721238.6230062.123862e+040.148019120000
15wmt_pytorchtrial_1validation/bleu30.849100True30.91468116745.4517961.546168e+040.148019120000
24wmt_pytorchtrial_1validation/bleu30.849100True30.95448919957.7178761.995772e+040.148019120000
\n", + "
" + ], + "text/plain": [ + " workload trial \\\n", + "7 criteo1tb_pytorch trial_1 \n", + "16 criteo1tb_pytorch trial_1 \n", + "25 criteo1tb_pytorch trial_1 \n", + "1 fastmri_pytorch trial_1 \n", + "10 fastmri_pytorch trial_1 \n", + "19 fastmri_pytorch trial_1 \n", + "8 finewebedu_lm_pytorch trial_1 \n", + "17 finewebedu_lm_pytorch trial_1 \n", + "26 finewebedu_lm_pytorch trial_1 \n", + "0 imagenet_resnet_pytorch trial_1 \n", + "9 imagenet_resnet_pytorch trial_1 \n", + "18 imagenet_resnet_pytorch trial_1 \n", + "2 imagenet_vit_pytorch trial_1 \n", + "11 imagenet_vit_pytorch trial_1 \n", + "20 imagenet_vit_pytorch trial_1 \n", + "3 librispeech_conformer_pytorch trial_1 \n", + "12 librispeech_conformer_pytorch trial_1 \n", + "21 librispeech_conformer_pytorch trial_1 \n", + "5 librispeech_deepspeech_pytorch trial_1 \n", + "14 librispeech_deepspeech_pytorch trial_1 \n", + "23 librispeech_deepspeech_pytorch trial_1 \n", + "4 ogbg_pytorch trial_1 \n", + "13 ogbg_pytorch trial_1 \n", + "22 ogbg_pytorch trial_1 \n", + "6 wmt_pytorch trial_1 \n", + "15 wmt_pytorch trial_1 \n", + "24 wmt_pytorch trial_1 \n", + "\n", + " val target metric name val target metric value \\\n", + "7 validation/loss 0.123735 \n", + "16 validation/loss 0.123735 \n", + "25 validation/loss 0.123735 \n", + "1 validation/ssim 0.723653 \n", + "10 validation/ssim 0.723653 \n", + "19 validation/ssim 0.723653 \n", + "8 validation/ppl 22.432000 \n", + "17 validation/ppl 22.432000 \n", + "26 validation/ppl 22.432000 \n", + "0 validation/accuracy 0.774310 \n", + "9 validation/accuracy 0.774310 \n", + "18 validation/accuracy 0.774310 \n", + "2 validation/accuracy 0.773090 \n", + "11 validation/accuracy 0.773090 \n", + "20 validation/accuracy 0.773090 \n", + "3 validation/wer 0.085884 \n", + "12 validation/wer 0.085884 \n", + "21 validation/wer 0.085884 \n", + "5 validation/wer 0.119936 \n", + "14 validation/wer 0.119936 \n", + "23 validation/wer 0.119936 \n", + "4 validation/mean_average_precision 0.280980 \n", + "13 validation/mean_average_precision 0.280980 \n", + "22 validation/mean_average_precision 0.280980 \n", + "6 validation/bleu 30.849100 \n", + "15 validation/bleu 30.849100 \n", + "24 validation/bleu 30.849100 \n", + "\n", + " val target reached best metric value on val \\\n", + "7 True 0.123696 \n", + "16 True 0.123732 \n", + "25 False 0.123828 \n", + "1 True 0.724301 \n", + "10 True 0.724164 \n", + "19 True 0.723703 \n", + "8 False 26.853745 \n", + "17 False 27.825478 \n", + "26 False 26.962307 \n", + "0 False 0.474260 \n", + "9 False 0.467600 \n", + "18 False 0.455200 \n", + "2 False 0.668040 \n", + "11 False 0.664440 \n", + "20 False 0.659700 \n", + "3 False 0.087732 \n", + "12 False 0.126809 \n", + "21 True 0.084797 \n", + "5 True 0.119847 \n", + "14 True 0.119780 \n", + "23 True 0.119017 \n", + "4 True 0.285353 \n", + "13 True 0.283666 \n", + "22 True 0.282301 \n", + "6 True 30.883987 \n", + "15 True 30.914681 \n", + "24 True 30.954489 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "7 10693.990020 1.033767e+04 1.017615 \n", + "16 7484.813044 7.484813e+03 1.017615 \n", + "25 13201.571622 inf 1.017615 \n", + "1 1188.913138 1.188913e+03 0.372004 \n", + "10 1084.009806 1.084010e+03 0.372004 \n", + "19 1414.230375 1.414230e+03 0.372004 \n", + "8 18022.233602 inf 0.390886 \n", + "17 38578.815465 inf 0.390886 \n", + "26 28299.942930 inf 0.390886 \n", + "0 20031.869838 inf 0.758086 \n", + "9 4114.095728 inf 0.758086 \n", + "18 20045.605985 inf 0.758086 \n", + "2 84876.442858 inf 0.798625 \n", + "11 87409.160116 inf 0.798625 \n", + "20 89980.170517 inf 0.798625 \n", + "3 64552.024778 inf 0.636075 \n", + "12 64541.008598 inf 0.636075 \n", + "21 55843.257082 5.584326e+04 0.636075 \n", + "5 36135.451890 3.613545e+04 0.436999 \n", + "14 40477.752172 4.047775e+04 0.436999 \n", + "23 40463.388149 4.046339e+04 0.436999 \n", + "4 3640.148542 3.640149e+03 0.230429 \n", + "13 4969.322803 4.969323e+03 0.230429 \n", + "22 3624.553771 3.624554e+03 0.230429 \n", + "6 21238.623006 2.123862e+04 0.148019 \n", + "15 16745.451796 1.546168e+04 0.148019 \n", + "24 19957.717876 1.995772e+04 0.148019 \n", + "\n", + " step_hint \n", + "7 10666 \n", + "16 10666 \n", + "25 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "8 72000 \n", + "17 72000 \n", + "26 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "2 167999 \n", + "11 167999 \n", + "20 167999 \n", + "3 76000 \n", + "12 76000 \n", + "21 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "4 52000 \n", + "13 52000 \n", + "22 52000 \n", + "6 120000 \n", + "15 120000 \n", + "24 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Schedule-Free AdamW (JAX) (schedule_free_adamw_jax) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735True0.1236787853.6429377.140809e+031.76334510666
17criteo1tb_jaxtrial_1validation/loss0.123735False0.12382613222.375915inf1.76334510666
26criteo1tb_jaxtrial_1validation/loss0.123735False0.12378913213.711726inf1.76334510666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7237301731.1340841.731134e+031.14967418094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7237192594.6673042.594667e+031.14967418094
19fastmri_jaxtrial_1validation/ssim0.723653True0.7238082397.4020352.397402e+031.14967418094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.63105612875.0245021.287502e+040.22480872000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.74279212876.2794331.287628e+040.22480872000
25finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.68387912875.2830801.287528e+040.22480872000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.3266802046.268139inf0.250221195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.37228012025.559068inf0.250221195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.33810043958.733883inf0.250221195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77448082325.3238928.232532e+040.522412167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.75714087510.925770inf0.522412167999
24imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77344087468.8608168.746886e+040.522412167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.15499465011.384938inf2.56890776000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.55679065011.670110inf2.56890776000
22librispeech_conformer_jaxtrial_1validation/wer0.085884False0.11871864999.678295inf2.56890776000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.13502655134.126437inf1.26186038400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.13573155131.024175inf1.26186038400
23librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.13533555139.798880inf1.26186038400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2882125446.9738275.446974e+030.20013052000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2861865446.9956535.446996e+030.20013052000
21ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2842355446.2664365.446266e+030.20013052000
2wmt_jaxtrial_1validation/bleu30.849100True30.85016916161.2022481.616120e+040.131380120000
11wmt_jaxtrial_1validation/bleu30.849100True30.85712421309.9016252.130990e+040.131380120000
20wmt_jaxtrial_1validation/bleu30.849100True30.92105412938.9215661.293892e+040.131380120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "26 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "19 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "25 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "24 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "22 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "23 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "21 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "20 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 True 0.123678 \n", + "17 0.123735 False 0.123826 \n", + "26 0.123735 False 0.123789 \n", + "1 0.723653 True 0.723730 \n", + "10 0.723653 True 0.723719 \n", + "19 0.723653 True 0.723808 \n", + "7 22.432000 True 21.631056 \n", + "16 22.432000 True 21.742792 \n", + "25 22.432000 True 21.683879 \n", + "0 0.774310 False 0.326680 \n", + "9 0.774310 False 0.372280 \n", + "18 0.774310 False 0.338100 \n", + "6 0.773090 True 0.774480 \n", + "15 0.773090 False 0.757140 \n", + "24 0.773090 True 0.773440 \n", + "4 0.085884 False 0.154994 \n", + "13 0.085884 False 0.556790 \n", + "22 0.085884 False 0.118718 \n", + "5 0.119936 False 0.135026 \n", + "14 0.119936 False 0.135731 \n", + "23 0.119936 False 0.135335 \n", + "3 0.280980 True 0.288212 \n", + "12 0.280980 True 0.286186 \n", + "21 0.280980 True 0.284235 \n", + "2 30.849100 True 30.850169 \n", + "11 30.849100 True 30.857124 \n", + "20 30.849100 True 30.921054 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 7853.642937 7.140809e+03 1.763345 \n", + "17 13222.375915 inf 1.763345 \n", + "26 13213.711726 inf 1.763345 \n", + "1 1731.134084 1.731134e+03 1.149674 \n", + "10 2594.667304 2.594667e+03 1.149674 \n", + "19 2397.402035 2.397402e+03 1.149674 \n", + "7 12875.024502 1.287502e+04 0.224808 \n", + "16 12876.279433 1.287628e+04 0.224808 \n", + "25 12875.283080 1.287528e+04 0.224808 \n", + "0 2046.268139 inf 0.250221 \n", + "9 12025.559068 inf 0.250221 \n", + "18 43958.733883 inf 0.250221 \n", + "6 82325.323892 8.232532e+04 0.522412 \n", + "15 87510.925770 inf 0.522412 \n", + "24 87468.860816 8.746886e+04 0.522412 \n", + "4 65011.384938 inf 2.568907 \n", + "13 65011.670110 inf 2.568907 \n", + "22 64999.678295 inf 2.568907 \n", + "5 55134.126437 inf 1.261860 \n", + "14 55131.024175 inf 1.261860 \n", + "23 55139.798880 inf 1.261860 \n", + "3 5446.973827 5.446974e+03 0.200130 \n", + "12 5446.995653 5.446996e+03 0.200130 \n", + "21 5446.266436 5.446266e+03 0.200130 \n", + "2 16161.202248 1.616120e+04 0.131380 \n", + "11 21309.901625 2.130990e+04 0.131380 \n", + "20 12938.921566 1.293892e+04 0.131380 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "26 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "7 72000 \n", + "16 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "24 167999 \n", + "4 76000 \n", + "13 76000 \n", + "22 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "3 52000 \n", + "12 52000 \n", + "21 52000 \n", + "2 120000 \n", + "11 120000 \n", + "20 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Schedule-Free AdamW (JAX v2) (schedule_free_adamw_jax_v2) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735True0.1236827494.7309877.494731e+030.89669110666
17criteo1tb_jaxtrial_1validation/loss0.123735True0.1236968204.5405398.204541e+030.89669110666
26criteo1tb_jaxtrial_1validation/loss0.123735True0.1237038561.9922378.205840e+030.89669110666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7237461850.6253821.850625e+030.36984018094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7239381854.5847801.854585e+030.36984018094
19fastmri_jaxtrial_1validation/ssim0.723653True0.7237981610.7917051.610792e+030.36984018094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True22.06370715451.9913471.545199e+040.22534672000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True22.08408015451.3329981.545133e+040.22534672000
25finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.41176518017.7463171.801775e+040.22534672000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.0346402051.405519inf0.447769195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.0401402058.181893inf0.447769195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.0360602058.049064inf0.447769195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77356084891.7550188.489176e+040.491351167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77320090041.7841649.004178e+040.491351167999
24imagenet_vit_jaxtrial_1validation/accuracy0.773090True0.77350079757.2853817.975729e+040.491351167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.12388465000.425951inf2.68788676000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.52096864987.361876inf2.68788676000
22librispeech_conformer_jaxtrial_1validation/wer0.085884False0.88584965011.338722inf2.68788676000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15747655212.787965inf2.85625738400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15430955199.303205inf2.85625738400
23librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15728355205.010649inf2.85625738400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2864135445.9748085.445975e+030.19452452000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2833404543.0610114.543061e+030.19452452000
21ogbg_jaxtrial_1validation/mean_average_precision0.280980True0.2839605444.0192955.444019e+030.19452452000
2wmt_jaxtrial_1validation/bleu30.849100False30.80719718087.946022inf0.131784120000
11wmt_jaxtrial_1validation/bleu30.849100False30.82293718733.534310inf0.131784120000
20wmt_jaxtrial_1validation/bleu30.849100True30.89861812937.4888431.293749e+040.131784120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "26 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "19 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "25 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "24 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "22 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "23 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "21 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "20 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 True 0.123682 \n", + "17 0.123735 True 0.123696 \n", + "26 0.123735 True 0.123703 \n", + "1 0.723653 True 0.723746 \n", + "10 0.723653 True 0.723938 \n", + "19 0.723653 True 0.723798 \n", + "7 22.432000 True 22.063707 \n", + "16 22.432000 True 22.084080 \n", + "25 22.432000 True 21.411765 \n", + "0 0.774310 False 0.034640 \n", + "9 0.774310 False 0.040140 \n", + "18 0.774310 False 0.036060 \n", + "6 0.773090 True 0.773560 \n", + "15 0.773090 True 0.773200 \n", + "24 0.773090 True 0.773500 \n", + "4 0.085884 False 0.123884 \n", + "13 0.085884 False 0.520968 \n", + "22 0.085884 False 0.885849 \n", + "5 0.119936 False 0.157476 \n", + "14 0.119936 False 0.154309 \n", + "23 0.119936 False 0.157283 \n", + "3 0.280980 True 0.286413 \n", + "12 0.280980 True 0.283340 \n", + "21 0.280980 True 0.283960 \n", + "2 30.849100 False 30.807197 \n", + "11 30.849100 False 30.822937 \n", + "20 30.849100 True 30.898618 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 7494.730987 7.494731e+03 0.896691 \n", + "17 8204.540539 8.204541e+03 0.896691 \n", + "26 8561.992237 8.205840e+03 0.896691 \n", + "1 1850.625382 1.850625e+03 0.369840 \n", + "10 1854.584780 1.854585e+03 0.369840 \n", + "19 1610.791705 1.610792e+03 0.369840 \n", + "7 15451.991347 1.545199e+04 0.225346 \n", + "16 15451.332998 1.545133e+04 0.225346 \n", + "25 18017.746317 1.801775e+04 0.225346 \n", + "0 2051.405519 inf 0.447769 \n", + "9 2058.181893 inf 0.447769 \n", + "18 2058.049064 inf 0.447769 \n", + "6 84891.755018 8.489176e+04 0.491351 \n", + "15 90041.784164 9.004178e+04 0.491351 \n", + "24 79757.285381 7.975729e+04 0.491351 \n", + "4 65000.425951 inf 2.687886 \n", + "13 64987.361876 inf 2.687886 \n", + "22 65011.338722 inf 2.687886 \n", + "5 55212.787965 inf 2.856257 \n", + "14 55199.303205 inf 2.856257 \n", + "23 55205.010649 inf 2.856257 \n", + "3 5445.974808 5.445975e+03 0.194524 \n", + "12 4543.061011 4.543061e+03 0.194524 \n", + "21 5444.019295 5.444019e+03 0.194524 \n", + "2 18087.946022 inf 0.131784 \n", + "11 18733.534310 inf 0.131784 \n", + "20 12937.488843 1.293749e+04 0.131784 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "26 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "7 72000 \n", + "16 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "24 167999 \n", + "4 76000 \n", + "13 76000 \n", + "22 76000 \n", + "5 38400 \n", + "14 38400 \n", + "23 38400 \n", + "3 52000 \n", + "12 52000 \n", + "21 52000 \n", + "2 120000 \n", + "11 120000 \n", + "20 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== Schedule-Free AdamW v2 (schedule_free_adamw_v2) ===\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + "['imagenet_resnet_pytorch', 'fastmri_pytorch', 'imagenet_vit_pytorch', 'librispeech_conformer_pytorch', 'ogbg_pytorch', 'librispeech_deepspeech_pytorch', 'wmt_pytorch', 'criteo1tb_pytorch', 'finewebedu_lm_pytorch']\n", + " Workload: criteo1tb_pytorch\n", + " Workload: fastmri_pytorch\n", + " Workload: finewebedu_lm_pytorch\n", + " Workload: imagenet_resnet_pytorch\n", + " Workload: imagenet_vit_pytorch\n", + " Workload: librispeech_conformer_pytorch\n", + " Workload: librispeech_deepspeech_pytorch\n", + " Workload: ogbg_pytorch\n", + " Workload: wmt_pytorch\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
7criteo1tb_pytorchtrial_1validation/loss0.123735True0.1236847836.1190347.480571e+030.90949010666
16criteo1tb_pytorchtrial_1validation/loss0.123735True0.1236898195.6632357.483041e+030.90949010666
24criteo1tb_pytorchtrial_1validation/loss0.123735True0.1236986768.5130466.768513e+030.90949010666
1fastmri_pytorchtrial_1validation/ssim0.723653True0.7243821018.5896021.018590e+030.25319718094
10fastmri_pytorchtrial_1validation/ssim0.723653True0.7242271279.6873631.279687e+030.25319718094
19fastmri_pytorchtrial_1validation/ssim0.723653True0.7240951128.8378761.128838e+030.25319718094
8finewebedu_lm_pytorchtrial_1validation/ppl22.432000False22.90743046293.006929inf0.39557072000
17finewebedu_lm_pytorchtrial_1validation/ppl22.432000False23.14862346274.095018inf0.39557072000
25finewebedu_lm_pytorchtrial_1validation/ppl22.432000False23.12958843710.660111inf0.39557072000
0imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.67248055976.228313inf0.817306195999
9imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.67436073961.891255inf0.817306195999
18imagenet_resnet_pytorchtrial_1validation/accuracy0.774310False0.68412069928.902331inf0.817306195999
2imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.65356095099.525435inf0.883881167999
11imagenet_vit_pytorchtrial_1validation/accuracy0.773090False0.64404092544.239928inf0.883881167999
3librispeech_conformer_pytorchtrial_1validation/wer0.085884False0.08943264575.976842inf0.66248276000
12librispeech_conformer_pytorchtrial_1validation/wer0.085884True0.08549255846.4408155.584644e+040.66248276000
20librispeech_conformer_pytorchtrial_1validation/wer0.085884True0.08550254098.9068205.409891e+040.66248276000
5librispeech_deepspeech_pytorchtrial_1validation/wer0.119936True0.11931636138.4303673.613843e+040.52422038400
14librispeech_deepspeech_pytorchtrial_1validation/wer0.119936True0.11963543377.4312474.337743e+040.52422038400
22librispeech_deepspeech_pytorchtrial_1validation/wer0.119936True0.11975141911.1755484.191118e+040.52422038400
4ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2844006330.9162966.330916e+030.21809152000
13ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2829465872.0419525.872042e+030.21809152000
21ogbg_pytorchtrial_1validation/mean_average_precision0.280980True0.2842696325.4306626.325431e+030.21809152000
6wmt_pytorchtrial_1validation/bleu30.849100True30.96826210325.4570551.032546e+040.140112120000
15wmt_pytorchtrial_1validation/bleu30.849100True30.90527111614.2507591.161425e+040.140112120000
23wmt_pytorchtrial_1validation/bleu30.849100True30.9647718397.6197317.755601e+030.140112120000
\n", + "
" + ], + "text/plain": [ + " workload trial \\\n", + "7 criteo1tb_pytorch trial_1 \n", + "16 criteo1tb_pytorch trial_1 \n", + "24 criteo1tb_pytorch trial_1 \n", + "1 fastmri_pytorch trial_1 \n", + "10 fastmri_pytorch trial_1 \n", + "19 fastmri_pytorch trial_1 \n", + "8 finewebedu_lm_pytorch trial_1 \n", + "17 finewebedu_lm_pytorch trial_1 \n", + "25 finewebedu_lm_pytorch trial_1 \n", + "0 imagenet_resnet_pytorch trial_1 \n", + "9 imagenet_resnet_pytorch trial_1 \n", + "18 imagenet_resnet_pytorch trial_1 \n", + "2 imagenet_vit_pytorch trial_1 \n", + "11 imagenet_vit_pytorch trial_1 \n", + "3 librispeech_conformer_pytorch trial_1 \n", + "12 librispeech_conformer_pytorch trial_1 \n", + "20 librispeech_conformer_pytorch trial_1 \n", + "5 librispeech_deepspeech_pytorch trial_1 \n", + "14 librispeech_deepspeech_pytorch trial_1 \n", + "22 librispeech_deepspeech_pytorch trial_1 \n", + "4 ogbg_pytorch trial_1 \n", + "13 ogbg_pytorch trial_1 \n", + "21 ogbg_pytorch trial_1 \n", + "6 wmt_pytorch trial_1 \n", + "15 wmt_pytorch trial_1 \n", + "23 wmt_pytorch trial_1 \n", + "\n", + " val target metric name val target metric value \\\n", + "7 validation/loss 0.123735 \n", + "16 validation/loss 0.123735 \n", + "24 validation/loss 0.123735 \n", + "1 validation/ssim 0.723653 \n", + "10 validation/ssim 0.723653 \n", + "19 validation/ssim 0.723653 \n", + "8 validation/ppl 22.432000 \n", + "17 validation/ppl 22.432000 \n", + "25 validation/ppl 22.432000 \n", + "0 validation/accuracy 0.774310 \n", + "9 validation/accuracy 0.774310 \n", + "18 validation/accuracy 0.774310 \n", + "2 validation/accuracy 0.773090 \n", + "11 validation/accuracy 0.773090 \n", + "3 validation/wer 0.085884 \n", + "12 validation/wer 0.085884 \n", + "20 validation/wer 0.085884 \n", + "5 validation/wer 0.119936 \n", + "14 validation/wer 0.119936 \n", + "22 validation/wer 0.119936 \n", + "4 validation/mean_average_precision 0.280980 \n", + "13 validation/mean_average_precision 0.280980 \n", + "21 validation/mean_average_precision 0.280980 \n", + "6 validation/bleu 30.849100 \n", + "15 validation/bleu 30.849100 \n", + "23 validation/bleu 30.849100 \n", + "\n", + " val target reached best metric value on val \\\n", + "7 True 0.123684 \n", + "16 True 0.123689 \n", + "24 True 0.123698 \n", + "1 True 0.724382 \n", + "10 True 0.724227 \n", + "19 True 0.724095 \n", + "8 False 22.907430 \n", + "17 False 23.148623 \n", + "25 False 23.129588 \n", + "0 False 0.672480 \n", + "9 False 0.674360 \n", + "18 False 0.684120 \n", + "2 False 0.653560 \n", + "11 False 0.644040 \n", + "3 False 0.089432 \n", + "12 True 0.085492 \n", + "20 True 0.085502 \n", + "5 True 0.119316 \n", + "14 True 0.119635 \n", + "22 True 0.119751 \n", + "4 True 0.284400 \n", + "13 True 0.282946 \n", + "21 True 0.284269 \n", + "6 True 30.968262 \n", + "15 True 30.905271 \n", + "23 True 30.964771 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "7 7836.119034 7.480571e+03 0.909490 \n", + "16 8195.663235 7.483041e+03 0.909490 \n", + "24 6768.513046 6.768513e+03 0.909490 \n", + "1 1018.589602 1.018590e+03 0.253197 \n", + "10 1279.687363 1.279687e+03 0.253197 \n", + "19 1128.837876 1.128838e+03 0.253197 \n", + "8 46293.006929 inf 0.395570 \n", + "17 46274.095018 inf 0.395570 \n", + "25 43710.660111 inf 0.395570 \n", + "0 55976.228313 inf 0.817306 \n", + "9 73961.891255 inf 0.817306 \n", + "18 69928.902331 inf 0.817306 \n", + "2 95099.525435 inf 0.883881 \n", + "11 92544.239928 inf 0.883881 \n", + "3 64575.976842 inf 0.662482 \n", + "12 55846.440815 5.584644e+04 0.662482 \n", + "20 54098.906820 5.409891e+04 0.662482 \n", + "5 36138.430367 3.613843e+04 0.524220 \n", + "14 43377.431247 4.337743e+04 0.524220 \n", + "22 41911.175548 4.191118e+04 0.524220 \n", + "4 6330.916296 6.330916e+03 0.218091 \n", + "13 5872.041952 5.872042e+03 0.218091 \n", + "21 6325.430662 6.325431e+03 0.218091 \n", + "6 10325.457055 1.032546e+04 0.140112 \n", + "15 11614.250759 1.161425e+04 0.140112 \n", + "23 8397.619731 7.755601e+03 0.140112 \n", + "\n", + " step_hint \n", + "7 10666 \n", + "16 10666 \n", + "24 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "8 72000 \n", + "17 72000 \n", + "25 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "2 167999 \n", + "11 167999 \n", + "3 76000 \n", + "12 76000 \n", + "20 76000 \n", + "5 38400 \n", + "14 38400 \n", + "22 38400 \n", + "4 52000 \n", + "13 52000 \n", + "21 52000 \n", + "6 120000 \n", + "15 120000 \n", + "23 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== DiLoCo (Single Worker) (single_worker_diloco) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735False0.12400512536.648544inf2.02925410666
17criteo1tb_jaxtrial_1validation/loss0.123735False0.12417713238.606914inf2.02925410666
25criteo1tb_jaxtrial_1validation/loss0.123735True0.1236798951.6992518.951699e+032.02925410666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7243451824.3617331.824362e+031.01013918094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7240332934.3234002.934323e+031.01013918094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.29992728315.8042412.831580e+040.46192972000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.32335128314.8191892.831482e+040.46192972000
24finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.30258928313.5053452.831351e+040.46192972000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.75864059924.762427inf0.254795195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.76084073905.253106inf0.254795195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.76208057916.220698inf0.254795195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.73200087449.532381inf0.498083167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.69314092609.954645inf0.498083167999
23imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.73982082302.748962inf0.498083167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.89619115938.478786inf2.73908676000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.17825563227.458880inf2.73908676000
21librispeech_conformer_jaxtrial_1validation/wer0.085884False0.18830764987.826900inf2.73908676000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.15569953798.129664inf2.64880938400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.16081755242.171370inf2.64880938400
22librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.16025755258.443447inf2.64880938400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2752504991.950768inf0.19546052000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2770215446.170158inf0.19546052000
20ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2721274542.065599inf0.19546052000
2wmt_jaxtrial_1validation/bleu30.849100False30.06096215523.899387inf0.140842120000
11wmt_jaxtrial_1validation/bleu30.849100False29.21444117454.147111inf0.140842120000
19wmt_jaxtrial_1validation/bleu30.849100False30.16493216168.221429inf0.140842120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "25 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "24 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "23 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "21 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "22 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "20 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "19 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 False 0.124005 \n", + "17 0.123735 False 0.124177 \n", + "25 0.123735 True 0.123679 \n", + "1 0.723653 True 0.724345 \n", + "10 0.723653 True 0.724033 \n", + "7 22.432000 True 21.299927 \n", + "16 22.432000 True 21.323351 \n", + "24 22.432000 True 21.302589 \n", + "0 0.774310 False 0.758640 \n", + "9 0.774310 False 0.760840 \n", + "18 0.774310 False 0.762080 \n", + "6 0.773090 False 0.732000 \n", + "15 0.773090 False 0.693140 \n", + "23 0.773090 False 0.739820 \n", + "4 0.085884 False 0.896191 \n", + "13 0.085884 False 0.178255 \n", + "21 0.085884 False 0.188307 \n", + "5 0.119936 False 0.155699 \n", + "14 0.119936 False 0.160817 \n", + "22 0.119936 False 0.160257 \n", + "3 0.280980 False 0.275250 \n", + "12 0.280980 False 0.277021 \n", + "20 0.280980 False 0.272127 \n", + "2 30.849100 False 30.060962 \n", + "11 30.849100 False 29.214441 \n", + "19 30.849100 False 30.164932 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 12536.648544 inf 2.029254 \n", + "17 13238.606914 inf 2.029254 \n", + "25 8951.699251 8.951699e+03 2.029254 \n", + "1 1824.361733 1.824362e+03 1.010139 \n", + "10 2934.323400 2.934323e+03 1.010139 \n", + "7 28315.804241 2.831580e+04 0.461929 \n", + "16 28314.819189 2.831482e+04 0.461929 \n", + "24 28313.505345 2.831351e+04 0.461929 \n", + "0 59924.762427 inf 0.254795 \n", + "9 73905.253106 inf 0.254795 \n", + "18 57916.220698 inf 0.254795 \n", + "6 87449.532381 inf 0.498083 \n", + "15 92609.954645 inf 0.498083 \n", + "23 82302.748962 inf 0.498083 \n", + "4 15938.478786 inf 2.739086 \n", + "13 63227.458880 inf 2.739086 \n", + "21 64987.826900 inf 2.739086 \n", + "5 53798.129664 inf 2.648809 \n", + "14 55242.171370 inf 2.648809 \n", + "22 55258.443447 inf 2.648809 \n", + "3 4991.950768 inf 0.195460 \n", + "12 5446.170158 inf 0.195460 \n", + "20 4542.065599 inf 0.195460 \n", + "2 15523.899387 inf 0.140842 \n", + "11 17454.147111 inf 0.140842 \n", + "19 16168.221429 inf 0.140842 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "25 10666 \n", + "1 18094 \n", + "10 18094 \n", + "7 72000 \n", + "16 72000 \n", + "24 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "23 167999 \n", + "4 76000 \n", + "13 76000 \n", + "21 76000 \n", + "5 38400 \n", + "14 38400 \n", + "22 38400 \n", + "3 52000 \n", + "12 52000 \n", + "20 52000 \n", + "2 120000 \n", + "11 120000 \n", + "19 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== DiLoCo v2 (Single Worker) (single_worker_dilocov2) ===\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + "['imagenet_resnet_jax', 'fastmri_jax', 'wmt_jax', 'ogbg_jax', 'librispeech_conformer_jax', 'librispeech_deepspeech_jax', 'imagenet_vit_jax', 'finewebedu_lm_jax', 'criteo1tb_jax']\n", + " Workload: criteo1tb_jax\n", + " Workload: fastmri_jax\n", + " Workload: finewebedu_lm_jax\n", + " Workload: imagenet_resnet_jax\n", + " Workload: imagenet_vit_jax\n", + " Workload: librispeech_conformer_jax\n", + " Workload: librispeech_deepspeech_jax\n", + " Workload: ogbg_jax\n", + " Workload: wmt_jax\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workloadtrialval target metric nameval target metric valueval target reachedbest metric value on valtime to best eval on val (s)time to target on val (s)step_time (s)step_hint
8criteo1tb_jaxtrial_1validation/loss0.123735False0.12427113033.471937inf1.95725610666
17criteo1tb_jaxtrial_1validation/loss0.123735False0.12432712450.281544inf1.95725610666
25criteo1tb_jaxtrial_1validation/loss0.123735False0.12436612143.230377inf1.95725610666
1fastmri_jaxtrial_1validation/ssim0.723653True0.7246793013.4445743.013445e+031.21314618094
10fastmri_jaxtrial_1validation/ssim0.723653True0.7237142578.1419472.578142e+031.21314618094
19fastmri_jaxtrial_1validation/ssim0.723653True0.7237212561.6468302.561647e+031.21314618094
7finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.83711928313.9738812.831397e+040.47487572000
16finewebedu_lm_jaxtrial_1validation/ppl22.432000True21.66829828312.4411872.831244e+040.47487572000
24finewebedu_lm_jaxtrial_1validation/ppl22.432000True22.06385528316.0340542.831603e+040.47487572000
0imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.73524071938.876954inf0.494305195999
9imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.76024063908.868738inf0.494305195999
18imagenet_resnet_jaxtrial_1validation/accuracy0.774310False0.67984073927.915774inf0.494305195999
6imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.68320082303.602971inf0.511691167999
15imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.68396084880.637240inf0.511691167999
23imagenet_vit_jaxtrial_1validation/accuracy0.773090False0.69978082310.410928inf0.511691167999
4librispeech_conformer_jaxtrial_1validation/wer0.085884False0.28446964958.122212inf2.58985276000
13librispeech_conformer_jaxtrial_1validation/wer0.085884False0.22808965014.055621inf2.58985276000
5librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.16544255277.984729inf2.60304738400
14librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.16333755251.850288inf2.60304738400
22librispeech_deepspeech_jaxtrial_1validation/wer0.119936False0.16829055264.863801inf2.60304738400
3ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2719105445.762616inf0.19557852000
12ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2654765895.114527inf0.19557852000
21ogbg_jaxtrial_1validation/mean_average_precision0.280980False0.2574247250.969810inf0.19557852000
2wmt_jaxtrial_1validation/bleu30.849100False29.73364615524.697182inf0.135402120000
11wmt_jaxtrial_1validation/bleu30.849100False29.61076017455.574302inf0.135402120000
20wmt_jaxtrial_1validation/bleu30.849100False29.57116914879.059205inf0.135402120000
\n", + "
" + ], + "text/plain": [ + " workload trial val target metric name \\\n", + "8 criteo1tb_jax trial_1 validation/loss \n", + "17 criteo1tb_jax trial_1 validation/loss \n", + "25 criteo1tb_jax trial_1 validation/loss \n", + "1 fastmri_jax trial_1 validation/ssim \n", + "10 fastmri_jax trial_1 validation/ssim \n", + "19 fastmri_jax trial_1 validation/ssim \n", + "7 finewebedu_lm_jax trial_1 validation/ppl \n", + "16 finewebedu_lm_jax trial_1 validation/ppl \n", + "24 finewebedu_lm_jax trial_1 validation/ppl \n", + "0 imagenet_resnet_jax trial_1 validation/accuracy \n", + "9 imagenet_resnet_jax trial_1 validation/accuracy \n", + "18 imagenet_resnet_jax trial_1 validation/accuracy \n", + "6 imagenet_vit_jax trial_1 validation/accuracy \n", + "15 imagenet_vit_jax trial_1 validation/accuracy \n", + "23 imagenet_vit_jax trial_1 validation/accuracy \n", + "4 librispeech_conformer_jax trial_1 validation/wer \n", + "13 librispeech_conformer_jax trial_1 validation/wer \n", + "5 librispeech_deepspeech_jax trial_1 validation/wer \n", + "14 librispeech_deepspeech_jax trial_1 validation/wer \n", + "22 librispeech_deepspeech_jax trial_1 validation/wer \n", + "3 ogbg_jax trial_1 validation/mean_average_precision \n", + "12 ogbg_jax trial_1 validation/mean_average_precision \n", + "21 ogbg_jax trial_1 validation/mean_average_precision \n", + "2 wmt_jax trial_1 validation/bleu \n", + "11 wmt_jax trial_1 validation/bleu \n", + "20 wmt_jax trial_1 validation/bleu \n", + "\n", + " val target metric value val target reached best metric value on val \\\n", + "8 0.123735 False 0.124271 \n", + "17 0.123735 False 0.124327 \n", + "25 0.123735 False 0.124366 \n", + "1 0.723653 True 0.724679 \n", + "10 0.723653 True 0.723714 \n", + "19 0.723653 True 0.723721 \n", + "7 22.432000 True 21.837119 \n", + "16 22.432000 True 21.668298 \n", + "24 22.432000 True 22.063855 \n", + "0 0.774310 False 0.735240 \n", + "9 0.774310 False 0.760240 \n", + "18 0.774310 False 0.679840 \n", + "6 0.773090 False 0.683200 \n", + "15 0.773090 False 0.683960 \n", + "23 0.773090 False 0.699780 \n", + "4 0.085884 False 0.284469 \n", + "13 0.085884 False 0.228089 \n", + "5 0.119936 False 0.165442 \n", + "14 0.119936 False 0.163337 \n", + "22 0.119936 False 0.168290 \n", + "3 0.280980 False 0.271910 \n", + "12 0.280980 False 0.265476 \n", + "21 0.280980 False 0.257424 \n", + "2 30.849100 False 29.733646 \n", + "11 30.849100 False 29.610760 \n", + "20 30.849100 False 29.571169 \n", + "\n", + " time to best eval on val (s) time to target on val (s) step_time (s) \\\n", + "8 13033.471937 inf 1.957256 \n", + "17 12450.281544 inf 1.957256 \n", + "25 12143.230377 inf 1.957256 \n", + "1 3013.444574 3.013445e+03 1.213146 \n", + "10 2578.141947 2.578142e+03 1.213146 \n", + "19 2561.646830 2.561647e+03 1.213146 \n", + "7 28313.973881 2.831397e+04 0.474875 \n", + "16 28312.441187 2.831244e+04 0.474875 \n", + "24 28316.034054 2.831603e+04 0.474875 \n", + "0 71938.876954 inf 0.494305 \n", + "9 63908.868738 inf 0.494305 \n", + "18 73927.915774 inf 0.494305 \n", + "6 82303.602971 inf 0.511691 \n", + "15 84880.637240 inf 0.511691 \n", + "23 82310.410928 inf 0.511691 \n", + "4 64958.122212 inf 2.589852 \n", + "13 65014.055621 inf 2.589852 \n", + "5 55277.984729 inf 2.603047 \n", + "14 55251.850288 inf 2.603047 \n", + "22 55264.863801 inf 2.603047 \n", + "3 5445.762616 inf 0.195578 \n", + "12 5895.114527 inf 0.195578 \n", + "21 7250.969810 inf 0.195578 \n", + "2 15524.697182 inf 0.135402 \n", + "11 17455.574302 inf 0.135402 \n", + "20 14879.059205 inf 0.135402 \n", + "\n", + " step_hint \n", + "8 10666 \n", + "17 10666 \n", + "25 10666 \n", + "1 18094 \n", + "10 18094 \n", + "19 18094 \n", + "7 72000 \n", + "16 72000 \n", + "24 72000 \n", + "0 195999 \n", + "9 195999 \n", + "18 195999 \n", + "6 167999 \n", + "15 167999 \n", + "23 167999 \n", + "4 76000 \n", + "13 76000 \n", + "5 38400 \n", + "14 38400 \n", + "22 38400 \n", + "3 52000 \n", + "12 52000 \n", + "21 52000 \n", + "2 120000 \n", + "11 120000 \n", + "20 120000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Loaded 14 submission(s): ['AdEMAMix', 'Cautious NAdamW', 'Lion', 'Muon (JAX)', 'Muon (PyTorch)', 'NAdamW', 'NAdamW (Baseline v0.5)', 'NAdamW (ResNet)', 'Schedule-Free AdamW', 'Schedule-Free AdamW (JAX)', 'Schedule-Free AdamW (JAX v2)', 'Schedule-Free AdamW v2', 'DiLoCo (Single Worker)', 'DiLoCo v2 (Single Worker)']\n" + ] + } + ], + "source": [ + "results = {}\n", + "\n", + "_exclude = {s.strip() for s in EXCLUDE_SUBMISSIONS.split(',')} - {''}\n", + "_include_raw = {s.strip() for s in INCLUDE_SUBMISSIONS.split(',')} - {''}\n", + "\n", + "print(f'Excluding ({len(_exclude)}): {sorted(_exclude) or \"(none)\"}')\n", + "print(f'Including ({len(_include_raw)}): {sorted(_include_raw) or \"(all)\"}')\n", + "\n", + "def _is_included(raw_name):\n", + " if raw_name in _exclude:\n", + " return False\n", + " if _include_raw and raw_name not in _include_raw:\n", + " return False\n", + " return True\n", + "\n", + "if LOAD_RESULTS_FROM:\n", + " load_path = os.path.join(OUTPUT_DIR, LOAD_RESULTS_FROM)\n", + " print(f'\\nLoading cached results from {load_path}')\n", + " with open(load_path, 'rb') as f:\n", + " cached = pickle.load(f)\n", + " _pretty_to_raw = {v: k for k, v in SUBMISSION_NAME_MAP.items()}\n", + " for name, df in cached.items():\n", + " raw = _pretty_to_raw.get(name, name)\n", + " if _is_included(raw):\n", + " results[name] = df\n", + " print(f' ✓ {name}')\n", + " else:\n", + " print(f' ✗ {name} ← excluded')\n", + "else:\n", + " all_submission_dirs = sorted(os.listdir(SUBMISSION_DIRECTORY))\n", + " print(f'\\nFound {len(all_submission_dirs)} folders:')\n", + " for s in all_submission_dirs:\n", + " tag = '✓' if _is_included(s) else '✗ ← excluded'\n", + " print(f' {tag} {s}')\n", + " print()\n", + "\n", + " for submission in all_submission_dirs:\n", + " if not _is_included(submission):\n", + " continue\n", + " print(f'\\n=== {pretty(submission)} ({submission}) ===')\n", + " experiment_path = os.path.join(SUBMISSION_DIRECTORY, submission)\n", + " df = scoring_utils.get_experiment_df(experiment_path)\n", + " results[pretty(submission)] = df\n", + "\n", + " summary_df = get_submission_summary(df)\n", + " summary_df.to_csv(os.path.join(OUTPUT_DIR, f'{submission}_summary.csv'))\n", + " display(summary_df)\n", + "\n", + " if SAVE_RESULTS_TO:\n", + " save_path = os.path.join(OUTPUT_DIR, SAVE_RESULTS_TO)\n", + " with open(save_path, 'wb') as f:\n", + " pickle.dump(results, f)\n", + " print(f'Results cached to {save_path}')\n", + "\n", + "print(f'\\nLoaded {len(results)} submission(s): {list(results.keys())}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Performance Profiles & Leaderboard Scores" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:Expecting 8 workloads but found 9 workloads for AdEMAMix.\n", + "WARNING:absl:Expecting 3 studies for workload imagenet_vit_pytorch but found 2 studies for AdEMAMix.\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Cautious NAdamW.\n", + "WARNING:absl:Expecting 3 studies for workload finewebedu_lm_jax but found 1 studies for Cautious NAdamW.\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Lion.\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Muon (JAX).\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Muon (PyTorch).\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for NAdamW.\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for NAdamW (Baseline v0.5).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: STRICT=False relaxes criteria on held-out workloads, trial counts, and study counts. Scores may not match official competition scoring. Set STRICT=True to enforce all rules.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:Expecting 8 workloads but found 9 workloads for NAdamW (ResNet).\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Schedule-Free AdamW.\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Schedule-Free AdamW (JAX).\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Schedule-Free AdamW (JAX v2).\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for Schedule-Free AdamW v2.\n", + "WARNING:absl:Expecting 3 studies for workload imagenet_vit_pytorch but found 2 studies for Schedule-Free AdamW v2.\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for DiLoCo (Single Worker).\n", + "WARNING:absl:Expecting 3 studies for workload fastmri_jax but found 2 studies for DiLoCo (Single Worker).\n", + "WARNING:absl:Expecting 8 workloads but found 9 workloads for DiLoCo v2 (Single Worker).\n", + "WARNING:absl:Expecting 3 studies for workload librispeech_conformer_jax but found 2 studies for DiLoCo v2 (Single Worker).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved → /home/kasimbeg/submissions_algorithms/scoring_artifacts/performance_profile_by_score.pdf / .png\n" + ] + }, + { + "data": { + "image/png": "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AMCqVatQVVXV6DbXrVuHCy64AH5+fggMDMSoUaPwwQcf4Ndff7Wa4+0f//iH1XGKomDVqlUYP348QkJC4OPjg65du+Luu+9WR7g0huViGABs5hf99ddfcc011yAiIgJGoxHR0dG47rrrsH37dqv9zpw5YxV7586dUVVVhWeeeQZ9+vSBj4+P1QW8JElSR/umpqY6/SIbiqLY7c/5PvvsMzz33HN2txUWFmLhwoXo378/fH191Tn3nnnmGRQXFzsci+V5tYxu27p1q0MXNLvwwguxdu1ah+/HYu3atbjwwgtx8cUX1/m4JiQkWG277bbbrNro3r27TYxr167F0KFD4evri5CQEFx77bU4efKk1XHnz114/oirxrZb265du3DllVciJCQEJpMJffr0waJFi1BWVmbVdnBwsObHrj6SJKnFjtLSUnX92rVr630shw0bZrW9MTIyMhAfH4+ePXvCx8cHQUFBGDVqFF5//XVUVlba7C/LMt5//32MHTsWkZGR6vykN910Ez799FOr+C20vN4t86FadOnSpcl9rEvtkaLn5/Nnn32GSy65BKGhofD29kanTp0wY8YMJCQkWO23bds2q/gmTJiA4uJizJ07F127doXRaFRfr1ryVct7spb3SHvxFhYW4v7770f79u3h7++PCy64AF999ZXa/sqVKxEXFwcfHx/ExsbiqaeegizLNo9nRUUFNm7ciJtvvhl9+vSBv78//P39MWTIEDz//POoqKiwOcYZeZuVlYVHH30Uffr0Uee37t27N2677TZs2rTJbqxJSUm466670LlzZ3h7eyM0NFQdLS6cOLdxbee/3rQ8b7VlZmZi7ty56N27N0wmEwIDA3HBBRdg2bJlNo+xZf7s22+/HUD1nNTn55MzLoSp9fEsLy/Ha6+9huHDhyMsLAze3t7o0aMH7rjjDnz77bdN+hxERET1cPH0A0RERE5hNptFTEyMePHFF4UQQhw+fFidj+3TTz+t87j65lSNj48XAMTAgQPF5s2bRWpqqtiyZYsYM2aMmDRpktXcp+fOnVOPKy8vF5dddpkAIG699Vaxd+9ekZycLD788EPRvn174e/vL3744Qe78SxYsEAAEOPHj7e7vaKiQuj1egFATJ8+XV3/9NNPCwBiyJAh4vvvvxfHjx8XX3zxhejVq5eQJEm8/vrr6r6yLFvN99mpUyfx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MG/ePKuzX4iIyDk4pyoREbVqK1aswFVXXYWBAweie/fudv9mzpwJAPjpp5+sCnJ1MRgMGDt2LABg165ddvc5cuSI3fWTJk2C0WiELMvYvXu33X127twJAJgyZUqDsTQkKioKgwYNAgDs2LHD7j5VVVW48MILGxw95yqHDx/GokWL1CkX6mI5tbj2qZqWx3Dfvn11nga7atUqDB48GCkpKc4JuBnVN7fi8ePHWziaxpswYQIA7fnjLA888AACAgJw6NAhfPrppzbbm+NxtrwW68pDAHj22WcxYsQIFBcXAwCOHj2K2267zeq1r9PpcNlll+G9994DAHX+1dr30ZjXu71RexkZGSgpKXGgd40zdOhQ9RTsuh6XnJwcDBkyBK+99lqzxNDS78nOoihKvdsbmku1MSz9tzwe5ysvL8dll12Gl19+2eaY+l739957LyZPntzkUeDO1lB/T58+jbS0NKt9WyomLY/ntm3bcN9991nt4+XlhX/+85/qc1X7fYSIiJyHRVUiImq10tPT8c033+D222+vd78bb7wRPj4+mi5YFR8fD6B6fsTzR66VlpbW2U54eDj+/e9/AwBeeeUVm+379u3Dr7/+isDAQPU+msoycnL58uUoKiqy2b58+XJs27YNkyZNcsr91WXOnDno0qUL1qxZo/nYiooKvP3223Vu379/Pw4ePAhfX19cfvnl6vqrrroKQ4YMQWFhIZYvX25zXH5+Pp5++mmYTCZ07txZc1wtbciQIQBgU/wpKirChg0bXBFSo9x5550IDAzE33//jR9//NFm+7Jly5r1/kNCQnDvvfcCqM6P8wtUlsd53759NqNVV65c2aj7vOOOO9CxY0ccO3YMX375pc321NRUvPzyy+jevbs6H2pGRgbef/99uxeVskxdUvt125TXu6WQbCminjt3Du3bt8f777/fmO46xGAwYP78+QCAJUuWqH2q7bnnnsPBgwdxySWXNEsMrnhPdobw8HB06dIFAPDVV1/ZbP/oo4+cfp+W1/CJEyfw9ddf22x///338f3331vNjxsfH4/AwED89NNP2Ldvn80xe/fuxYoVKzB8+HC3Ox3f0t+kpCS7OWt5vUydOlW9MFhza8zjeeLECbz55ps4ceKEzf723keIiMh5WFQlIqJWR5ZlZGRkYPny5QgMDMSgQYNQUFBgd9+ysjKUlZXh4osv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Pfj4+OCLL76w2Wa5yNKdd97ZwlERERERETkHi6pERET1ePzxxyHLMi699FIEBgbi6NGjePrpp5GUlIQVK1bwirpE9fjyyy9x991344477kBUVBTS09Pxzjvv4IMPPsCtt96Kf/3rX64OkYiIiIioUTinKhERUR2++eYbfPHFF/jzzz+Rnp6OgoIChIWFYcyYMXj44YcxcuRIV4dI5Lb279+Pjz/+GFu2bMGZM2eQnZ0Nf39/DBo0CHfeeScLqkRERETUqrGoSkRERERERERERKQBL1RFREREREREREREpAGLqkREREREREREREQasKhKREREREREREREpAGLqkREREREREREREQasKhKREREREREREREpAGLqkREREREREREREQasKhKREREREREREREpAGLqkREREREREREREQaGBp7YHl5OVJTU1FYWAiz2Qx/f39ERkYiIiLCmfFRPa6++moAwKZNm1wcCRERERERERERUduhqai6d+9evP/++/jhhx+QlJQEIYTNPkFBQbjwwgtx7bXX4qabboLRaHRasGQtKSkJiqJAURTodBx0TNQQRVFQUlICPz8/5gyRA5gzRNowZ4gcx3wh0oY5Q6RNS9TKHGo9NTUVl19+OUaMGIE33ngDx48fh6IoEELY/OXn5+Orr77CzJkz0blzZ3z00UfN2oG2zvK4E1HDhBAoKytjzhA5iDlDpA1zhshxzBcibZgzRNq0RK5IooF7+fPPP3HFFVcgPz8fU6ZMwaWXXoqBAweiU6dOCAsLg4+PD/R6PSoqKlBQUICMjAwcOXIE27Ztw8aNG5GVlYUHH3wQr7zySrN3pq2Ji4sDACQmJro4EiIiIiIiIiIioraj3qLqqVOnMHToUAwZMgQvv/wy+vfvr6nx0tJSLF26FM8++yyeeeYZxMfHNzlgqmEpqiYkJECSJBdHQ+T+hBCQZRl6vZ45Q+QA5gyRNswZIscxX4i0Yc4QaSOEaPZcqbeo+o9//AMGgwEbNmxoUiBff/01brrpJiQmJqJTp06NboesxcXFwWw2IzExEQZDo685RtRmmM1m5OTkICwsjDlD5ADmDJE2zBkixzFfiLRhzhBpYzabmz1X6mxdCIH4+HiMGjWqyZXdK6+8Ejt37oSXl1eT2iEiIiIiIiIiIiJytTqLqpIkYdy4cU67I8up6kRERERERERERESt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LTYiIqKWormoOnLkSDz55JNIT08HAEyePBlvvvkmZs+ejc8//xyff/45Zs6ciVdffRUXXui6XyBfffVV9OrVCwsXLsTHH3+MsrIypKen47777sPevXtx11134cYbb1T3nzJlCh544AFs2LABixcvRkFBAdLS0nD77bfj77//xptvvonY2Lq/ZKampuI///kPFixYgG7dulltu/fee+Hr64sHH3wQubm52LJlC9atW4c5c+bYnfOViMjVDidnQ6k1tcvg7rbzSZPn2JeTgcKqCnV5UgyLqq6iKIrNfKpERO4kPa8Emedqpkwb3L3hH16Ldv+m3vbrNxQ6H34HIiKi1k9zUfW6667DoUOH1IJpfHw8wsLC8O6772LatGmYNm0aVq9eDS8vLyxYsMDpATsqPDwcf/75J+655x48+eSTCA4ORp8+fZCYmIiPPvrIZkQqUF2IXbNmDb755htER0ejT58+yMzMxE8//YSZM2fWe3/33HMPunfvjocffthmW3R0NH744QekpqYiOjoa//znPzF79mw8++yzTe5nfZPzEpE1nU4HPz8/5owDap/WFxnih/ah9c8nTa1b7VP/A728MTSs+gKOzJmWV1RUZHXVVJ7637owZ6gt2H8iU72tkyT07xJe7/5KeSlKDu9RlwOGj6s+lvlCpAlzhkiblsgV+5fRqscll1yC9PR0dY7QsLAwbNu2DfHx8fj111+hKAouuOACPPfccxg0aJCz49UkKCgIL7zwAl544QWHj7nllltwyy23aL6vb7/9tt7tY8aMsTtfa1N5clFVzj0HUVQMfcdoSHVcDY5IC51O57JpSVoTIYTNaX3k2X5JqymqjmvfAYb//V9hzrS82qf+GwwGPv6tDHOG2oKDJ7PV2z1iQuDnU/8UJcUH/oSoqrmAcMDw6sE5zBcibZgzRNq4ZVFVkiRERlqfBtq9e3ds2rTJaUGR4xRFgaIoHllYrdy5DxW//AHJ5AOvgX3ge/2Vrg6JWjlFUVBSUsJfeBtwNqcYuYVl6jKLqp4tt7wMB3NrviBfFNNZvc2caXm1L1IVEhLCx72VYc6QpzPLChJSai5G7Mj0QEV7auZT9QqLhE/nngCYL0RaMWeItGmJWpnmoiq5F08uqpqPJgEARFk5RHlFA3sTNczyQcRkMnlkzjhL7VGqep0O/TqHuTAaam6/pp2CQM38uROj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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Leaderboard Scores ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_709114/3734530332.py:74: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " scores = np.trapz(df, x=df.columns)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
score
submission
Schedule-Free AdamW v20.638889
AdEMAMix0.583965
Schedule-Free AdamW0.525253
NAdamW (Baseline v0.5)0.506944
Schedule-Free AdamW (JAX v2)0.495581
Muon (PyTorch)0.476010
Schedule-Free AdamW (JAX)0.462121
NAdamW0.432449
Cautious NAdamW0.353535
Muon (JAX)0.320076
Lion0.313131
NAdamW (ResNet)0.208965
DiLoCo (Single Worker)0.154040
DiLoCo v2 (Single Worker)0.146465
\n", + "
" + ], + "text/plain": [ + " score\n", + "submission \n", + "Schedule-Free AdamW v2 0.638889\n", + "AdEMAMix 0.583965\n", + "Schedule-Free AdamW 0.525253\n", + "NAdamW (Baseline v0.5) 0.506944\n", + "Schedule-Free AdamW (JAX v2) 0.495581\n", + "Muon (PyTorch) 0.476010\n", + "Schedule-Free AdamW (JAX) 0.462121\n", + "NAdamW 0.432449\n", + "Cautious NAdamW 0.353535\n", + "Muon (JAX) 0.320076\n", + "Lion 0.313131\n", + "NAdamW (ResNet) 0.208965\n", + "DiLoCo (Single Worker) 0.154040\n", + "DiLoCo v2 (Single Worker) 0.146465" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved to /home/kasimbeg/submissions_algorithms/scoring_artifacts/scores.csv\n" + ] + } + ], + "source": [ + "if not STRICT:\n", + " print(\n", + " 'WARNING: STRICT=False relaxes criteria on held-out workloads, '\n", + " 'trial counts, and study counts. Scores may not match official '\n", + " 'competition scoring. Set STRICT=True to enforce all rules.'\n", + " )\n", + "\n", + "if COMPUTE_PERFORMANCE_PROFILES:\n", + " performance_profile_df = performance_profile.compute_performance_profiles(\n", + " results,\n", + " WORKLOAD_CONFIG,\n", + " time_col='score',\n", + " min_tau=MIN_TAU,\n", + " max_tau=MAX_TAU,\n", + " reference_submission_tag=None,\n", + " num_points=NUM_POINTS,\n", + " scale=SCALE,\n", + " verbosity=0,\n", + " self_tuning_ruleset=SELF_TUNING_RULESET,\n", + " strict=STRICT,\n", + " output_dir=OUTPUT_DIR,\n", + " )\n", + "\n", + " # Save profile CSV so the Reload section (Section 7) always reflects the\n", + " # current run rather than loading a stale file from a previous run.\n", + " profile_csv = os.path.join(OUTPUT_DIR, 'performance_profile_score.csv')\n", + " performance_profile_df.to_csv(profile_csv)\n", + "\n", + " # ── Styled plot ────────────────────────────────────────────────────────────\n", + " fig, ax = plot_performance_profiles_styled(\n", + " performance_profile_df,\n", + " 'score',\n", + " scale=SCALE,\n", + " save_dir=OUTPUT_DIR,\n", + " title='AlgoPerf: Self-Tuning Ruleset Performance Profiles',\n", + " )\n", + " plt.show()\n", + "\n", + " # ── Scores table ──────────────────────────────────────────────────────────\n", + " scores = compute_leaderboard_score(performance_profile_df)\n", + " scores_path = os.path.join(OUTPUT_DIR, 'scores.csv')\n", + " scores.to_csv(scores_path)\n", + "\n", + " print('\\n--- Leaderboard Scores ---')\n", + " display(scores.sort_values('score', ascending=False))\n", + " print(f'Saved to {scores_path}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6b. Time-to-Target Table\n", + "Shows the median time (seconds) each submission took to reach the validation target on each workload.\\n`inf` means the target was not reached within the run." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Time to Target (seconds) ---\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
criteo1tbfastmrifinewebedu_lmimagenet_resnetimagenet_vitlibrispeech_conformerlibrispeech_deepspeechogbgwmt
Submission
AdEMAMix7,839s1,518s18,026s\\textemdash{}\\textemdash{}48,895s\\textemdash{}6,330s17,400s
Cautious NAdamW\\textemdash{}1,608s25,739s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}4,993s14,232s
Lion\\textemdash{}1,394s23,172s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}7,224s15,476s
Muon (JAX)\\textemdash{}1,870s20,594s\\textemdash{}77,163s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}
Muon (PyTorch)7,142s\\textemdash{}15,472s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}1,833s14,215s
NAdamW7,493s1,801s25,734s\\textemdash{}72,016s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}
NAdamW (Baseline v0.5)8,206s1,621s20,590s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}4,090s14,866s
NAdamW (ResNet)\\textemdash{}1,921s23,163s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}6,350s\\textemdash{}
Schedule-Free AdamW10,338s1,189s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}40,463s3,640s19,958s
Schedule-Free AdamW (JAX)\\textemdash{}2,397s12,875s\\textemdash{}87,469s\\textemdash{}\\textemdash{}5,447s16,161s
Schedule-Free AdamW (JAX v2)8,205s1,851s15,452s\\textemdash{}84,892s\\textemdash{}\\textemdash{}5,444s\\textemdash{}
Schedule-Free AdamW v27,481s1,129s\\textemdash{}\\textemdash{}\\textemdash{}55,846s41,911s6,325s10,325s
DiLoCo (Single Worker)\\textemdash{}2,379s28,315s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}
DiLoCo v2 (Single Worker)\\textemdash{}2,578s28,314s\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}\\textemdash{}
\n", + "
" + ], + "text/plain": [ + " criteo1tb fastmri finewebedu_lm \\\n", + "Submission \n", + "AdEMAMix 7,839s 1,518s 18,026s \n", + "Cautious NAdamW \\textemdash{} 1,608s 25,739s \n", + "Lion \\textemdash{} 1,394s 23,172s \n", + "Muon (JAX) \\textemdash{} 1,870s 20,594s \n", + "Muon (PyTorch) 7,142s \\textemdash{} 15,472s \n", + "NAdamW 7,493s 1,801s 25,734s \n", + "NAdamW (Baseline v0.5) 8,206s 1,621s 20,590s \n", + "NAdamW (ResNet) \\textemdash{} 1,921s 23,163s \n", + "Schedule-Free AdamW 10,338s 1,189s \\textemdash{} \n", + "Schedule-Free AdamW (JAX) \\textemdash{} 2,397s 12,875s \n", + "Schedule-Free AdamW (JAX v2) 8,205s 1,851s 15,452s \n", + "Schedule-Free AdamW v2 7,481s 1,129s \\textemdash{} \n", + "DiLoCo (Single Worker) \\textemdash{} 2,379s 28,315s \n", + "DiLoCo v2 (Single Worker) \\textemdash{} 2,578s 28,314s \n", + "\n", + " imagenet_resnet imagenet_vit \\\n", + "Submission \n", + "AdEMAMix \\textemdash{} \\textemdash{} \n", + "Cautious NAdamW \\textemdash{} \\textemdash{} \n", + "Lion \\textemdash{} \\textemdash{} \n", + "Muon (JAX) \\textemdash{} 77,163s \n", + "Muon (PyTorch) \\textemdash{} \\textemdash{} \n", + "NAdamW \\textemdash{} 72,016s \n", + "NAdamW (Baseline v0.5) \\textemdash{} \\textemdash{} \n", + "NAdamW (ResNet) \\textemdash{} \\textemdash{} \n", + "Schedule-Free AdamW \\textemdash{} \\textemdash{} \n", + "Schedule-Free AdamW (JAX) \\textemdash{} 87,469s \n", + "Schedule-Free AdamW (JAX v2) \\textemdash{} 84,892s \n", + "Schedule-Free AdamW v2 \\textemdash{} \\textemdash{} \n", + "DiLoCo (Single Worker) \\textemdash{} \\textemdash{} \n", + "DiLoCo v2 (Single Worker) \\textemdash{} \\textemdash{} \n", + "\n", + " librispeech_conformer librispeech_deepspeech \\\n", + "Submission \n", + "AdEMAMix 48,895s \\textemdash{} \n", + "Cautious NAdamW \\textemdash{} \\textemdash{} \n", + "Lion \\textemdash{} \\textemdash{} \n", + "Muon (JAX) \\textemdash{} \\textemdash{} \n", + "Muon (PyTorch) \\textemdash{} \\textemdash{} \n", + "NAdamW \\textemdash{} \\textemdash{} \n", + "NAdamW (Baseline v0.5) \\textemdash{} \\textemdash{} \n", + "NAdamW (ResNet) \\textemdash{} \\textemdash{} \n", + "Schedule-Free AdamW \\textemdash{} 40,463s \n", + "Schedule-Free AdamW (JAX) \\textemdash{} \\textemdash{} \n", + "Schedule-Free AdamW (JAX v2) \\textemdash{} \\textemdash{} \n", + "Schedule-Free AdamW v2 55,846s 41,911s \n", + "DiLoCo (Single Worker) \\textemdash{} \\textemdash{} \n", + "DiLoCo v2 (Single Worker) \\textemdash{} \\textemdash{} \n", + "\n", + " ogbg wmt \n", + "Submission \n", + "AdEMAMix 6,330s 17,400s \n", + "Cautious NAdamW 4,993s 14,232s \n", + "Lion 7,224s 15,476s \n", + "Muon (JAX) \\textemdash{} \\textemdash{} \n", + "Muon (PyTorch) 1,833s 14,215s \n", + "NAdamW \\textemdash{} \\textemdash{} \n", + "NAdamW (Baseline v0.5) 4,090s 14,866s \n", + "NAdamW (ResNet) 6,350s \\textemdash{} \n", + "Schedule-Free AdamW 3,640s 19,958s \n", + "Schedule-Free AdamW (JAX) 5,447s 16,161s \n", + "Schedule-Free AdamW (JAX v2) 5,444s \\textemdash{} \n", + "Schedule-Free AdamW v2 6,325s 10,325s \n", + "DiLoCo (Single Worker) \\textemdash{} \\textemdash{} \n", + "DiLoCo v2 (Single Worker) \\textemdash{} \\textemdash{} " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "LaTeX saved → /home/kasimbeg/submissions_algorithms/scoring_artifacts/time_to_target_table.tex\n" + ] + } + ], + "source": [ + "ttt = pd.read_csv(os.path.join(OUTPUT_DIR, 'time_to_targets.csv'), index_col=0)\n", + "\n", + "# Format: finite values as \"Xs\", inf as em-dash\n", + "def _fmt(v):\n", + " if pd.isna(v) or v == float('inf'):\n", + " return r'\\textemdash{}'\n", + " return f'{v:,.0f}s'\n", + "\n", + "ttt_display = ttt.map(_fmt)\n", + "ttt_display.index.name = 'Submission'\n", + "\n", + "print('--- Time to Target (seconds) ---')\n", + "display(ttt_display)\n", + "\n", + "# ── Workload column → LaTeX macro ─────────────────────────────────────────────\n", + "_WL_MACRO = {\n", + " 'criteo1tb': r'\\criteo',\n", + " 'fastmri': r'\\fastmri',\n", + " 'finewebedu_lm': r'\\finewebedu',\n", + " 'imagenet_resnet': r'\\resnet',\n", + " 'imagenet_vit': r'\\vit',\n", + " 'librispeech_conformer': r'\\conformer',\n", + " 'librispeech_deepspeech': r'\\deepspeech',\n", + " 'ogbg': r'\\ogbg',\n", + " 'wmt': r'\\wmt',\n", + "}\n", + "\n", + "workloads = list(ttt.columns)\n", + "col_spec = 'l' + 'r' * len(workloads)\n", + "wl_headers = ' & '.join(_WL_MACRO.get(w, w) for w in workloads)\n", + "\n", + "rows = []\n", + "for name, row in ttt_display.iterrows():\n", + " rows.append(' ' + name + ' & ' + ' & '.join(str(v) for v in row) + r' \\\\')\n", + "\n", + "latex = '\\n'.join([\n", + " r'\\begin{table}[htbp]',\n", + " r' \\centering',\n", + " r' \\caption{Time to target (seconds). \\textemdash{} = target not reached.}',\n", + " r' \\label{tab:time_to_target}',\n", + " r' \\resizebox{\\textwidth}{!}{%',\n", + " r' \\begin{tabular}{' + col_spec + '}',\n", + " r' \\toprule',\n", + " r' Submission & ' + wl_headers + r' \\\\',\n", + " r' \\midrule',\n", + " *rows,\n", + " r' \\bottomrule',\n", + " r' \\end{tabular}%',\n", + " r' }',\n", + " r'\\end{table}',\n", + "])\n", + "\n", + "ttt_latex_path = os.path.join(OUTPUT_DIR, 'time_to_target_table.tex')\n", + "with open(ttt_latex_path, 'w') as f:\n", + " f.write(latex)\n", + "print(f'\\nLaTeX saved → {ttt_latex_path}')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. LaTeX Tables\n", + "Generates a ready-to-paste LaTeX table of leaderboard scores, sorted best-first.\\\n", + "nRun after Section 6." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{table}[h]\n", + " \\centering\n", + " \\caption{AlgoPerf Self-Tuning Leaderboard}\n", + " \\label{tab:scores}\n", + " \\begin{tabular}{rlr}\n", + " \\toprule\n", + " Rank & Submission & Score \\\\\n", + " \\midrule\n", + " 1 & Schedule-Free AdamW v2 & \\textbf{0.6389} \\\\\n", + " 2 & AdEMAMix & 0.5840 \\\\\n", + " 3 & Schedule-Free AdamW & 0.5253 \\\\\n", + " 4 & NAdamW (Baseline v0.5) & 0.5069 \\\\\n", + " 5 & Schedule-Free AdamW (JAX v2) & 0.4956 \\\\\n", + " 6 & Muon (PyTorch) & 0.4760 \\\\\n", + " 7 & Schedule-Free AdamW (JAX) & 0.4621 \\\\\n", + " 8 & NAdamW & 0.4324 \\\\\n", + " 9 & Cautious NAdamW & 0.3535 \\\\\n", + " 10 & Muon (JAX) & 0.3201 \\\\\n", + " 11 & Lion & 0.3131 \\\\\n", + " 12 & NAdamW (ResNet) & 0.2090 \\\\\n", + " 13 & DiLoCo (Single Worker) & 0.1540 \\\\\n", + " 14 & DiLoCo v2 (Single Worker) & 0.1465 \\\\\n", + " \\bottomrule\n", + " \\end{tabular}\n", + "\\end{table}\n", + "\n", + "Saved to /home/kasimbeg/submissions_algorithms/scoring_artifacts/scores_table.tex\n" + ] + } + ], + "source": [ + "def scores_to_latex(scores_df, caption='AlgoPerf Self-Tuning Leaderboard', label='tab:scores'):\n", + " \"\"\"\n", + " Render a leaderboard scores DataFrame as a LaTeX table.\n", + " Submission names come from the DataFrame index (already pretty-named).\n", + " Scores are formatted to 4 decimal places; best score is bolded.\n", + " \"\"\"\n", + " df = scores_df.sort_values('score', ascending=False).copy()\n", + " df['rank'] = range(1, len(df) + 1)\n", + "\n", + " best_score = df['score'].iloc[0]\n", + "\n", + " rows = []\n", + " for rank, (name, row) in enumerate(df.iterrows(), start=1):\n", + " score_str = f'{row[\"score\"]:.4f}'\n", + " if row['score'] == best_score:\n", + " score_str = r'\\textbf{' + score_str + '}'\n", + " rows.append(f' {rank} & {name} & {score_str} \\\\\\\\')\n", + "\n", + " body = '\\n'.join(rows)\n", + "\n", + " latex = (\n", + " r'\\begin{table}[h]' + '\\n'\n", + " r' \\centering' + '\\n'\n", + " r' \\caption{' + caption + '}\\n'\n", + " r' \\label{' + label + '}\\n'\n", + " r' \\begin{tabular}{rlr}' + '\\n'\n", + " r' \\toprule' + '\\n'\n", + " r' Rank & Submission & Score \\\\' + '\\n'\n", + " r' \\midrule' + '\\n'\n", + " + body + '\\n'\n", + " r' \\bottomrule' + '\\n'\n", + " r' \\end{tabular}' + '\\n'\n", + " r'\\end{table}'\n", + " )\n", + " return latex\n", + "\n", + "\n", + "latex_table = scores_to_latex(scores)\n", + "print(latex_table)\n", + "\n", + "latex_path = os.path.join(OUTPUT_DIR, 'scores_table.tex')\n", + "with open(latex_path, 'w') as f:\n", + " f.write(latex_table)\n", + "print(f'\\nSaved to {latex_path}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. (Optional) Reload and Replot from Saved CSVs\n", + "\n", + "If you already have a `performance_profile_score.csv` saved, you can reload and replot without re-running the full pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved → /home/kasimbeg/submissions_algorithms/scoring_artifacts/performance_profile_by_score.pdf / .png\n" + ] + }, + { + "data": { + "image/png": "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AMCqVatQVVXV6DbXrVuHCy64AH5+fggMDMSoUaPwwQcf4Ndff7Wa4+0f//iH1XGKomDVqlUYP348QkJC4OPjg65du+Luu+9WR7g0huViGABs5hf99ddfcc011yAiIgJGoxHR0dG47rrrsH37dqv9zpw5YxV7586dUVVVhWeeeQZ9+vSBj4+P1QW8JElSR/umpqY6/SIbiqLY7c/5PvvsMzz33HN2txUWFmLhwoXo378/fH191Tn3nnnmGRQXFzsci+V5tYxu27p1q0MXNLvwwguxdu1ah+/HYu3atbjwwgtx8cUX1/m4JiQkWG277bbbrNro3r27TYxr167F0KFD4evri5CQEFx77bU4efKk1XHnz114/oirxrZb265du3DllVciJCQEJpMJffr0waJFi1BWVmbVdnBwsObHrj6SJKnFjtLSUnX92rVr630shw0bZrW9MTIyMhAfH4+ePXvCx8cHQUFBGDVqFF5//XVUVlba7C/LMt5//32MHTsWkZGR6vykN910Ez799FOr+C20vN4t86FadOnSpcl9rEvtkaLn5/Nnn32GSy65BKGhofD29kanTp0wY8YMJCQkWO23bds2q/gmTJiA4uJizJ07F127doXRaFRfr1ryVct7spb3SHvxFhYW4v7770f79u3h7++PCy64AF999ZXa/sqVKxEXFwcfHx/ExsbiqaeegizLNo9nRUUFNm7ciJtvvhl9+vSBv78//P39MWTIEDz//POoqKiwOcYZeZuVlYVHH30Uffr0Uee37t27N2677TZs2rTJbqxJSUm466670LlzZ3h7eyM0NFQdLS6cOLdxbee/3rQ8b7VlZmZi7ty56N27N0wmEwIDA3HBBRdg2bJlNo+xZf7s22+/HUD1nNTn55MzLoSp9fEsLy/Ha6+9huHDhyMsLAze3t7o0aMH7rjjDnz77bdN+hxERET1cPH0A0RERE5hNptFTEyMePHFF4UQQhw+fFidj+3TTz+t87j65lSNj48XAMTAgQPF5s2bRWpqqtiyZYsYM2aMmDRpktXcp+fOnVOPKy8vF5dddpkAIG699Vaxd+9ekZycLD788EPRvn174e/vL3744Qe78SxYsEAAEOPHj7e7vaKiQuj1egFATJ8+XV3/9NNPCwBiyJAh4vvvvxfHjx8XX3zxhejVq5eQJEm8/vrr6r6yLFvN99mpUyfx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MG/ePKuzX4iIyDk4pyoREbVqK1aswFVXXYWBAweie/fudv9mzpwJAPjpp5+sCnJ1MRgMGDt2LABg165ddvc5cuSI3fWTJk2C0WiELMvYvXu33X127twJAJgyZUqDsTQkKioKgwYNAgDs2LHD7j5VVVW48MILGxw95yqHDx/GokWL1CkX6mI5tbj2qZqWx3Dfvn11nga7atUqDB48GCkpKc4JuBnVN7fi8ePHWziaxpswYQIA7fnjLA888AACAgJw6NAhfPrppzbbm+NxtrwW68pDAHj22WcxYsQIFBcXAwCOHj2K2267zeq1r9PpcNlll+G9994DAHX+1dr30ZjXu71RexkZGSgpKXGgd40zdOhQ9RTsuh6XnJwcDBkyBK+99lqzxNDS78nOoihKvdsbmku1MSz9tzwe5ysvL8dll12Gl19+2eaY+l739957LyZPntzkUeDO1lB/T58+jbS0NKt9WyomLY/ntm3bcN9991nt4+XlhX/+85/qc1X7fYSIiJyHRVUiImq10tPT8c033+D222+vd78bb7wRPj4+mi5YFR8fD6B6fsTzR66VlpbW2U54eDj+/e9/AwBeeeUVm+379u3Dr7/+isDAQPU+msoycnL58uUoKiqy2b58+XJs27YNkyZNcsr91WXOnDno0qUL1qxZo/nYiooKvP3223Vu379/Pw4ePAhfX19cfvnl6vqrrroKQ4YMQWFhIZYvX25zXH5+Pp5++mmYTCZ07txZc1wtbciQIQBgU/wpKirChg0bXBFSo9x5550IDAzE33//jR9//NFm+7Jly5r1/kNCQnDvvfcCqM6P8wtUlsd53759NqNVV65c2aj7vOOOO9CxY0ccO3YMX375pc321NRUvPzyy+jevbs6H2pGRgbef/99uxeVskxdUvt125TXu6WQbCminjt3Du3bt8f777/fmO46xGAwYP78+QCAJUuWqH2q7bnnnsPBgwdxySWXNEsMrnhPdobw8HB06dIFAPDVV1/ZbP/oo4+cfp+W1/CJEyfw9ddf22x///338f3331vNjxsfH4/AwED89NNP2Ldvn80xe/fuxYoVKzB8+HC3Ox3f0t+kpCS7OWt5vUydOlW9MFhza8zjeeLECbz55ps4ceKEzf723keIiMh5WFQlIqJWR5ZlZGRkYPny5QgMDMSgQYNQUFBgd9+ysjKUlZXh4osv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Pfj4+OCLL76w2Wa5yNKdd97ZwlERERERETkHi6pERET1ePzxxyHLMi699FIEBgbi6NGjePrpp5GUlIQVK1bwirpE9fjyyy9x991344477kBUVBTS09Pxzjvv4IMPPsCtt96Kf/3rX64OkYiIiIioUTinKhERUR2++eYbfPHFF/jzzz+Rnp6OgoIChIWFYcyYMXj44YcxcuRIV4dI5Lb279+Pjz/+GFu2bMGZM2eQnZ0Nf39/DBo0CHfeeScLqkRERETUqrGoSkRERERERERERKQBL1RFREREREREREREpAGLqkREREREREREREQasKhKREREREREREREpAGLqkREREREREREREQasKhKREREREREREREpAGLqkREREREREREREQasKhKREREREREREREpAGLqkREREREREREREQaGBp7YHl5OVJTU1FYWAiz2Qx/f39ERkYiIiLCmfFRPa6++moAwKZNm1wcCRERERERERERUduhqai6d+9evP/++/jhhx+QlJQEIYTNPkFBQbjwwgtx7bXX4qabboLRaHRasGQtKSkJiqJAURTodBx0TNQQRVFQUlICPz8/5gyRA5gzRNowZ4gcx3wh0oY5Q6RNS9TKHGo9NTUVl19+OUaMGIE33ngDx48fh6IoEELY/OXn5+Orr77CzJkz0blzZ3z00UfN2oG2zvK4E1HDhBAoKytjzhA5iDlDpA1zhshxzBcibZgzRNq0RK5IooF7+fPPP3HFFVcgPz8fU6ZMwaWXXoqBAweiU6dOCAsLg4+PD/R6PSoqKlBQUICMjAwcOXIE27Ztw8aNG5GVlYUHH3wQr7zySrN3pq2Ji4sDACQmJro4EiIiIiIiIiIioraj3qLqqVOnMHToUAwZMgQvv/wy+vfvr6nx0tJSLF26FM8++yyeeeYZxMfHNzlgqmEpqiYkJECSJBdHQ+T+hBCQZRl6vZ45Q+QA5gyRNswZIscxX4i0Yc4QaSOEaPZcqbeo+o9//AMGgwEbNmxoUiBff/01brrpJiQmJqJTp06NboesxcXFwWw2IzExEQZDo685RtRmmM1m5OTkICwsjDlD5ADmDJE2zBkixzFfiLRhzhBpYzabmz1X6mxdCIH4+HiMGjWqyZXdK6+8Ejt37oSXl1eT2iEiIiIiIiIiIiJytTqLqpIkYdy4cU67I8up6kRERERERERERESt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LTYiIqKWormoOnLkSDz55JNIT08HAEyePBlvvvkmZs+ejc8//xyff/45Zs6ciVdffRUXXui6XyBfffVV9OrVCwsXLsTHH3+MsrIypKen47777sPevXtx11134cYbb1T3nzJlCh544AFs2LABixcvRkFBAdLS0nD77bfj77//xptvvonY2Lq/ZKampuI///kPFixYgG7dulltu/fee+Hr64sHH3wQubm52LJlC9atW4c5c+bYnfOViMjVDidnQ6k1tcvg7rbzSZPn2JeTgcKqCnV5UgyLqq6iKIrNfKpERO4kPa8Emedqpkwb3L3hH16Ldv+m3vbrNxQ6H34HIiKi1k9zUfW6667DoUOH1IJpfHw8wsLC8O6772LatGmYNm0aVq9eDS8vLyxYsMDpATsqPDwcf/75J+655x48+eSTCA4ORp8+fZCYmIiPPvrIZkQqUF2IXbNmDb755htER0ejT58+yMzMxE8//YSZM2fWe3/33HMPunfvjocffthmW3R0NH744QekpqYiOjoa//znPzF79mw8++yzTe5nfZPzEpE1nU4HPz8/5owDap/WFxnih/ah9c8nTa1b7VP/A728MTSs+gKOzJmWV1RUZHXVVJ7637owZ6gt2H8iU72tkyT07xJe7/5KeSlKDu9RlwOGj6s+lvlCpAlzhkiblsgV+5fRqscll1yC9PR0dY7QsLAwbNu2DfHx8fj111+hKAouuOACPPfccxg0aJCz49UkKCgIL7zwAl544QWHj7nllltwyy23aL6vb7/9tt7tY8aMsTtfa1N5clFVzj0HUVQMfcdoSHVcDY5IC51O57JpSVoTIYTNaX3k2X5JqymqjmvfAYb//V9hzrS82qf+GwwGPv6tDHOG2oKDJ7PV2z1iQuDnU/8UJcUH/oSoqrmAcMDw6sE5zBcibZgzRNq4ZVFVkiRERlqfBtq9e3ds2rTJaUGR4xRFgaIoHllYrdy5DxW//AHJ5AOvgX3ge/2Vrg6JWjlFUVBSUsJfeBtwNqcYuYVl6jKLqp4tt7wMB3NrviBfFNNZvc2caXm1L1IVEhLCx72VYc6QpzPLChJSai5G7Mj0QEV7auZT9QqLhE/nngCYL0RaMWeItGmJWpnmoiq5F08uqpqPJgEARFk5RHlFA3sTNczyQcRkMnlkzjhL7VGqep0O/TqHuTAaam6/pp2CQM38uROj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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2935401/3734530332.py:74: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " scores = np.trapz(df, x=df.columns)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
score
submission
Schedule-Free AdamW v20.638889
AdEMAMix0.583965
Schedule-Free AdamW0.525253
NAdamW (Baseline v0.5)0.506944
Schedule-Free AdamW (JAX v2)0.495581
Muon (PyTorch)0.476010
Schedule-Free AdamW (JAX)0.462121
NAdamW0.432449
Cautious NAdamW0.353535
Muon (JAX)0.320076
Lion0.313131
NAdamW (ResNet)0.208965
DiLoCo (Single Worker)0.154040
DiLoCo v2 (Single Worker)0.146465
\n", + "
" + ], + "text/plain": [ + " score\n", + "submission \n", + "Schedule-Free AdamW v2 0.638889\n", + "AdEMAMix 0.583965\n", + "Schedule-Free AdamW 0.525253\n", + "NAdamW (Baseline v0.5) 0.506944\n", + "Schedule-Free AdamW (JAX v2) 0.495581\n", + "Muon (PyTorch) 0.476010\n", + "Schedule-Free AdamW (JAX) 0.462121\n", + "NAdamW 0.432449\n", + "Cautious NAdamW 0.353535\n", + "Muon (JAX) 0.320076\n", + "Lion 0.313131\n", + "NAdamW (ResNet) 0.208965\n", + "DiLoCo (Single Worker) 0.154040\n", + "DiLoCo v2 (Single Worker) 0.146465" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "csv_file = os.path.join(OUTPUT_DIR, 'performance_profile_score.csv')\n", + "\n", + "if os.path.exists(csv_file):\n", + " reloaded_df = pd.read_csv(csv_file, index_col=0)\n", + " reloaded_df.columns = reloaded_df.columns.astype(float)\n", + " fig, ax = plot_performance_profiles_styled(\n", + " reloaded_df,\n", + " 'score',\n", + " save_dir=OUTPUT_DIR,\n", + " title='AlgoPerf: Self-Tuning Ruleset Performance Profiles',\n", + " )\n", + " plt.show()\n", + " display(compute_leaderboard_score(reloaded_df).sort_values('score', ascending=False))\n", + "else:\n", + " print(f'No saved profile found at {csv_file}. Run Section 6 first.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Step-Based Scoring: Step vs. Wall-Clock Efficiency\n", + "\n", + "Re-scores every submission with the identical performance-profile machinery,\n", + "but using `global_step` (optimizer steps to target) as the time column instead\n", + "of wall-clock seconds. Same workload config, same $\\tau$ range, same\n", + "denominator. Artifacts are written with a `_steps` suffix, plus:\n", + "\n", + "- `steps_to_target_table.tex` — per-workload median steps to target\n", + "- `leaderboard_steps_table.tex` — wall-clock vs. step-based scores and ranks\n", + "- `wallclock_vs_steps.{pdf,png}` — scatter of the two benchmark scores\n", + "\n", + "Caveat: submissions choose their own batch sizes, so step counts compare\n", + "optimizer updates, not examples seen; steps are not sample-normalized.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ── Step-based performance profiles and leaderboard scores ────────────────────\n", + "performance_profile_steps_df = performance_profile.compute_performance_profiles(\n", + " results,\n", + " WORKLOAD_CONFIG,\n", + " time_col='global_step',\n", + " min_tau=MIN_TAU,\n", + " max_tau=MAX_TAU,\n", + " reference_submission_tag=None,\n", + " num_points=NUM_POINTS,\n", + " scale=SCALE,\n", + " verbosity=0,\n", + " self_tuning_ruleset=SELF_TUNING_RULESET,\n", + " strict=STRICT,\n", + " output_dir=OUTPUT_DIR, # writes time_to_targets_steps.csv\n", + " artifact_suffix='_steps',\n", + ")\n", + "performance_profile_steps_df.to_csv(\n", + " os.path.join(OUTPUT_DIR, 'performance_profile_global_step.csv')\n", + ")\n", + "\n", + "fig, ax = plot_performance_profiles_styled(\n", + " performance_profile_steps_df,\n", + " 'global_step',\n", + " scale=SCALE,\n", + " save_dir=OUTPUT_DIR,\n", + " title='AlgoPerf: Self-Tuning Performance Profiles (steps to target)',\n", + ")\n", + "plt.show()\n", + "\n", + "scores_steps = compute_leaderboard_score(performance_profile_steps_df)\n", + "scores_steps.to_csv(os.path.join(OUTPUT_DIR, 'scores_steps.csv'))\n", + "print('--- Step-based Leaderboard Scores ---')\n", + "display(scores_steps.sort_values('score', ascending=False))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ── Steps-to-target table (analog of the time-to-target table) ────────────────\n", + "stt = pd.read_csv(os.path.join(OUTPUT_DIR, 'time_to_targets_steps.csv'), index_col=0)\n", + "\n", + "def _fmt_steps(v):\n", + " if pd.isna(v) or v == float('inf'):\n", + " return r'\\textemdash{}'\n", + " return f'{v:,.0f}'\n", + "\n", + "stt_display = stt.map(_fmt_steps)\n", + "stt_display.index.name = 'Submission'\n", + "display(stt_display)\n", + "\n", + "_stt_workloads = list(stt.columns)\n", + "_stt_col_spec = 'l' + 'r' * len(_stt_workloads)\n", + "_stt_headers = ' & '.join(_WL_MACRO.get(w, w) for w in _stt_workloads)\n", + "\n", + "_stt_rows = []\n", + "for name, row in stt_display.iterrows():\n", + " _stt_rows.append(' ' + name + ' & ' + ' & '.join(str(v) for v in row) + r' \\\\')\n", + "\n", + "stt_latex = '\\n'.join([\n", + " r'\\begin{table}[htbp]',\n", + " r' \\centering',\n", + " r' \\caption{Median number of optimizer steps to reach the validation target.'\n", + " r' \\textemdash{} = target not reached. Submissions choose their own batch'\n", + " r' sizes, so step counts compare optimizer updates, not examples seen.}',\n", + " r' \\label{tab:steps_to_target}',\n", + " r' \\resizebox{\\textwidth}{!}{%',\n", + " r' \\begin{tabular}{' + _stt_col_spec + '}',\n", + " r' \\toprule',\n", + " r' Submission & ' + _stt_headers + r' \\\\',\n", + " r' \\midrule',\n", + " *_stt_rows,\n", + " r' \\bottomrule',\n", + " r' \\end{tabular}%',\n", + " r' }',\n", + " r'\\end{table}',\n", + "])\n", + "\n", + "with open(os.path.join(OUTPUT_DIR, 'steps_to_target_table.tex'), 'w') as f:\n", + " f.write(stt_latex)\n", + "print('LaTeX saved -> steps_to_target_table.tex')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ── Scatter: wall-clock score vs. step-based score ────────────────────────────\n", + "# One marker per algorithm family, validated colorblind-safe colors cycling\n", + "# within each family; dark marker edges keep light fills legible on white.\n", + "# Print-true sizing: the paper includes this at \\textwidth = 6.5in, square\n", + "# plot left, family-grouped legend right, real paper point sizes throughout.\n", + "_SC_COLORS = ['#3D6FC4', '#EE6677', '#228833', '#AA3377',\n", + " '#EE7733', '#009988', '#CC3311']\n", + "\n", + "# One marker per algorithm family, colors cycling within the family; legend\n", + "# entries are grouped so family members sit next to each other.\n", + "_FAMILIES = [\n", + " ('o', ['Schedule-Free AdamW v2', 'Schedule-Free AdamW',\n", + " 'Schedule-Free AdamW (JAX)', 'Schedule-Free AdamW (JAX v2)']),\n", + " ('s', ['NAdamW', 'NAdamW (Baseline v0.5)', 'NAdamW (ResNet)',\n", + " 'Cautious NAdamW']),\n", + " ('D', ['Muon (PyTorch)', 'Muon (JAX)']),\n", + " ('^', ['DiLoCo (Single Worker)', 'DiLoCo v2 (Single Worker)']),\n", + " ('P', ['AdEMAMix']),\n", + " ('X', ['Lion']),\n", + "]\n", + "\n", + "# Print-true sizing: included at \\textwidth = 6.5in; square plot on the left,\n", + "# grouped legend on the right; real paper point sizes throughout.\n", + "fig, ax = plt.subplots(figsize=(6.5, 3.8))\n", + "\n", + "lims = (0.10, 0.60)\n", + "ax.plot(lims, lims, linestyle='--', color='#999999', linewidth=0.9, zorder=1)\n", + "ax.text(0.125, 0.585, 'wall-clock advantage',\n", + " ha='left', va='top', fontsize=7.5, style='italic', color='#777777')\n", + "ax.text(0.585, 0.125, 'step advantage',\n", + " ha='right', va='bottom', fontsize=7.5, style='italic', color='#777777')\n", + "\n", + "for marker, members in _FAMILIES:\n", + " for j, name in enumerate(members):\n", + " row = cmp.loc[name]\n", + " ax.scatter(\n", + " row.steps, row.wallclock,\n", + " color=_SC_COLORS[(4 if marker in 'PX' else j) % len(_SC_COLORS)],\n", + " marker=marker, s=42, linewidths=0.5, edgecolors='#333333',\n", + " zorder=3, label=name,\n", + " )\n", + "\n", + "_annotate = {\n", + " 'Schedule-Free AdamW v2': (-7, -4, 'right'),\n", + " 'AdEMAMix': (-8, -6, 'right'),\n", + " 'Muon (JAX)': (7, -3, 'left'),\n", + " 'DiLoCo (Single Worker)': (-4, 8, 'left'),\n", + "}\n", + "for name, (dx, dy, ha) in _annotate.items():\n", + " row = cmp.loc[name]\n", + " label = 'DiLoCo v1/v2' if name.startswith('DiLoCo') else name\n", + " ax.annotate(label, (row.steps, row.wallclock), xytext=(dx, dy),\n", + " textcoords='offset points', fontsize=7.5, ha=ha,\n", + " color='#333333')\n", + "\n", + "ax.set_xlim(lims)\n", + "ax.set_ylim(lims)\n", + "ax.set_aspect('equal')\n", + "ax.tick_params(labelsize=9)\n", + "ax.set_xlabel('Step-based benchmark score', fontsize=10)\n", + "ax.set_ylabel('Wall-clock benchmark score', fontsize=10)\n", + "\n", + "ax.legend(\n", + " loc='center left', bbox_to_anchor=(1.04, 0.5), ncol=1, fontsize=8,\n", + " borderaxespad=0, frameon=True, framealpha=0.92, edgecolor='#cccccc',\n", + " handlelength=1.0, columnspacing=1.0, labelspacing=0.45, borderpad=0.6,\n", + ")\n", + "fig.subplots_adjust(left=0.08, right=0.66, top=0.97, bottom=0.13)\n", + "\n", + "for ext in ('pdf', 'png'):\n", + " fig.savefig(os.path.join(OUTPUT_DIR, f'wallclock_vs_steps.{ext}'), format=ext, dpi=300)\n", + "print('Saved -> wallclock_vs_steps.pdf / .png')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ── Scatter: wall-clock score vs. step-based score ────────────────────────────\n", + "# 7 colorblind-safe colors x 2 marker shapes = 14 distinct (color, marker)\n", + "# identities; dark marker edges keep light fills legible on white.\n", + "_SC_COLORS = ['#3D6FC4', '#EE6677', '#228833', '#AA3377',\n", + " '#EE7733', '#009988', '#CC3311']\n", + "_SC_MARKERS = ['o', 's']\n", + "\n", + "fig, ax = plt.subplots(figsize=(7.0, 7.6))\n", + "\n", + "lims = (0.10, 0.60)\n", + "ax.plot(lims, lims, linestyle='--', color='#999999', linewidth=1.0, zorder=1)\n", + "ax.text(0.135, 0.575, 'wall-clock advantage\\n(cheap, fast steps)',\n", + " ha='left', va='top', fontsize=8.5, style='italic', color='#777777')\n", + "ax.text(0.575, 0.135, 'step advantage\\n(expensive steps)',\n", + " ha='right', va='bottom', fontsize=8.5, style='italic', color='#777777')\n", + "\n", + "for i, (name, row) in enumerate(cmp.iterrows()):\n", + " ax.scatter(\n", + " row.steps, row.wallclock,\n", + " color=_SC_COLORS[i % len(_SC_COLORS)],\n", + " marker=_SC_MARKERS[i // len(_SC_COLORS)],\n", + " s=58, linewidths=0.6, edgecolors='#333333', zorder=3, label=name,\n", + " )\n", + "\n", + "_annotate = {\n", + " 'Schedule-Free AdamW v2': (-8, 2, 'right'),\n", + " 'AdEMAMix': (8, 3, 'left'),\n", + " 'Muon (JAX)': (8, -3, 'left'),\n", + " 'NAdamW': (8, 1, 'left'),\n", + " 'DiLoCo (Single Worker)': (-2, 9, 'left'),\n", + " 'DiLoCo v2 (Single Worker)': (5, -12, 'left'),\n", + "}\n", + "for name, (dx, dy, ha) in _annotate.items():\n", + " row = cmp.loc[name]\n", + " ax.annotate(name, (row.steps, row.wallclock), xytext=(dx, dy),\n", + " textcoords='offset points', fontsize=8, ha=ha,\n", + " color='#333333')\n", + "\n", + "ax.set_xlim(lims)\n", + "ax.set_ylim(lims)\n", + "ax.set_aspect('equal')\n", + "ax.set_xlabel('Step-based benchmark score')\n", + "ax.set_ylabel('Wall-clock benchmark score')\n", + "ax.set_title('Wall-clock vs. step-based benchmark scores', pad=8)\n", + "\n", + "n = len(cmp)\n", + "ncol = 3\n", + "ax.legend(\n", + " loc='upper center', bbox_to_anchor=(0.5, -0.11), ncol=ncol,\n", + " borderaxespad=0, frameon=True, handlelength=1.0, columnspacing=0.9,\n", + " labelspacing=0.35,\n", + ")\n", + "fig.subplots_adjust(left=0.10, right=0.97, top=0.94, bottom=0.24)\n", + "\n", + "for ext in ('pdf', 'png'):\n", + " fig.savefig(os.path.join(OUTPUT_DIR, f'wallclock_vs_steps.{ext}'),\n", + " format=ext, dpi=300)\n", + "print('Saved -> wallclock_vs_steps.pdf / .png')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 9. Framework Comparison: JAX vs. PyTorch\n", + "\n", + "Three algorithms have implementations in both frameworks (Schedule-Free AdamW\n", + "v1/v2 and Muon). Each pair runs the same algorithm with the same batch sizes on\n", + "nearly every workload, so differences between the two versions measure the\n", + "frameworks rather than the optimizers. Emits `framework_comparison.{pdf,png}`:\n", + "(a) per-example step time ratio, (b) time-to-target ratio / which framework\n", + "reaches each target.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ── JAX vs PyTorch: paired-algorithm framework comparison ────────────────────\n", + "import re\n", + "from matplotlib.colors import LinearSegmentedColormap, TwoSlopeNorm\n", + "\n", + "WORKLOADS = ['criteo1tb', 'fastmri', 'finewebedu_lm', 'imagenet_resnet',\n", + " 'imagenet_vit', 'librispeech_conformer', 'librispeech_deepspeech',\n", + " 'ogbg', 'wmt']\n", + "WL_SHORT = ['Criteo', 'fastMRI', 'FineWeb', 'ResNet', 'ViT', 'Conformer',\n", + " 'DeepSpeech', 'OGBG', 'WMT']\n", + "\n", + "# (row label, pytorch submission, jax submission)\n", + "PAIRS = [\n", + " ('Schedule-Free AdamW', 'Schedule-Free AdamW', 'Schedule-Free AdamW (JAX)'),\n", + " ('Schedule-Free AdamW v2', 'Schedule-Free AdamW v2', 'Schedule-Free AdamW (JAX v2)'),\n", + " ('Muon', 'Muon (PyTorch)', 'Muon (JAX)'),\n", + "]\n", + "\n", + "# Training batch sizes from each submission's get_batch_size().\n", + "BATCH_PT_SFA = {'criteo1tb': 262144, 'fastmri': 16, 'finewebedu_lm': 64,\n", + " 'imagenet_resnet': 1024, 'imagenet_vit': 1024,\n", + " 'librispeech_conformer': 224, 'librispeech_deepspeech': 128,\n", + " 'ogbg': 512, 'wmt': 128}\n", + "BATCH_JAX_SFA = {**BATCH_PT_SFA, 'fastmri': 32, 'finewebedu_lm': 32,\n", + " 'librispeech_conformer': 256}\n", + "BATCH_MUON = {'criteo1tb': 262144, 'fastmri': 32, 'finewebedu_lm': 64,\n", + " 'imagenet_resnet': 1024, 'imagenet_vit': 1024,\n", + " 'librispeech_conformer': 256, 'librispeech_deepspeech': 256,\n", + " 'ogbg': 512, 'wmt': 128}\n", + "BATCHES = {\n", + " 'Schedule-Free AdamW': (BATCH_PT_SFA, BATCH_JAX_SFA),\n", + " 'Schedule-Free AdamW v2': (BATCH_PT_SFA, BATCH_JAX_SFA),\n", + " 'Muon': (BATCH_MUON, BATCH_MUON),\n", + "}\n", + "\n", + "ttt_fw = pd.read_csv(os.path.join(OUTPUT_DIR, 'time_to_targets.csv'), index_col=0)\n", + "\n", + "\n", + "def step_times(sub):\n", + " \"\"\"Median seconds per step, per base workload.\"\"\"\n", + " df = results[sub]\n", + " out = {}\n", + " for workload, group in df.groupby('workload'):\n", + " base = re.sub(r'_(jax|pytorch)$', '', workload)\n", + " ratios = []\n", + " for _, trial in group.iterrows():\n", + " t = np.diff(np.asarray(trial['accumulated_submission_time']), prepend=0)\n", + " s = np.diff(np.asarray(trial['global_step']), prepend=0)\n", + " with np.errstate(divide='ignore', invalid='ignore'):\n", + " ratios.append(np.nanmedian(t / s))\n", + " out[base] = float(np.median(ratios))\n", + " return out\n", + "\n", + "step_ratio = np.full((len(PAIRS), len(WORKLOADS)), np.nan)\n", + "tt_ratio = np.full_like(step_ratio, np.nan)\n", + "tt_state = np.empty_like(step_ratio, dtype=object) # both/pt/jax/none\n", + "\n", + "for i, (label, pt, jx) in enumerate(PAIRS):\n", + " st_pt, st_jx = step_times(pt), step_times(jx)\n", + " b_pt, b_jx = BATCHES[label]\n", + " for j, w in enumerate(WORKLOADS):\n", + " per_ex_pt = st_pt[w] / b_pt[w]\n", + " per_ex_jx = st_jx[w] / b_jx[w]\n", + " step_ratio[i, j] = per_ex_jx / per_ex_pt\n", + " t_pt, t_jx = ttt_fw.loc[pt, w], ttt_fw.loc[jx, w]\n", + " if np.isfinite(t_pt) and np.isfinite(t_jx):\n", + " tt_state[i, j] = 'both'\n", + " tt_ratio[i, j] = t_jx / t_pt\n", + " elif np.isfinite(t_pt):\n", + " tt_state[i, j] = 'pt'\n", + " elif np.isfinite(t_jx):\n", + " tt_state[i, j] = 'jax'\n", + " else:\n", + " tt_state[i, j] = 'none'\n", + "\n", + "print('per-example step-time ratio (JAX/PT):')\n", + "print(pd.DataFrame(step_ratio, index=[p[0] for p in PAIRS], columns=WL_SHORT).round(2))\n", + "print('time-to-target state:')\n", + "print(pd.DataFrame(tt_state, index=[p[0] for p in PAIRS], columns=WL_SHORT))\n", + "print(pd.DataFrame(tt_ratio, index=[p[0] for p in PAIRS], columns=WL_SHORT).round(2))\n", + "\n", + "# ── Figure: two aligned heatmaps, print-true at \\textwidth = 6.5in ────────────\n", + "JAX_C, PT_C, MID_C = '#3D6FC4', '#CC3311', '#f7f7f7'\n", + "cmap = LinearSegmentedColormap.from_list('fw', [JAX_C, MID_C, PT_C])\n", + "norm = TwoSlopeNorm(vmin=-2.5, vcenter=0.0, vmax=2.5)\n", + "\n", + "fig, axes = plt.subplots(2, 1, figsize=(6.5, 3.5), sharex=True)\n", + "\n", + "\n", + "def draw(ax, mat, states=None, title=''):\n", + " log = np.log2(mat)\n", + " disp = np.where(np.isnan(log), 0.0, log)\n", + " masked = np.ma.masked_invalid(log)\n", + " ax.imshow(masked, cmap=cmap, norm=norm, aspect='auto')\n", + " for i in range(mat.shape[0]):\n", + " for j in range(mat.shape[1]):\n", + " if states is not None and states[i, j] != 'both':\n", + " s = states[i, j]\n", + " if s == 'pt':\n", + " ax.add_patch(plt.Rectangle((j - .5, i - .5), 1, 1,\n", + " color=PT_C, alpha=0.25, lw=0))\n", + " ax.text(j, i, 'PT', ha='center', va='center', fontsize=8,\n", + " color='#7a1f0a', fontweight='bold')\n", + " elif s == 'jax':\n", + " ax.add_patch(plt.Rectangle((j - .5, i - .5), 1, 1,\n", + " color=JAX_C, alpha=0.25, lw=0))\n", + " ax.text(j, i, 'JAX', ha='center', va='center', fontsize=8,\n", + " color='#1d3d75', fontweight='bold')\n", + " else:\n", + " ax.text(j, i, '—', ha='center', va='center', fontsize=8,\n", + " color='#999999')\n", + " continue\n", + " v = mat[i, j]\n", + " ax.text(j, i, f'{v:.2f}' if v < 10 else f'{v:.0f}',\n", + " ha='center', va='center', fontsize=8,\n", + " color='white' if abs(np.log2(v)) > 1.6 else '#333333')\n", + " ax.set_yticks(range(mat.shape[0]))\n", + " ax.set_yticklabels([p[0] for p in PAIRS], fontsize=8.5)\n", + " ax.set_xticks(range(len(WL_SHORT)))\n", + " ax.set_title(title, fontsize=9, loc='left', pad=4)\n", + " ax.tick_params(length=0)\n", + " for spine in ax.spines.values():\n", + " spine.set_visible(False)\n", + " for j in range(mat.shape[1] + 1):\n", + " ax.axvline(j - .5, color='white', lw=1.6)\n", + " for i in range(mat.shape[0] + 1):\n", + " ax.axhline(i - .5, color='white', lw=1.6)\n", + "\n", + "\n", + "draw(axes[0], step_ratio,\n", + " title='(a) Per-example step time, JAX ÷ PyTorch')\n", + "draw(axes[1], tt_ratio, states=tt_state,\n", + " title='(b) Time to target, JAX ÷ PyTorch')\n", + "axes[1].set_xticklabels(WL_SHORT, fontsize=8.5, rotation=28, ha='right', rotation_mode='anchor')\n", + "\n", + "cbar = fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap), ax=axes,\n", + " fraction=0.035, pad=0.03, ticks=[-2, -1, 0, 1, 2])\n", + "cbar.ax.set_yticklabels([r'$4\\times$ JAX faster', r'$2\\times$', 'parity',\n", + " r'$2\\times$', r'$4\\times$ PyTorch faster'], fontsize=8)\n", + "cbar.outline.set_visible(False)\n", + "\n", + "OUT = OUTPUT_DIR\n", + "for ext in ('pdf', 'png'):\n", + " fig.savefig(os.path.join(OUT, f'framework_comparison.{ext}'), format=ext, dpi=300)\n", + "print('Saved -> framework_comparison.pdf / .png')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "algoperf", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.15" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/scoring/config.py b/scoring/config.py index 4fbb23f2..4eeeb60d 100644 --- a/scoring/config.py +++ b/scoring/config.py @@ -3,7 +3,7 @@ import json import os import re -from dataclasses import dataclass +from dataclasses import dataclass, replace # Strips the framework suffix from a logged workload name, e.g. # 'imagenet_resnet_jax' -> 'imagenet_resnet'. @@ -21,9 +21,32 @@ class WorkloadTarget: """Scoring constants for a single workload.""" target_metric_name: str + target_metric_goal: str validation_target_value: float step_hint: int + def __post_init__(self): + if self.target_metric_goal not in ('minimize', 'maximize'): + raise ValueError( + 'Target metric goal must be "minimize" or "maximize"; ' + f'got {self.target_metric_goal!r}.' + ) + + @property + def is_minimized(self) -> bool: + return self.target_metric_goal == 'minimize' + + def relaxed(self, fraction: float) -> 'WorkloadTarget': + """Return this target relaxed by a relative fraction.""" + if not 0 <= fraction < 1: + raise ValueError(f'Target relaxation must be in [0, 1); got {fraction}.') + direction = 1 if self.is_minimized else -1 + return replace( + self, + validation_target_value=self.validation_target_value + * (1 + direction * fraction), + ) + @dataclass(frozen=True) class WorkloadConfig: @@ -32,7 +55,7 @@ class WorkloadConfig: A `WorkloadConfig` describes one benchmark version's scoring inputs: which workloads count toward the score (`base_workloads`), which held-out variants were sampled (`held_out_workloads`), and each workload's target metric, target - value, and step hint. + goal, target value, and step hint. """ benchmark_version: str @@ -84,6 +107,43 @@ def base_workload_name(self, workload_name: str) -> str: return base_workload_name return workload_name + def with_target_relaxations( + self, relaxations: dict[str, float] + ) -> 'WorkloadConfig': + """Return a copy with selected convergence targets relaxed. + + The special selector ``all`` matches every configured workload. A base + workload selector also matches its held-out variants. Later selectors + override earlier selectors. + """ + workload_relaxations = {} + for selector, fraction in relaxations.items(): + if selector == 'all': + matches = self.workloads + elif selector in self.base_workloads: + matches = ( + workload + for workload in self.workloads + if self.base_workload_name(workload) == selector + ) + elif selector in self.workloads: + matches = (selector,) + else: + raise ValueError( + f'Unknown target-relaxation selector {selector!r}. Use "all" or ' + f'one of: {", ".join(sorted(self.workloads))}.' + ) + for workload in matches: + workload_relaxations[workload] = fraction + + workloads = { + name: target.relaxed(workload_relaxations[name]) + if name in workload_relaxations + else target + for name, target in self.workloads.items() + } + return replace(self, workloads=workloads) + def _target(self, workload: str) -> WorkloadTarget: match = _FRAMEWORK_SUFFIX.match(workload) name = match.group(1) if match else workload @@ -104,6 +164,10 @@ def metric_and_target(self, workload: str) -> tuple[str, float]: target.validation_target_value, ) + def target_is_minimized(self, workload: str) -> bool: + """Return whether the workload's target metric is minimized.""" + return self._target(workload).is_minimized + def step_hint(self, workload: str) -> int: """Returns the step hint for a workload.""" return self._target(workload).step_hint diff --git a/scoring/performance_profile.py b/scoring/performance_profile.py index a5b94a46..f27a5244 100644 --- a/scoring/performance_profile.py +++ b/scoring/performance_profile.py @@ -15,18 +15,10 @@ include a column of np.arrays indicating time (e.g., 'global_step'), a column of np.arrays indicating performance (e.g., 'validation/accuracy') for each workload and a column 'workload' that indicates the workload identifier. -2. A dictionary of workload metadata describing each workload in the form: - { - 'workload_identifier': { - 'target': VALUE, - 'metric': 'validation/error_rate', - } - } - The keys in this dictionary should match the workload identifiers used in - the dictionary of submissions. +2. A `WorkloadConfig` containing each workload's validation metric, target, + and explicit `minimize` or `maximize` goal. """ -import itertools import operator import os import re @@ -47,18 +39,6 @@ NUM_TRIALS = 5 NUM_STUDIES = 3 -MIN_EVAL_METRICS = [ - 'ce_loss', - 'error_rate', - 'ctc_loss', - 'wer', - 'l1_loss', - 'loss', - 'ppl', -] - -MAX_EVAL_METRICS = ['mean_average_precision', 'ssim', 'accuracy', 'bleu'] - # MPL params mpl.rcParams['figure.figsize'] = (16, 10) # Width, height in inches mpl.rcParams['font.family'] = 'serif' @@ -92,48 +72,22 @@ def print_dataframe(df): logging.info(tabulated_df) -def generate_eval_cols(metrics): - splits = ['train', 'validation'] - return [f'{split}/{col}' for split, col in itertools.product(splits, metrics)] - - -MINIMIZE_REGISTRY = {k: True for k in generate_eval_cols(MIN_EVAL_METRICS)} -MINIMIZE_REGISTRY.update( - {k: False for k in generate_eval_cols(MAX_EVAL_METRICS)} -) -MINIMIZE_REGISTRY['train_cost'] = True - - -def check_if_minimized(col_name): - """Guess if the eval metric column name should be minimized or not.""" - for prefix in ['best_', 'final_']: - col_name = col_name.replace(prefix, '') - for col in MINIMIZE_REGISTRY: - if col in col_name: - return MINIMIZE_REGISTRY[col] - - raise ValueError( - f'Column {col_name} not found in `MINIMIZE_REGISTRY` as ' - 'either a column name or a substring of a column name.' - ) - - def get_best_trial_index( - workload_df, validation_metric, validation_target=None + workload_df, validation_metric, validation_target, is_minimized ): """Get the eval index in which a workload reaches the target metric_col. Args: workload_df: A subset of a submission's trials DataFrame that includes only the trials in a single workload. - metric_col: Name of array column in workload_df (e.g. `validation/l1_loss`). - target: Target value for metric_col. + validation_metric: Name of an array column in workload_df. + validation_target: Target value for validation_metric. + is_minimized: Whether smaller metric values are better. Returns: Tuple of trial index and time index where the workload reached the target metric_col. Return (-1, -1) if not reached. """ - is_minimized = check_if_minimized(validation_metric) validation_series = workload_df[validation_metric] validation_series = validation_series[validation_series != np.nan] @@ -196,6 +150,7 @@ def get_workloads_time_to_target( # For each workload get submission time get the submission times to target. for workload, group in submission.groupby('workload'): validation_metric, validation_target = config.metric_and_target(workload) + is_minimized = config.target_is_minimized(workload) # Check number of studies time_vals_per_study = [] @@ -234,7 +189,7 @@ def get_workloads_time_to_target( # Get trial and time index that reaches target trial_idx, time_idx = get_best_trial_index( - group, validation_metric, validation_target + group, validation_metric, validation_target, is_minimized ) if time_idx > -1: time_val = group[time_col].loc[trial_idx][time_idx] @@ -285,6 +240,7 @@ def compute_performance_profiles( strict=False, self_tuning_ruleset=False, output_dir=None, + artifact_suffix='', ): """Compute performance profiles for a set of submission by some time column. @@ -293,6 +249,7 @@ def compute_performance_profiles( trials where each row is a trial and each column is a field for a given trial. Results should contain keys for each workload's metric, time_col, 'workload'. See file header comment for more details. + config: WorkloadConfig containing workload targets and metric goals. time_col: A string indicating which column to use for time. min_tau: Minimum tau to use for plotting. max_tau: Maximum tau to use for plotting. @@ -303,6 +260,7 @@ def compute_performance_profiles( num_points: Number of points to use for plotting. scale: Linear or log scale for the x-axis. verbosity: Debug level of information; choice of (1, 2, 3). + artifact_suffix: Suffix inserted before the extension of saved artifacts. Returns: A DataFrame of performance profiles for the set of submissions given in @@ -340,7 +298,7 @@ def compute_performance_profiles( df = df.reindex(sorted(df.columns), axis=1) # Save time to target dataframe - df.to_csv(os.path.join(output_dir, 'time_to_targets.csv')) + df.to_csv(os.path.join(output_dir, f'time_to_targets{artifact_suffix}.csv')) # For each held-out workload set to inf if the base workload is inf or nan for workload in df.keys(): if workload not in config.base_workloads: @@ -451,7 +409,12 @@ def maybe_save_df_to_csv(save_dir, df, path, **to_csv_kwargs): def plot_performance_profiles( - perf_df, df_col, scale='linear', save_dir=None, figsize=(30, 10) + perf_df, + df_col, + scale='linear', + save_dir=None, + figsize=(30, 10), + artifact_suffix='', ): """Plot performance profiles. @@ -467,7 +430,7 @@ def plot_performance_profiles( save_dir: If a valid directory is provided, save both the plot and perf_df to the provided directory. figsize: The size of the plot. - font_size: The font size to use for the legend. + artifact_suffix: Suffix inserted before the extension of saved artifacts. Returns: None. If a valid save_dir is provided, save both the plot and perf_df. @@ -478,7 +441,11 @@ def plot_performance_profiles( fig.set_ylabel('Proportion of workloads') fig.legend(bbox_to_anchor=(1.0, 1.0)) plt.tight_layout() - maybe_save_figure(save_dir, f'performance_profile_by_{df_col_display}') + maybe_save_figure( + save_dir, f'performance_profile_by_{df_col_display}{artifact_suffix}' + ) maybe_save_df_to_csv( - save_dir, perf_df, f'performance_profile_{df_col_display}.csv' + save_dir, + perf_df, + f'performance_profile_{df_col_display}{artifact_suffix}.csv', ) diff --git a/scoring/score_submissions.py b/scoring/score_submissions.py index 819305c9..d49ee08c 100644 --- a/scoring/score_submissions.py +++ b/scoring/score_submissions.py @@ -80,14 +80,67 @@ '', 'Optional comma seperated list of names of submissions to include from scoring.', ) +flags.DEFINE_string( + 'target_relaxations', + '', + 'Optional comma-separated target relaxations in SELECTOR=FRACTION form. ' + 'For example, "all=0.05,imagenet_resnet=0.10" relaxes every target by ' + '5%, then the ImageNet ResNet workload family by 10%. A base workload ' + 'selector includes its held-out variants. Fractions must be in [0, 1).', +) FLAGS = flags.FLAGS +def parse_target_relaxations(spec): + """Parse a target-relaxation flag into an ordered selector mapping.""" + relaxations = {} + if not spec.strip(): + return relaxations + + for assignment in spec.split(','): + assignment = assignment.strip() + if assignment.count('=') != 1: + raise ValueError( + 'Target relaxations must use SELECTOR=FRACTION syntax; ' + f'got {assignment!r}.' + ) + selector, fraction_text = (part.strip() for part in assignment.split('=')) + if not selector: + raise ValueError(f'Missing workload selector in {assignment!r}.') + if selector in relaxations: + raise ValueError(f'Duplicate target-relaxation selector {selector!r}.') + try: + fraction = float(fraction_text) + except ValueError: + raise ValueError( + f'Target relaxation for {selector!r} must be a number; ' + f'got {fraction_text!r}.' + ) from None + if not 0 <= fraction < 1: + raise ValueError( + f'Target relaxation for {selector!r} must be in [0, 1); got {fraction}.' + ) + relaxations[selector] = fraction + return relaxations + + +def prepare_scoring_runs(official_config, relaxation_spec): + """Build the official and optional relaxed scoring configurations.""" + relaxations = parse_target_relaxations(relaxation_spec) + scoring_runs = [('official', '', official_config)] + if not relaxations: + return scoring_runs + + relaxed_config = official_config.with_target_relaxations(relaxations) + scoring_runs.append(('relaxed', '_relaxed', relaxed_config)) + return scoring_runs + + def get_summary_df(workload, workload_df, config): print(f' WORKLOAD: {workload}') validation_metric, validation_target = config.metric_and_target(workload) - is_minimized = performance_profile.check_if_minimized(validation_metric) + is_minimized = config.target_is_minimized(workload) target_op = operator.le if is_minimized else operator.ge best_op = min if is_minimized else max idx_op = np.argmin if is_minimized else np.argmax @@ -186,13 +239,68 @@ def compute_leaderboard_score(df, normalize=True): return pd.DataFrame(scores, columns=['score'], index=df.index) +def score_results( + results, + config, + run_name, + artifact_suffix, + output_dir, + self_tuning_ruleset=False, + strict=False, +): + """Score parsed results once with one workload configuration.""" + logging.info('Computing %s scores.', run_name) + profile_df = performance_profile.compute_performance_profiles( + results, + config, + time_col='score', + min_tau=1.0, + max_tau=4.0, + reference_submission_tag=None, + num_points=100, + scale='linear', + verbosity=0, + self_tuning_ruleset=self_tuning_ruleset, + strict=strict, + output_dir=output_dir, + artifact_suffix=artifact_suffix, + ) + if not os.path.exists(output_dir): + os.mkdir(output_dir) + performance_profile.plot_performance_profiles( + profile_df, + 'score', + save_dir=output_dir, + artifact_suffix=artifact_suffix, + ) + logging.info( + '%s performance profile:\n%s', + run_name.capitalize(), + tabulate(profile_df.T, headers='keys', tablefmt='psql'), + ) + + scores = compute_leaderboard_score(profile_df) + scores.to_csv(os.path.join(output_dir, f'scores{artifact_suffix}.csv')) + logging.info( + '%s scores:\n%s', + run_name.capitalize(), + tabulate(scores, headers='keys', tablefmt='psql'), + ) + + def main(_): results = {} os.makedirs(FLAGS.output_dir, exist_ok=True) - config = WorkloadConfig.from_json(FLAGS.workload_targets) + official_config = WorkloadConfig.from_json(FLAGS.workload_targets) + try: + scoring_runs = prepare_scoring_runs( + official_config, FLAGS.target_relaxations + ) + except ValueError as e: + raise app.UsageError(str(e)) from e logging.info( f'Scoring submissions in {FLAGS.submission_directory} ' - f'with benchmark version {config.benchmark_version} targets ' + f'with benchmark version {official_config.benchmark_version} targets ' f'({FLAGS.workload_targets})' ) @@ -217,11 +325,13 @@ def main(_): experiment_path = os.path.join(FLAGS.submission_directory, submission) df = scoring_utils.get_experiment_df(experiment_path) results[submission] = df - summary_df = get_submission_summary(df, config) - with open( - os.path.join(FLAGS.output_dir, f'{submission}_summary.csv'), 'w' - ) as fout: - summary_df.to_csv(fout) + for _, artifact_suffix, config in scoring_runs: + summary_df = get_submission_summary(df, config) + summary_path = os.path.join( + FLAGS.output_dir, f'{submission}_summary{artifact_suffix}.csv' + ) + with open(summary_path, 'w') as fout: + summary_df.to_csv(fout) # Optionally save results to filename if FLAGS.save_results_to_filename: @@ -238,33 +348,16 @@ def main(_): 'under competition scoring rules. To enforce the criteria set strict=True.' ) if FLAGS.compute_performance_profiles: - performance_profile_df = performance_profile.compute_performance_profiles( - results, - config, - time_col='score', - min_tau=1.0, - max_tau=4.0, - reference_submission_tag=None, - num_points=100, - scale='linear', - verbosity=0, - self_tuning_ruleset=FLAGS.self_tuning_ruleset, - strict=FLAGS.strict, - output_dir=FLAGS.output_dir, - ) - if not os.path.exists(FLAGS.output_dir): - os.mkdir(FLAGS.output_dir) - performance_profile.plot_performance_profiles( - performance_profile_df, 'score', save_dir=FLAGS.output_dir - ) - performance_profile_str = tabulate( - performance_profile_df.T, headers='keys', tablefmt='psql' - ) - logging.info(f'Performance profile:\n {performance_profile_str}') - scores = compute_leaderboard_score(performance_profile_df) - scores.to_csv(os.path.join(FLAGS.output_dir, 'scores.csv')) - scores_str = tabulate(scores, headers='keys', tablefmt='psql') - logging.info(f'Scores: \n {scores_str}') + for run_name, artifact_suffix, config in scoring_runs: + score_results( + results, + config, + run_name, + artifact_suffix, + FLAGS.output_dir, + self_tuning_ruleset=FLAGS.self_tuning_ruleset, + strict=FLAGS.strict, + ) if __name__ == '__main__': diff --git a/scoring/test_score_submissions.py b/scoring/test_score_submissions.py index e10f405e..a87152c0 100644 --- a/scoring/test_score_submissions.py +++ b/scoring/test_score_submissions.py @@ -8,6 +8,12 @@ import pandas as pd from absl.testing import absltest +from scoring.config import WorkloadConfig, WorkloadTarget +from scoring.score_submissions import ( + parse_target_relaxations, + prepare_scoring_runs, +) + _REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) _TARGETS = os.path.join(_REPO_ROOT, 'scoring', 'workload_targets_v05.json') _EXTERNAL_LOGS = os.path.join( @@ -32,6 +38,96 @@ } +class TargetRelaxationTest(absltest.TestCase): + def setUp(self): + super().setUp() + self.config = WorkloadConfig( + benchmark_version='test', + base_workloads=('accuracy_workload', 'loss_workload'), + held_out_workloads=('accuracy_workload_variant',), + workloads={ + 'accuracy_workload': WorkloadTarget('accuracy', 'maximize', 0.8, 100), + 'accuracy_workload_variant': WorkloadTarget( + 'accuracy', 'maximize', 0.75, 100 + ), + 'loss_workload': WorkloadTarget('loss', 'minimize', 0.2, 100), + }, + ) + + def test_parse_target_relaxations(self): + self.assertEqual( + parse_target_relaxations('all=0.05, accuracy_workload=0.1'), + {'all': 0.05, 'accuracy_workload': 0.1}, + ) + self.assertEqual(parse_target_relaxations(''), {}) + + def test_parse_target_relaxations_rejects_invalid_values(self): + for spec in ('accuracy_workload', 'all=one', 'all=-0.1', 'all=1'): + with self.subTest(spec=spec): + with self.assertRaises(ValueError): + parse_target_relaxations(spec) + + def test_relaxes_minimized_and_maximized_targets(self): + relaxed = self.config.with_target_relaxations( + {'all': 0.05, 'accuracy_workload': 0.1} + ) + + # The explicit base-workload selector overrides `all` for the base and its + # held-out variants. Accuracy is maximized, so its target decreases. + self.assertAlmostEqual( + relaxed.workloads['accuracy_workload'].validation_target_value, 0.72 + ) + self.assertAlmostEqual( + relaxed.workloads['accuracy_workload_variant'].validation_target_value, + 0.675, + ) + # Loss is minimized, so its target increases. + self.assertAlmostEqual( + relaxed.workloads['loss_workload'].validation_target_value, 0.21 + ) + + def test_relaxation_direction_comes_from_config(self): + target = WorkloadTarget('loss', 'maximize', 0.2, 100) + self.assertAlmostEqual(target.relaxed(0.1).validation_target_value, 0.18) + + def test_rejects_unknown_metric_goal(self): + with self.assertRaisesRegex(ValueError, 'minimize.*maximize'): + WorkloadTarget('accuracy', 'sideways', 0.8, 100) + + def test_prepare_scoring_runs_adds_relaxed_config_with_suffix(self): + scoring_runs = prepare_scoring_runs(self.config, 'accuracy_workload=0.1') + + self.assertEqual( + [(name, suffix) for name, suffix, _ in scoring_runs], + [('official', ''), ('relaxed', '_relaxed')], + ) + self.assertIs(scoring_runs[0][2], self.config) + self.assertAlmostEqual( + scoring_runs[1][2].workloads['accuracy_workload'].validation_target_value, + 0.72, + ) + + def test_prepare_scoring_runs_without_relaxation_scores_once(self): + scoring_runs = prepare_scoring_runs(self.config, '') + self.assertEqual(scoring_runs, [('official', '', self.config)]) + + def test_exact_variant_selector_does_not_change_base(self): + relaxed = self.config.with_target_relaxations( + {'accuracy_workload_variant': 0.1} + ) + self.assertEqual( + relaxed.workloads['accuracy_workload'].validation_target_value, 0.8 + ) + self.assertAlmostEqual( + relaxed.workloads['accuracy_workload_variant'].validation_target_value, + 0.675, + ) + + def test_rejects_unknown_workload(self): + with self.assertRaisesRegex(ValueError, 'Unknown.*missing'): + self.config.with_target_relaxations({'missing': 0.1}) + + class ScoreSubmissionsEndToEndTest(absltest.TestCase): def test_reproduces_v05_external_tuning_leaderboard(self): with tempfile.TemporaryDirectory() as output_dir: diff --git a/scoring/workload_targets.json b/scoring/workload_targets.json index 4d84ea9c..7f7194e4 100644 --- a/scoring/workload_targets.json +++ b/scoring/workload_targets.json @@ -16,181 +16,217 @@ "workloads": { "cifar": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.85, "step_hint": 4883 }, "criteo1tb": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.123735, "step_hint": 10666 }, "criteo1tb_test": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.123735, "step_hint": 10666 }, "criteo1tb_layernorm": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.123757, "step_hint": 10666 }, "criteo1tb_embed_init": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.129657, "step_hint": 10666 }, "criteo1tb_resnet": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.12415, "step_hint": 10666 }, "fastmri": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.723653, "step_hint": 18094 }, "fastmri_model_size": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.723559, "step_hint": 18094 }, "fastmri_tanh": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.71784, "step_hint": 18094 }, "fastmri_layernorm": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.723284, "step_hint": 18094 }, "imagenet_resnet": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.77431, "step_hint": 195999 }, "imagenet_resnet_silu": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.75445, "step_hint": 195999 }, "imagenet_resnet_gelu": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.76765, "step_hint": 195999 }, "imagenet_resnet_large_bn_init": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.76526, "step_hint": 195999 }, "imagenet_vit": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.77309, "step_hint": 167999 }, "imagenet_vit_glu": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.75738, "step_hint": 167999 }, "imagenet_vit_post_ln": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.75312, "step_hint": 167999 }, "imagenet_vit_map": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.77113, "step_hint": 167999 }, "librispeech_conformer": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.085884, "step_hint": 76000 }, "librispeech_conformer_attention_temperature": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.109977, "step_hint": 76000 }, "librispeech_conformer_layernorm": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.09731, "step_hint": 76000 }, "librispeech_conformer_gelu": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.094114, "step_hint": 76000 }, "librispeech_deepspeech": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.119936, "step_hint": 38400 }, "librispeech_deepspeech_tanh": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.150883, "step_hint": 38400 }, "librispeech_deepspeech_no_resnet": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.131564, "step_hint": 38400 }, "librispeech_deepspeech_norm_and_spec_aug": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.14342, "step_hint": 38400 }, "finewebedu_lm": { "target_metric_name": "ppl", + "target_metric_goal": "minimize", "validation_target_value": 22.2995, "step_hint": 72000 }, "mnist": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.97, "step_hint": 7813 }, "ogbg": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.28098, "step_hint": 52000 }, "ogbg_gelu": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.27771, "step_hint": 52000 }, "ogbg_silu": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.282178, "step_hint": 52000 }, "ogbg_model_size": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.269446, "step_hint": 52000 }, "wmt": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 30.8491, "step_hint": 120000 }, "wmt_post_ln": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 30.0779, "step_hint": 120000 }, "wmt_attention_temp": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 29.3379, "step_hint": 120000 }, "wmt_glu_tanh": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 29.5779, "step_hint": 120000 } diff --git a/scoring/workload_targets_v05.json b/scoring/workload_targets_v05.json index 047ced71..9814f6a0 100644 --- a/scoring/workload_targets_v05.json +++ b/scoring/workload_targets_v05.json @@ -22,181 +22,217 @@ "workloads": { "cifar": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.85, "step_hint": 4883 }, "criteo1tb": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.123735, "step_hint": 10666 }, "criteo1tb_test": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.123735, "step_hint": 10666 }, "criteo1tb_layernorm": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.123757, "step_hint": 10666 }, "criteo1tb_embed_init": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.129657, "step_hint": 10666 }, "criteo1tb_resnet": { "target_metric_name": "loss", + "target_metric_goal": "minimize", "validation_target_value": 0.12415, "step_hint": 10666 }, "fastmri": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.723653, "step_hint": 18094 }, "fastmri_model_size": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.723559, "step_hint": 18094 }, "fastmri_tanh": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.71784, "step_hint": 18094 }, "fastmri_layernorm": { "target_metric_name": "ssim", + "target_metric_goal": "maximize", "validation_target_value": 0.723284, "step_hint": 18094 }, "imagenet_resnet": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.77431, "step_hint": 195999 }, "imagenet_resnet_silu": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.75445, "step_hint": 195999 }, "imagenet_resnet_gelu": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.76765, "step_hint": 195999 }, "imagenet_resnet_large_bn_init": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.76526, "step_hint": 195999 }, "imagenet_vit": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.77309, "step_hint": 167999 }, "imagenet_vit_glu": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.75738, "step_hint": 167999 }, "imagenet_vit_post_ln": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.75312, "step_hint": 167999 }, "imagenet_vit_map": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.77113, "step_hint": 167999 }, "librispeech_conformer": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.085884, "step_hint": 76000 }, "librispeech_conformer_attention_temperature": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.109977, "step_hint": 76000 }, "librispeech_conformer_layernorm": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.09731, "step_hint": 76000 }, "librispeech_conformer_gelu": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.094114, "step_hint": 76000 }, "librispeech_deepspeech": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.119936, "step_hint": 38400 }, "librispeech_deepspeech_tanh": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.150883, "step_hint": 38400 }, "librispeech_deepspeech_no_resnet": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.131564, "step_hint": 38400 }, "librispeech_deepspeech_norm_and_spec_aug": { "target_metric_name": "wer", + "target_metric_goal": "minimize", "validation_target_value": 0.14342, "step_hint": 38400 }, "finewebedu_lm": { "target_metric_name": "ppl", + "target_metric_goal": "minimize", "validation_target_value": 22.2995, "step_hint": 72000 }, "mnist": { "target_metric_name": "accuracy", + "target_metric_goal": "maximize", "validation_target_value": 0.97, "step_hint": 7813 }, "ogbg": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.28098, "step_hint": 52000 }, "ogbg_gelu": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.27771, "step_hint": 52000 }, "ogbg_silu": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.282178, "step_hint": 52000 }, "ogbg_model_size": { "target_metric_name": "mean_average_precision", + "target_metric_goal": "maximize", "validation_target_value": 0.269446, "step_hint": 52000 }, "wmt": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 30.8491, "step_hint": 120000 }, "wmt_post_ln": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 30.0779, "step_hint": 120000 }, "wmt_attention_temp": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 29.3379, "step_hint": 120000 }, "wmt_glu_tanh": { "target_metric_name": "bleu", + "target_metric_goal": "maximize", "validation_target_value": 29.5779, "step_hint": 120000 } diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..20450bbd --- /dev/null +++ b/uv.lock @@ -0,0 +1,678 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version < '3.12'", +] + +[[package]] +name = "absl-py" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/8f/fc001b92ecc467cc32ab38398bd0bfb45df46e7523bf33c2ad22a505f06e/absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff", size = 118055, upload-time = "2024-01-16T22:14:26.154Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", size = 133706, upload-time = "2024-01-16T22:14:24.055Z" }, +] + +[[package]] +name = "algoperf-submissions" +version = "0.6.0" +source = { editable = "." } +dependencies = [ + { name = "absl-py" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "scipy" }, + { name = "tabulate" }, +] + +[package.optional-dependencies] +dev = [ + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "absl-py", specifier = "==2.1.0" }, + { name = "matplotlib", specifier = "==3.9.2" }, + { name = "numpy", specifier = "==2.1.3" }, + { name = "pandas", specifier = "==2.2.3" }, + { name = "pytest", marker = "extra == 'dev'", specifier = "==8.3.3" }, + { name = "ruff", marker = "extra == 'dev'", specifier = "==0.12.0" }, + { name = "scipy", specifier = "==1.14.1" }, + { name = "tabulate", specifier = "==0.9.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/2b/a7f1545bdf5da69c4bda0cea2a5781f0ad2a6623e0277267672db43c5fe6/fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f", size = 2881793, upload-time = "2026-05-14T12:02:56.645Z" }, + { url = "https://files.pythonhosted.org/packages/49/50/965308c703f085f225db2886813b27e015b8b3438c350b22dd65b52c2a2c/fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9", size = 2428130, upload-time = "2026-05-14T12:02:58.891Z" }, + { url = "https://files.pythonhosted.org/packages/d8/38/6937fbd7f2dc3a6b48725851bc2c15ec949b9af14d9bbcb5fe83cdf9bdf9/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b", size = 5111952, upload-time = "2026-05-14T12:03:01.263Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/a81f20050a3115b57d62c8e781446949512eac36690dc384ccea65ff4cc1/fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18", size = 5082308, upload-time = "2026-05-14T12:03:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/67/00/cdd9d4944ca6ae280d01e69cc37bde3bf663630b837a6fc6d2cd65d80e0e/fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0", size = 5087932, upload-time = "2026-05-14T12:03:05.147Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f1/0aa0dbea778c75adbef223c42019fd47d22262b905974d62d829545d485f/fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007", size = 5213271, upload-time = "2026-05-14T12:03:07.238Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/253e4056e1f0e67b9390125a154b73b5eb73ad521bece95c004858fdeec2/fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb", size = 2304473, upload-time = "2026-05-14T12:03:09.271Z" }, + { url = "https://files.pythonhosted.org/packages/08/60/defa5e69641db890a63be281f41345f4c33b157824eaf0b9fad3e08b0dcb/fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c", size = 2356389, upload-time = "2026-05-14T12:03:11.53Z" }, + { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" }, + { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" }, + { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" }, + { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" }, + { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" }, + { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" }, + { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" }, + { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" }, + { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" }, + { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" }, + { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" }, + { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, + { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/d8/3d7f706c69e024d4287c1110d74f7dabac91d9843b99eadc90de9efc8869/matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92", size = 36088381, upload-time = "2024-08-13T01:45:36.875Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/c2/f9d7fe80a8fcce9bb128d1381c6fe41a8d286d7e18395e273002e8e0fa34/matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772", size = 7902925, upload-time = "2024-08-13T01:44:35.27Z" }, + { url = "https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41", size = 7773193, upload-time = "2024-08-13T01:44:36.78Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f", size = 8202378, upload-time = "2024-08-13T01:44:38.772Z" }, + { url = "https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447", size = 8314361, upload-time = "2024-08-13T01:44:40.994Z" }, + { url = "https://files.pythonhosted.org/packages/6e/49/dc7384c6c092958e0b75e754efbd9e52500154939c3d715789cee9fb8a53/matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e", size = 9091428, upload-time = "2024-08-13T01:44:42.904Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7", size = 7829377, upload-time = "2024-08-13T01:44:44.843Z" }, + { url = "https://files.pythonhosted.org/packages/82/de/54f7f38ce6de79cb77d513bb3eaa4e0b1031e9fd6022214f47943fa53a88/matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9", size = 7892511, upload-time = "2024-08-13T01:44:46.59Z" }, + { url = "https://files.pythonhosted.org/packages/35/3e/5713b84a02b24b2a4bd4d6673bfc03017e6654e1d8793ece783b7ed4d484/matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d", size = 7769370, upload-time = "2024-08-13T01:44:48.084Z" }, + { url = "https://files.pythonhosted.org/packages/5b/bd/c404502aa1824456d2862dd6b9b0c1917761a51a32f7f83ff8cf94b6d117/matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7", size = 8193260, upload-time = "2024-08-13T01:44:49.663Z" }, + { url = "https://files.pythonhosted.org/packages/27/75/de5b9cd67648051cae40039da0c8cbc497a0d99acb1a1f3d087cd66d27b7/matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c", size = 8306310, upload-time = "2024-08-13T01:44:51.329Z" }, + { url = "https://files.pythonhosted.org/packages/de/e3/2976e4e54d7ee76eaf54b7639fdc10a223d05c2bdded7045233e9871e469/matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e", size = 9086717, upload-time = "2024-08-13T01:44:53.772Z" }, + { url = "https://files.pythonhosted.org/packages/d2/92/c2b9464a0562feb6ae780bdc152364810862e07ef5e6affa2b7686028db2/matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3", size = 7832805, upload-time = "2024-08-13T01:44:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/5c/7f/8932eac316b32f464b8f9069f151294dcd892c8fbde61fe8bcd7ba7f7f7e/matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9", size = 7893012, upload-time = "2024-08-13T01:44:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/90/89/9db9db3dd0ff3e2c49e452236dfe29e60b5586a88f8928ca1d153d0da8b5/matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa", size = 7769810, upload-time = "2024-08-13T01:44:59.652Z" }, + { url = "https://files.pythonhosted.org/packages/67/26/d2661cdc2e1410b8929c5f12dfd521e4528abfed1b3c3d5a28ac48258b43/matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b", size = 8193779, upload-time = "2024-08-13T01:45:01.453Z" }, + { url = "https://files.pythonhosted.org/packages/95/70/4839eaa672bf4eacc98ebc8d23633e02b6daf39e294e7433c4ab11a689be/matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413", size = 8306260, upload-time = "2024-08-13T01:45:03.107Z" }, + { url = "https://files.pythonhosted.org/packages/88/62/7b263b2cb2724b45d3a4f9c8c6137696cc3ef037d44383fb01ac2a9555c2/matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b", size = 9086073, upload-time = "2024-08-13T01:45:04.757Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6d/3572fe243c74112fef120f0bc86f5edd21f49b60e8322fc7f6a01fe945dd/matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49", size = 7833041, upload-time = "2024-08-13T01:45:07.406Z" }, + { url = "https://files.pythonhosted.org/packages/03/8f/9d505be3eb2f40ec731674fb6b47d10cc3147bbd6a9ea7a08c8da55415c6/matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03", size = 7933657, upload-time = "2024-08-13T01:45:08.967Z" }, + { url = "https://files.pythonhosted.org/packages/5d/68/44b458b9794bcff2a66921f8c9a8110a50a0bb099bd5f7cabb428a1dc765/matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30", size = 7799276, upload-time = "2024-08-13T01:45:10.607Z" }, + { url = "https://files.pythonhosted.org/packages/47/79/8486d4ddcaaf676314b5fb58e8fe19d1a6210a443a7c31fa72d4215fcb87/matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51", size = 8221027, upload-time = "2024-08-13T01:45:12.204Z" }, + { url = "https://files.pythonhosted.org/packages/56/62/72a472181578c3d035dcda0d0fa2e259ba2c4cb91132588a348bb705b70d/matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c", size = 8329097, upload-time = "2024-08-13T01:45:13.877Z" }, + { url = "https://files.pythonhosted.org/packages/01/8a/760f7fce66b39f447ad160800619d0bd5d0936d2b4633587116534a4afe0/matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e", size = 9093770, upload-time = "2024-08-13T01:45:15.562Z" }, +] + +[[package]] +name = "numpy" +version = "2.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ca/1166b75c21abd1da445b97bf1fa2f14f423c6cfb4fc7c4ef31dccf9f6a94/numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", size = 20166090, upload-time = "2024-11-02T17:48:55.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/81/c8167192eba5247593cd9d305ac236847c2912ff39e11402e72ae28a4985/numpy-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", size = 21156252, upload-time = "2024-11-02T17:34:01.372Z" }, + { url = "https://files.pythonhosted.org/packages/da/74/5a60003fc3d8a718d830b08b654d0eea2d2db0806bab8f3c2aca7e18e010/numpy-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", size = 13784119, upload-time = "2024-11-02T17:34:23.809Z" }, + { url = "https://files.pythonhosted.org/packages/47/7c/864cb966b96fce5e63fcf25e1e4d957fe5725a635e5f11fe03f39dd9d6b5/numpy-2.1.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", size = 5352978, upload-time = "2024-11-02T17:34:34.001Z" }, + { url = "https://files.pythonhosted.org/packages/09/ac/61d07930a4993dd9691a6432de16d93bbe6aa4b1c12a5e573d468eefc1ca/numpy-2.1.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", size = 6892570, upload-time = "2024-11-02T17:34:45.401Z" }, + { url = "https://files.pythonhosted.org/packages/27/2f/21b94664f23af2bb52030653697c685022119e0dc93d6097c3cb45bce5f9/numpy-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", size = 13896715, upload-time = "2024-11-02T17:35:06.564Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f0/80811e836484262b236c684a75dfc4ba0424bc670e765afaa911468d9f39/numpy-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", size = 16339644, upload-time = "2024-11-02T17:35:30.888Z" }, + { url = "https://files.pythonhosted.org/packages/fa/81/ce213159a1ed8eb7d88a2a6ef4fbdb9e4ffd0c76b866c350eb4e3c37e640/numpy-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", size = 16712217, upload-time = "2024-11-02T17:35:56.703Z" }, + { url = "https://files.pythonhosted.org/packages/7d/84/4de0b87d5a72f45556b2a8ee9fc8801e8518ec867fc68260c1f5dcb3903f/numpy-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", size = 14399053, upload-time = "2024-11-02T17:36:22.3Z" }, + { url = "https://files.pythonhosted.org/packages/7e/1c/e5fabb9ad849f9d798b44458fd12a318d27592d4bc1448e269dec070ff04/numpy-2.1.3-cp311-cp311-win32.whl", hash = "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", size = 6534741, upload-time = "2024-11-02T17:36:33.552Z" }, + { url = "https://files.pythonhosted.org/packages/1e/48/a9a4b538e28f854bfb62e1dea3c8fea12e90216a276c7777ae5345ff29a7/numpy-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", size = 12869487, upload-time = "2024-11-02T17:36:52.909Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f0/385eb9970309643cbca4fc6eebc8bb16e560de129c91258dfaa18498da8b/numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", size = 20849658, upload-time = "2024-11-02T17:37:23.919Z" }, + { url = "https://files.pythonhosted.org/packages/54/4a/765b4607f0fecbb239638d610d04ec0a0ded9b4951c56dc68cef79026abf/numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", size = 13492258, upload-time = "2024-11-02T17:37:45.252Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a7/2332679479c70b68dccbf4a8eb9c9b5ee383164b161bee9284ac141fbd33/numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", size = 5090249, upload-time = "2024-11-02T17:37:54.252Z" }, + { url = "https://files.pythonhosted.org/packages/c1/67/4aa00316b3b981a822c7a239d3a8135be2a6945d1fd11d0efb25d361711a/numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", size = 6621704, upload-time = "2024-11-02T17:38:05.127Z" }, + { url = "https://files.pythonhosted.org/packages/5e/da/1a429ae58b3b6c364eeec93bf044c532f2ff7b48a52e41050896cf15d5b1/numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", size = 13606089, upload-time = "2024-11-02T17:38:25.997Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3e/3757f304c704f2f0294a6b8340fcf2be244038be07da4cccf390fa678a9f/numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", size = 16043185, upload-time = "2024-11-02T17:38:51.07Z" }, + { url = "https://files.pythonhosted.org/packages/43/97/75329c28fea3113d00c8d2daf9bc5828d58d78ed661d8e05e234f86f0f6d/numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", size = 16410751, upload-time = "2024-11-02T17:39:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7a/442965e98b34e0ae9da319f075b387bcb9a1e0658276cc63adb8c9686f7b/numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", size = 14082705, upload-time = "2024-11-02T17:39:38.274Z" }, + { url = "https://files.pythonhosted.org/packages/ac/b6/26108cf2cfa5c7e03fb969b595c93131eab4a399762b51ce9ebec2332e80/numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", size = 6239077, upload-time = "2024-11-02T17:39:49.299Z" }, + { url = "https://files.pythonhosted.org/packages/a6/84/fa11dad3404b7634aaab50733581ce11e5350383311ea7a7010f464c0170/numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", size = 12566858, upload-time = "2024-11-02T17:40:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0b/620591441457e25f3404c8057eb924d04f161244cb8a3680d529419aa86e/numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", size = 20836263, upload-time = "2024-11-02T17:40:39.528Z" }, + { url = "https://files.pythonhosted.org/packages/45/e1/210b2d8b31ce9119145433e6ea78046e30771de3fe353f313b2778142f34/numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", size = 13507771, upload-time = "2024-11-02T17:41:01.368Z" }, + { url = "https://files.pythonhosted.org/packages/55/44/aa9ee3caee02fa5a45f2c3b95cafe59c44e4b278fbbf895a93e88b308555/numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", size = 5075805, upload-time = "2024-11-02T17:41:11.213Z" }, + { url = "https://files.pythonhosted.org/packages/78/d6/61de6e7e31915ba4d87bbe1ae859e83e6582ea14c6add07c8f7eefd8488f/numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", size = 6608380, upload-time = "2024-11-02T17:41:22.19Z" }, + { url = "https://files.pythonhosted.org/packages/3e/46/48bdf9b7241e317e6cf94276fe11ba673c06d1fdf115d8b4ebf616affd1a/numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", size = 13602451, upload-time = "2024-11-02T17:41:43.094Z" }, + { url = "https://files.pythonhosted.org/packages/70/50/73f9a5aa0810cdccda9c1d20be3cbe4a4d6ea6bfd6931464a44c95eef731/numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", size = 16039822, upload-time = "2024-11-02T17:42:07.595Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cd/098bc1d5a5bc5307cfc65ee9369d0ca658ed88fbd7307b0d49fab6ca5fa5/numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", size = 16411822, upload-time = "2024-11-02T17:42:32.48Z" }, + { url = "https://files.pythonhosted.org/packages/83/a2/7d4467a2a6d984549053b37945620209e702cf96a8bc658bc04bba13c9e2/numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", size = 14079598, upload-time = "2024-11-02T17:42:53.773Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6a/d64514dcecb2ee70bfdfad10c42b76cab657e7ee31944ff7a600f141d9e9/numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", size = 6236021, upload-time = "2024-11-02T17:46:19.171Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f9/12297ed8d8301a401e7d8eb6b418d32547f1d700ed3c038d325a605421a4/numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", size = 12560405, upload-time = "2024-11-02T17:46:38.177Z" }, + { url = "https://files.pythonhosted.org/packages/a7/45/7f9244cd792e163b334e3a7f02dff1239d2890b6f37ebf9e82cbe17debc0/numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", size = 20859062, upload-time = "2024-11-02T17:43:24.599Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b4/a084218e7e92b506d634105b13e27a3a6645312b93e1c699cc9025adb0e1/numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", size = 13515839, upload-time = "2024-11-02T17:43:45.498Z" }, + { url = "https://files.pythonhosted.org/packages/27/45/58ed3f88028dcf80e6ea580311dc3edefdd94248f5770deb980500ef85dd/numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", size = 5116031, upload-time = "2024-11-02T17:43:54.585Z" }, + { url = "https://files.pythonhosted.org/packages/37/a8/eb689432eb977d83229094b58b0f53249d2209742f7de529c49d61a124a0/numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", size = 6629977, upload-time = "2024-11-02T17:44:05.31Z" }, + { url = "https://files.pythonhosted.org/packages/42/a3/5355ad51ac73c23334c7caaed01adadfda49544f646fcbfbb4331deb267b/numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", size = 13575951, upload-time = "2024-11-02T17:44:25.881Z" }, + { url = "https://files.pythonhosted.org/packages/c4/70/ea9646d203104e647988cb7d7279f135257a6b7e3354ea6c56f8bafdb095/numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", size = 16022655, upload-time = "2024-11-02T17:44:50.115Z" }, + { url = "https://files.pythonhosted.org/packages/14/ce/7fc0612903e91ff9d0b3f2eda4e18ef9904814afcae5b0f08edb7f637883/numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", size = 16399902, upload-time = "2024-11-02T17:45:15.685Z" }, + { url = "https://files.pythonhosted.org/packages/ef/62/1d3204313357591c913c32132a28f09a26357e33ea3c4e2fe81269e0dca1/numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", size = 14067180, upload-time = "2024-11-02T17:45:37.234Z" }, + { url = "https://files.pythonhosted.org/packages/24/d7/78a40ed1d80e23a774cb8a34ae8a9493ba1b4271dde96e56ccdbab1620ef/numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", size = 6291907, upload-time = "2024-11-02T17:45:48.951Z" }, + { url = "https://files.pythonhosted.org/packages/86/09/a5ab407bd7f5f5599e6a9261f964ace03a73e7c6928de906981c31c38082/numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", size = 12644098, upload-time = "2024-11-02T17:46:07.941Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload-time = "2024-09-20T13:08:56.254Z" }, + { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload-time = "2024-09-20T13:08:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload-time = "2024-09-20T19:01:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload-time = "2024-09-20T13:09:01.501Z" }, + { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload-time = "2024-09-20T19:02:00.678Z" }, + { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload-time = "2024-09-20T13:09:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload-time = "2024-09-20T13:09:06.917Z" }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload-time = "2024-09-20T13:09:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload-time = "2024-09-20T13:09:28.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload-time = "2024-09-20T19:02:10.451Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload-time = "2024-09-20T13:09:30.814Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload-time = "2024-09-20T19:02:13.825Z" }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload-time = "2024-09-20T13:09:33.462Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload-time = "2024-09-20T13:09:35.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload-time = "2024-09-20T13:09:38.685Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload-time = "2024-09-20T13:09:41.141Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload-time = "2024-09-20T19:02:16.905Z" }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload-time = "2024-09-20T13:09:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload-time = "2024-09-20T19:02:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload-time = "2024-09-20T13:09:48.112Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/c8/0a78b0e02d7ac54bc03e5321c9220da52f0c2ea83b21f7c40e7f3169c502/pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756", size = 5392415, upload-time = "2026-07-01T11:53:47.162Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5b/a02d30018abd97ced9f5a6c63d28597694a00d066516b9c1c6de45859fc9/pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6", size = 4785266, upload-time = "2026-07-01T11:53:49.079Z" }, + { url = "https://files.pythonhosted.org/packages/c8/98/766667a4be768150a202836acd9fad19c06824ca86c4286d3cf6b274964e/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd", size = 6263814, upload-time = "2026-07-01T11:53:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/ede717bc1144f63886c21fd349bb95860b0d1a21149ff16f2bb362b612b6/pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd", size = 6934408, upload-time = "2026-07-01T11:53:53.487Z" }, + { url = "https://files.pythonhosted.org/packages/a3/48/9c58b685e69d49c31af6c8eb9012055fab7e665785165c84796e2c73ce72/pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c", size = 6337160, upload-time = "2026-07-01T11:53:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/ff/fa/dc2a5c0ba6df93f67c31d34b808b7ce440b40cdbf96f0b81cde1d1e6fa93/pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5", size = 7045172, upload-time = "2026-07-01T11:53:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/86/a5/444817a4d4c4c2417df00513086ca196f388d8f9ef40c2e4ccd1ad1af54b/pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b", size = 6472232, upload-time = "2026-07-01T11:53:59.767Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/4bad1b18d132a50b27e1365e1ab163616f7a5bb56d330f66f9d1d9d4f9d4/pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a", size = 7233653, upload-time = "2026-07-01T11:54:02.066Z" }, + { url = "https://files.pythonhosted.org/packages/fd/16/00f91ab7760dc842f5aad55217e80fc4a7067a0604535249bc8a2d6d9870/pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26", size = 2568195, upload-time = "2026-07-01T11:54:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, + { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, + { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, + { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, + { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, + { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, + { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, + { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, + { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, + { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, + { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/75/18/2e8b40223153ccbc60df07f9e8928dc0c76202aa4e55ae9f53962b6510d6/pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468", size = 5302510, upload-time = "2026-07-01T11:56:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/46/3e/51fabf59d5ab801ceab709453d3ab6b180083496579549de4c45ced6528a/pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94", size = 4736058, upload-time = "2026-07-01T11:56:28.041Z" }, + { url = "https://files.pythonhosted.org/packages/bf/20/22fe9384b7949e25fb1293bcfc84fb82590ff4ea6b37c95b24d26d793d86/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e", size = 5237776, upload-time = "2026-07-01T11:56:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/08/14/f6ba68107680ffa74b39985f3f30884e41318fbc4250caa423c79b4788bb/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3", size = 5860358, upload-time = "2026-07-01T11:56:32.68Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786, upload-time = "2026-07-01T11:56:35.046Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487, upload-time = "2024-09-10T10:52:15.003Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341, upload-time = "2024-09-10T10:52:12.54Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2026.3.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", size = 319745, upload-time = "2026-07-25T15:12:07.385Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", size = 508283, upload-time = "2026-07-25T15:12:05.782Z" }, +] + +[[package]] +name = "ruff" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/90/5255432602c0b196a0da6720f6f76b93eb50baef46d3c9b0025e2f9acbf3/ruff-0.12.0.tar.gz", hash = "sha256:4d047db3662418d4a848a3fdbfaf17488b34b62f527ed6f10cb8afd78135bc5c", size = 4376101, upload-time = "2025-06-17T15:19:26.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/fd/b46bb20e14b11ff49dbc74c61de352e0dc07fb650189513631f6fb5fc69f/ruff-0.12.0-py3-none-linux_armv6l.whl", hash = "sha256:5652a9ecdb308a1754d96a68827755f28d5dfb416b06f60fd9e13f26191a8848", size = 10311554, upload-time = "2025-06-17T15:18:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d3/021dde5a988fa3e25d2468d1dadeea0ae89dc4bc67d0140c6e68818a12a1/ruff-0.12.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:05ed0c914fabc602fc1f3b42c53aa219e5736cb030cdd85640c32dbc73da74a6", size = 11118435, upload-time = "2025-06-17T15:18:49.064Z" }, + { url = "https://files.pythonhosted.org/packages/07/a2/01a5acf495265c667686ec418f19fd5c32bcc326d4c79ac28824aecd6a32/ruff-0.12.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:07a7aa9b69ac3fcfda3c507916d5d1bca10821fe3797d46bad10f2c6de1edda0", size = 10466010, upload-time = "2025-06-17T15:18:51.341Z" }, + { url = "https://files.pythonhosted.org/packages/4c/57/7caf31dd947d72e7aa06c60ecb19c135cad871a0a8a251723088132ce801/ruff-0.12.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7731c3eec50af71597243bace7ec6104616ca56dda2b99c89935fe926bdcd48", size = 10661366, upload-time = "2025-06-17T15:18:53.29Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ba/aa393b972a782b4bc9ea121e0e358a18981980856190d7d2b6187f63e03a/ruff-0.12.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:952d0630eae628250ab1c70a7fffb641b03e6b4a2d3f3ec6c1d19b4ab6c6c807", size = 10173492, upload-time = "2025-06-17T15:18:55.262Z" }, + { url = "https://files.pythonhosted.org/packages/d7/50/9349ee777614bc3062fc6b038503a59b2034d09dd259daf8192f56c06720/ruff-0.12.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c021f04ea06966b02614d442e94071781c424ab8e02ec7af2f037b4c1e01cc82", size = 11761739, upload-time = "2025-06-17T15:18:58.906Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/ad459de67c70ec112e2ba7206841c8f4eb340a03ee6a5cabc159fe558b8e/ruff-0.12.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d235618283718ee2fe14db07f954f9b2423700919dc688eacf3f8797a11315c", size = 12537098, upload-time = "2025-06-17T15:19:01.316Z" }, + { url = "https://files.pythonhosted.org/packages/ed/50/15ad9c80ebd3c4819f5bd8883e57329f538704ed57bac680d95cb6627527/ruff-0.12.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0758038f81beec8cc52ca22de9685b8ae7f7cc18c013ec2050012862cc9165", size = 12154122, upload-time = "2025-06-17T15:19:03.727Z" }, + { url = "https://files.pythonhosted.org/packages/76/e6/79b91e41bc8cc3e78ee95c87093c6cacfa275c786e53c9b11b9358026b3d/ruff-0.12.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139b3d28027987b78fc8d6cfb61165447bdf3740e650b7c480744873688808c2", size = 11363374, upload-time = "2025-06-17T15:19:05.875Z" }, + { url = "https://files.pythonhosted.org/packages/db/c3/82b292ff8a561850934549aa9dc39e2c4e783ab3c21debe55a495ddf7827/ruff-0.12.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68853e8517b17bba004152aebd9dd77d5213e503a5f2789395b25f26acac0da4", size = 11587647, upload-time = "2025-06-17T15:19:08.246Z" }, + { url = "https://files.pythonhosted.org/packages/2b/42/d5760d742669f285909de1bbf50289baccb647b53e99b8a3b4f7ce1b2001/ruff-0.12.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3a9512af224b9ac4757f7010843771da6b2b0935a9e5e76bb407caa901a1a514", size = 10527284, upload-time = "2025-06-17T15:19:10.37Z" }, + { url = "https://files.pythonhosted.org/packages/19/f6/fcee9935f25a8a8bba4adbae62495c39ef281256693962c2159e8b284c5f/ruff-0.12.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b08df3d96db798e5beb488d4df03011874aff919a97dcc2dd8539bb2be5d6a88", size = 10158609, upload-time = "2025-06-17T15:19:12.286Z" }, + { url = "https://files.pythonhosted.org/packages/37/fb/057febf0eea07b9384787bfe197e8b3384aa05faa0d6bd844b94ceb29945/ruff-0.12.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6a315992297a7435a66259073681bb0d8647a826b7a6de45c6934b2ca3a9ed51", size = 11141462, upload-time = "2025-06-17T15:19:15.195Z" }, + { url = "https://files.pythonhosted.org/packages/10/7c/1be8571011585914b9d23c95b15d07eec2d2303e94a03df58294bc9274d4/ruff-0.12.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e55e44e770e061f55a7dbc6e9aed47feea07731d809a3710feda2262d2d4d8a", size = 11641616, upload-time = "2025-06-17T15:19:17.6Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/b960ab4818f90ff59e571d03c3f992828d4683561095e80f9ef31f3d58b7/ruff-0.12.0-py3-none-win32.whl", hash = "sha256:7162a4c816f8d1555eb195c46ae0bd819834d2a3f18f98cc63819a7b46f474fb", size = 10525289, upload-time = "2025-06-17T15:19:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/34/93/8b16034d493ef958a500f17cda3496c63a537ce9d5a6479feec9558f1695/ruff-0.12.0-py3-none-win_amd64.whl", hash = "sha256:d00b7a157b8fb6d3827b49d3324da34a1e3f93492c1f97b08e222ad7e9b291e0", size = 11598311, upload-time = "2025-06-17T15:19:21.785Z" }, + { url = "https://files.pythonhosted.org/packages/d0/33/4d3e79e4a84533d6cd526bfb42c020a23256ae5e4265d858bd1287831f7d/ruff-0.12.0-py3-none-win_arm64.whl", hash = "sha256:8cd24580405ad8c1cc64d61725bca091d6b6da7eb3d36f72cc605467069d7e8b", size = 10724946, upload-time = "2025-06-17T15:19:23.952Z" }, +] + +[[package]] +name = "scipy" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/11/4d44a1f274e002784e4dbdb81e0ea96d2de2d1045b2132d5af62cc31fd28/scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", size = 58620554, upload-time = "2024-08-21T00:09:20.662Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675", size = 39076999, upload-time = "2024-08-21T00:04:32.61Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c5/02ac82f9bb8f70818099df7e86c3ad28dae64e1347b421d8e3adf26acab6/scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2", size = 29894570, upload-time = "2024-08-21T00:04:37.938Z" }, + { url = "https://files.pythonhosted.org/packages/ed/05/7f03e680cc5249c4f96c9e4e845acde08eb1aee5bc216eff8a089baa4ddb/scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617", size = 23103567, upload-time = "2024-08-21T00:04:42.582Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fc/9f1413bef53171f379d786aabc104d4abeea48ee84c553a3e3d8c9f96a9c/scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8", size = 25499102, upload-time = "2024-08-21T00:04:47.467Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37", size = 35586346, upload-time = "2024-08-21T00:04:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2", size = 41165244, upload-time = "2024-08-21T00:05:00.489Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/e6aa6f55729a8f245d8a6984f2855696c5992113a5dc789065020f8be753/scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2", size = 42817917, upload-time = "2024-08-21T00:05:07.533Z" }, + { url = "https://files.pythonhosted.org/packages/ea/c2/5ecadc5fcccefaece775feadcd795060adf5c3b29a883bff0e678cfe89af/scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94", size = 44781033, upload-time = "2024-08-21T00:05:14.297Z" }, + { url = "https://files.pythonhosted.org/packages/c0/04/2bdacc8ac6387b15db6faa40295f8bd25eccf33f1f13e68a72dc3c60a99e/scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d", size = 39128781, upload-time = "2024-08-21T04:08:04.15Z" }, + { url = "https://files.pythonhosted.org/packages/c8/53/35b4d41f5fd42f5781dbd0dd6c05d35ba8aa75c84ecddc7d44756cd8da2e/scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07", size = 29939542, upload-time = "2024-08-21T00:05:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/66/67/6ef192e0e4d77b20cc33a01e743b00bc9e68fb83b88e06e636d2619a8767/scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5", size = 23148375, upload-time = "2024-08-21T00:05:30.359Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/3a6dedd51d68eb7b8e7dc7947d5d841bcb699f1bf4463639554986f4d782/scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc", size = 25578573, upload-time = "2024-08-21T00:05:35.274Z" }, + { url = "https://files.pythonhosted.org/packages/f0/5a/efa92a58dc3a2898705f1dc9dbaf390ca7d4fba26d6ab8cfffb0c72f656f/scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310", size = 35319299, upload-time = "2024-08-21T00:05:40.956Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ee/8a26858ca517e9c64f84b4c7734b89bda8e63bec85c3d2f432d225bb1886/scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066", size = 40849331, upload-time = "2024-08-21T00:05:47.53Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cd/06f72bc9187840f1c99e1a8750aad4216fc7dfdd7df46e6280add14b4822/scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1", size = 42544049, upload-time = "2024-08-21T00:05:59.294Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7d/43ab67228ef98c6b5dd42ab386eae2d7877036970a0d7e3dd3eb47a0d530/scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f", size = 44521212, upload-time = "2024-08-21T00:06:06.521Z" }, + { url = "https://files.pythonhosted.org/packages/50/ef/ac98346db016ff18a6ad7626a35808f37074d25796fd0234c2bb0ed1e054/scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79", size = 39091068, upload-time = "2024-08-21T00:06:13.671Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cc/70948fe9f393b911b4251e96b55bbdeaa8cca41f37c26fd1df0232933b9e/scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e", size = 29875417, upload-time = "2024-08-21T00:06:21.482Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2e/35f549b7d231c1c9f9639f9ef49b815d816bf54dd050da5da1c11517a218/scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73", size = 23084508, upload-time = "2024-08-21T00:06:28.064Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d6/b028e3f3e59fae61fb8c0f450db732c43dd1d836223a589a8be9f6377203/scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e", size = 25503364, upload-time = "2024-08-21T00:06:35.25Z" }, + { url = "https://files.pythonhosted.org/packages/a7/2f/6c142b352ac15967744d62b165537a965e95d557085db4beab2a11f7943b/scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d", size = 35292639, upload-time = "2024-08-21T00:06:44.542Z" }, + { url = "https://files.pythonhosted.org/packages/56/46/2449e6e51e0d7c3575f289f6acb7f828938eaab8874dbccfeb0cd2b71a27/scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e", size = 40798288, upload-time = "2024-08-21T00:06:54.182Z" }, + { url = "https://files.pythonhosted.org/packages/32/cd/9d86f7ed7f4497c9fd3e39f8918dd93d9f647ba80d7e34e4946c0c2d1a7c/scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06", size = 42524647, upload-time = "2024-08-21T00:07:04.649Z" }, + { url = "https://files.pythonhosted.org/packages/f5/1b/6ee032251bf4cdb0cc50059374e86a9f076308c1512b61c4e003e241efb7/scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", size = 44469524, upload-time = "2024-08-21T00:07:15.381Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +]