File size: 71,824 Bytes
2c3b1dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "74fc32e1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label\n",
      "1    5362\n",
      "0    4666\n",
      "3    2159\n",
      "4    1937\n",
      "2    1304\n",
      "5     572\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "from datasets import load_dataset\n",
    "import pandas as pd\n",
    "\n",
    "dataset = load_dataset(\"dair-ai/emotion\")\n",
    "label_names = dataset[\"train\"].features[\"label\"].names\n",
    "\n",
    "df = pd.DataFrame(dataset[\"train\"])\n",
    "print(df[\"label\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "53d69ac1",
   "metadata": {},
   "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>text</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>i didnt feel humiliated</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>i can go from feeling so hopeless to so damned...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>im grabbing a minute to post i feel greedy wrong</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>i am ever feeling nostalgic about the fireplac...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>i am feeling grouchy</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  label\n",
       "0                            i didnt feel humiliated      0\n",
       "1  i can go from feeling so hopeless to so damned...      0\n",
       "2   im grabbing a minute to post i feel greedy wrong      3\n",
       "3  i am ever feeling nostalgic about the fireplac...      2\n",
       "4                               i am feeling grouchy      3"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8ecaa77f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatasetDict({\n",
       "    train: Dataset({\n",
       "        features: ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'],\n",
       "        num_rows: 16000\n",
       "    })\n",
       "    validation: Dataset({\n",
       "        features: ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'],\n",
       "        num_rows: 2000\n",
       "    })\n",
       "    test: Dataset({\n",
       "        features: ['text', 'label', 'input_ids', 'token_type_ids', 'attention_mask'],\n",
       "        num_rows: 2000\n",
       "    })\n",
       "})"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## Tokenization\n",
    "\n",
    "from transformers import AutoTokenizer\n",
    "\n",
    "model_name = \"distilbert-base-uncased\"\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
    "\n",
    "def tokenize(batch):\n",
    "    return tokenizer(batch[\"text\"], padding=\"max_length\", truncation=True, max_length=64)\n",
    "\n",
    "tokenized = dataset.map(tokenize, batched=True)\n",
    "tokenized"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c57493f4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "853d3ad1823b4d799a0d052bfb2f3120",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Loading weights:   0%|          | 0/100 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[transformers] \u001b[1mDistilBertForSequenceClassification LOAD REPORT\u001b[0m from: distilbert-base-uncased\n",
      "Key                     | Status     | \n",
      "------------------------+------------+-\n",
      "vocab_layer_norm.bias   | UNEXPECTED | \n",
      "vocab_transform.weight  | UNEXPECTED | \n",
      "vocab_layer_norm.weight | UNEXPECTED | \n",
      "vocab_projector.bias    | UNEXPECTED | \n",
      "vocab_transform.bias    | UNEXPECTED | \n",
      "classifier.weight       | MISSING    | \n",
      "pre_classifier.bias     | MISSING    | \n",
      "pre_classifier.weight   | MISSING    | \n",
      "classifier.bias         | MISSING    | \n",
      "\n",
      "Notes:\n",
      "- UNEXPECTED:\tcan be ignored when loading from different task/architecture; not ok if you expect identical arch.\n",
      "- MISSING:\tthose params were newly initialized because missing from the checkpoint. Consider training on your downstream task.\n"
     ]
    }
   ],
   "source": [
    "from transformers import AutoModelForSequenceClassification\n",
    "import evaluate\n",
    "import numpy as np\n",
    "\n",
    "model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e0c904ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1ca364ae57b64117b96fa5434c7f0abe",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading builder script: 0.00B [00:00, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9526adea7bf942c494b1b7efceda5ca8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading builder script: 0.00B [00:00, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy = evaluate.load(\"accuracy\")\n",
    "f1 = evaluate.load(\"f1\")\n",
    "\n",
    "def compute_metrics(eval_pred):\n",
    "    logits, labels = eval_pred\n",
    "    preds = np.argmax(logits, axis=1)\n",
    "    return {\n",
    "        \"accuracy\": accuracy.compute(predictions=preds, references=labels)[\"accuracy\"],\n",
    "        \"f1_weighted\": f1.compute(predictions=preds, references=labels, average=\"weighted\")[\"f1\"]\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c513a282",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\torch\\utils\\data\\dataloader.py:775: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
      "  super().__init__(loader)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='1500' max='1500' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [1500/1500 1:04:28, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>F1 Weighted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.609121</td>\n",
       "      <td>0.200775</td>\n",
       "      <td>0.927500</td>\n",
       "      <td>0.928239</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.169215</td>\n",
       "      <td>0.148969</td>\n",
       "      <td>0.940500</td>\n",
       "      <td>0.940165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.116937</td>\n",
       "      <td>0.145599</td>\n",
       "      <td>0.936500</td>\n",
       "      <td>0.936436</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "383e8f3dd5fc475b9fcedc0f734ae052",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Writing model shards:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\torch\\utils\\data\\dataloader.py:775: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
      "  super().__init__(loader)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e62f75836b52450c824ab1c08c1b79f1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Writing model shards:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\torch\\utils\\data\\dataloader.py:775: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
      "  super().__init__(loader)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4b465b6d951b491085723e13b160c866",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Writing model shards:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "TrainOutput(global_step=1500, training_loss=0.2984243876139323, metrics={'train_runtime': 3870.143, 'train_samples_per_second': 12.403, 'train_steps_per_second': 0.388, 'total_flos': 794861088768000.0, 'train_loss': 0.2984243876139323, 'epoch': 3.0})"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from transformers import TrainingArguments, Trainer\n",
    "\n",
    "args = TrainingArguments(\n",
    "    output_dir=\"./results\",\n",
    "    eval_strategy=\"epoch\",\n",
    "    save_strategy=\"epoch\",\n",
    "    learning_rate=2e-5,\n",
    "    per_device_train_batch_size=32,\n",
    "    per_device_eval_batch_size=32,\n",
    "    num_train_epochs=3,\n",
    "    weight_decay=0.01,\n",
    "    load_best_model_at_end=True,\n",
    "    metric_for_best_model=\"f1_weighted\",\n",
    "    report_to=\"none\"\n",
    ")\n",
    "\n",
    "trainer = Trainer(\n",
    "    model=model,\n",
    "    args=args,\n",
    "    train_dataset=tokenized[\"train\"],\n",
    "    eval_dataset=tokenized[\"validation\"],\n",
    "    compute_metrics=compute_metrics\n",
    ")\n",
    "\n",
    "trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "863e5b7f",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\torch\\utils\\data\\dataloader.py:775: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
      "  super().__init__(loader)\n"
     ]
    },
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "     sadness       0.96      0.96      0.96       581\n",
      "         joy       0.94      0.96      0.95       695\n",
      "        love       0.87      0.79      0.83       159\n",
      "       anger       0.95      0.90      0.92       275\n",
      "        fear       0.90      0.88      0.89       224\n",
      "    surprise       0.70      0.83      0.76        66\n",
      "\n",
      "    accuracy                           0.93      2000\n",
      "   macro avg       0.88      0.89      0.88      2000\n",
      "weighted avg       0.93      0.93      0.93      2000\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix, classification_report\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "preds = trainer.predict(tokenized[\"test\"])\n",
    "pred = np.argmax(preds.predictions, axis=1)\n",
    "y_true = tokenized[\"test\"][\"label\"]\n",
    "\n",
    "print(classification_report(y_true, pred, target_names=label_names))\n",
    "\n",
    "cm = confusion_matrix(y_true, pred)\n",
    "sns.heatmap(cm, annot=True, fmt=\"d\", xticklabels=label_names, yticklabels=label_names, cmap=\"Blues\")\n",
    "plt.xlabel(\"Predicted\")\n",
    "plt.ylabel(\"True\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a99c42dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "from huggingface_hub import login\n",
    "login()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c1d401db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9ae732c123cb44f3bfdb52384a5e89a9",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Writing model shards:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "418a36d0b5c04b6ea2b802ffa3c77362",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Processing Files (0 / 0): |          |  0.00B /  0.00B            "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a9115a850356447ea694d05345245446",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "New Data Upload: |          |  0.00B /  0.00B            "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mKeyboardInterrupt\u001b[39m                         Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[10]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpush_to_hub\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mTrunkSam/support-emotion-classifier\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m      2\u001b[39m tokenizer.push_to_hub(\u001b[33m\"\u001b[39m\u001b[33mTrunkSam/support-emotion-classifier\u001b[39m\u001b[33m\"\u001b[39m)\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\transformers\\modeling_utils.py:3601\u001b[39m, in \u001b[36mPreTrainedModel.push_to_hub\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m   3599\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m tags:\n\u001b[32m   3600\u001b[39m     kwargs[\u001b[33m\"\u001b[39m\u001b[33mtags\u001b[39m\u001b[33m\"\u001b[39m] = tags\n\u001b[32m-> \u001b[39m\u001b[32m3601\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpush_to_hub\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\transformers\\utils\\hub.py:814\u001b[39m, in \u001b[36mPushToHubMixin.push_to_hub\u001b[39m\u001b[34m(self, repo_id, commit_message, commit_description, private, token, revision, create_pr, max_shard_size, tags)\u001b[39m\n\u001b[32m    811\u001b[39m model_card.save(os.path.join(tmp_dir, \u001b[33m\"\u001b[39m\u001b[33mREADME.md\u001b[39m\u001b[33m\"\u001b[39m))\n\u001b[32m    813\u001b[39m \u001b[38;5;66;03m# Upload\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m814\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_upload_modified_files\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    815\u001b[39m \u001b[43m    \u001b[49m\u001b[43mtmp_dir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    816\u001b[39m \u001b[43m    \u001b[49m\u001b[43mrepo_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    817\u001b[39m \u001b[43m    \u001b[49m\u001b[43mfiles_timestamps\u001b[49m\u001b[43m=\u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    818\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcommit_message\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcommit_message\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    819\u001b[39m \u001b[43m    \u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    820\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    821\u001b[39m \u001b[43m    \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    822\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcommit_description\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcommit_description\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    823\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\transformers\\utils\\hub.py:729\u001b[39m, in \u001b[36mPushToHubMixin._upload_modified_files\u001b[39m\u001b[34m(self, working_dir, repo_id, files_timestamps, commit_message, token, create_pr, revision, commit_description)\u001b[39m\n\u001b[32m    726\u001b[39m             \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[32m    728\u001b[39m logger.info(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mUploading the following files to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrepo_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m,\u001b[39m\u001b[33m'\u001b[39m.join(modified_files)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m729\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mhf_api\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcreate_commit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    730\u001b[39m \u001b[43m    \u001b[49m\u001b[43mrepo_id\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrepo_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    731\u001b[39m \u001b[43m    \u001b[49m\u001b[43moperations\u001b[49m\u001b[43m=\u001b[49m\u001b[43moperations\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    732\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcommit_message\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcommit_message\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    733\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcommit_description\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcommit_description\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    734\u001b[39m \u001b[43m    \u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    735\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    736\u001b[39m \u001b[43m    \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    737\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\utils\\_validators.py:88\u001b[39m, in \u001b[36mvalidate_hf_hub_args.<locals>._inner_fn\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m     84\u001b[39m         validate_repo_id(arg_value)\n\u001b[32m     86\u001b[39m kwargs = smoothly_deprecate_legacy_arguments(fn_name=fn.\u001b[34m__name__\u001b[39m, kwargs=kwargs)\n\u001b[32m---> \u001b[39m\u001b[32m88\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\hf_api.py:2164\u001b[39m, in \u001b[36mfuture_compatible.<locals>._inner\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m   2161\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.run_as_future(fn, \u001b[38;5;28mself\u001b[39m, *args, **kwargs)\n\u001b[32m   2163\u001b[39m \u001b[38;5;66;03m# Otherwise, call the function normally\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m2164\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\hf_api.py:5277\u001b[39m, in \u001b[36mHfApi.create_commit\u001b[39m\u001b[34m(self, repo_id, operations, commit_message, commit_description, token, repo_type, revision, create_pr, num_threads, parent_commit, run_as_future, _hot_reload)\u001b[39m\n\u001b[32m   5274\u001b[39m \u001b[38;5;66;03m# If updating twice the same file or update then delete a file in a single commit\u001b[39;00m\n\u001b[32m   5275\u001b[39m _warn_on_overwriting_operations(operations)\n\u001b[32m-> \u001b[39m\u001b[32m5277\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpreupload_lfs_files\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m   5278\u001b[39m \u001b[43m    \u001b[49m\u001b[43mrepo_id\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrepo_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5279\u001b[39m \u001b[43m    \u001b[49m\u001b[43madditions\u001b[49m\u001b[43m=\u001b[49m\u001b[43madditions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5280\u001b[39m \u001b[43m    \u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5281\u001b[39m \u001b[43m    \u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5282\u001b[39m \u001b[43m    \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43munquoted_revision\u001b[49m\u001b[43m,\u001b[49m\u001b[43m  \u001b[49m\u001b[38;5;66;43;03m# first-class methods take unquoted revision\u001b[39;49;00m\n\u001b[32m   5283\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5284\u001b[39m \u001b[43m    \u001b[49m\u001b[43mnum_threads\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnum_threads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5285\u001b[39m \u001b[43m    \u001b[49m\u001b[43mfree_memory\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m  \u001b[49m\u001b[38;5;66;43;03m# do not remove `CommitOperationAdd.path_or_fileobj` on LFS files for \"normal\" users\u001b[39;49;00m\n\u001b[32m   5286\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   5288\u001b[39m files_to_copy = _fetch_files_to_copy(\n\u001b[32m   5289\u001b[39m     copies=copies,\n\u001b[32m   5290\u001b[39m     repo_type=repo_type,\n\u001b[32m   (...)\u001b[39m\u001b[32m   5294\u001b[39m     endpoint=\u001b[38;5;28mself\u001b[39m.endpoint,\n\u001b[32m   5295\u001b[39m )\n\u001b[32m   5297\u001b[39m \u001b[38;5;28mself\u001b[39m._duplicate_lfs_files(\n\u001b[32m   5298\u001b[39m     repo_id=repo_id, copies=copies, files_to_copy=files_to_copy, token=token, repo_type=repo_type\n\u001b[32m   5299\u001b[39m )\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\hf_api.py:5536\u001b[39m, in \u001b[36mHfApi.preupload_lfs_files\u001b[39m\u001b[34m(self, repo_id, additions, token, repo_type, revision, create_pr, num_threads, free_memory, gitignore_content)\u001b[39m\n\u001b[32m   5524\u001b[39m \u001b[38;5;66;03m# Prepare upload parameters\u001b[39;00m\n\u001b[32m   5525\u001b[39m upload_kwargs = {\n\u001b[32m   5526\u001b[39m     \u001b[33m\"\u001b[39m\u001b[33madditions\u001b[39m\u001b[33m\"\u001b[39m: new_lfs_additions_to_upload,\n\u001b[32m   5527\u001b[39m     \u001b[33m\"\u001b[39m\u001b[33mrepo_type\u001b[39m\u001b[33m\"\u001b[39m: repo_type,\n\u001b[32m   (...)\u001b[39m\u001b[32m   5534\u001b[39m     \u001b[33m\"\u001b[39m\u001b[33mrevision\u001b[39m\u001b[33m\"\u001b[39m: revision \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m create_pr \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m   5535\u001b[39m }\n\u001b[32m-> \u001b[39m\u001b[32m5536\u001b[39m \u001b[43m_upload_files\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m   5537\u001b[39m \u001b[43m    \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mupload_kwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m  \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[32m   5538\u001b[39m \u001b[43m    \u001b[49m\u001b[43mnum_threads\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnum_threads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5539\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   5540\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   5541\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m addition \u001b[38;5;129;01min\u001b[39;00m new_lfs_additions_to_upload:\n\u001b[32m   5542\u001b[39m     addition._is_uploaded = \u001b[38;5;28;01mTrue\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\utils\\_validators.py:88\u001b[39m, in \u001b[36mvalidate_hf_hub_args.<locals>._inner_fn\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m     84\u001b[39m         validate_repo_id(arg_value)\n\u001b[32m     86\u001b[39m kwargs = smoothly_deprecate_legacy_arguments(fn_name=fn.\u001b[34m__name__\u001b[39m, kwargs=kwargs)\n\u001b[32m---> \u001b[39m\u001b[32m88\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\_commit_api.py:397\u001b[39m, in \u001b[36m_upload_files\u001b[39m\u001b[34m(additions, repo_type, repo_id, headers, endpoint, num_threads, revision, create_pr)\u001b[39m\n\u001b[32m    395\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m is_xet_available():\n\u001b[32m    396\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_buffered_io_data:\n\u001b[32m--> \u001b[39m\u001b[32m397\u001b[39m         \u001b[43m_upload_xet_files\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    398\u001b[39m \u001b[43m            \u001b[49m\u001b[43madditions\u001b[49m\u001b[43m=\u001b[49m\u001b[43madditions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    399\u001b[39m \u001b[43m            \u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    400\u001b[39m \u001b[43m            \u001b[49m\u001b[43mrepo_id\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrepo_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    401\u001b[39m \u001b[43m            \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    402\u001b[39m \u001b[43m            \u001b[49m\u001b[43mendpoint\u001b[49m\u001b[43m=\u001b[49m\u001b[43mendpoint\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    403\u001b[39m \u001b[43m            \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    404\u001b[39m \u001b[43m            \u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcreate_pr\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    405\u001b[39m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    406\u001b[39m         \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[32m    407\u001b[39m     logger.warning(\n\u001b[32m    408\u001b[39m         \u001b[33m\"\u001b[39m\u001b[33mUploading files as a binary IO buffer is not supported by Xet Storage. Falling back to HTTP upload.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m    409\u001b[39m     )\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\utils\\_validators.py:88\u001b[39m, in \u001b[36mvalidate_hf_hub_args.<locals>._inner_fn\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m     84\u001b[39m         validate_repo_id(arg_value)\n\u001b[32m     86\u001b[39m kwargs = smoothly_deprecate_legacy_arguments(fn_name=fn.\u001b[34m__name__\u001b[39m, kwargs=kwargs)\n\u001b[32m---> \u001b[39m\u001b[32m88\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\TrunkSam\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\huggingface_hub\\_commit_api.py:658\u001b[39m, in \u001b[36m_upload_xet_files\u001b[39m\u001b[34m(additions, repo_type, repo_id, headers, endpoint, revision, create_pr)\u001b[39m\n\u001b[32m    655\u001b[39m all_paths_ops = [op \u001b[38;5;28;01mfor\u001b[39;00m op \u001b[38;5;129;01min\u001b[39;00m additions \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(op.path_or_fileobj, (\u001b[38;5;28mstr\u001b[39m, Path))]\n\u001b[32m    657\u001b[39m handles: \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mtuple\u001b[39m[CommitOperationAdd, Any]] = []\n\u001b[32m--> \u001b[39m\u001b[32m658\u001b[39m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msession\u001b[49m\u001b[43m.\u001b[49m\u001b[43mnew_upload_commit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    659\u001b[39m \u001b[43m    \u001b[49m\u001b[43mtoken_refresh_url\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrefresh_url\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    660\u001b[39m \u001b[43m    \u001b[49m\u001b[43mtoken_refresh_headers\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    661\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcustom_headers\u001b[49m\u001b[43m=\u001b[49m\u001b[43mxet_headers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    662\u001b[39m \u001b[43m    \u001b[49m\u001b[43mprogress_callback\u001b[49m\u001b[43m=\u001b[49m\u001b[43mprogress_callback\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    663\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcommit\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m    664\u001b[39m \u001b[43m    \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mop\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mall_paths_ops\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m    665\u001b[39m \u001b[43m        \u001b[49m\u001b[43mhandles\u001b[49m\u001b[43m.\u001b[49m\u001b[43mappend\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommit\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstart_upload_file\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mstr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mop\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpath_or_fileobj\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msha256\u001b[49m\u001b[43m=\u001b[49m\u001b[43m_sha256_arg\u001b[49m\u001b[43m(\u001b[49m\u001b[43mop\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[31mKeyboardInterrupt\u001b[39m: "
     ]
    }
   ],
   "source": [
    "model.push_to_hub(\"TrunkSam/support-emotion-classifier\")\n",
    "tokenizer.push_to_hub(\"TrunkSam/support-emotion-classifier\")"
   ]
  }
 ],
 "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.13.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}