{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# KoHRM SFT/LoRA Data Runbook\n", "\n", "이 노트북은 Colab 또는 로컬에서 KoHRM SFT/LoRA prepared dataset repo를 확인하고, 어떤 subset으로 LoRA를 돌릴지 결정하기 위한 점검용입니다. T4에서 1.4B LoRA 학습을 실제로 돌리는 노트북이 아닙니다. H200 서버에서는 아래 명령을 repo 루트에서 실행합니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Install dependencies" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip -q install -U huggingface_hub hf_transfer numpy \"tokenizers>=0.22.0,<0.23.1\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Dataset repo settings" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os\n", "import json\n", "from pathlib import Path\n", "\n", "from huggingface_hub import HfApi, snapshot_download\n", "\n", "os.environ[\"HF_HUB_ENABLE_HF_TRANSFER\"] = \"1\"\n", "\n", "DATASET_REPO_ID = \"LLM-OS-Models/KoHRM-Text-1.4B-sft-lora-data\"\n", "REVISION = \"main\"\n", "\n", "api = HfApi()\n", "info = api.dataset_info(DATASET_REPO_ID, revision=REVISION)\n", "print(\"dataset sha:\", info.sha)\n", "print(\"num siblings:\", len(info.siblings))\n", "for item in info.siblings[:30]:\n", " print(item.rfilename)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Recommended subsets" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "SUBSETS = {\n", " \"behavior-mini\": {\n", " \"folder\": \"kohrm_sft_behavior_mini_v1\",\n", " \"tokens\": 60000387,\n", " \"samples\": 61810,\n", " \"purpose\": \"quick behavior smoke: Korean answer style, JSON/tool-call form, terminal command behavior\",\n", " },\n", " \"korean-domain\": {\n", " \"folder\": \"kohrm_sft_korean_domain_core_v1\",\n", " \"tokens\": 100000654,\n", " \"samples\": 219072,\n", " \"purpose\": \"Korean legal/admin-rule extraction and Korean finance QA style\",\n", " },\n", " \"terminal-tool\": {\n", " \"folder\": \"kohrm_sft_terminal_tool_core_v1\",\n", " \"tokens\": 165007375,\n", " \"samples\": 55934,\n", " \"purpose\": \"terminal trajectories, tool-call JSON, SWE/code workflow\",\n", " },\n", " \"behavior-core\": {\n", " \"folder\": \"kohrm_sft_behavior_core_v1\",\n", " \"tokens\": 285008218,\n", " \"samples\": 291382,\n", " \"purpose\": \"broad behavior alignment mix\",\n", " },\n", "}\n", "\n", "print(f\"{'name':<16} {'folder':<40} {'tokens':>12} {'samples':>10}\")\n", "for name, spec in SUBSETS.items():\n", " print(f\"{name:<16} {spec['folder']:<40} {spec['tokens']:>12,} {spec['samples']:>10,}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Download metadata only\n", "\n", "전체 `tokens.npy`까지 받으면 수 GB가 필요합니다. Colab에서는 먼저 metadata만 받는 것이 안전합니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "metadata_dir = Path(snapshot_download(\n", " repo_id=DATASET_REPO_ID,\n", " repo_type=\"dataset\",\n", " revision=REVISION,\n", " allow_patterns=[\n", " \"README.md\",\n", " \"*/metadata.json\",\n", " \"*/tokenizer_info.json\",\n", " \"*/sample_stats.json\",\n", " \"*/merge_stats.json\",\n", " ],\n", " max_workers=8,\n", "))\n", "\n", "print(\"metadata cache:\", metadata_dir)\n", "for name, spec in SUBSETS.items():\n", " folder = metadata_dir / spec[\"folder\"]\n", " print(\"\\n==\", name, \"==\")\n", " for filename in [\"metadata.json\", \"sample_stats.json\", \"merge_stats.json\"]:\n", " path = folder / filename\n", " if path.exists():\n", " print(filename, json.loads(path.read_text()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Optional: download one full subset\n", "\n", "실제 학습 서버에서는 이미 `/home/work/.data/hrm_text_prepared`에 있어야 합니다. 다른 PC에서 이어서 학습하려면 필요한 subset만 내려받습니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "DOWNLOAD_FULL_SUBSET = False\n", "SELECTED = \"kohrm_sft_behavior_mini_v1\"\n", "\n", "if DOWNLOAD_FULL_SUBSET:\n", " subset_dir = Path(snapshot_download(\n", " repo_id=DATASET_REPO_ID,\n", " repo_type=\"dataset\",\n", " revision=REVISION,\n", " allow_patterns=[f\"{SELECTED}/**\"],\n", " max_workers=8,\n", " )) / SELECTED\n", " print(\"downloaded subset:\", subset_dir)\n", " for path in sorted(subset_dir.iterdir()):\n", " if path.is_file():\n", " print(path.name, round(path.stat().st_size / 2**20, 2), \"MiB\")\n", "else:\n", " print(\"Set DOWNLOAD_FULL_SUBSET=True to download one complete prepared subset.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. H200 LoRA commands\n", "\n", "아래 명령은 Colab이 아니라 H200 학습 서버에서 실행합니다. 현재 pretraining을 방해하지 않도록 별도 시점에 실행합니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "BASE = \"/home/work/.data/hrm_text_checkpoints/KoHRM-Text-1.4B-stage4b-korean-tool-finance-repeat-gbs180\"\n", "commands = {\n", " \"phase1\": f\"export RESUME_FROM={BASE} && bash scripts/run_kohrm_lora_experiments.sh phase1\",\n", " \"behavior-mini\": f\"export RESUME_FROM={BASE} && bash scripts/run_kohrm_lora_experiments.sh behavior-mini\",\n", " \"korean-domain\": f\"export RESUME_FROM={BASE} && bash scripts/run_kohrm_lora_experiments.sh korean-domain\",\n", " \"terminal-tool\": f\"export RESUME_FROM={BASE} && bash scripts/run_kohrm_lora_experiments.sh terminal-tool\",\n", " \"behavior-core\": f\"export RESUME_FROM={BASE} && bash scripts/run_kohrm_lora_experiments.sh behavior-core\",\n", "}\n", "for name, command in commands.items():\n", " print(\"\\n#\", name)\n", " print(command)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7. Decision rule\n", "\n", "현재 공개 checkpoint에서 반복, 영어 agent reasoning, JSON fidelity 문제가 보이면 `behavior-mini`를 먼저 돌립니다. 한국어 도메인 응답이 계속 약하면 `korean-domain`, 명령만 답하기/tool-call JSON이 약하면 `terminal-tool`을 이어서 돌립니다. 이 세 후보가 좋아지면 RL 또는 preference optimization으로 넘어가고, 여전히 전반 행동이 흔들리면 `behavior-core` short SFT/LoRA를 사용합니다." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "pygments_lexer": "ipython3" }, "colab": { "provenance": [] } }, "nbformat": 4, "nbformat_minor": 5 }