PEFT/conditional-generation
4
1{2 "cells": [3 {4 "cell_type": "code",5 "execution_count": null,6 "id": "71fbfca2",7 "metadata": {},8 "outputs": [],9 "source": [10 "from transformers import AutoModelForSeq2SeqLM\n",11 "from peft import PeftModel, PeftConfig\n",12 "import torch\n",13 "from datasets import load_dataset\n",14 "import os\n",15 "from transformers import AutoTokenizer\n",16 "from torch.utils.data import DataLoader\n",17 "from transformers import default_data_collator, get_linear_schedule_with_warmup\n",18 "from tqdm import tqdm\n",19 "from datasets import load_dataset\n",20 "\n",21 "dataset_name = \"twitter_complaints\"\n",22 "text_column = \"Tweet text\"\n",23 "label_column = \"text_label\"\n",24 "batch_size = 8\n",25 "\n",26 "peft_model_id = \"smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM\"\n",27 "config = PeftConfig.from_pretrained(peft_model_id)"28 ]29 },30 {31 "cell_type": "code",32 "execution_count": 2,33 "id": "cc55820a",34 "metadata": {},35 "outputs": [],36 "source": [37 "peft_model_id = \"smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM\"\n",38 "max_memory = {0: \"6GIB\", 1: \"0GIB\", 2: \"0GIB\", 3: \"0GIB\", 4: \"0GIB\", \"cpu\": \"30GB\"}\n",39 "config = PeftConfig.from_pretrained(peft_model_id)\n",40 "model = AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path, device_map=\"auto\", max_memory=max_memory)\n",41 "model = PeftModel.from_pretrained(model, peft_model_id, device_map=\"auto\", max_memory=max_memory)"42 ]43 },44 {45 "cell_type": "code",46 "execution_count": null,47 "id": "e1a3648b",48 "metadata": {},49 "outputs": [],50 "source": [51 "from datasets import load_dataset\n",52 "\n",53 "dataset = load_dataset(\"ought/raft\", dataset_name)\n",54 "\n",55 "classes = [k.replace(\"_\", \" \") for k in dataset[\"train\"].features[\"Label\"].names]\n",56 "print(classes)\n",57 "dataset = dataset.map(\n",58 " lambda x: {\"text_label\": [classes[label] for label in x[\"Label\"]]},\n",59 " batched=True,\n",60 " num_proc=1,\n",61 ")\n",62 "print(dataset)\n",63 "dataset[\"train\"][0]"64 ]65 },66 {67 "cell_type": "code",68 "execution_count": null,69 "id": "fe12d4d3",70 "metadata": {},71 "outputs": [],72 "source": [73 "tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)\n",74 "target_max_length = max([len(tokenizer(class_label)[\"input_ids\"]) for class_label in classes])\n",75 "\n",76 "\n",77 "def preprocess_function(examples):\n",78 " inputs = examples[text_column]\n",79 " targets = examples[label_column]\n",80 " model_inputs = tokenizer(inputs, truncation=True)\n",81 " labels = tokenizer(\n",82 " targets, max_length=target_max_length, padding=\"max_length\", truncation=True, return_tensors=\"pt\"\n",83 " )\n",84 " labels = labels[\"input_ids\"]\n",85 " labels[labels == tokenizer.pad_token_id] = -100\n",86 " model_inputs[\"labels\"] = labels\n",87 " return model_inputs\n",88 "\n",89 "\n",90 "processed_datasets = dataset.map(\n",91 " preprocess_function,\n",92 " batched=True,\n",93 " num_proc=1,\n",94 " remove_columns=dataset[\"train\"].column_names,\n",95 " load_from_cache_file=True,\n",96 " desc=\"Running tokenizer on dataset\",\n",97 ")\n",98 "\n",99 "train_dataset = processed_datasets[\"train\"]\n",100 "eval_dataset = processed_datasets[\"train\"]\n",101 "test_dataset = processed_datasets[\"test\"]\n",102 "\n",103 "\n",104 "def collate_fn(examples):\n",105 " return tokenizer.pad(examples, padding=\"longest\", return_tensors=\"pt\")\n",106 "\n",107 "\n",108 "train_dataloader = DataLoader(\n",109 " train_dataset, shuffle=True, collate_fn=collate_fn, batch_size=batch_size, pin_memory=True\n",110 ")\n",111 "eval_dataloader = DataLoader(eval_dataset, collate_fn=collate_fn, batch_size=batch_size, pin_memory=True)\n",112 "test_dataloader = DataLoader(test_dataset, collate_fn=collate_fn, batch_size=batch_size, pin_memory=True)"113 ]114 },115 {116 "cell_type": "code",117 "execution_count": 5,118 "id": "b33be5e6",119 "metadata": {},120 "outputs": [121 {122 "name": "stdout",123 "output_type": "stream",124 "text": [125 "@NYTsupport i have complained a dozen times & yet my papers are still thrown FAR from my door. Why is this so hard to resolve?\n",126 "{'input_ids': tensor([[25335, 1499, 3, 10, 3320, 12056, 382, 20390, 3, 23,\n",127 " 43, 25932, 3, 9, 9611, 648, 3, 184, 4624, 117,\n",128 " 780, 82, 5778, 33, 341, 3, 12618, 377, 4280, 45,\n",129 " 82, 1365, 5, 1615, 19, 48, 78, 614, 12, 7785,\n",130 " 58, 16229, 3, 10, 3, 1]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",131 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}\n",132 "tensor([[ 0, 10394, 1]], device='cuda:0')\n",133 "['complaint']\n"134 ]135 }136 ],137 "source": [138 "model.eval()\n",139 "i = 15\n",140 "inputs = tokenizer(f'{text_column} : {dataset[\"test\"][i][\"Tweet text\"]} Label : ', return_tensors=\"pt\")\n",141 "print(dataset[\"test\"][i][\"Tweet text\"])\n",142 "print(inputs)\n",143 "\n",144 "with torch.no_grad():\n",145 " outputs = model.generate(input_ids=inputs[\"input_ids\"].to(\"cuda\"), max_new_tokens=10)\n",146 " print(outputs)\n",147 " print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True))"148 ]149 },150 {151 "cell_type": "code",152 "execution_count": 6,153 "id": "b6d6cd5b",154 "metadata": {},155 "outputs": [156 {157 "name": "stderr",158 "output_type": "stream",159 "text": [160 " 0%| | 0/7 [00:00<?, ?it/s]You're using a T5TokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.\n",161 "100%|████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:10<00:00, 1.48s/it]\n"162 ]163 }164 ],165 "source": [166 "model.eval()\n",167 "eval_preds = []\n",168 "for _, batch in enumerate(tqdm(eval_dataloader)):\n",169 " batch = {k: v.to(\"cuda\") for k, v in batch.items() if k != \"labels\"}\n",170 " with torch.no_grad():\n",171 " outputs = model.generate(**batch, max_new_tokens=10)\n",172 " preds = outputs.detach().cpu().numpy()\n",173 " eval_preds.extend(tokenizer.batch_decode(preds, skip_special_tokens=True))"174 ]175 },176 {177 "cell_type": "code",178 "execution_count": 7,179 "id": "61264abe",180 "metadata": {},181 "outputs": [182 {183 "name": "stdout",184 "output_type": "stream",185 "text": [186 "accuracy=100.0\n",187 "eval_preds[:10]=['no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint', 'no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint']\n",188 "dataset['train'][label_column][:10]=['no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint', 'no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint']\n"189 ]190 }191 ],192 "source": [193 "correct = 0\n",194 "total = 0\n",195 "for pred, true in zip(eval_preds, dataset[\"train\"][label_column]):\n",196 " if pred.strip() == true.strip():\n",197 " correct += 1\n",198 " total += 1\n",199 "accuracy = correct / total * 100\n",200 "print(f\"{accuracy=}\")\n",201 "print(f\"{eval_preds[:10]=}\")\n",202 "print(f\"{dataset['train'][label_column][:10]=}\")"203 ]204 },205 {206 "cell_type": "code",207 "execution_count": null,208 "id": "a70802a3",209 "metadata": {},210 "outputs": [],211 "source": [212 "model.eval()\n",213 "test_preds = []\n",214 "\n",215 "for _, batch in enumerate(tqdm(test_dataloader)):\n",216 " batch = {k: v for k, v in batch.items() if k != \"labels\"}\n",217 " with torch.no_grad():\n",218 " outputs = model.generate(**batch, max_new_tokens=10)\n",219 " preds = outputs.detach().cpu().numpy()\n",220 " test_preds.extend(tokenizer.batch_decode(preds, skip_special_tokens=True))\n",221 " if len(test_preds) > 100:\n",222 " break\n",223 "test_preds"224 ]225 }226 ],227 "metadata": {228 "kernelspec": {229 "display_name": "Python 3 (ipykernel)",230 "language": "python",231 "name": "python3"232 },233 "language_info": {234 "codemirror_mode": {235 "name": "ipython",236 "version": 3237 },238 "file_extension": ".py",239 "mimetype": "text/x-python",240 "name": "python",241 "nbconvert_exporter": "python",242 "pygments_lexer": "ipython3",243 "version": "3.10.5 (v3.10.5:f377153967, Jun 6 2022, 12:36:10) [Clang 13.0.0 (clang-1300.0.29.30)]"244 },245 "vscode": {246 "interpreter": {247 "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"248 }249 }250 },251 "nbformat": 4,252 "nbformat_minor": 5253}254 