{"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":[{"sourceId":121150,"databundleVersionId":15061024,"sourceType":"competition"},{"sourceId":14661932,"sourceType":"datasetVersion","datasetId":9366631}],"dockerImageVersionId":31259,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport logging\nimport torch\nimport pandas as pd\nfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM\n\n# ==============================================================\n# LOGGING\n# ==============================================================\nlogging.basicConfig(\n    level=logging.INFO,\n    format=\"%(asctime)s | %(levelname)s | %(message)s\"\n)\nlogger = logging.getLogger(__name__)\n\n# ==============================================================\n# PRETTY PRINTING\n# ==============================================================\ndef banner(title):\n    print(\"\\n\" + \"=\" * 70)\n    print(f\" {title}\")\n    print(\"=\" * 70)\n\ndef kv(key, value):\n    print(f\"  • {key:<22}: {value}\")\n\n# ==============================================================\n# CONFIGURATION\n# ==============================================================\nclass InferenceConfig:\n    model_path = \"/kaggle/input/datasets/assiaben/final-byt5/byt5-akkadian-optimized-34x\"\n    batch_size = 8\n    beam_size = 8\n    use_fp16 = True\n    max_length = 256\n\n\n# ==============================================================\n# INFERENCE ENGINE\n# ==============================================================\nclass UltraInferenceEngine:\n    def __init__(self, cfg):\n        self.cfg = cfg\n        self.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n        self._load_model()\n\n    def _load_model(self):\n        banner(\"LOADING MODEL\")\n\n        model_dir = os.path.abspath(self.cfg.model_path)\n\n        if not os.path.isdir(model_dir):\n            raise RuntimeError(f\"❌ Model directory not found:\\n{model_dir}\")\n\n        kv(\"Resolved Path\", model_dir)\n        kv(\"Device\", self.device)\n\n        # Check essential files\n        required_files = [\"config.json\"]\n        for f in required_files:\n            if not os.path.exists(os.path.join(model_dir, f)):\n                raise RuntimeError(f\"❌ Missing required file: {f}\")\n\n        # ---- LOAD TOKENIZER (LOCAL ONLY) ----\n        self.tokenizer = AutoTokenizer.from_pretrained(\n            pretrained_model_name_or_path=model_dir,\n            local_files_only=True,\n            trust_remote_code=False\n        )\n\n        # ---- LOAD MODEL (LOCAL ONLY) ----\n        self.model = AutoModelForSeq2SeqLM.from_pretrained(\n            pretrained_model_name_or_path=model_dir,\n            local_files_only=True,\n            trust_remote_code=False,\n            torch_dtype=(\n                torch.float16\n                if self.cfg.use_fp16 and self.device.type == \"cuda\"\n                else torch.float32\n            )\n        )\n\n        self.model.to(self.device)\n        self.model.eval()\n\n        logger.info(\"✅ Model successfully loaded from local Kaggle dataset\")\n\n    @torch.no_grad()\n    def infer(self, texts):\n        inputs = self.tokenizer(\n            texts,\n            padding=True,\n            truncation=True,\n            return_tensors=\"pt\"\n        ).to(self.device)\n\n        outputs = self.model.generate(\n            **inputs,\n            num_beams=self.cfg.beam_size,\n            max_length=self.cfg.max_length\n        )\n\n        return self.tokenizer.batch_decode(outputs, skip_special_tokens=True)\n\n\n# ==============================================================\n# MAIN\n# ==============================================================\ndef main():\n    banner(\"SYSTEM INFO\")\n    kv(\"PyTorch Version\", torch.__version__)\n    kv(\"CUDA Available\", torch.cuda.is_available())\n    kv(\"Execution Mode\", \"GPU\" if torch.cuda.is_available() else \"CPU\")\n\n    # ------------------------------------------------------------------\n    # 🔹 REPLACE THIS WITH REAL test.csv IF NEEDED\n    # ------------------------------------------------------------------\n    test_df = pd.DataFrame({\n        \"id\": range(4),\n        \"text\": [\n            \"𒀀𒈾𒀭𒂗𒆤\",\n            \"𒄿𒈾𒀭𒊩𒌆\",\n            \"𒅆𒀭𒈹𒂗\",\n            \"𒀀𒈾𒀭𒆠\"\n        ]\n    })\n\n    banner(\"STARTING INFERENCE\")\n    kv(\"Samples\", len(test_df))\n\n    engine = UltraInferenceEngine(InferenceConfig)\n    predictions = engine.infer(test_df[\"text\"].tolist())\n\n    # ==============================================================\n    # CREATE SUBMISSION FILE\n    # ==============================================================\n    submission = pd.DataFrame({\n        \"id\": test_df[\"id\"],\n        \"prediction\": predictions\n    })\n\n    output_path = \"/kaggle/working/submission.csv\"\n    submission.to_csv(output_path, index=False)\n\n    banner(\"SUBMISSION CREATED\")\n    kv(\"Saved To\", output_path)\n    kv(\"Rows\", len(submission))\n\n    print(\"\\nPreview:\")\n    print(submission.head())\n\n\nif __name__ == \"__main__\":\n    main()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-13T06:59:08.217666Z","iopub.execute_input":"2026-02-13T06:59:08.218544Z","iopub.status.idle":"2026-02-13T07:00:09.533412Z","shell.execute_reply.started":"2026-02-13T06:59:08.218509Z","shell.execute_reply":"2026-02-13T07:00:09.532233Z"}},"outputs":[],"execution_count":null}]}