{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":121150,"databundleVersionId":15061024,"sourceType":"competition"},{"sourceId":14376272,"sourceType":"datasetVersion","datasetId":9181082},{"sourceId":14410665,"sourceType":"datasetVersion","datasetId":9203761},{"sourceId":14423069,"sourceType":"datasetVersion","datasetId":9212291},{"sourceId":290514565,"sourceType":"kernelVersion"}],"dockerImageVersionId":31236,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport torch\nfrom torch.utils.data import DataLoader, Dataset\nfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM\nfrom tqdm.auto import tqdm\nimport re\nimport joblib","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-07T10:24:40.771886Z","iopub.execute_input":"2026-01-07T10:24:40.772145Z","iopub.status.idle":"2026-01-07T10:24:53.072442Z","shell.execute_reply.started":"2026-01-07T10:24:40.772116Z","shell.execute_reply":"2026-01-07T10:24:53.071648Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# MODEL_PATH = \"/kaggle/input/byt5-base-big-data2\" #32.6\n# MODEL_PATH = \"/kaggle/input/byt5-akkadian-model\" #33.3\n# MODEL_PATH = \"/kaggle/input/dpc-baseline-train-infer/byt5-akkadian-model\" #33.2\nMODEL_PATH = '/kaggle/input/byt5-base-akkadian-model-private'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T10:24:53.073331Z","iopub.execute_input":"2026-01-07T10:24:53.073778Z","iopub.status.idle":"2026-01-07T10:24:53.077177Z","shell.execute_reply.started":"2026-01-07T10:24:53.073752Z","shell.execute_reply":"2026-01-07T10:24:53.076640Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TEST_DATA_PATH = \"/kaggle/input/deep-past-initiative-machine-translation/test.csv\"\nBATCH_SIZE = 8 #4\nMAX_LENGTH = 512 #512\nDEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\ntokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)\nmodel = AutoModelForSeq2SeqLM.from_pretrained(MODEL_PATH).to(DEVICE)\nmodel.eval()\n\ntest_df = pd.read_csv(TEST_DATA_PATH)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T10:24:53.079038Z","iopub.execute_input":"2026-01-07T10:24:53.079329Z","iopub.status.idle":"2026-01-07T10:25:25.953579Z","shell.execute_reply.started":"2026-01-07T10:24:53.079309Z","shell.execute_reply":"2026-01-07T10:25:25.952734Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"PREFIX = \"translate Akkadian to English: \"\n\nclass InferenceDataset(Dataset):\n    def __init__(self, df, tokenizer):\n        self.texts = df['transliteration'].astype(str).tolist()\n        self.texts = [PREFIX + i for i in self.texts]\n        self.tokenizer = tokenizer\n        \n    def __len__(self):\n        return len(self.texts)\n    \n    def __getitem__(self, idx):\n        text = self.texts[idx]\n        inputs = self.tokenizer(\n            text, \n            max_length=MAX_LENGTH, \n            padding=\"max_length\", \n            truncation=True, \n            return_tensors=\"pt\"\n        )\n        return {\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0)\n        }\n\ntest_dataset = InferenceDataset(test_df, tokenizer)\ntest_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False)\n\nprint(\"Starting Inference...\")\nall_predictions = []","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T10:25:25.954604Z","iopub.execute_input":"2026-01-07T10:25:25.954926Z","iopub.status.idle":"2026-01-07T10:25:25.964222Z","shell.execute_reply.started":"2026-01-07T10:25:25.954893Z","shell.execute_reply":"2026-01-07T10:25:25.963606Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom tqdm import tqdm\n\nDEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nmodel = model.to(DEVICE)\nmodel.eval()\nmodel.float()  # <-- force les poids en FP32\n\nall_predictions = []\n\n# Optionnel: si tu veux être sûr de ne pas avoir de comportements bizarres \"mixed\"\n# (sur P100 TF32 n'existe pas, mais ça ne coûte rien)\ntorch.set_grad_enabled(False)\n\nwith torch.inference_mode():  # mieux que no_grad pour l'inférence\n    for batch in tqdm(test_loader):\n        input_ids = batch[\"input_ids\"].to(DEVICE)              # int64, normal\n        attention_mask = batch[\"attention_mask\"].to(DEVICE)    # int64/bool, normal\n\n        # IMPORTANT: ne pas mettre autocast ici (pas de with torch.cuda.amp.autocast())\n        outputs = model.generate(\n            input_ids=input_ids,\n            attention_mask=attention_mask,\n            max_length=MAX_LENGTH,\n            num_beams=4,\n            early_stopping=True,\n        )\n\n        decoded = tokenizer.batch_decode(outputs, skip_special_tokens=True)\n        all_predictions.extend([d.strip() for d in decoded])\n\n# all_predictions contient une prédiction par élément du test_loader\n        predictions = []\n        for txt in all_predictions:\n            predictions.append(txt)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T10:25:25.965230Z","iopub.execute_input":"2026-01-07T10:25:25.965538Z","iopub.status.idle":"2026-01-07T10:25:34.125377Z","shell.execute_reply.started":"2026-01-07T10:25:25.965516Z","shell.execute_reply":"2026-01-07T10:25:34.124671Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(next(model.parameters()).dtype)  # doit afficher: torch.float32","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T10:25:34.126368Z","iopub.execute_input":"2026-01-07T10:25:34.126613Z","iopub.status.idle":"2026-01-07T10:25:34.130722Z","shell.execute_reply.started":"2026-01-07T10:25:34.126591Z","shell.execute_reply":"2026-01-07T10:25:34.130137Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    \"id\": test_df[\"id\"],\n    \"translation\": predictions\n})\n\nsubmission[\"translation\"] = submission[\"translation\"].apply(lambda x: x if len(x) > 0 else \"broken text\")\n\n    \nsubmission.to_csv(\"submission.csv\", index=False)\nprint(\"Submission file saved successfully!\")\nsubmission.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T10:25:34.131726Z","iopub.execute_input":"2026-01-07T10:25:34.132085Z","iopub.status.idle":"2026-01-07T10:25:34.217856Z","shell.execute_reply.started":"2026-01-07T10:25:34.132047Z","shell.execute_reply":"2026-01-07T10:25:34.217304Z"}},"outputs":[],"execution_count":null}]}