{"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":"none","dataSources":[{"sourceType":"competition","sourceId":121150,"databundleVersionId":15833391}],"dockerImageVersionId":31286,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install torch \n!pip install transformers \n!pip install datasets \n!pip install peft \n!pip install accelerate \n!pip install evaluate \n!pip install sentencepiece","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T08:39:57.949509Z","iopub.execute_input":"2026-03-04T08:39:57.950311Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =========================================================\n# Deep Past AI\n# Akkadian → English (mT5 + LoRA + BLEU)\n# Single File Clean Project\n# =========================================================\n\nimport random\nimport numpy as np\nimport pandas as pd\nimport torch\n\nfrom datasets import Dataset\nfrom transformers import (\n    AutoTokenizer,\n    AutoModelForSeq2SeqLM,\n    DataCollatorForSeq2Seq,\n    TrainingArguments,\n    Trainer\n)\n\nfrom peft import LoraConfig, get_peft_model\nimport evaluate\n\n\n# =========================\n# 1. Reproducibility\n# =========================\ndef seed_everything(seed=42):\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n\nseed_everything(42)\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"Using device:\", device)\n\n\n# =========================\n# 2. Load Data\n# =========================\nINPUT_DIR = \"/kaggle/input/deep-past-initiative-machine-translation\"\n\nprint(\"Files in dataset folder:\")\nprint(os.listdir(INPUT_DIR))\n\ntrain_path = os.path.join(INPUT_DIR, \"train.csv\")\ntest_path  = os.path.join(INPUT_DIR, \"test.csv\")\n\ntrain_df = pd.read_csv(train_path)\ntest_df  = pd.read_csv(test_path)\n\nprint(\"\\nTrain shape:\", train_df.shape)\nprint(\"Test shape:\", test_df.shape)\n\nprint(\"\\nTrain columns:\", train_df.columns)\nprint(\"Test columns:\", test_df.columns)\n\ntrain_df.head()\n\n\n# =========================\n# 3. Model + Tokenizer\n# =========================\nmodel_name = \"google/mt5-small\"\n\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModelForSeq2SeqLM.from_pretrained(model_name)\n\nmodel.config.use_cache = False\n\n\n# =========================\n# 4. LoRA Configuration\n# =========================\nlora_config = LoraConfig(\n    r=8,\n    lora_alpha=16,\n    target_modules=[\"q\", \"k\", \"v\", \"o\"],\n    lora_dropout=0.1,\n    bias=\"none\",\n    task_type=\"SEQ_2_SEQ_LM\"\n)\n\nmodel = get_peft_model(model, lora_config)\nmodel.to(device)\n\n\n# =========================\n# 5. Preprocessing\n# =========================\nMAX_LEN = 128\n\ndef preprocess(examples):\n    inputs = [\n        \"translate Akkadian to English: \" + x\n        for x in examples[\"akkadian\"]\n    ]\n\n    model_inputs = tokenizer(\n        inputs,\n        max_length=MAX_LEN,\n        truncation=True\n    )\n\n    labels = tokenizer(\n        text_target=examples[\"english\"],\n        max_length=MAX_LEN,\n        truncation=True\n    )\n\n    labels_ids = labels[\"input_ids\"]\n    labels_ids = [\n        [(l if l != tokenizer.pad_token_id else -100) for l in label]\n        for label in labels_ids\n    ]\n\n    model_inputs[\"labels\"] = labels_ids\n    return model_inputs\n\ntrain_ds = train_ds.map(preprocess, batched=True, remove_columns=train_ds.column_names)\nval_ds   = val_ds.map(preprocess, batched=True, remove_columns=val_ds.column_names)\n\ndata_collator = DataCollatorForSeq2Seq(tokenizer, model=model)\n\n\n# =========================\n# 6. BLEU Metric\n# =========================\nbleu = evaluate.load(\"bleu\")\n\ndef compute_metrics(eval_pred):\n    preds, labels = eval_pred\n\n    decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)\n\n    labels = np.where(labels != -100, labels, tokenizer.pad_token_id)\n    decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)\n\n    result = bleu.compute(\n        predictions=decoded_preds,\n        references=[[l] for l in decoded_labels]\n    )\n\n    return {\"bleu\": result[\"bleu\"]}\n\n\n# =========================\n# 7. Training Arguments\n# =========================\ntraining_args = TrainingArguments(\n    output_dir=\"./deep_past_model\",\n    per_device_train_batch_size=8,\n    per_device_eval_batch_size=8,\n    learning_rate=2e-4,\n    num_train_epochs=5,\n    evaluation_strategy=\"epoch\",\n    save_strategy=\"epoch\",\n    predict_with_generate=True,\n    logging_steps=100,\n    fp16=torch.cuda.is_available(),\n    load_best_model_at_end=True,\n    report_to=\"none\"\n)\n\n\ntrainer = Trainer(\n    model=model,\n    args=training_args,\n    train_dataset=train_ds,\n    eval_dataset=val_ds,\n    tokenizer=tokenizer,\n    data_collator=data_collator,\n    compute_metrics=compute_metrics\n)\n\n\n# =========================\n# 8. Train\n# =========================\ntrainer.train()\n\n\n# =========================\n# 9. Merge LoRA for Inference\n# =========================\nmodel = model.merge_and_unload()\nmodel.to(device)\n\n\n# =========================\n# 10. Inference\n# =========================\ndef translate(texts):\n    inputs = tokenizer(\n        [\"translate Akkadian to English: \" + t for t in texts],\n        return_tensors=\"pt\",\n        padding=True,\n        truncation=True\n    ).to(device)\n\n    outputs = model.generate(\n        **inputs,\n        max_length=MAX_LEN,\n        num_beams=5\n    )\n\n    return tokenizer.batch_decode(outputs, skip_special_tokens=True)\n\n\npredictions = []\n\nfor i in range(0, len(test_df), 32):\n    batch = test_df[\"akkadian\"].iloc[i:i+32].tolist()\n    preds = translate(batch)\n    predictions.extend(preds)\n\n\nsubmission = pd.DataFrame({\n    \"id\": test_df[\"id\"],\n    \"translation\": predictions\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)\n\nprint(\"✅ Submission created: submission.csv\")","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}