[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2258":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},2258,"MicroLM","jiaran-king\u002FMicroLM","jiaran-king","基于轻量级 LLM 与 Qwen2.5-1.5B 两条主线，完成从数据处理、模型训练、参数高效微调，到评测验证与服务部署的端到端闭环。",null,"Python",173,14,109,1,0,5,10,49,15,3.53,"MIT License",false,"main",true,[],"2026-06-12 02:00:39","# MicroLM\n\n轻量级 LLM 训练、微调、评测与部署全链路项目。\n\n## 从零搭建一个能训练、能微调、能推理的完整 LLM 链路\n\n涵盖 tokenizer 训练、语料处理、pretrain、SFT、LoRA、推理优化、评测与部署，每一个环节亲手实现。\n\n[自研链路](#自研链路--31m-参数) · [Qwen 迁移](#迁移链路--qwen25-15b) · [快速开始](#快速开始) · [文档](#详细文档)\n\n---\n\n## 两线并行\n\n| | **自研 MicroLM 链路** | **Qwen 迁移与部署链路** |\n|:--:|:---:|:---:|\n| **规模** | 31.7M 参数 | 1.55B 参数 |\n| **技术栈** | 纯 PyTorch（einsum 自实现） | HF \u002F PEFT \u002F vLLM |\n| **数据源** | MiniMind ~141 万条 | InstructIE 171K 条 |\n| **核心能力** | Tokenizer → Pretrain → SFT → LoRA → KV Cache 推理 | 数据 Pipeline → LoRA 微调 → 自动评测 → 服务化部署 |\n| **LoRA 效率** | **0.83%** 可训练参数（1.0 MB） | **0.14%** 可训练参数（8.3 MB） |\n\n```mermaid\nflowchart TB\n    A[\"自研 MicroLM 链路\u003Cbr\u002F>31.7M · 纯 PyTorch\"]\n    B[\"Qwen 迁移与部署链路\u003Cbr\u002F>1.55B · HF \u002F PEFT \u002F vLLM\"]\n\n    A --> A1[\"MiniMind ~141万条\"]\n    A1 --> A2[\"清洗 + SHA1切分\"]\n    A2 --> A3[\"BPE Tokenizer\u003Cbr\u002F>vocab=6400\"]\n    A3 --> A4[\"Pretrain\u003Cbr\u002F>8层 RoPE+SwiGLU\"]\n    A4 --> A5[\"SFT \u002F LoRA 微调\u003Cbr\u002F>0.83% 参数\"]\n    A5 --> A6[\"KV Cache 推理\u003Cbr\u002F>加速 3.86x\"]\n    A6 --> A7[\"chat.py REPL\"]\n\n    B --> B1[\"InstructIE 171K 条\"]\n    B1 --> B2[\"6步数据Pipeline\u003Cbr\u002F>标准化→过滤→分层→派生→采样→转写\"]\n    B2 --> B3[\"SFT 数据集 28.5K\u003Cbr\u002F>JSON 校验 100%\"]\n    B3 --> B4[\"Qwen LoRA 微调\u003Cbr\u002F>r=8 · 0.14% 参数\"]\n    B4 --> B5[\"结构化自动评测\u003Cbr\u002F>4模型 × 40prompt × 4指标\"]\n    B5 --> B6[\"vLLM 服务化部署\u003Cbr\u002F>smoke 5\u002F5 · Parse% 100%\"]\n\n    style A fill:#fef9e7,stroke:#f39c12,color:#2c3e50\n    style B fill:#eafaf1,stroke:#27ae60,color:#2c3e50\n    style A6 fill:#fdedec,stroke:#e74c3c,color:#2c3e50\n    style B6 fill:#fdedec,stroke:#e74c3c,color:#2c3e50\n```\n\n---\n\n## 核心成果\n\n### 自研链路 — 31.7M 参数\n\n| 指标 | 数值 |\n|:---:|:---:|\n| 模型架构 | 8 层 Transformer · RoPE + SwiGLU + RMSNorm pre-norm |\n| LoRA 可训练占比 | **0.83%**（262K \u002F 31.7M） |\n| Adaptor 存储 | **1.0 MB**（vs 全参 377 MB，节省 **99.7%**） |\n| KV Cache 加速 | 平均 **3.86x** · 最大 **9.08x** |\n| SFT 质量提升 | 评分 **+81%**（1.13 → 2.04 \u002F 满分 5） |\n| LoRA vs 全参 | 生成质量达全参 **85%**（val_loss 差距仅 9%） |\n\n### 迁移链路 — Qwen2.5-1.5B-Instruct\n\n| 指标 | 数值 |\n|:---:|:---:|\n| 基座模型 | Qwen2.5-1.5B-Instruct（1.55B 参数） |\n| LoRA 可训练占比 | **0.14%**（2.18M \u002F 1.55B） |\n| Adaptor 存储 | **8.3 MB**（vs 基座 2,944 MB，节省 **99.7%**） |\n| SFT 数据集 | **28.5K** train + 1.5K valid（全量 JSON 校验 **100%** 通过） |\n| val_loss 降幅 | 0.3999 → **0.1534**（**61.6%**） |\n| 部署决策依据 | Alias-Strict **15.0%**（为 base 的 **2 倍**），结构化质量全面领先 |\n| vLLM 验证 | smoke **5\u002F5** · stability Parse% **100%** · 单并发 ~30 tok\u002Fs |\n\n---\n\n## 详细文档\n\n完整中文文档位于 [`Readme\u002F`](Readme\u002F) 目录：\n\n| 文档 | 内容 |\n|:---:|:---:|\n| [01-项目总览](Readme\u002F项目全景图\u002F01-项目总览.md) | 双轨架构、核心量化成果一览 |\n| [02-自研 MicroLM 主线](Readme\u002F项目全景图\u002F02-自研%20MicroLM%20主线.md) | 数据处理 \u002F Tokenizer \u002F 模型设计 \u002F Pretrain \u002F SFT \u002F LoRA \u002F 能力边界 |\n| [03-推理与系统能力增强](Readme\u002F项目全景图\u002F03-推理与系统能力增强.md) | 文本生成流程 \u002F KV Cache 优化与 Benchmark \u002F chat.py 多轮对话 |\n| [04-Qwen 迁移与结构化输出](Readme\u002F项目全景图\u002F04-Qwen%20迁移与结构化输出主线.md) | 迁移动机 \u002F InstructIE 数据 pipeline \u002F Qwen LoRA 微调 \u002F 导出部署 |\n| [05-评测、验证与部署闭环](Readme\u002F项目全景图\u002F05-评测、验证与部署闭环.md) | 通用评测体系 \u002F 结构化自动评测 \u002F Alias 归一化 \u002F vLLM benchmark |\n| [06-项目复盘与总结](Readme\u002F项目全景图\u002F06-项目复盘与总结.md) | 关键成果 \u002F 8 个 Bug 清册 \u002F 方法论收获 \u002F 扩展方向 |\n\n> 核心代码解析：[transformer.py](Readme\u002F核心代码解析\u002F01-transformer.py%20模型主干.md) · [lora.py](Readme\u002F核心代码解析\u002F02-lora.py%20LoRA%20参数高效微调.md) · [sft.py](Readme\u002F核心代码解析\u002F03-sft.py%20SFT%20数据协议.md) · [data_loader & loss](Readme\u002F核心代码解析\u002F04-data_loader.py%20与%20loss.py.md) · [generate_text.py](Readme\u002F核心代码解析\u002F05-generate_text.py%20推理链路.md) · [chat.py](Readme\u002F核心代码解析\u002F06-chat.py%20多轮对话系统.md) · [train_qwen_lora.py](Readme\u002F核心代码解析\u002F07-train_qwen_lora.py%20Qwen%20迁移线核心.md) · [数据 pipeline 六步处理](Readme\u002F核心代码解析\u002F08-数据%20pipeline%20六步处理.md)\n\n---\n\n\u003Cdetails>\n\u003Csummary>\u003Cstrong>目录结构\u003C\u002Fstrong> （点击展开）\u003C\u002Fsummary>\n\n```\nmicro_LM\u002F\n├── microlm\u002F                  # 核心 Python 包\n│   ├── model\u002F                #   transformer.py, lora.py, kv_cache.py\n│   ├── tokenizer\u002F            #   BPE tokenizer (训练 + 编码\u002F解码)\n│   ├── training\u002F             #   optimizer, scheduler, sft.py, data_loader, loss\n│   └── inference\u002F            #   generate_text.py, prompting.py\n├── scripts\u002F                  # 可执行脚本入口\n│   ├── train_pretrain.py     #   预训练\n│   ├── train_sft.py          #   SFT 微调 (支持 --use-lora)\n│   ├── train_qwen_lora.py    #   Qwen LoRA 微调\n│   ├── train_tokenizer.py    #   BPE tokenizer 训练\n│   ├── chat.py               #   交互式聊天 REPL\n│   ├── 01~06_*.py            #   InstructIE 数据 pipeline (6步)\n│   ├── export_final_model.py #   LoRA 合并导出\n│   ├── serve_vllm.sh         #   vLLM 服务启动\n│   └── smoke_vllm.py         #   vLLM 功能验证\n├── tests\u002F                    # 测试套件 (6个测试文件)\n├── configs\u002F                  # 训练\u002F推理配置 JSON\n├── eval\u002F                     # 评测 prompt 模板\n├── results\u002F                  # 评测结果\n├── data\u002F                     # 训练数据 (大部分需自行准备)\n├── Readme\u002F                   # 详细中文文档\n│   ├── 项目全景图\u002F            #   01-06 全景文档\n│   └── 核心代码解析\u002F          #   各模块代码详解\n└── pyproject.toml\n```\n\n\u003C\u002Fdetails>\n\n---\n\n## 快速开始\n\n### 安装\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fjiaran-king\u002FMicroLM.git\ncd MicroLM\npython -m venv .venv\nsource .venv\u002Fbin\u002Factivate        # Linux\u002FMac\n# .venv\\Scripts\\activate         # Windows\n\npip install -e \".[all]\"          # 推荐：包含全部依赖\n```\n\n| 安装方式 | 命令 | 适用场景 |\n|:---:|:---:|:---:|\n| 核心依赖 | `pip install -e .` | 仅自研链路（纯 PyTorch） |\n| +Qwen 链路 | `pip install -e \".[qwen]\"` | +transformers, peft, datasets |\n| +开发测试 | `pip install -e \".[dev]\"` | +pytest |\n| **全部安装** | **`pip install -e \".[all]\"`** | **推荐** |\n\n可选：`pip install vllm`（部署）· `pip install modelscope`（国内下载数据）\n\n### 验证\n\n```bash\npytest tests\u002F                                            # 跑通测试\npython scripts\u002Ftrain_pretrain.py --config configs\u002Fpretrain_smoke.json  # smoke 最小链路\n```\n\n\u003Cdetails>\n\u003Csummary>\u003Cstrong>数据准备\u003C\u002Fstrong> （点击展开下载说明）\u003C\u002Fsummary>\n\n仓库仅包含 `data\u002Fsmoke\u002F` 和 `data\u002Fsft_smoke\u002F` 小型测试数据。完整训练数据需自行下载：\n\n**MiniMind** — 预训练 + SFT 对话数据（自研链路）\n\n```bash\npip install huggingface_hub\n\nmkdir -p data data\u002Fminimind_sft\u002Fgongjy\u002Fminimind_dataset\n\npython - \u003C\u003C'PY'\nfrom huggingface_hub import hf_hub_download\n\nhf_hub_download(\n    repo_id=\"jingyaogong\u002Fminimind_dataset\",\n    repo_type=\"dataset\",\n    filename=\"pretrain_t2t_mini.jsonl\",\n    local_dir=\"data\",\n)\nhf_hub_download(\n    repo_id=\"jingyaogong\u002Fminimind_dataset\",\n    repo_type=\"dataset\",\n    filename=\"sft_t2t_mini.jsonl\",\n    local_dir=\"data\u002Fminimind_sft\u002Fgongjy\u002Fminimind_dataset\",\n)\nPY\n```\n\n当前 MiniMind 数据集已不再提供旧版 `pretrain_hq.jsonl`。本项目现使用并已验证兼容的文件为：\n\n- 预训练：`data\u002Fpretrain_t2t_mini.jsonl`\n- SFT：`data\u002Fminimind_sft\u002Fgongjy\u002Fminimind_dataset\u002Fsft_t2t_mini.jsonl`\n\n来源：[jingyaogong\u002Fminimind](https:\u002F\u002Fgithub.com\u002Fjingyaogong\u002Fminimind)\n\n**InstructIE** — 结构化信息抽取数据（Qwen 迁移链路）\n\n```bash\npip install datasets\npython -c \"from datasets import load_dataset; load_dataset('zjunlp\u002FInstructIE')\"\n```\n来源：[zjunlp\u002FInstructIE](https:\u002F\u002Fhuggingface.co\u002Fdatasets\u002Fzjunlp\u002FInstructIE)\n\n**基座模型**\n\n从 [HuggingFace](https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen2.5-1.5B-Instruct) 下载 `Qwen2.5-1.5B-Instruct` 至项目根目录。\n\n> 详细处理流程见 [`data\u002FREADME.md`](data\u002FREADME.md)\n\n\u003C\u002Fdetails>\n\n---\n\n## 从原始数据到正式产物\n\n下面这组命令按 **项目阶段** 排列，适合从一个全新 clone 的仓库出发，逐步生成正式训练产物。\n\n### 自研 MicroLM 主线（阶段 A → B）\n\n**阶段 A0 — 下载原始数据**\n\n对应项目阶段：原始输入准备\n\n```bash\npip install huggingface_hub\n\nmkdir -p data data\u002Fminimind_sft\u002Fgongjy\u002Fminimind_dataset\n\npython - \u003C\u003C'PY'\nfrom huggingface_hub import hf_hub_download\n\nhf_hub_download(\n    repo_id=\"jingyaogong\u002Fminimind_dataset\",\n    repo_type=\"dataset\",\n    filename=\"pretrain_t2t_mini.jsonl\",\n    local_dir=\"data\",\n)\nhf_hub_download(\n    repo_id=\"jingyaogong\u002Fminimind_dataset\",\n    repo_type=\"dataset\",\n    filename=\"sft_t2t_mini.jsonl\",\n    local_dir=\"data\u002Fminimind_sft\u002Fgongjy\u002Fminimind_dataset\",\n)\nPY\n```\n\n原始输入：\n- `data\u002Fpretrain_t2t_mini.jsonl`\n- `data\u002Fminimind_sft\u002Fgongjy\u002Fminimind_dataset\u002Fsft_t2t_mini.jsonl`\n\n**阶段 A1 — 预训练语料清洗与切分**\n\n对应项目阶段：MiniMind 原始语料 → `pretrain_clean\u002F`\n\n```bash\npython scripts\u002Fprepare_pretrain_jsonl.py \\\n  --input-path data\u002Fpretrain_t2t_mini.jsonl \\\n  --output-dir data\u002Fpretrain_clean \\\n  --document-separator \"\u003C|endoftext|>\" \\\n  --replace-literal \"\u003C|im_end|>=\\n\" \\\n  --replace-literal \"\u003C|im_start|>=\\n\" \\\n  --replace-literal \"\u003Cthink>=\\n\" \\\n  --replace-literal \"\u003C\u002Fthink>=\\n\" \\\n  --clean-html\n```\n\n产物：\n- `data\u002Fpretrain_clean\u002Ftrain.txt`\n- `data\u002Fpretrain_clean\u002Fvalid.txt`\n- `data\u002Fpretrain_clean\u002Ftokenizer_corpus.txt`\n- `data\u002Fpretrain_clean\u002Fmetadata.json`\n\n**阶段 A2 — 构造 tokenizer 训练样本**\n\n对应项目阶段：为 BPE 训练准备轻量样本\n\n```bash\npython - \u003C\u003C'PY'\nfrom pathlib import Path\n\nsrc = Path(\"data\u002Fpretrain_clean\u002Ftokenizer_corpus.txt\")\ndst = Path(\"data\u002Fpretrain_clean\u002Ftokenizer_sample.txt\")\nsample_bytes = 15 * 1024 * 1024\n\nwith src.open(\"rb\") as fsrc, dst.open(\"wb\") as fdst:\n    fdst.write(fsrc.read(sample_bytes))\nPY\n```\n\n产物：\n- `data\u002Fpretrain_clean\u002Ftokenizer_sample.txt`\n\n**阶段 A3 — 训练 BPE tokenizer**\n\n对应项目阶段：Tokenizer 训练\n\n```bash\npython scripts\u002Ftrain_tokenizer.py --config configs\u002Ftokenizer_full_clean.json\n```\n\n产物：\n- `outputs\u002Ftokenizer_full_clean\u002Fvocab.json`\n- `outputs\u002Ftokenizer_full_clean\u002Fmerge.txt`\n\n**阶段 A4 — 将全文预训练语料编码成 token IDs**\n\n对应项目阶段：文本语料 → `.npy` token IDs\n\n```bash\npython scripts\u002Ftokenize_corpus.py --config configs\u002Ftokenize_full_corpus.json\n```\n\n产物：\n- `data\u002Fpretrain_clean\u002Ftokenized_full\u002Ftrain_ids.npy`\n- `data\u002Fpretrain_clean\u002Ftokenized_full\u002Fvalid_ids.npy`\n- `data\u002Fpretrain_clean\u002Ftokenized_full\u002Fmetadata.json`\n\n**阶段 B1 — 正式预训练**\n\n对应项目阶段：Pretrain\n\n```bash\npython scripts\u002Ftrain_pretrain.py --config configs\u002Fpretrain_full_corpus.json\n```\n\n产物：\n- `outputs\u002Fpretrain_full_corpus\u002Fckpt_final.pt`\n- `outputs\u002Fpretrain_full_corpus\u002Fmodel_config.json`\n\n**阶段 B2 — 正式 SFT（全参）**\n\n对应项目阶段：SFT 微调\n\n```bash\npython scripts\u002Ftrain_sft.py --config configs\u002Fsft_baseline.json\n```\n\n产物：\n- `outputs\u002Fsft_baseline\u002Fckpt_final.pt`\n- `outputs\u002Fsft_baseline\u002Ftrain_log.jsonl`\n\n**阶段 B3 — 正式 SFT（LoRA）**\n\n对应项目阶段：LoRA 微调\n\n```bash\npython scripts\u002Ftrain_sft.py --config configs\u002Fsft_lora.json\n```\n\n产物：\n- `outputs\u002Fsft_lora\u002Fckpt_final.pt`\n- `outputs\u002Fsft_lora\u002Flora_adaptor.pt`\n\n### Qwen 迁移主线（阶段 C → D）\n\n**阶段 C0 — 下载原始数据与基座模型**\n\n对应项目阶段：结构化输出链路的原始输入准备\n\n```bash\npip install huggingface_hub\n\nmkdir -p data\u002Finstructie Qwen2.5-1.5B-Instruct\n\npython - \u003C\u003C'PY'\nfrom huggingface_hub import hf_hub_download, snapshot_download\n\nfor filename in [\"train_zh.json\", \"valid_zh.json\", \"test_zh.json\", \"schema_zh.json\"]:\n    hf_hub_download(\n        repo_id=\"zjunlp\u002FInstructIE\",\n        repo_type=\"dataset\",\n        filename=filename,\n        local_dir=\"data\u002Finstructie\",\n    )\n\nsnapshot_download(\n    repo_id=\"Qwen\u002FQwen2.5-1.5B-Instruct\",\n    local_dir=\"Qwen2.5-1.5B-Instruct\",\n)\nPY\n```\n\n原始输入：\n- `data\u002Finstructie\u002Ftrain_zh.json`\n- `data\u002Finstructie\u002Fvalid_zh.json`\n- `data\u002Finstructie\u002Ftest_zh.json`\n- `data\u002Finstructie\u002Fschema_zh.json`\n- `Qwen2.5-1.5B-Instruct\u002F`\n\n**阶段 C1 — 运行 InstructIE 六步数据 pipeline**\n\n对应项目阶段：原始抽取数据 → `sft_candidate\u002F`\n\n```bash\npython scripts\u002F01_normalize.py\npython scripts\u002F02_filter.py\npython scripts\u002F03_quality_tier.py\npython scripts\u002F04_derive_tasks.py\npython scripts\u002F05_stratified_sample.py\npython scripts\u002F06_to_chat_jsonl.py\n```\n\n产物：\n- `data\u002Fprocessed\u002F*.jsonl`\n- `data\u002Fsft_candidate\u002Ftrain.jsonl`\n- `data\u002Fsft_candidate\u002Fvalid.jsonl`\n- `data\u002Fsft_candidate\u002Fmetadata.json`\n\n**阶段 D1 — Qwen LoRA 正式训练**\n\n对应项目阶段：Qwen 迁移 + 结构化输出微调\n\n```bash\npython scripts\u002Ftrain_qwen_lora.py --config configs\u002Fqwen_lora_structured.json\n```\n\n产物：\n- `outputs\u002Fqwen_lora\u002Fadaptor_final\u002F`\n- `outputs\u002Fqwen_lora\u002Fbest_adaptor\u002F`\n- `outputs\u002Fqwen_lora\u002Ftrain_log.jsonl`\n\n**阶段 D2 — 导出合并后的最终模型**\n\n对应项目阶段：部署前导出\n\n```bash\npython scripts\u002Fexport_final_model.py\n```\n\n产物：\n- `outputs\u002Fqwen_lora_merged_final\u002F`\n\n### 最小验证顺序\n\n如果只想先确认环境和数据路径无误，不直接跑正式长任务，推荐按下面顺序验证：\n\n```bash\npytest tests\u002F\npython scripts\u002Ftrain_pretrain.py --config configs\u002Fpretrain_smoke.json\npython scripts\u002Ftrain_sft.py --config configs\u002Fsft_smoke.json\npython scripts\u002Ftrain_qwen_lora.py --config configs\u002Fqwen_lora_structured_smoke.json\n```\n\n---\n\n## License\n\nMIT License. See [LICENSE](LICENSE).\n","MicroLM 是一个轻量级语言模型（LLM）的训练、微调、评测与部署全链路项目。它基于自研的 31.7M 参数 MicroLM 和 Qwen2.5-1.5B 两条主线，支持从数据处理到模型服务化的完整流程。项目使用纯 PyTorch 实现了包括 tokenizer 训练、语料处理、预训练、SFT 微调、LoRA 高效微调、KV Cache 推理优化等核心功能，并通过 Hugging Face 生态工具集实现了对 Qwen 模型的迁移与部署。特别地，其 LoRA 微调效率显著，仅需训练极少比例参数即可达到接近全参模型的效果。此项目适用于需要构建高效且可扩展的语言模型解决方案的研究者和开发者，尤其适合那些希望在有限资源下实现高质量 LLM 应用的场景。",2,"2026-06-11 02:49:08","CREATED_QUERY"]