{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# PEFT Fine-Tune a Generative AI Model for Dialogue Summarization" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "\n", "## First, check that the correct kernel is chosen.\n", "\n", "\n", "\n", "You can click on that to see and check the details of the image, kernel, and instance type.\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "from datasets import load_dataset\n", "from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, GenerationConfig, TrainingArguments, Trainer\n", "import torch\n", "import time\n", "import evaluate\n", "import pandas as pd\n", "import numpy as np\n", "\n", "# tqdm library makes the loops show a smart progress meter.\n", "from tqdm import tqdm\n", "tqdm.pandas()" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Load Dataset and LLM" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "huggingface_dataset_name = \"knkarthick/dialogsum\"\n", "\n", "dataset = load_dataset(huggingface_dataset_name)\n", "\n", "dataset" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "model_name='google/flan-t5-base'\n", "\n", "original_model = AutoModelForSeq2SeqLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)\n", "tokenizer = AutoTokenizer.from_pretrained(model_name)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "def print_number_of_trainable_model_parameters(model):\n", " trainable_model_params = 0\n", " all_model_params = 0\n", " for _, param in model.named_parameters():\n", " all_model_params += param.numel()\n", " if param.requires_grad:\n", " trainable_model_params += param.numel()\n", " return f\"trainable model parameters: {trainable_model_params}\\nall model parameters: {all_model_params}\\npercentage of trainable model parameters: {100 * trainable_model_params / all_model_params}%\"\n", "\n", "print(print_number_of_trainable_model_parameters(original_model))" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Test the Model with Zero Shot Inferencing" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "index = 200\n", "\n", "dialogue = dataset['test'][index]['dialogue']\n", "summary = dataset['test'][index]['summary']\n", "\n", "prompt = f\"\"\"\n", "Summarize the following conversation.\n", "\n", "{dialogue}\n", "\n", "Summary:\n", "\"\"\"\n", "\n", "inputs = tokenizer(prompt, return_tensors='pt')\n", "output = tokenizer.decode(\n", " original_model.generate(\n", " inputs[\"input_ids\"], \n", " max_new_tokens=200,\n", " )[0], \n", " skip_special_tokens=True\n", ")\n", "\n", "dash_line = ('-'.join('' for x in range(100)))\n", "print(dash_line)\n", "print(f'INPUT PROMPT:\\n{prompt}')\n", "print(dash_line)\n", "print(f'BASELINE HUMAN SUMMARY:\\n{summary}\\n')\n", "print(dash_line)\n", "print(f'MODEL GENERATION - ZERO SHOT:\\n{output}')" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Perform Full Fine-Tuning" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "def tokenize_function(example):\n", " start_prompt = 'Summarize the following conversation.\\n\\n'\n", " end_prompt = '\\n\\nSummary: '\n", " prompt = [start_prompt + dialogue + end_prompt for dialogue in example[\"dialogue\"]]\n", " example['input_ids'] = tokenizer(prompt, padding=\"max_length\", truncation=True, return_tensors=\"pt\").input_ids\n", " example['labels'] = tokenizer(example[\"summary\"], padding=\"max_length\", truncation=True, return_tensors=\"pt\").input_ids\n", " \n", " return example\n", "\n", "tokenized_datasets = dataset.map(tokenize_function, batched=True)\n", "tokenized_datasets = tokenized_datasets.remove_columns(['id', 'topic', 'dialogue', 'summary',])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "tokenized_datasets = tokenized_datasets.filter(lambda example, index: index % 100 == 0, with_indices=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "print(f\"Shapes of the datasets:\")\n", "print(f\"Training: {tokenized_datasets['train'].shape}\")\n", "print(f\"Validation: {tokenized_datasets['validation'].shape}\")\n", "print(f\"Test: {tokenized_datasets['test'].shape}\")\n", "\n", "print(tokenized_datasets)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "output_dir = f'./dialogue-summary-training-{str(int(time.time()))}'\n", "\n", "training_args = TrainingArguments(\n", " output_dir=output_dir,\n", " learning_rate=1e-5,\n", " num_train_epochs=1,\n", " weight_decay=0.01,\n", " logging_steps=1,\n", " max_steps=1\n", ")\n", "\n", "trainer = Trainer(\n", " model=original_model,\n", " args=training_args,\n", " train_dataset=tokenized_datasets['train'],\n", " eval_dataset=tokenized_datasets['validation']\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "trainer.train()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "!aws s3 cp --recursive s3://dsoaws/models/flan-dialogue-summary-checkpoint/ ./flan-dialogue-summary-checkpoint/" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "!ls -al ./flan-dialogue-summary-checkpoint/pytorch_model.bin" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "instruct_model = AutoModelForSeq2SeqLM.from_pretrained(\"./flan-dialogue-summary-checkpoint\", torch_dtype=torch.bfloat16)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate the Model Qualitatively" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "index = 200\n", "dialogue = dataset['test'][index]['dialogue']\n", "human_baseline_summary = dataset['test'][index]['summary']\n", "\n", "prompt = f\"\"\"\n", "Summarize the following conversation.\n", "\n", "{dialogue}\n", "\n", "Summary:\n", "\"\"\"\n", "\n", "input_ids = tokenizer(prompt, return_tensors=\"pt\").input_ids\n", "\n", "original_model_outputs = original_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200, num_beams=1))\n", "original_model_text_output = tokenizer.decode(original_model_outputs[0], skip_special_tokens=True)\n", "\n", "instruct_model_outputs = instruct_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200, num_beams=1))\n", "instruct_model_text_output = tokenizer.decode(instruct_model_outputs[0], skip_special_tokens=True)\n", "\n", "print(dash_line)\n", "print(f'BASELINE HUMAN SUMMARY:\\n{human_baseline_summary}')\n", "print(dash_line)\n", "print(f'ORIGINAL MODEL:\\n{original_model_text_output}')\n", "print(dash_line)\n", "print(f'INSTRUCT MODEL:\\n{instruct_model_text_output}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate the Model Quantitatively" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "rouge = evaluate.load('rouge')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generate the outputs for the sample of the test dataset (only 10 dialogues and summaries to save time), and save the results." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "dialogues = dataset['test'][0:10]['dialogue']\n", "human_baseline_summaries = dataset['test'][0:10]['summary']\n", "\n", "original_model_summaries = []\n", "instruct_model_summaries = []\n", "\n", "for _, dialogue in enumerate(tqdm(dialogues)):\n", " prompt = f\"\"\"\n", "Summarize the following conversation.\n", "\n", "{dialogue}\n", "\n", "Summary: \"\"\"\n", " input_ids = tokenizer(prompt, return_tensors=\"pt\").input_ids\n", "\n", " original_model_outputs = original_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200))\n", " original_model_text_output = tokenizer.decode(original_model_outputs[0], skip_special_tokens=True)\n", " original_model_summaries.append(original_model_text_output)\n", "\n", " instruct_model_outputs = instruct_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200))\n", " instruct_model_text_output = tokenizer.decode(instruct_model_outputs[0], skip_special_tokens=True)\n", " instruct_model_summaries.append(instruct_model_text_output)\n", " \n", "zipped_summaries = list(zip(human_baseline_summaries, original_model_summaries, instruct_model_summaries))\n", " \n", "pd.set_option('display.max_colwidth', 500)\n", "df = pd.DataFrame(zipped_summaries, columns = ['human_baseline_summaries', 'original_model_summaries', 'instruct_model_summaries'])\n", "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "original_model_results = rouge.compute(\n", " predictions=original_model_summaries,\n", " references=human_baseline_summaries[0:len(original_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "instruct_model_results = rouge.compute(\n", " predictions=instruct_model_summaries,\n", " references=human_baseline_summaries[0:len(instruct_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "print('ORIGINAL MODEL:')\n", "print(original_model_results)\n", "print('INSTRUCT MODEL:')\n", "print(instruct_model_results)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "results = pd.read_csv(\"data-peft/dialogue-summary-training-results-peft.csv\")\n", "\n", "human_baseline_summaries = results['human_baseline_summaries'].values\n", "original_model_summaries = results['original_model_summaries'].values\n", "instruct_model_summaries = results['instruct_model_summaries'].values\n", "\n", "original_model_results = rouge.compute(\n", " predictions=original_model_summaries,\n", " references=human_baseline_summaries[0:len(original_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "instruct_model_results = rouge.compute(\n", " predictions=instruct_model_summaries,\n", " references=human_baseline_summaries[0:len(instruct_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "print('ORIGINAL MODEL:')\n", "print(original_model_results)\n", "print('INSTRUCT MODEL:')\n", "print(instruct_model_results)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "print(\"Absolute percentage improvement of INSTRUCT MODEL over HUMAN BASELINE\")\n", "\n", "improvement = (np.array(list(instruct_model_results.values())) - np.array(list(original_model_results.values())))\n", "for key, value in zip(instruct_model_results.keys(), improvement):\n", " print(f'{key}: {value*100:.2f}%')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parameter Efficient Fine-Tuning (PEFT)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "from peft import LoraConfig, get_peft_model, TaskType\n", "\n", "lora_config = LoraConfig(\n", " r=32, # Rank\n", " lora_alpha=32,\n", " target_modules=[\"q\", \"v\"],\n", " lora_dropout=0.05,\n", " bias=\"none\",\n", " task_type=TaskType.SEQ_2_SEQ_LM # FLAN-T5\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "peft_model = get_peft_model(original_model, \n", " lora_config)\n", "print(print_number_of_trainable_model_parameters(peft_model))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "output_dir = f'./peft-dialogue-summary-training-{str(int(time.time()))}'\n", "\n", "peft_training_args = TrainingArguments(\n", " output_dir=output_dir,\n", " auto_find_batch_size=True,\n", " learning_rate=1e-3, # Higher learning rate than full fine-tuning.\n", " num_train_epochs=1,\n", " logging_steps=1,\n", " max_steps=1 \n", ")\n", " \n", "peft_trainer = Trainer(\n", " model=peft_model,\n", " args=peft_training_args,\n", " train_dataset=tokenized_datasets[\"train\"],\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "peft_trainer.train()\n", "\n", "peft_model_path=\"./peft-dialogue-summary-checkpoint-local\"\n", "\n", "peft_trainer.model.save_pretrained(peft_model_path)\n", "tokenizer.save_pretrained(peft_model_path)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "!aws s3 cp --recursive s3://dsoaws/models/peft-dialogue-summary-checkpoint/ ./peft-dialogue-summary-checkpoint-from-s3/ " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "!ls -al ./peft-dialogue-summary-checkpoint-from-s3/adapter_model.bin" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "from peft import PeftModel, PeftConfig\n", "\n", "peft_model_base = AutoModelForSeq2SeqLM.from_pretrained(\"google/flan-t5-base\", torch_dtype=torch.bfloat16)\n", "tokenizer = AutoTokenizer.from_pretrained(\"google/flan-t5-base\")\n", "\n", "peft_model = PeftModel.from_pretrained(peft_model_base, \n", " './peft-dialogue-summary-checkpoint-from-s3/', \n", " torch_dtype=torch.bfloat16,\n", " is_trainable=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "print(print_number_of_trainable_model_parameters(peft_model))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate the Model Qualitatively" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "index = 200\n", "dialogue = dataset['test'][index]['dialogue']\n", "baseline_human_summary = dataset['test'][index]['summary']\n", "\n", "prompt = f\"\"\"\n", "Summarize the following conversation.\n", "\n", "{dialogue}\n", "\n", "Summary: \"\"\"\n", "\n", "input_ids = tokenizer(prompt, return_tensors=\"pt\").input_ids\n", "\n", "original_model_outputs = original_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200, num_beams=1))\n", "original_model_text_output = tokenizer.decode(original_model_outputs[0], skip_special_tokens=True)\n", "\n", "instruct_model_outputs = instruct_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200, num_beams=1))\n", "instruct_model_text_output = tokenizer.decode(instruct_model_outputs[0], skip_special_tokens=True)\n", "\n", "peft_model_outputs = peft_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200, num_beams=1))\n", "peft_model_text_output = tokenizer.decode(peft_model_outputs[0], skip_special_tokens=True)\n", "\n", "print(dash_line)\n", "print(f'BASELINE HUMAN SUMMARY:\\n{human_baseline_summary}')\n", "print(dash_line)\n", "print(f'ORIGINAL MODEL:\\n{original_model_text_output}')\n", "print(dash_line)\n", "print(f'INSTRUCT MODEL:\\n{instruct_model_text_output}')\n", "print(dash_line)\n", "print(f'PEFT MODEL: {peft_model_text_output}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate the Model Quantitatively" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "dialogues = dataset['test'][0:10]['dialogue']\n", "human_baseline_summaries = dataset['test'][0:10]['summary']\n", "\n", "original_model_summaries = []\n", "instruct_model_summaries = []\n", "peft_model_summaries = []\n", "\n", "for idx, dialogue in enumerate(tqdm(dialogues)):\n", " prompt = f\"\"\"\n", "Summarize the following conversation.\n", "\n", "{dialogue}\n", "\n", "Summary: \"\"\"\n", " \n", " input_ids = tokenizer(prompt, return_tensors=\"pt\").input_ids\n", "\n", " human_baseline_text_output = human_baseline_summaries[idx]\n", " \n", " original_model_outputs = original_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200))\n", " original_model_text_output = tokenizer.decode(original_model_outputs[0], skip_special_tokens=True)\n", "\n", " instruct_model_outputs = instruct_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200))\n", " instruct_model_text_output = tokenizer.decode(instruct_model_outputs[0], skip_special_tokens=True)\n", "\n", " peft_model_outputs = peft_model.generate(input_ids=input_ids, generation_config=GenerationConfig(max_new_tokens=200))\n", " peft_model_text_output = tokenizer.decode(peft_model_outputs[0], skip_special_tokens=True)\n", "\n", " original_model_summaries.append(original_model_text_output)\n", " instruct_model_summaries.append(instruct_model_text_output)\n", " peft_model_summaries.append(peft_model_text_output)\n", "\n", "zipped_summaries = list(zip(human_baseline_summaries, original_model_summaries, instruct_model_summaries, peft_model_summaries))\n", " \n", "df = pd.DataFrame(zipped_summaries, columns = ['human_baseline_summaries', 'original_model_summaries', 'instruct_model_summaries', 'peft_model_summaries'])\n", "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "rouge = evaluate.load('rouge')\n", "\n", "original_model_results = rouge.compute(\n", " predictions=original_model_summaries,\n", " references=human_baseline_summaries[0:len(original_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "instruct_model_results = rouge.compute(\n", " predictions=instruct_model_summaries,\n", " references=human_baseline_summaries[0:len(instruct_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "peft_model_results = rouge.compute(\n", " predictions=peft_model_summaries,\n", " references=human_baseline_summaries[0:len(peft_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "print('ORIGINAL MODEL:')\n", "print(original_model_results)\n", "print('INSTRUCT MODEL:')\n", "print(instruct_model_results)\n", "print('PEFT MODEL:')\n", "print(peft_model_results)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "human_baseline_summaries = results['human_baseline_summaries'].values\n", "original_model_summaries = results['original_model_summaries'].values\n", "instruct_model_summaries = results['instruct_model_summaries'].values\n", "peft_model_summaries = results['peft_model_summaries'].values\n", "\n", "original_model_results = rouge.compute(\n", " predictions=original_model_summaries,\n", " references=human_baseline_summaries[0:len(original_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "instruct_model_results = rouge.compute(\n", " predictions=instruct_model_summaries,\n", " references=human_baseline_summaries[0:len(instruct_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "peft_model_results = rouge.compute(\n", " predictions=peft_model_summaries,\n", " references=human_baseline_summaries[0:len(peft_model_summaries)],\n", " use_aggregator=True,\n", " use_stemmer=True,\n", ")\n", "\n", "print('ORIGINAL MODEL:')\n", "print(original_model_results)\n", "print('INSTRUCT MODEL:')\n", "print(instruct_model_results)\n", "print('PEFT MODEL:')\n", "print(peft_model_results)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "print(\"Absolute percentage improvement of PEFT MODEL over HUMAN BASELINE\")\n", "\n", "improvement = (np.array(list(peft_model_results.values())) - np.array(list(original_model_results.values())))\n", "for key, value in zip(peft_model_results.keys(), improvement):\n", " print(f'{key}: {value*100:.2f}%')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "print(\"Absolute percentage improvement of PEFT MODEL over INSTRUCT MODEL\")\n", "\n", "improvement = (np.array(list(peft_model_results.values())) - np.array(list(instruct_model_results.values())))\n", "for key, value in zip(peft_model_results.keys(), improvement):\n", " print(f'{key}: {value*100:.2f}%')" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# Release Resources" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "%%html\n", "\n", "

Shutting down your kernel for this notebook to release resources.

\n", "\n", " \n", "" ] } ], "metadata": { "availableInstances": [ { "_defaultOrder": 0, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.t3.medium", "vcpuNum": 2 }, { "_defaultOrder": 1, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.t3.large", "vcpuNum": 2 }, { "_defaultOrder": 2, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.t3.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 3, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.t3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 4, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5.large", "vcpuNum": 2 }, { "_defaultOrder": 5, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 6, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 7, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 8, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 9, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 10, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 11, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 12, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5d.large", "vcpuNum": 2 }, { "_defaultOrder": 13, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5d.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 14, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5d.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 15, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5d.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 16, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5d.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 17, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5d.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 18, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5d.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 19, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5d.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 20, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": true, "memoryGiB": 0, "name": "ml.geospatial.interactive", "supportedImageNames": [ "sagemaker-geospatial-v1-0" ], "vcpuNum": 0 }, { "_defaultOrder": 21, "_isFastLaunch": true, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.c5.large", "vcpuNum": 2 }, { "_defaultOrder": 22, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.c5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 23, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.c5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 24, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.c5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 25, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 72, "name": "ml.c5.9xlarge", "vcpuNum": 36 }, { "_defaultOrder": 26, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 96, "name": "ml.c5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 27, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 144, "name": "ml.c5.18xlarge", "vcpuNum": 72 }, { "_defaultOrder": 28, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.c5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 29, "_isFastLaunch": true, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g4dn.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 30, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g4dn.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 31, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g4dn.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 32, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g4dn.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 33, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g4dn.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 34, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g4dn.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 35, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 61, "name": "ml.p3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 36, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 244, "name": "ml.p3.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 37, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 488, "name": "ml.p3.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 38, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.p3dn.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 39, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.r5.large", "vcpuNum": 2 }, { "_defaultOrder": 40, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.r5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 41, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.r5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 42, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.r5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 43, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.r5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 44, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.r5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 45, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 512, "name": "ml.r5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 46, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.r5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 47, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 48, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 49, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 50, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 51, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 52, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 53, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.g5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 54, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.g5.48xlarge", "vcpuNum": 192 }, { "_defaultOrder": 55, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 1152, "name": "ml.p4d.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 56, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 1152, "name": "ml.p4de.24xlarge", "vcpuNum": 96 } ], "colab": { "name": "Fine-tune a language model", "provenance": [] }, "instance_type": "ml.m5.2xlarge", "kernelspec": { "display_name": "Python 3 (Data Science)", "language": "python", "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" }, "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.7.10" }, "vscode": { "interpreter": { "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" } } }, "nbformat": 4, "nbformat_minor": 4 }