CoolFace
Apppublic

PEFT/conditional-generation

sourceHugging Faceupdated 3y agoView on Hugging Face
4likes
peft_lora_seq2seq_accelerate_big_model_inference.ipynb254 linesDownload Raw Back to root
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 &amp; 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