File size: 18,645 Bytes
a537067 | 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 | {
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "a5d77a87",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Old keys example: ['head.weight', 'head.bias']\n",
"New keys example: ['lm_head.weight', 'lm_head.bias']\n"
]
}
],
"source": [
"import torch\n",
"\n",
"ckpt_path = r\"C:\\Users\\Dinesh\\Downloads\\temple_model_bundle_20260201 2\\temple_model_bundle_20260201\\tamil_clm_15m_instruction.pt\"\n",
"\n",
"state = torch.load(ckpt_path, map_location=\"cpu\")\n",
"\n",
"# --- Rename head.* β lm_head.* ---\n",
"new_state = {}\n",
"\n",
"for k, v in state.items():\n",
" if k.startswith(\"head.\"):\n",
" new_state[k.replace(\"head.\", \"lm_head.\")] = v\n",
" else:\n",
" new_state[k] = v\n",
"\n",
"# Optional sanity check\n",
"print(\"Old keys example:\", [k for k in state.keys() if k.startswith(\"head.\")][:2])\n",
"print(\"New keys example:\", [k for k in new_state.keys() if k.startswith(\"lm_head.\")][:2])\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "3dd294ef",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\Dinesh\\anaconda3\\envs\\tamil-llm\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"β
Model loaded with exact weights (strict)\n"
]
}
],
"source": [
"import torch\n",
"from tamil_clm_hf import TamilCLMConfig, TamilCLMForCausalLM\n",
"\n",
"DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
"\n",
"config = TamilCLMConfig()\n",
"model = TamilCLMForCausalLM(config).to(DEVICE)\n",
"\n",
"model.load_state_dict(new_state, strict=True)\n",
"model.eval()\n",
"\n",
"print(\"β
Model loaded with exact weights (strict)\")\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0fa1e1d9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SentencePiece vocab size: 8000\n",
"β
SentencePiece tokenizer is correct\n"
]
}
],
"source": [
"import sentencepiece as spm\n",
"\n",
"SP_MODEL = r\"C:\\Users\\Dinesh\\Downloads\\temple_model_bundle_20260201 2\\temple_model_bundle_20260201\\tamil_clm.model\"\n",
"\n",
"sp = spm.SentencePieceProcessor()\n",
"sp.load(SP_MODEL)\n",
"\n",
"print(\"SentencePiece vocab size:\", sp.get_piece_size())\n",
"assert sp.get_piece_size() == 8000\n",
"print(\"β
SentencePiece tokenizer is correct\")\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ef2cc03e",
"metadata": {},
"outputs": [],
"source": [
"from transformers import PreTrainedTokenizer\n",
"\n",
"class TamilSentencePieceTokenizer(PreTrainedTokenizer):\n",
" model_input_names = [\"input_ids\", \"attention_mask\"]\n",
"\n",
" def __init__(self, sp_model_path, **kwargs):\n",
" self.sp = spm.SentencePieceProcessor()\n",
" self.sp.load(sp_model_path)\n",
" super().__init__(**kwargs)\n",
"\n",
" @property\n",
" def vocab_size(self):\n",
" return self.sp.get_piece_size()\n",
"\n",
" def _tokenize(self, text):\n",
" return self.sp.encode(text, out_type=str)\n",
"\n",
" def _convert_token_to_id(self, token):\n",
" return self.sp.piece_to_id(token)\n",
"\n",
" def _convert_id_to_token(self, index):\n",
" return self.sp.id_to_piece(index)\n",
"\n",
" def get_vocab(self):\n",
" return {self.sp.id_to_piece(i): i for i in range(self.vocab_size)}\n",
"\n",
" def save_vocabulary(self, save_directory, filename_prefix=None):\n",
" return ()\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "048dda1d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tokenizer vocab size: 8000\n",
"β
Slow tokenizer ready\n"
]
}
],
"source": [
"slow_tokenizer = TamilSentencePieceTokenizer(\n",
" SP_MODEL,\n",
" bos_token=\"<s>\",\n",
" eos_token=\"</s>\",\n",
" unk_token=\"<unk>\",\n",
" pad_token=\"<pad>\"\n",
")\n",
"\n",
"print(\"Tokenizer vocab size:\", slow_tokenizer.vocab_size)\n",
"assert slow_tokenizer.vocab_size == 8000\n",
"print(\"β
Slow tokenizer ready\")\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "3048571c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"β
Slow tokenizer saved to HF directory\n"
]
}
],
"source": [
"HF_DIR = r\"C:\\Users\\Dinesh\\hf_tamil_clm_15m\"\n",
"\n",
"slow_tokenizer.save_pretrained(HF_DIR)\n",
"print(\"β
Slow tokenizer saved to HF directory\")\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "c9eba604",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"protobuf + sentencepiece OK\n"
]
}
],
"source": [
"import sentencepiece, google.protobuf\n",
"print(\"protobuf + sentencepiece OK\")\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "f83b6371",
"metadata": {},
"outputs": [
{
"ename": "ImportError",
"evalue": "\n requires the protobuf library but it was not found in your environment. Check out the instructions on the\ninstallation page of its repo: https://github.com/protocolbuffers/protobuf/tree/master/python#installation and follow the ones\nthat match your environment. Please note that you may need to restart your runtime after installation.\n",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mValueError\u001b[39m Traceback (most recent call last)",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Dinesh\\anaconda3\\envs\\tamil-llm\\Lib\\site-packages\\transformers\\tokenization_utils_base.py:2003\u001b[39m, in \u001b[36mPreTrainedTokenizerBase._from_pretrained\u001b[39m\u001b[34m(cls, resolved_vocab_files, pretrained_model_name_or_path, init_configuration, token, cache_dir, local_files_only, _commit_hash, _is_local, trust_remote_code, *init_inputs, **kwargs)\u001b[39m\n\u001b[32m 2002\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m2003\u001b[39m tokenizer = \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43minit_inputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43minit_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2004\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m import_protobuf_decode_error():\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Dinesh\\anaconda3\\envs\\tamil-llm\\Lib\\site-packages\\transformers\\tokenization_utils_tokenizers.py:274\u001b[39m, in \u001b[36mTokenizersBackend.__init__\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m 273\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._tokenizer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m274\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 275\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mCouldn\u001b[39m\u001b[33m'\u001b[39m\u001b[33mt instantiate the backend tokenizer from one of: \u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 276\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m(1) a `tokenizers` library serialization file, \u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 277\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m(2) a slow tokenizer instance to convert or \u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 278\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m(3) an equivalent slow tokenizer class to instantiate and convert. \u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 279\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mYou need to have sentencepiece or tiktoken installed to convert a slow tokenizer to a fast one.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 280\u001b[39m )\n\u001b[32m 281\u001b[39m \u001b[38;5;66;03m# Only set defaults when creating TokenizersBackend from scratch\u001b[39;00m\n",
"\u001b[31mValueError\u001b[39m: Couldn't instantiate the backend tokenizer from one of: \n(1) a `tokenizers` library serialization file, \n(2) a slow tokenizer instance to convert or \n(3) an equivalent slow tokenizer class to instantiate and convert. \nYou need to have sentencepiece or tiktoken installed to convert a slow tokenizer to a fast one.",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[31mImportError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[17]\u001b[39m\u001b[32m, line 5\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mtransformers\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m AutoTokenizer, AutoModelForCausalLM\n\u001b[32m 3\u001b[39m HF_DIR = \u001b[33mr\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mC:\u001b[39m\u001b[33m\\\u001b[39m\u001b[33mUsers\u001b[39m\u001b[33m\\\u001b[39m\u001b[33mDinesh\u001b[39m\u001b[33m\\\u001b[39m\u001b[33mhf_tamil_clm_15m\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m5\u001b[39m tokenizer = \u001b[43mAutoTokenizer\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfrom_pretrained\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 6\u001b[39m \u001b[43m \u001b[49m\u001b[43mHF_DIR\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 7\u001b[39m \u001b[43m \u001b[49m\u001b[43muse_fast\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 8\u001b[39m \u001b[43m \u001b[49m\u001b[43mtrust_remote_code\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\n\u001b[32m 9\u001b[39m \u001b[43m)\u001b[49m\n\u001b[32m 11\u001b[39m model = AutoModelForCausalLM.from_pretrained(\n\u001b[32m 12\u001b[39m HF_DIR,\n\u001b[32m 13\u001b[39m trust_remote_code=\u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[32m 14\u001b[39m )\n\u001b[32m 16\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33mπ LOCAL HF LOAD SUCCESS\u001b[39m\u001b[33m\"\u001b[39m)\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Dinesh\\anaconda3\\envs\\tamil-llm\\Lib\\site-packages\\transformers\\models\\auto\\tokenization_auto.py:702\u001b[39m, in \u001b[36mAutoTokenizer.from_pretrained\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, *inputs, **kwargs)\u001b[39m\n\u001b[32m 699\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m tokenizer_class \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 700\u001b[39m tokenizer_class = TokenizersBackend\n\u001b[32m--> \u001b[39m\u001b[32m702\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mtokenizer_class\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfrom_pretrained\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43minputs\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[32m 703\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(config, \u001b[33m\"\u001b[39m\u001b[33mtokenizer_class\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[32m 704\u001b[39m _class = config.tokenizer_class\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Dinesh\\anaconda3\\envs\\tamil-llm\\Lib\\site-packages\\transformers\\tokenization_utils_base.py:1751\u001b[39m, in \u001b[36mPreTrainedTokenizerBase.from_pretrained\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, cache_dir, force_download, local_files_only, token, revision, trust_remote_code, *init_inputs, **kwargs)\u001b[39m\n\u001b[32m 1748\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m file_id \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m resolved_vocab_files:\n\u001b[32m 1749\u001b[39m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1751\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_from_pretrained\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1752\u001b[39m \u001b[43m \u001b[49m\u001b[43mresolved_vocab_files\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1753\u001b[39m \u001b[43m \u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1754\u001b[39m \u001b[43m \u001b[49m\u001b[43minit_configuration\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1755\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43minit_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1756\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 1757\u001b[39m \u001b[43m \u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1758\u001b[39m \u001b[43m \u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1759\u001b[39m \u001b[43m \u001b[49m\u001b[43m_commit_hash\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcommit_hash\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1760\u001b[39m \u001b[43m \u001b[49m\u001b[43m_is_local\u001b[49m\u001b[43m=\u001b[49m\u001b[43mis_local\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1761\u001b[39m \u001b[43m \u001b[49m\u001b[43mtrust_remote_code\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtrust_remote_code\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1762\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1763\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Dinesh\\anaconda3\\envs\\tamil-llm\\Lib\\site-packages\\transformers\\tokenization_utils_base.py:2004\u001b[39m, in \u001b[36mPreTrainedTokenizerBase._from_pretrained\u001b[39m\u001b[34m(cls, resolved_vocab_files, pretrained_model_name_or_path, init_configuration, token, cache_dir, local_files_only, _commit_hash, _is_local, trust_remote_code, *init_inputs, **kwargs)\u001b[39m\n\u001b[32m 2002\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 2003\u001b[39m tokenizer = \u001b[38;5;28mcls\u001b[39m(*init_inputs, **init_kwargs)\n\u001b[32m-> \u001b[39m\u001b[32m2004\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[43mimport_protobuf_decode_error\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[32m 2005\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[32m 2006\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mUnable to load tokenizer model from SPM, loading from TikToken will be attempted instead.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 2007\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m(Google protobuf error: Tried to load SPM model with non-SPM vocab file).\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 2008\u001b[39m )\n\u001b[32m 2009\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Dinesh\\anaconda3\\envs\\tamil-llm\\Lib\\site-packages\\transformers\\tokenization_utils_base.py:79\u001b[39m, in \u001b[36mimport_protobuf_decode_error\u001b[39m\u001b[34m(error_message)\u001b[39m\n\u001b[32m 77\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m DecodeError\n\u001b[32m 78\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m79\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(PROTOBUF_IMPORT_ERROR.format(error_message))\n",
"\u001b[31mImportError\u001b[39m: \n requires the protobuf library but it was not found in your environment. Check out the instructions on the\ninstallation page of its repo: https://github.com/protocolbuffers/protobuf/tree/master/python#installation and follow the ones\nthat match your environment. Please note that you may need to restart your runtime after installation.\n"
]
}
],
"source": [
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
"\n",
"HF_DIR = r\"C:\\Users\\Dinesh\\hf_tamil_clm_15m\"\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(\n",
" HF_DIR,\n",
" use_fast=False,\n",
" trust_remote_code=True\n",
")\n",
"\n",
"model = AutoModelForCausalLM.from_pretrained(\n",
" HF_DIR,\n",
" trust_remote_code=True\n",
")\n",
"\n",
"print(\"π LOCAL HF LOAD SUCCESS\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fb116309",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "tamil-llm",
"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.11.14"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
|