|
20 | 20 | "id": "acae54e37e7d407bbb7b55eff062a284", |
21 | 21 | "metadata": {}, |
22 | 22 | "outputs": [], |
23 | | - "source": "MODE = \"train\" # \"train\" | \"serve\"\n\nBASE_MODEL = \"Qwen/Qwen2.5-Coder-7B-Instruct\"\nDATA_DIR = \"/kaggle/input/nlsql-autotune-data\" # train.jsonl, val.jsonl, train_qlora.py\nOUT = \"/kaggle/working/qlora_out\"\n\n# train mode\nEPOCHS = 1.0\nMAX_SEQ = 4096\nSMOKE_STEPS = 0 # >0: run this many steps end-to-end first, then the real run (0 = straight in)\nRESUME_INPUT = \"auto\" # non-empty: rglob /kaggle/input for checkpoint-* and resume; \"\" = fresh\n\n# serve mode\nADAPTER_DIR = \"/kaggle/input/nlsql-adapter/adapter\" # absent path => serve plain base model\nSERVE_HOURS = 5.0\nPORT = 8000" |
| 23 | + "source": [ |
| 24 | + "MODE = \"serve\" # \"train\" | \"serve\"\n", |
| 25 | + "\n", |
| 26 | + "BASE_MODEL = \"Qwen/Qwen2.5-Coder-7B-Instruct\"\n", |
| 27 | + "DATA_DIR = \"/kaggle/input/nlsql-autotune-data\" # train.jsonl, val.jsonl, train_qlora.py\n", |
| 28 | + "OUT = \"/kaggle/working/qlora_out\"\n", |
| 29 | + "\n", |
| 30 | + "# train mode\n", |
| 31 | + "EPOCHS = 1.0\n", |
| 32 | + "MAX_SEQ = 4096\n", |
| 33 | + "SMOKE_STEPS = 0 # >0: run this many steps end-to-end first, then the real run (0 = straight in)\n", |
| 34 | + "RESUME_INPUT = \"auto\" # non-empty: rglob /kaggle/input for checkpoint-* and resume; \"\" = fresh\n", |
| 35 | + "\n", |
| 36 | + "# serve mode\n", |
| 37 | + "ADAPTER_DIR = \"/kaggle/input/nlsql-adapter/adapter\" # absent path => serve plain base model\n", |
| 38 | + "SERVE_HOURS = 8.0\n", |
| 39 | + "PORT = 8000" |
| 40 | + ] |
24 | 41 | }, |
25 | 42 | { |
26 | 43 | "cell_type": "code", |
|
37 | 54 | "metadata": {}, |
38 | 55 | "outputs": [], |
39 | 56 | "source": [ |
| 57 | + "import json\n", |
| 58 | + "import os\n", |
40 | 59 | "import re\n", |
41 | 60 | "import subprocess\n", |
42 | 61 | "import sys\n", |
|
56 | 75 | " import torch\n", |
57 | 76 | "\n", |
58 | 77 | " tp = 2 if torch.cuda.device_count() >= 2 else 1\n", |
59 | | - " with_lora = Path(ADAPTER_DIR).is_dir()\n", |
| 78 | + " # Kaggle unpacks an uploaded zip FLAT (v9/v10 lesson) -- self-home on the config\n", |
| 79 | + " hits = sorted(Path(\"/kaggle/input/nlsql-adapter\").rglob(\"adapter_config.json\"))\n", |
| 80 | + " adapter_dir = str(hits[0].parent) if hits else ADAPTER_DIR\n", |
| 81 | + " with_lora = Path(adapter_dir, \"adapter_model.safetensors\").exists()\n", |
| 82 | + " if not with_lora:\n", |
| 83 | + " raise RuntimeError(\n", |
| 84 | + " \"no adapter under /kaggle/input/nlsql-adapter -- refusing to silently serve base\"\n", |
| 85 | + " )\n", |
| 86 | + " print(f\"adapter_dir resolved: {adapter_dir}\", flush=True)\n", |
60 | 87 | " vllm_cmd = [\n", |
61 | 88 | " \"vllm\",\n", |
62 | 89 | " \"serve\",\n", |
|
78 | 105 | " \"--max-lora-rank\",\n", |
79 | 106 | " \"16\",\n", |
80 | 107 | " \"--lora-modules\",\n", |
81 | | - " f\"sqltuned={ADAPTER_DIR}\",\n", |
| 108 | + " f\"sqltuned={adapter_dir}\",\n", |
82 | 109 | " ]\n", |
83 | 110 | " print(\" \".join(vllm_cmd), flush=True)\n", |
84 | 111 | " with open(\"/kaggle/working/vllm.log\", \"w\") as vllm_log:\n", |
|
109 | 136 | " url = m.group(0)\n", |
110 | 137 | " break\n", |
111 | 138 | " Path(\"/kaggle/working/tunnel_url.txt\").write_text(url or \"NONE\")\n", |
| 139 | + " # Live kernel logs are unreadable via API, so push the URL out through a\n", |
| 140 | + " # private dataset the Windows side can poll. Creds ride in nlsql-relay.\n", |
| 141 | + " creds = json.loads(Path(\"/kaggle/input/nlsql-relay/kaggle.json\").read_text())\n", |
| 142 | + " relay_env = {**os.environ, \"KAGGLE_USERNAME\": creds[\"username\"], \"KAGGLE_KEY\": creds[\"key\"]}\n", |
| 143 | + " relay = Path(\"/kaggle/working/relay\")\n", |
| 144 | + " relay.mkdir(exist_ok=True)\n", |
| 145 | + " (relay / \"tunnel_url.txt\").write_text(url or \"NONE\")\n", |
| 146 | + " (relay / \"dataset-metadata.json\").write_text(\n", |
| 147 | + " json.dumps(\n", |
| 148 | + " {\n", |
| 149 | + " \"title\": \"nlsql-tunnel\",\n", |
| 150 | + " \"id\": \"liovinajo/nlsql-tunnel\",\n", |
| 151 | + " \"licenses\": [{\"name\": \"CC0-1.0\"}],\n", |
| 152 | + " }\n", |
| 153 | + " )\n", |
| 154 | + " )\n", |
| 155 | + " for verb in ([\"version\", \"-m\", \"tunnel-url\"], [\"create\"]):\n", |
| 156 | + " rr = subprocess.run(\n", |
| 157 | + " [\"kaggle\", \"datasets\", *verb, \"-p\", str(relay)],\n", |
| 158 | + " capture_output=True,\n", |
| 159 | + " text=True,\n", |
| 160 | + " env=relay_env,\n", |
| 161 | + " )\n", |
| 162 | + " print(f\"relay {verb[0]}: rc={rr.returncode}\", flush=True)\n", |
| 163 | + " if rr.returncode == 0:\n", |
| 164 | + " break\n", |
| 165 | + " else:\n", |
| 166 | + " print(\"relay FAILED; url only in log/output\", flush=True)\n", |
| 167 | + " print(rr.stdout[-400:], rr.stderr[-400:], flush=True)\n", |
112 | 168 | " model_name = \"sqltuned\" if with_lora else BASE_MODEL\n", |
113 | 169 | " print(\n", |
114 | 170 | " f\"\\n{'=' * 60}\\nTUNNEL: {url}\\nbase_url for .env: {url}/v1\\n--sql-model {model_name}\\n{'=' * 60}\\n\",\n", |
|
0 commit comments