Marwan-Tamer commited on
Commit
bd15f1a
·
1 Parent(s): 7a89d30

fix: repair module 2 notebook execution

Browse files
.gitignore CHANGED
@@ -13,6 +13,7 @@ src/models/saved_emotion_model/
13
  src/models/saved_*/
14
  checkpoints/
15
  runs/
 
16
 
17
  # Local secrets and editor files
18
  .env
 
13
  src/models/saved_*/
14
  checkpoints/
15
  runs/
16
+ .hf_cache/
17
 
18
  # Local secrets and editor files
19
  .env
notebooks/module_2_emotion_training.ipynb CHANGED
@@ -29,7 +29,13 @@
29
  "metadata": {},
30
  "outputs": [],
31
  "source": [
32
- "!nvidia-smi"
 
 
 
 
 
 
33
  ]
34
  },
35
  {
@@ -39,7 +45,27 @@
39
  "metadata": {},
40
  "outputs": [],
41
  "source": [
42
- "%pip -q install -U transformers datasets accelerate evaluate scikit-learn pandas"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  ]
44
  },
45
  {
@@ -72,6 +98,7 @@
72
  "outputs": [],
73
  "source": [
74
  "import json\n",
 
75
  "import sys\n",
76
  "from inspect import signature\n",
77
  "from pathlib import Path\n",
@@ -80,16 +107,20 @@
80
  "import pandas as pd\n",
81
  "from datasets import load_dataset\n",
82
  "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, f1_score\n",
83
- "from transformers import AutoModelForSequenceClassification, AutoTokenizer, DataCollatorWithPadding, Trainer, TrainingArguments\n",
84
  "\n",
85
  "PROJECT_ROOT = Path.cwd().resolve().parent if Path.cwd().name == 'notebooks' else Path.cwd().resolve()\n",
86
  "MODEL_DIR = PROJECT_ROOT / 'src' / 'models' / 'saved_emotion_model'\n",
87
  "REPORT_DIR = PROJECT_ROOT / 'reports' / 'module_2_emotion_classification'\n",
 
88
  "MODEL_NAME = 'distilbert-base-uncased'\n",
 
89
  "\n",
90
  "MODEL_DIR.mkdir(parents=True, exist_ok=True)\n",
91
  "REPORT_DIR.mkdir(parents=True, exist_ok=True)\n",
92
- "sys.path.append(str(PROJECT_ROOT / 'src' / 'models'))"
 
 
93
  ]
94
  },
