{"cells": [{"cell_type": "markdown", "metadata": {}, "source": "# Deep Past Challenge - ByT5 Inference\n\nThis notebook performs inference using a fine-tuned ByT5-base model for Akkadian to English translation.\n\n**Model**: google/byt5-base (fine-tuned on competition training data)\n\n**Training**: 30 epochs, batch_size=4, lr=3e-5"}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "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"}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Configuration\nMODEL_PATH = \"/kaggle/input/byt5-akkadian-model\"\nTEST_DATA_PATH = \"/kaggle/input/deep-past-initiative-machine-translation/test.csv\"\n\nBATCH_SIZE = 16\nMAX_LENGTH = 512\nDEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nPREFIX = \"translate Akkadian to English: \"\n\nprint(f\"Device: {DEVICE}\")\nprint(f\"Model Path: {MODEL_PATH}\")"}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Model Loading\nprint(f\"Loading model from {MODEL_PATH}...\")\ntokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)\nmodel = AutoModelForSeq2SeqLM.from_pretrained(MODEL_PATH).to(DEVICE)\nmodel.eval()\nprint(\"Model loaded successfully!\")"}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Load Test Data\nprint(f\"Loading test data from {TEST_DATA_PATH}...\")\ntest_df = pd.read_csv(TEST_DATA_PATH)\nprint(f\"Test samples: {len(test_df)}\")\ntest_df.head()"}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Dataset Class\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)\nprint(f\"DataLoader batches: {len(test_loader)}\")"}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Inference Loop\nprint(\"Starting Inference...\")\nall_predictions = []\n\nwith torch.no_grad():\n    for batch in tqdm(test_loader, desc=\"Translating\"):\n        input_ids = batch[\"input_ids\"].to(DEVICE)\n        attention_mask = batch[\"attention_mask\"].to(DEVICE)\n\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            no_repeat_ngram_size=3,\n            repetition_penalty=1.2\n        )\n\n        decoded = tokenizer.batch_decode(outputs, skip_special_tokens=True)\n        all_predictions.extend([d.strip() for d in decoded])\n\nprint(f\"Generated {len(all_predictions)} translations\")"}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Create Submission\nsubmission = pd.DataFrame({\n    \"id\": test_df[\"id\"],\n    \"translation\": all_predictions\n})\n\n# Handle empty translations\nsubmission[\"translation\"] = submission[\"translation\"].apply(\n    lambda x: x if len(x) > 0 else \"broken text\"\n)\n\n# Save\nsubmission.to_csv(\"submission.csv\", index=False)\nprint(f\"Submission saved. Shape: {submission.shape}\")\nsubmission.head(10)"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"name": "python", "version": "3.10.0"}}, "nbformat": 4, "nbformat_minor": 4}