{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":121150,"databundleVersionId":15061024},{"sourceType":"modelInstanceVersion","sourceId":743057,"databundleVersionId":15600023,"modelInstanceId":567094},{"sourceType":"kernelVersion","sourceId":296222689}],"dockerImageVersionId":31236,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Akkadian → English MT (ByT5)\n\nEnd-to-end Kaggle notebook: model loading, sanity checks, batch inference, and submission generation.","metadata":{}},{"cell_type":"markdown","source":"## 1️⃣ Setup & Imports","metadata":{}},{"cell_type":"code","source":"import os\nimport torch\nimport pandas as pd\nfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2️⃣ Paths & Device","metadata":{}},{"cell_type":"code","source":"MODEL_PATH = \"/kaggle/input/akkadian-byt5-model/transformers/default/1/akkadian_final_model\"\nTRAIN_PATH = \"/kaggle/input/deep-past-initiative-machine-translation/train.csv\"\nTEST_PATH = \"/kaggle/input/deep-past-initiative-machine-translation/test.csv\"\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"Using device:\", device)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3️⃣ Load Model & Tokenizer","metadata":{}},{"cell_type":"code","source":"tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)\nmodel = AutoModelForSeq2SeqLM.from_pretrained(MODEL_PATH).to(device)\nmodel.eval()\n\nprint(\"Model & tokenizer loaded\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4️⃣ Load Data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv(TRAIN_PATH)\ntest_df = pd.read_csv(TEST_PATH)\n\nprint(\"Train rows:\", len(train_df))\nprint(\"Test rows:\", len(test_df))\ntrain_df.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 5️⃣ Single-Sentence Sanity Check","metadata":{}},{"cell_type":"code","source":"text = test_df.iloc[0][\"transliteration\"]\nprint(\"INPUT:\", text)\n\ninputs = tokenizer(text, return_tensors=\"pt\").to(device)\n\nwith torch.no_grad():\n    output = model.generate(\n        **inputs,\n        max_new_tokens=120,\n        num_beams=4,\n        early_stopping=True,\n        no_repeat_ngram_size=4,\n        repetition_penalty=1.3\n    )\n\nprint(\"OUTPUT:\", tokenizer.decode(output[0], skip_special_tokens=True))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 6️⃣ Train Sample vs Prediction (Debug Only)","metadata":{}},{"cell_type":"code","source":"sample = train_df.sample(5, random_state=42)\n\nfor _, row in sample.iterrows():\n    print(\"—\" * 50)\n    print(\"SRC :\", row[\"transliteration\"])\n    print(\"GT  :\", row[\"translation\"])\n\n    inputs = tokenizer(row[\"transliteration\"], return_tensors=\"pt\").to(device)\n\n    with torch.no_grad():\n        output = model.generate(\n            **inputs,\n            max_new_tokens=120,\n            num_beams=4,\n            early_stopping=True,\n            no_repeat_ngram_size=4,\n            repetition_penalty=1.3\n        )\n\n    print(\"PRED:\", tokenizer.decode(output[0], skip_special_tokens=True))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 7️⃣ Batch Inference on test.csv","metadata":{}},{"cell_type":"code","source":"BATCH_SIZE = 16\ntranslations = []\n\nfor i in range(0, len(test_df), BATCH_SIZE):\n    batch = test_df.iloc[i:i+BATCH_SIZE][\"transliteration\"].tolist()\n    inputs = tokenizer(batch, return_tensors=\"pt\", padding=True, truncation=True).to(device)\n\n    with torch.no_grad():\n        outputs = model.generate(\n            **inputs,\n            max_new_tokens=120,\n            num_beams=4,\n            early_stopping=True,\n            no_repeat_ngram_size=4,\n            repetition_penalty=1.3\n        )\n\n    translations.extend(tokenizer.batch_decode(outputs, skip_special_tokens=True))\n    if i % 200 == 0:\n        print(f\"Processed {i}/{len(test_df)}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 8️⃣ Build Submission","metadata":{}},{"cell_type":"code","source":"assert len(translations) == len(test_df)\n\nsubmission = test_df[[\"id\"]].copy()\nsubmission[\"translation\"] = translations\nsubmission.to_csv(\"submission.csv\", index=False)\n\nsubmission.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## ✅ Done\n\nUpload `submission.csv` to Kaggle.","metadata":{}}]}