File size: 46,690 Bytes
77ba698
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "138889b92720ce2e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-30T15:08:02.398435Z",
     "start_time": "2024-04-30T15:08:02.194901Z"
    },
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>runname</th>\n",
       "      <th>seed</th>\n",
       "      <th>steps</th>\n",
       "      <th>agg_score</th>\n",
       "      <th>commonsense_qa/acc</th>\n",
       "      <th>commonsense_qa/acc_norm</th>\n",
       "      <th>hellaswag/acc</th>\n",
       "      <th>hellaswag/acc_norm</th>\n",
       "      <th>openbookqa/acc</th>\n",
       "      <th>openbookqa/acc_norm</th>\n",
       "      <th>...</th>\n",
       "      <th>siqa/acc</th>\n",
       "      <th>siqa/acc_norm</th>\n",
       "      <th>winogrande/acc</th>\n",
       "      <th>winogrande/acc_norm</th>\n",
       "      <th>sciq/acc</th>\n",
       "      <th>sciq/acc_norm</th>\n",
       "      <th>arc/acc</th>\n",
       "      <th>arc/acc_norm</th>\n",
       "      <th>mmlu/acc</th>\n",
       "      <th>mmlu/acc_norm</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>big-run-sampled_full_filtered_no_dedup</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0.330893</td>\n",
       "      <td>0.186</td>\n",
       "      <td>0.233</td>\n",
       "      <td>0.272</td>\n",
       "      <td>0.258</td>\n",
       "      <td>0.166</td>\n",
       "      <td>0.286</td>\n",
       "      <td>...</td>\n",
       "      <td>0.367</td>\n",
       "      <td>0.362</td>\n",
       "      <td>0.516</td>\n",
       "      <td>0.497</td>\n",
       "      <td>0.209</td>\n",
       "      <td>0.202</td>\n",
       "      <td>0.2195</td>\n",
       "      <td>0.2510</td>\n",
       "      <td>0.230294</td>\n",
       "      <td>0.250147</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>big-run-sampled_full_filtered_no_dedup</td>\n",
       "      <td>6</td>\n",
       "      <td>1000</td>\n",
       "      <td>0.360520</td>\n",
       "      <td>0.254</td>\n",
       "      <td>0.260</td>\n",
       "      <td>0.290</td>\n",
       "      <td>0.281</td>\n",
       "      <td>0.138</td>\n",
       "      <td>0.256</td>\n",
       "      <td>...</td>\n",
       "      <td>0.362</td>\n",
       "      <td>0.400</td>\n",
       "      <td>0.517</td>\n",
       "      <td>0.524</td>\n",
       "      <td>0.573</td>\n",
       "      <td>0.515</td>\n",
       "      <td>0.2675</td>\n",
       "      <td>0.2895</td>\n",
       "      <td>0.239489</td>\n",
       "      <td>0.251660</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>big-run-sampled_full_filtered_no_dedup</td>\n",
       "      <td>6</td>\n",
       "      <td>2000</td>\n",
       "      <td>0.373315</td>\n",
       "      <td>0.285</td>\n",
       "      <td>0.278</td>\n",
       "      <td>0.315</td>\n",
       "      <td>0.323</td>\n",
       "      <td>0.138</td>\n",
       "      <td>0.272</td>\n",
       "      <td>...</td>\n",
       "      <td>0.365</td>\n",
       "      <td>0.395</td>\n",
       "      <td>0.509</td>\n",
       "      <td>0.490</td>\n",
       "      <td>0.677</td>\n",
       "      <td>0.596</td>\n",
       "      <td>0.3075</td>\n",
       "      <td>0.3235</td>\n",
       "      <td>0.250318</td>\n",
       "      <td>0.261019</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>big-run-sampled_full_filtered_no_dedup</td>\n",
       "      <td>6</td>\n",
       "      <td>3000</td>\n",
       "      <td>0.388201</td>\n",
       "      <td>0.294</td>\n",
       "      <td>0.291</td>\n",
       "      <td>0.327</td>\n",
       "      <td>0.341</td>\n",
       "      <td>0.152</td>\n",
       "      <td>0.298</td>\n",
       "      <td>...</td>\n",
       "      <td>0.371</td>\n",
       "      <td>0.396</td>\n",
       "      <td>0.512</td>\n",
       "      <td>0.504</td>\n",
       "      <td>0.712</td>\n",
       "      <td>0.621</td>\n",
       "      <td>0.3220</td>\n",
       "      <td>0.3390</td>\n",
       "      <td>0.255646</td>\n",
       "      <td>0.266605</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>big-run-sampled_full_filtered_no_dedup</td>\n",
       "      <td>6</td>\n",
       "      <td>4000</td>\n",
       "      <td>0.393412</td>\n",
       "      <td>0.306</td>\n",
       "      <td>0.307</td>\n",
       "      <td>0.337</td>\n",
       "      <td>0.360</td>\n",
       "      <td>0.172</td>\n",
       "      <td>0.284</td>\n",
       "      <td>...</td>\n",
       "      <td>0.380</td>\n",
       "      <td>0.402</td>\n",
       "      <td>0.522</td>\n",
       "      <td>0.510</td>\n",
       "      <td>0.729</td>\n",
       "      <td>0.612</td>\n",
       "      <td>0.3100</td>\n",
       "      <td>0.3385</td>\n",
       "      <td>0.253048</td>\n",
       "      <td>0.266798</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>670</th>\n",
       "      <td>big-run-sampled_full_ind_minhash</td>\n",
       "      <td>6</td>\n",
       "      <td>163000</td>\n",
       "      <td>0.481842</td>\n",
       "      <td>0.427</td>\n",
       "      <td>0.393</td>\n",
       "      <td>0.488</td>\n",
       "      <td>0.579</td>\n",
       "      <td>0.242</td>\n",
       "      <td>0.358</td>\n",
       "      <td>...</td>\n",
       "      <td>0.420</td>\n",
       "      <td>0.397</td>\n",
       "      <td>0.587</td>\n",
       "      <td>0.568</td>\n",
       "      <td>0.885</td>\n",
       "      <td>0.809</td>\n",
       "      <td>0.4760</td>\n",
       "      <td>0.4595</td>\n",
       "      <td>0.305843</td>\n",
       "      <td>0.330238</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>671</th>\n",
       "      <td>big-run-sampled_full_ind_minhash</td>\n",
       "      <td>6</td>\n",
       "      <td>164000</td>\n",
       "      <td>0.482727</td>\n",
       "      <td>0.426</td>\n",
       "      <td>0.394</td>\n",
       "      <td>0.487</td>\n",
       "      <td>0.582</td>\n",
       "      <td>0.238</td>\n",
       "      <td>0.360</td>\n",
       "      <td>...</td>\n",
       "      <td>0.422</td>\n",
       "      <td>0.398</td>\n",
       "      <td>0.575</td>\n",
       "      <td>0.562</td>\n",
       "      <td>0.885</td>\n",
       "      <td>0.827</td>\n",
       "      <td>0.4745</td>\n",
       "      <td>0.4625</td>\n",
       "      <td>0.307377</td>\n",
       "      <td>0.332317</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>672</th>\n",
       "      <td>big-run-sampled_full_ind_minhash</td>\n",
       "      <td>6</td>\n",
       "      <td>165000</td>\n",
       "      <td>0.482413</td>\n",
       "      <td>0.423</td>\n",
       "      <td>0.397</td>\n",
       "      <td>0.482</td>\n",
       "      <td>0.573</td>\n",
       "      <td>0.238</td>\n",
       "      <td>0.360</td>\n",
       "      <td>...</td>\n",
       "      <td>0.409</td>\n",
       "      <td>0.396</td>\n",
       "      <td>0.581</td>\n",
       "      <td>0.569</td>\n",
       "      <td>0.889</td>\n",
       "      <td>0.829</td>\n",
       "      <td>0.4675</td>\n",
       "      <td>0.4600</td>\n",
       "      <td>0.308059</td>\n",
       "      <td>0.331304</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>673</th>\n",
       "      <td>big-run-sampled_full_ind_minhash</td>\n",
       "      <td>6</td>\n",
       "      <td>166000</td>\n",
       "      <td>0.482014</td>\n",
       "      <td>0.422</td>\n",
       "      <td>0.391</td>\n",
       "      <td>0.477</td>\n",
       "      <td>0.573</td>\n",
       "      <td>0.230</td>\n",
       "      <td>0.358</td>\n",
       "      <td>...</td>\n",
       "      <td>0.420</td>\n",
       "      <td>0.400</td>\n",
       "      <td>0.586</td>\n",
       "      <td>0.566</td>\n",
       "      <td>0.883</td>\n",
       "      <td>0.817</td>\n",
       "      <td>0.4660</td>\n",
       "      <td>0.4645</td>\n",
       "      <td>0.304975</td>\n",
       "      <td>0.329611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>674</th>\n",
       "      <td>big-run-sampled_full_ind_minhash</td>\n",
       "      <td>6</td>\n",
       "      <td>167000</td>\n",
       "      <td>0.486587</td>\n",
       "      <td>0.424</td>\n",
       "      <td>0.402</td>\n",
       "      <td>0.490</td>\n",
       "      <td>0.579</td>\n",
       "      <td>0.236</td>\n",
       "      <td>0.360</td>\n",
       "      <td>...</td>\n",
       "      <td>0.417</td>\n",
       "      <td>0.405</td>\n",
       "      <td>0.585</td>\n",
       "      <td>0.575</td>\n",
       "      <td>0.884</td>\n",
       "      <td>0.832</td>\n",
       "      <td>0.4760</td>\n",
       "      <td>0.4715</td>\n",
       "      <td>0.309503</td>\n",
       "      <td>0.332197</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>675 rows × 22 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                    runname  seed   steps  agg_score  \\\n",
       "0    big-run-sampled_full_filtered_no_dedup     6       0   0.330893   \n",
       "1    big-run-sampled_full_filtered_no_dedup     6    1000   0.360520   \n",
       "2    big-run-sampled_full_filtered_no_dedup     6    2000   0.373315   \n",
       "3    big-run-sampled_full_filtered_no_dedup     6    3000   0.388201   \n",
       "4    big-run-sampled_full_filtered_no_dedup     6    4000   0.393412   \n",
       "..                                      ...   ...     ...        ...   \n",
       "670        big-run-sampled_full_ind_minhash     6  163000   0.481842   \n",
       "671        big-run-sampled_full_ind_minhash     6  164000   0.482727   \n",
       "672        big-run-sampled_full_ind_minhash     6  165000   0.482413   \n",
       "673        big-run-sampled_full_ind_minhash     6  166000   0.482014   \n",
       "674        big-run-sampled_full_ind_minhash     6  167000   0.486587   \n",
       "\n",
       "     commonsense_qa/acc  commonsense_qa/acc_norm  hellaswag/acc  \\\n",
       "0                 0.186                    0.233          0.272   \n",
       "1                 0.254                    0.260          0.290   \n",
       "2                 0.285                    0.278          0.315   \n",
       "3                 0.294                    0.291          0.327   \n",
       "4                 0.306                    0.307          0.337   \n",
       "..                  ...                      ...            ...   \n",
       "670               0.427                    0.393          0.488   \n",
       "671               0.426                    0.394          0.487   \n",
       "672               0.423                    0.397          0.482   \n",
       "673               0.422                    0.391          0.477   \n",
       "674               0.424                    0.402          0.490   \n",
       "\n",
       "     hellaswag/acc_norm  openbookqa/acc  openbookqa/acc_norm  ...  siqa/acc  \\\n",
       "0                 0.258           0.166                0.286  ...     0.367   \n",
       "1                 0.281           0.138                0.256  ...     0.362   \n",
       "2                 0.323           0.138                0.272  ...     0.365   \n",
       "3                 0.341           0.152                0.298  ...     0.371   \n",
       "4                 0.360           0.172                0.284  ...     0.380   \n",
       "..                  ...             ...                  ...  ...       ...   \n",
       "670               0.579           0.242                0.358  ...     0.420   \n",
       "671               0.582           0.238                0.360  ...     0.422   \n",
       "672               0.573           0.238                0.360  ...     0.409   \n",
       "673               0.573           0.230                0.358  ...     0.420   \n",
       "674               0.579           0.236                0.360  ...     0.417   \n",
       "\n",
       "     siqa/acc_norm  winogrande/acc  winogrande/acc_norm  sciq/acc  \\\n",
       "0            0.362           0.516                0.497     0.209   \n",
       "1            0.400           0.517                0.524     0.573   \n",
       "2            0.395           0.509                0.490     0.677   \n",
       "3            0.396           0.512                0.504     0.712   \n",
       "4            0.402           0.522                0.510     0.729   \n",
       "..             ...             ...                  ...       ...   \n",
       "670          0.397           0.587                0.568     0.885   \n",
       "671          0.398           0.575                0.562     0.885   \n",
       "672          0.396           0.581                0.569     0.889   \n",
       "673          0.400           0.586                0.566     0.883   \n",
       "674          0.405           0.585                0.575     0.884   \n",
       "\n",
       "     sciq/acc_norm  arc/acc  arc/acc_norm  mmlu/acc  mmlu/acc_norm  \n",
       "0            0.202   0.2195        0.2510  0.230294       0.250147  \n",
       "1            0.515   0.2675        0.2895  0.239489       0.251660  \n",
       "2            0.596   0.3075        0.3235  0.250318       0.261019  \n",
       "3            0.621   0.3220        0.3390  0.255646       0.266605  \n",
       "4            0.612   0.3100        0.3385  0.253048       0.266798  \n",
       "..             ...      ...           ...       ...            ...  \n",
       "670          0.809   0.4760        0.4595  0.305843       0.330238  \n",
       "671          0.827   0.4745        0.4625  0.307377       0.332317  \n",
       "672          0.829   0.4675        0.4600  0.308059       0.331304  \n",
       "673          0.817   0.4660        0.4645  0.304975       0.329611  \n",
       "674          0.832   0.4760        0.4715  0.309503       0.332197  \n",
       "\n",
       "[675 rows x 22 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from matplotlib.figure import Figure\n",
    "\n",
    "df = pd.read_csv(\"../src_data/cross_ind_unfiltered_comparison.csv\")\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "b610f43caefdf01",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-30T15:08:02.401852Z",
     "start_time": "2024-04-30T15:08:02.399712Z"
    },
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "runs_mapping = {\n",
    "    \"big-run-refinedweb\": \"RefinedWeb\",\n",
    "    \"big-run-fineweb-cross-dedup-fixed\": \"FineWeb full MinHash\",\n",
    "    \"big-run-sampled_full_ind_minhash\": \"FineWeb independent MinHash\",\n",
    "    \"big-run-sampled_full_filtered_no_dedup\": \"FineWeb filtered only\"\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "initial_id",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-30T15:08:02.519228Z",
     "start_time": "2024-04-30T15:08:02.402938Z"
    },
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHHCAYAAABTMjf2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLBElEQVR4nO3deXRN5/7H8U8SMpEBkQEhhCo13qg0hipSKUr1Vg1VCS1tTVWp25pDq6KKq9fMbVHtLar0tjVW8GspNWtras3aSsyJOZI8vz+6cm6PJCRkEPv9Wuus5Tx59t7ffZ59zvnY03EwxhgBAABYkGNBFwAAAFBQCEIAAMCyCEIAAMCyCEIAAMCyCEIAAMCyCEIAAMCyCEIAAMCyCEIAAMCyCEIAAMCyCEKFyNGjR+Xg4KC5c+cWdCm5ojCtT17UOnfuXDk4OOjo0aO5Nk/86b333lOlSpXk5OSkOnXqFHQ5ecbBwUEjR47MtfmtX79eDg4OWr9+fa7NE9kXFBSkbt26FXQZlkMQyiPpX3Lbtm0r6FIsb9q0aYUibBV2Y8aM0RdffFHQZWj16tV644031LBhQ82ZM0djxowp6JIA3MOKFHQBQF6bNm2afHx8+J9WHhszZozat2+vdu3aFWgda9eulaOjoz744AM5OzsXaC0A7n3sEQJwX7hy5Yok6dSpU3Jzc8u1EGSM0dWrV3NlXig4165dU1paWkGXgXsQQSgfdevWTcWLF9fvv/+udu3aqXjx4ipdurQGDhyo1NRUu74XLlxQt27d5OXlJW9vb0VFRenChQuZznf//v1q3769SpYsKVdXV9WrV09ffvmlXZ/0Q3XffvutXn75ZZUqVUqenp6KjIzU+fPnM8xzxYoVaty4sYoVKyYPDw+1bt1ae/bsuefWZ+PGjYqOjlbp0qVVrFgxPf300zp9+rStX1BQkPbs2aP/+7//k4ODgxwcHPTYY49luty8qlWS9uzZo2bNmsnNzU3lypXT6NGjM/1Qzuqcj5vPHcjpeGZm7dq1tjH29vbWU089pX379tn16datm4KCgjJMO3LkSDk4ONjVffnyZc2bN8/2OqfXm953//796tChgzw9PVWqVCn1799f165dyzDvjz/+WCEhIXJzc1PJkiXVqVMnnThxwq7PY489pho1amj79u169NFH5e7uriFDhsjBwUFz5szR5cuXbXWkHxZNSUnR22+/reDgYLm4uCgoKEhDhgzR9evXM7zWTz75pFatWqV69erJzc1NM2fOtJ0/s2jRIo0aNUply5aVh4eH2rdvr8TERF2/fl2vvfaafH19Vbx4cXXv3j3DvL/55hs1atRI3t7eKl68uKpWraohQ4bcdqyuX7+uAQMGqHTp0vLw8FDbtm3122+/Zdr3999/1wsvvCA/Pz+5uLjooYce0ocffpih32+//aZ27dqpWLFi8vX11YABAzLUm/56ZLY39bHHHrN7L6W/PgsXLtSQIUPk7++vYsWKqW3bthnGLzPHjh1T7969VbVqVbm5ualUqVJ69tlnMz2H7sKFCxowYICCgoLk4uKicuXKKTIyUmfOnLGrZcGCBRo2bJjKli0rd3d3JSUlSZI+++wz2zbm4+Oj559/Xr///rvdMuLj49W9e3eVK1dOLi4uCggI0FNPPWVXz7Zt2xQRESEfHx+5ubmpYsWKeuGFF267rsYYjR49WuXKlZO7u7uaNm2a4fNVyvg+S5fZ+YXp2+369ett223NmjVt53stWbJENWvWlKurq0JCQrRz5067eaZ/nh8+fFgREREqVqyYypQpo7feekvGGLu+CxYsUEhIiDw8POTp6amaNWvq/fffv+1636s4NJbPUlNTFRERodDQUI0fP15r1qzRhAkTFBwcrF69ekn6803y1FNPacOGDXrllVdUrVo1LV26VFFRURnmt2fPHjVs2FBly5bVoEGDVKxYMS1atEjt2rXT559/rqefftquf9++feXt7a2RI0fqwIEDmj59uo4dO2b74JCk+fPnKyoqShEREXr33Xd15coVTZ8+XY0aNdLOnTvtvhgLen369eunEiVKKCYmRkePHtWkSZPUt29fLVy4UJI0adIk9evXT8WLF9fQoUMlSX5+flmOT17UGh8fr6ZNmyolJcXWb9asWXJzc8uyjuzKznhmZs2aNWrZsqUqVaqkkSNH6urVq5o8ebIaNmyoHTt2ZBp+bmX+/Pnq0aOH6tevr5deekmSFBwcbNenQ4cOCgoKUmxsrDZv3qx//etfOn/+vD766CNbn3feeUfDhw9Xhw4d1KNHD50+fVqTJ0/Wo48+qp07d8rb29vW9+zZs2rZsqU6deqk559/Xn5+fqpXr55mzZqlLVu26N///rckqUGDBpKkHj16aN68eWrfvr1ef/11/fDDD4qNjdW+ffu0dOlSu1oPHDigzp076+WXX1bPnj1VtWpV299iY2Pl5uamQYMG6eDBg5o8ebKKFi0qR0dHnT9/XiNHjtTmzZs1d+5cVaxYUSNGjJD05/by5JNPqlatWnrrrbfk4uKigwcPauPGjbd9fXv06KGPP/5Yzz33nBo0aKC1a9eqdevWGfolJCTokUcekYODg/r27avSpUtrxYoVevHFF5WUlKTXXntNknT16lU1b95cx48f16uvvqoyZcpo/vz5Wrt27W1ruZ133nlHDg4OevPNN3Xq1ClNmjRJ4eHh2rVr1y23+a1bt+r7779Xp06dVK5cOR09elTTp0/XY489pr1798rd3V2SdOnSJTVu3Fj79u3TCy+8oL/97W86c+aMvvzyS/3222/y8fGxzfPtt9+Ws7OzBg4cqOvXr8vZ2Vlz585V9+7d9fDDDys2NlYJCQl6//33tXHjRrtt7JlnntGePXvUr18/BQUF6dSpU/rmm290/Phx2/MWLVqodOnSGjRokLy9vXX06FEtWbLktq/RiBEjNHr0aLVq1UqtWrXSjh071KJFCyUnJ9/Va3/w4EE999xzevnll/X8889r/PjxatOmjWbMmKEhQ4aod+/ekv7chjt06KADBw7I0fF/+0NSU1P1xBNP6JFHHtG4ceO0cuVKxcTEKCUlRW+99ZakP8N8586d1bx5c7377ruSpH379mnjxo3q37//XdVfYAzyxJw5c4wks3XrVltbVFSUkWTeeustu75169Y1ISEhtudffPGFkWTGjRtna0tJSTGNGzc2ksycOXNs7c2bNzc1a9Y0165ds7WlpaWZBg0amCpVqmSoJyQkxCQnJ9vax40bZySZ//73v8YYYy5evGi8vb1Nz5497WqMj483Xl5edu33wvqEh4ebtLQ0W/uAAQOMk5OTuXDhgq3toYceMk2aNDHZkRe1vvbaa0aS+eGHH2xtp06dMl5eXkaSOXLkiK1dkomJiclQV4UKFUxUVFSG9b/deGalTp06xtfX15w9e9bWtnv3buPo6GgiIyNtbVFRUaZChQoZpo+JiTE3f3wUK1bMrsab+7Zt29auvXfv3kaS2b17tzHGmKNHjxonJyfzzjvv2PX76aefTJEiRezamzRpYiSZGTNmZFheVFSUKVasmF3brl27jCTTo0cPu/aBAwcaSWbt2rW2tgoVKhhJZuXKlXZ9161bZySZGjVq2L3mnTt3Ng4ODqZly5Z2/cPCwuxeu3/+859Gkjl9+nSGmm8lvfbevXvbtT/33HMZtpcXX3zRBAQEmDNnztj17dSpk/Hy8jJXrlwxxhgzadIkI8ksWrTI1ufy5cumcuXKRpJZt26d3euR2bg2adLE7n2V/vqULVvWJCUl2doXLVpkJJn333//luuZXttfbdq0yUgyH330ka1txIgRRpJZsmRJhv7pnwXptVSqVMluvsnJycbX19fUqFHDXL161db+9ddfG0lmxIgRxhhjzp8/bySZ9957L8t6ly5dmuEzPjtOnTplnJ2dTevWre0+u4YMGWIk2b3Wmb3PjPnf+/+vnx3p2+33339va1u1apWRZNzc3MyxY8ds7TNnzswwzumf5/369bO1paWlmdatWxtnZ2fbdtu/f3/j6elpUlJScrTe9zIOjRWAV155xe5548aNdfjwYdvz5cuXq0iRIrY9KpLk5OSkfv362U137tw5rV27Vh06dNDFixd15swZnTlzRmfPnlVERIR+/fXXDLt7X3rpJRUtWtT2vFevXipSpIiWL18u6c+0f+HCBXXu3Nk2vzNnzsjJyUmhoaFat27dPbc+f93z0bhxY6WmpurYsWMZ6syOvKh1+fLleuSRR1S/fn3b9KVLl1aXLl3uqMa/ut14ZubkyZPatWuXunXrppIlS9raa9Wqpccff/yW096NPn362D1Pf03Tl7dkyRKlpaWpQ4cOdtuev7+/qlSpkmHbc3FxUffu3bO17PRlREdH27W//vrrkqRly5bZtVesWFERERGZzisyMtLuNQ8NDZUxJsMhkdDQUJ04cUIpKSmSZNvT8N///jdH56qk1/7qq6/atafv3UlnjNHnn3+uNm3ayBhj9xpGREQoMTFRO3bssM0zICBA7du3t03v7u5u25t3NyIjI+Xh4WF73r59ewUEBNx2u/rr3qIbN27o7Nmzqly5sry9vW11S9Lnn3+u2rVrZ9g7LCnDXtCoqCi7+W7btk2nTp1S79695erqamtv3bq1HnzwQdt2kH6O2fr167M81Jw+nl9//bVu3Lhxy3X7qzVr1ig5OVn9+vWzq/fm8bwT1atXV1hYmO15aGioJKlZs2YqX758hva/fk6n69u3r+3f6XsWk5OTtWbNGkl/rvfly5f1zTff3HW99wqCUD5zdXVV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57M7nplZs2aNadiwoXFzczOenp6mTZs2Zu/evRn6rV692tSoUcM4OzubqlWrmo8//jjTMd6/f7959NFHjZubm91lwOl99+7da9q3b288PDxMiRIlTN++fe0uYU73+eefm0aNGplixYqZYsWKmQcffND06dPHHDhwwNanSZMm5qGHHsp0vbLaLm/cuGFGjRplKlasaIoWLWoCAwPN4MGD7W5/YMyflyG3bt06w/Tp29Znn31m157Vtpi+3umXHcfFxZmnnnrKlClTxjg7O5syZcqYzp07m19++SXT9firq1evmldffdWUKlXKFCtWzLRp08acOHEi09stJCQkmD59+pjAwEBTtGhR4+/vb5o3b25mzZpl1+/YsWOmbdu2xt3d3fj4+Jj+/fublStXZnj/GGPMhAkTTNmyZY2Li4tp2LCh2bZtW5aXz3/66adm8ODBxtfX17i5uZnWrVvbXbqdlfPnz5vu3bsbHx8fU7x4cRMREWH279+f6eX7Z8+eNX379jVly5Y1zs7Oply5ciYqKsp224CsxirdwoULTd26dY2Li4spWbKk6dKli/ntt99sfz9z5ozp06ePefDBB02xYsWMl5eXCQ0NtbvdwI4dO0znzp1N+fLljYuLi/H19TVPPvmk3WdkVlJTU82oUaNMQECAcXNzM4899pj5+eefM13X7du3m9DQUOPs7GzKly9vJk6cmOXl85ltt5JMnz597NqOHDmS4fYA6e+bQ4cOmRYtWhh3d3fj5+dnYmJiTGpqqq3f4sWLTYsWLYyvr6+tppdfftmcPHnytut9r3IwJo/PKsU9If0mYlu3blW9evUKuhzcpcI0niNHjtSoUaN0+vTpLPdsofBbv369mjZtqs8++8zusnwUDt26ddPixYt16dKlgi4l33GOEAAAsCyCEAAAsCyCEAAAsKwCPUfo22+/1Xvvvaft27fbLslt167dLadZv369oqOjtWfPHgUGBmrYsGGZ/jIyAADA7RToHqHLly+rdu3aGe4vkpUjR46odevWatq0qXbt2qXXXntNPXr00KpVq/K4UgAAcD+6Z64ac3BwuO0eoTfffFPLli2zu1lYp06ddOHChUL/WycAACD/FaobKm7atCnDreMjIiJu+au9169ft7vbZVpams6dO6dSpUrl6KcXAABAwTHG6OLFiypTpowcHXPvgFahCkLx8fHy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vvzyywoKCsrt+nId9xECAKDwKRQ3VPz5559Vo0aN3JpdniAIAQBQ+OTV9/dd3+jn4sWLmjVrlurXr6/atWvnRk0AAAD54o6D0LfffquoqCgFBARo/PjxatasmTZv3pybtQEAAOSpHJ0sHR8fr7lz5+qDDz5QUlKSOnTooOvXr+uLL75Q9erV86pGAACAPJHtPUJt2rRR1apV9eOPP2rSpEn6448/NHny5LysDQAAIE9le4/QihUr9Oqrr6pXr16qUqVKXtYEAACQL7K9R2jDhg26ePGiQkJCFBoaqilTpujMmTN5WRsAAECeynYQeuSRRzR79mydPHlSL7/8shYsWKAyZcooLS1N33zzjS5evHjHRUydOlVBQUFydXVVaGiotmzZkq3pFixYIAcHB7Vr1+6Olw0AAKwrx1eNFStWTC+88II2bNign376Sa+//rrGjh0rX19ftW3bNscFLFy4UNHR0YqJidGOHTtUu3ZtRURE6NSpU7ec7ujRoxo4cKAaN26c42UCAABId3kfoapVq2rcuHH67bff9Omnn97RPCZOnKiePXuqe/fuql69umbMmCF3d3d9+OGHWU6TmpqqLl26aNSoUapUqdKdlg8AACzurm+oKElOTk5q166dvvzyyxxNl5ycrO3btys8PPx/BTk6Kjw83PZL9pl566235OvrqxdffPG2y7h+/bqSkpLsHgAAAFIuBaE7debMGaWmpsrPz8+u3c/PT/Hx8ZlOs2HDBn3wwQeaPXt2tpYRGxsrLy8v2yMwMPCu6wYAAPeHAg1COXXx4kV17dpVs2fPlo+PT7amGTx4sBITE22PEydO5HGVAACgsMjRnaVzm4+Pj5ycnJSQkGDXnpCQIH9//wz9Dx06pKNHj6pNmza2trS0NElSkSJFdODAAQUHB9tN4+LiIhcXlzyoHgAAFHYFukfI2dlZISEhiouLs7WlpaUpLi5OYWFhGfo/+OCD+umnn7Rr1y7bo23btmratKl27drFYS8AAJAjBbpHSJKio6MVFRWlevXqqX79+po0aZIuX76s7t27S5IiIyNVtmxZxcbGytXVVTVq1LCb3tvbW5IytAMAANxOgQehjh076vTp0xoxYoTi4+NVp04drVy50nYC9fHjx+XoWKhOZQIAAIWEgzHGFHQR+SkpKUleXl5KTEyUp6dnQZcDAACyIa++v9nVAgAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALOueCEJTp05VUFCQXF1dFRoaqi1btmTZd/bs2WrcuLFKlCihEiVKKDw8/Jb9AQAAslLgQWjhwoWKjo5WTEyMduzYodq1aysiIkKnTp3KtP/69evVuXNnrVu3Tps2bVJgYKBatGih33//PZ8rBwAAhZ2DMcYUZAGhoaF6+OGHNWXKFElSWlqaAgMD1a9fPw0aNOi206empqpEiRKaMmWKIiMjb9s/KSlJXl5eSkxMlKen513XDwAA8l5efX8X6B6h5ORkbd++XeHh4bY2R0dHhYeHa9OmTdmax5UrV3Tjxg2VLFky079fv35dSUlJdg8AAACpgIPQmTNnlJqaKj8/P7t2Pz8/xcfHZ2seb775psqUKWMXpv4qNjZWXl5etkdgYOBd1w0AAO4PBX6O0N0YO3asFixYoKVLl8rV1TXTPoMHD1ZiYqLtceLEiXyuEgAA3KuKFOTCfXx85OTkpISEBLv2hIQE+fv733La8ePHa+zYsVqzZo1q1aqVZT8XFxe5uLjkSr0AAOD+UqB7hJydnRUSEqK4uDhbW1pamuLi4hQWFpbldOPGjdPbb7+tlStXql69evlRKgAAuA8V6B4hSYqOjlZUVJTq1aun+vXra9KkSbp8+bK6d+8uSYqMjFTZsmUVGxsrSXr33Xc1YsQI/ec//1FQUJDtXKLixYurePHiBbYeAACg8CnwINSxY0ed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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "import json\n",
    "import os\n",
    "from matplotlib import pyplot as plt\n",
    "metrics = ['agg_score', 'commonsense_qa/acc_norm', 'hellaswag/acc_norm', 'openbookqa/acc_norm', 'piqa/acc_norm',\n",
    "                   'siqa/acc_norm', 'winogrande/acc_norm', 'arc/acc_norm', 'mmlu/acc_norm']\n",
    "\n",
    "def normalize_runname(runname):\n",
    "    return runname.replace(\"/\", \"_\")\n",
    "\n",
    "grouped = (\n",
    "    df.groupby([\"runname\", \"steps\"])\n",
    "    .agg(\n",
    "        {\n",
    "            key: \"mean\" for key in metrics\n",
    "        }\n",
    "    )\n",
    "    .reset_index()\n",
    ")\n",
    "\n",
    "file_id=\"../assets/data/plots/ind_dedup_better\"\n",
    "files = {}\n",
    "for metric in metrics:\n",
    "    datas = {}\n",
    "    for name, group in grouped.groupby(\"runname\"):\n",
    "        group = group[[\"steps\", metric]].sort_values(by=\"steps\")\n",
    "        group = group.set_index(\"steps\")\n",
    "        rolling_avg = group\n",
    "        # rolling_avg = group.rolling(wjjjjjjjjjjjjjindow=5).mean()\n",
    "        datas[name] = {\n",
    "            \"x\": (rolling_avg.index * 2048 * 1024 * 1e-9).tolist(),\n",
    "            \"y\": rolling_avg[metric].tolist(),\n",
    "            \"label\": runs_mapping[name],\n",
    "        }\n",
    "    # Sort the datata based on the steps\n",
    "    datas = {k: v for k, v in sorted(datas.items(), key=lambda x: -x[1][\"y\"][-1])}\n",
    "    # Create a folder\n",
    "    os.makedirs(f\"{file_id}\", exist_ok=True)\n",
    "    with open(f\"{file_id}/{normalize_runname(metric)}.json\", \"w\") as f:\n",
    "        json.dump({\n",
    "            \"data\": datas,\n",
    "            \"layout\": {\n",
    "                \"title\": {\n",
    "                    \"text\": \"Independent dedup outperforms dedup across dumps\"\n",
    "                },\n",
    "            }\n",
    "        }, f)\n",
    "    files[metric] = {\"file\": f\"{normalize_runname(metric)}.json\"}\n",
    "# Create index\n",
    "with open(f\"{file_id}/index.json\", \"w\") as f:\n",
    "    json.dump({\n",
    "        \"files\": files,\n",
    "        \"settings\": {\n",
    "            \"defaultMetric\": \"agg_score\",\n",
    "            \"slider\":{\"min\":0,\"max\":30,\"default\":5}\n",
    "        }\n",
    "    }, f)\n",
    "        \n",
    "\n",
    "    \n",
    "# Add labels and legend\n",
    "plt.xlabel('Training tokens (billions)')\n",
    "plt.ylabel('Agg Score')\n",
    "plt.title('Independent dedup outperforms dedup across dumps')\n",
    "plt.legend()\n",
    "\n",
    "# Show the plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "af28ebbd054cdc33",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-30T15:08:02.522543Z",
     "start_time": "2024-04-30T15:08:02.520569Z"
    },
    "collapsed": false
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}