{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":""},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":121150,"databundleVersionId":14976537,"sourceType":"competition"},{"sourceId":692588,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":525138,"modelId":539132}],"dockerImageVersionId":31236,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# NLLB Akkadian Translation - Inference\n\nGenerate translations for Kaggle competition submission.","metadata":{}},{"cell_type":"code","source":"import os\nimport sys\nimport pandas as pd\nimport torch\nfrom pathlib import Path\nfrom tqdm import tqdm\n\nprint(f\"Python: {sys.version}\")\nprint(f\"PyTorch: {torch.__version__}\")\nprint(f\"CUDA available: {torch.cuda.is_available()}\")\nif torch.cuda.is_available():\n    print(f\"GPU: {torch.cuda.get_device_name(0)}\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Load Model","metadata":{}},{"cell_type":"code","source":"# Find model path\nimport os\n\nbase = \"/kaggle/input/akkadian-nllb\"\nmodel_path = None\n\nfor root, dirs, files in os.walk(base):\n    if \"config.json\" in files:\n        model_path = root\n        print(f\"Found model at: {model_path}\")\n        break\n\nif model_path is None:\n    print(f\"ERROR: Could not find model. Contents of {base}:\")\n    for root, dirs, files in os.walk(base):\n        print(f\"  {root}: dirs={dirs}, files={files[:5]}\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import AutoTokenizer, AutoModelForSeq2SeqLM\n\nif model_path is None:\n    raise RuntimeError(\"Model not found! Add akkadian-nllb as a data source.\")\n\ntokenizer = AutoTokenizer.from_pretrained(model_path, local_files_only=True)\nmodel = AutoModelForSeq2SeqLM.from_pretrained(model_path, local_files_only=True)\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel = model.to(device)\nmodel.eval()\n\nprint(f\"Model loaded on {device}\")\nprint(f\"Parameters: {sum(p.numel() for p in model.parameters()):,}\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Load Test Data","metadata":{}},{"cell_type":"code","source":"import glob\n\ntest_files = glob.glob(\"/kaggle/input/**/test.csv\", recursive=True)\nprint(f\"Found test files: {test_files}\")\n\nif not test_files:\n    raise RuntimeError(\"test.csv not found! Add the competition as a data source.\")\n\ntest_df = pd.read_csv(test_files[0])\nprint(f\"Test samples: {len(test_df)}\")\nprint(test_df.head())","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Configuration","metadata":{}},{"cell_type":"code","source":"CONFIG = {\n    \"max_src_len\": 256,\n    \"max_tgt_len\": 256,\n    \"batch_size\": 8,\n    \"num_beams\": 5,\n    \"repetition_penalty\": 1.5,\n    \"no_repeat_ngram_size\": 3,\n}\n\n# Get English language token ID for NLLB\neng_token_id = tokenizer.convert_tokens_to_ids(\"eng_Latn\")\nprint(f\"English token ID: {eng_token_id}\")\n\nprint(\"Inference config:\")\nfor k, v in CONFIG.items():\n    print(f\"  {k}: {v}\")","metadata":{"lines_to_next_cell":1},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Generate Translations","metadata":{}},{"cell_type":"code","source":"def translate_batch(texts, model, tokenizer, config, device, eng_token_id):\n    \"\"\"Translate a batch of texts.\"\"\"\n    inputs = tokenizer(\n        texts,\n        max_length=config[\"max_src_len\"],\n        padding=True,\n        truncation=True,\n        return_tensors=\"pt\",\n    )\n    inputs = {k: v.to(device) for k, v in inputs.items()}\n\n    with torch.no_grad():\n        outputs = model.generate(\n            **inputs,\n            max_length=config[\"max_tgt_len\"],\n            num_beams=config[\"num_beams\"],\n            forced_bos_token_id=eng_token_id,\n            repetition_penalty=config[\"repetition_penalty\"],\n            no_repeat_ngram_size=config[\"no_repeat_ngram_size\"],\n        )\n\n    translations = tokenizer.batch_decode(outputs, skip_special_tokens=True)\n    return translations","metadata":{"lines_to_next_cell":1},"outputs":[],"execution_count":null},{"cell_type":"code","source":"translations = []\nbatch_size = CONFIG[\"batch_size\"]\n\nsource_col = \"transliteration\" if \"transliteration\" in test_df.columns else test_df.columns[1]\nsources = test_df[source_col].tolist()\n\nprint(f\"Translating {len(sources)} samples...\")\n\nfor i in tqdm(range(0, len(sources), batch_size)):\n    batch = sources[i:i+batch_size]\n    batch_translations = translate_batch(batch, model, tokenizer, CONFIG, device, eng_token_id)\n    translations.extend(batch_translations)\n\nprint(f\"Generated {len(translations)} translations\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Create Submission","metadata":{}},{"cell_type":"code","source":"submission = pd.DataFrame({\n    \"id\": test_df[\"id\"] if \"id\" in test_df.columns else range(len(translations)),\n    \"translation\": translations\n})\n\nprint(submission.head(10))","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index=False)\nprint(\"Saved submission.csv\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Show sample translations\nprint(\"\\n=== Sample Translations ===\")\nfor i in range(min(5, len(sources))):\n    print(f\"\\nSRC: {sources[i][:100]}...\")\n    print(f\"OUT: {translations[i][:100]}...\")","metadata":{},"outputs":[],"execution_count":null}]}