95
  {
@@ -100,6 +131,13 @@
100
  "outputs": [],
101
  "source": [
102
  "dataset = load_dataset('dair-ai/emotion', 'split')\n",
 
 
 
 
 
 
 
103
  "label_names = dataset['train'].features['label'].names\n",
104
  "id2label = {i: label for i, label in enumerate(label_names)}\n",
105
  "label2id = {label: i for i, label in id2label.items()}\n",
@@ -116,14 +154,14 @@
116
  "metadata": {},
117
  "outputs": [],
118
  "source": [
119
- "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n",
120
  "\n",
121
  "def tokenize(batch):\n",
122
  " return tokenizer(batch['text'], truncation=True, max_length=128)\n",
123
  "\n",
124
  "encoded = dataset.map(tokenize, batched=True)\n",
125
  "encoded = encoded.rename_column('label', 'labels')\n",
126
- "encoded.set_format(type='torch', columns=['input_ids', 'attention_mask', 'labels'])\n",
127
  "data_collator = DataCollatorWithPadding(tokenizer=tokenizer)"
128
  ]
129
  },
@@ -134,13 +172,27 @@
134
  "metadata": {},
135
  "outputs": [],
136
  "source": [
137
- "model = AutoModelForSequenceClassification.from_pretrained(\n",
138
  " MODEL_NAME,\n",
139
  " num_labels=len(label_names),\n",
140
  " id2label=id2label,\n",
141
  " label2id=label2id,\n",
 
142
  ")\n",
143
  "\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  "def compute_metrics(eval_pred):\n",
145
  " logits, labels = eval_pred\n",
146
  " predictions = np.argmax(logits, axis=-1)\n",
@@ -154,13 +206,14 @@
154
  " 'learning_rate': 2e-5,\n",
155
  " 'per_device_train_batch_size': 16,\n",
156
  " 'per_device_eval_batch_size': 32,\n",
157
- " 'num_train_epochs': 3,\n",
158
  " 'weight_decay': 0.01,\n",
159
- " 'save_strategy': 'epoch',\n",
160
- " 'load_best_model_at_end': True,\n",
161
  " 'metric_for_best_model': 'macro_f1',\n",
162
  " 'greater_is_better': True,\n",
163
- " 'logging_steps': 50,\n",
 
164
  " 'report_to': 'none',\n",
165
  "}\n",
166
  "\n",
@@ -213,9 +266,10 @@
213
  "model.save_pretrained(MODEL_DIR)\n",
214
  "tokenizer.save_pretrained(MODEL_DIR)\n",
215
  "\n",
216
- "report_text = classification_report(test_labels, test_predictions, target_names=label_names, zero_division=0)\n",
217
- "report_dict = classification_report(test_labels, test_predictions, target_names=label_names, output_dict=True, zero_division=0)\n",
218
- "matrix = confusion_matrix(test_labels, test_predictions)\n",
 
219
  "\n",
220
  "(REPORT_DIR / 'test_classification_report.txt').write_text(report_text, encoding='utf-8')\n",
221
  "pd.DataFrame(report_dict).transpose().to_csv(REPORT_DIR / 'test_classification_report.csv')\n",
 
29
  "metadata": {},
30
  "outputs": [],
31
  "source": [
32
+ "import shutil\n",
33
+ "import subprocess\n",
34
+ "\n",
35
+ "if shutil.which('nvidia-smi'):\n",
36
+ " subprocess.run(['nvidia-smi'], check=False)\n",
37
+ "else:\n",
38
+ " print('No NVIDIA GPU detected in this runtime. Use Colab T4 for full training.')"
39
  ]
40
  },
41
  {
 
45
  "metadata": {},
46
  "outputs": [],
47
  "source": [
48
+ "import os\n",
49
+ "import subprocess\n",
50
+ "import sys\n",
51
+ "\n",
52
+ "if os.getenv('FAST_DEV_RUN', '0') == '1':\n",
53
+ " print('Skipping package install during local FAST_DEV_RUN.')\n",
54
+ "else:\n",
55
+ " subprocess.check_call([\n",
56
+ " sys.executable,\n",
57
+ " '-m',\n",
58
+ " 'pip',\n",
59
+ " 'install',\n",
60
+ " '-q',\n",
61
+ " '-U',\n",
62
+ " 'transformers>=4.40,<5',\n",
63
+ " 'datasets>=2.18,<5',\n",
64
+ " 'accelerate>=0.28',\n",
65
+ " 'evaluate>=0.4',\n",
66
+ " 'scikit-learn>=1.4',\n",
67
+ " ])\n",
68
+ "# Do not upgrade pandas in Colab; Colab/GPU packages often pin pandas < 3."
69
  ]
70
  },
71
  {
 
98
  "outputs": [],
99
  "source": [
100
  "import json\n",
101
+ "import os\n",
102
  "import sys\n",
103
  "from inspect import signature\n",
104
  "from pathlib import Path\n",
 
107
  "import pandas as pd\n",
108
  "from datasets import load_dataset\n",
109
  "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, f1_score\n",
110
+ "from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer, DataCollatorWithPadding, Trainer, TrainingArguments\n",
111
  "\n",
112
  "PROJECT_ROOT = Path.cwd().resolve().parent if Path.cwd().name == 'notebooks' else Path.cwd().resolve()\n",
113
  "MODEL_DIR = PROJECT_ROOT / 'src' / 'models' / 'saved_emotion_model'\n",
114
  "REPORT_DIR = PROJECT_ROOT / 'reports' / 'module_2_emotion_classification'\n",
115
+ "CACHE_DIR = PROJECT_ROOT / '.hf_cache'\n",
116
  "MODEL_NAME = 'distilbert-base-uncased'\n",
117
+ "FAST_DEV_RUN = os.getenv('FAST_DEV_RUN', '0') == '1'\n",
118
  "\n",
119
  "MODEL_DIR.mkdir(parents=True, exist_ok=True)\n",
120
  "REPORT_DIR.mkdir(parents=True, exist_ok=True)\n",
121
+ "CACHE_DIR.mkdir(parents=True, exist_ok=True)\n",
122
+ "sys.path.append(str(PROJECT_ROOT / 'src' / 'models'))\n",
123
+ "print(f'FAST_DEV_RUN={FAST_DEV_RUN}')"
124
  ]
125
  },
126
  {
 
131
  "outputs": [],
132
  "source": [
133
  "dataset = load_dataset('dair-ai/emotion', 'split')\n",
134
+ "\n",
135
+ "if FAST_DEV_RUN:\n",
136
+ " dataset = dataset.shuffle(seed=42)\n",
137
+ " dataset['train'] = dataset['train'].select(range(64))\n",
138
+ " dataset['validation'] = dataset['validation'].select(range(32))\n",
139
+ " dataset['test'] = dataset['test'].select(range(32))\n",
140
+ "\n",
141
  "label_names = dataset['train'].features['label'].names\n",
142
  "id2label = {i: label for i, label in enumerate(label_names)}\n",
143
  "label2id = {label: i for i, label in id2label.items()}\n",
 
154
  "metadata": {},
155
  "outputs": [],
156
  "source": [
157
+ "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, cache_dir=CACHE_DIR)\n",
158
  "\n",
159
  "def tokenize(batch):\n",
160
  " return tokenizer(batch['text'], truncation=True, max_length=128)\n",
161
  "\n",
162
  "encoded = dataset.map(tokenize, batched=True)\n",
163
  "encoded = encoded.rename_column('label', 'labels')\n",
164
+ "encoded = encoded.remove_columns(['text'])\n",
165
  "data_collator = DataCollatorWithPadding(tokenizer=tokenizer)"
166
  ]
167
  },
 
172
  "metadata": {},
173
  "outputs": [],
174
  "source": [
175
+ "config = AutoConfig.from_pretrained(\n",
176
  " MODEL_NAME,\n",
177
  " num_labels=len(label_names),\n",
178
  " id2label=id2label,\n",
179
  " label2id=label2id,\n",
180
+ " cache_dir=CACHE_DIR,\n",
181
  ")\n",
182
  "\n",
183
+ "if FAST_DEV_RUN:\n",
184
+ " config.dim = 64\n",
185
+ " config.hidden_dim = 128\n",
186
+ " config.n_layers = 1\n",
187
+ " config.n_heads = 2\n",
188
+ " model = AutoModelForSequenceClassification.from_config(config)\n",
189
+ "else:\n",
190
+ " model = AutoModelForSequenceClassification.from_pretrained(\n",
191
+ " MODEL_NAME,\n",
192
+ " config=config,\n",
193
+ " cache_dir=CACHE_DIR,\n",
194
+ " )\n",
195
+ "\n",
196
  "def compute_metrics(eval_pred):\n",
197
  " logits, labels = eval_pred\n",
198
  " predictions = np.argmax(logits, axis=-1)\n",
 
206
  " 'learning_rate': 2e-5,\n",
207
  " 'per_device_train_batch_size': 16,\n",
208
  " 'per_device_eval_batch_size': 32,\n",
209
+ " 'num_train_epochs': 1 if FAST_DEV_RUN else 3,\n",
210
  " 'weight_decay': 0.01,\n",
211
+ " 'save_strategy': 'no' if FAST_DEV_RUN else 'epoch',\n",
212
+ " 'load_best_model_at_end': False if FAST_DEV_RUN else True,\n",
213
  " 'metric_for_best_model': 'macro_f1',\n",
214
  " 'greater_is_better': True,\n",
215
+ " 'logging_steps': 1 if FAST_DEV_RUN else 50,\n",
216
+ " 'max_steps': 2 if FAST_DEV_RUN else -1,\n",
217
  " 'report_to': 'none',\n",
218
  "}\n",
219
  "\n",
 
266
  "model.save_pretrained(MODEL_DIR)\n",
267
  "tokenizer.save_pretrained(MODEL_DIR)\n",
268
  "\n",
269
+ "all_label_ids = list(range(len(label_names)))\n",
270
+ "report_text = classification_report(test_labels, test_predictions, labels=all_label_ids, target_names=label_names, zero_division=0)\n",
271
+ "report_dict = classification_report(test_labels, test_predictions, labels=all_label_ids, target_names=label_names, output_dict=True, zero_division=0)\n",
272
+ "matrix = confusion_matrix(test_labels, test_predictions, labels=all_label_ids)\n",
273
  "\n",
274
  "(REPORT_DIR / 'test_classification_report.txt').write_text(report_text, encoding='utf-8')\n",
275
  "pd.DataFrame(report_dict).transpose().to_csv(REPORT_DIR / 'test_classification_report.csv')\n",