[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80689":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":12,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":18,"hasPages":16,"topics":19,"createdAt":10,"pushedAt":10,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},80689,"100M","duguying\u002F100M","duguying","training your 0.1B llm from zero","https:\u002F\u002Ftinyllm.duguying.net",null,"Python",46,6,0,2.54,false,"main",true,[20,21],"llm","training","2026-06-12 02:04:05","# Tiny LLM Studio — 从零训练 0.1B 中文大模型的端到端工作台\n\n在 Apple Silicon（M 系列）MacBook 上从零训练一个 ~0.1B 参数、类 LLaMA 架构（RoPE + RMSNorm + SwiGLU + GQA）的中文大模型，全程在一个 Web UI 里完成：\n\n- **Tiny LLM Studio**（FastAPI + React Web UI）：数据源 → 采集任务 → Tokenizer → 数据集 → 训练，一站式\n- 32k byte-level BPE tokenizer\n- 类 LLaMA 模型实现（≈ 96M 参数）\n- 预训练（pretrain）\n- 监督微调（SFT）\n- 直接偏好优化（DPO）\n- 推理与流式 chat CLI\n\n> 目标硬件：MacBook Pro M4 Pro \u002F 48GB（统一内存），PyTorch ≥ 2.5 + MPS 后端。\n\n## 快速开始\n\n```bash\n# 1. 安装依赖（推荐 uv，或直接 pip）\npython3 -m venv .venv && source .venv\u002Fbin\u002Factivate\npip install -e \".[dev]\"\n\n# 2. 下载并清洗最小语料（默认抽样 ~5GB）\nbash scripts\u002F01_collect_minimal.sh\n\n# 3. 训练 32k BPE tokenizer\nbash scripts\u002F02_train_tokenizer.sh\n\n# 4. 预训练（先跑 0.5B tokens 验证，~12h on M4 Pro）\nbash scripts\u002F03_pretrain.sh\n\n# 5. SFT\nbash scripts\u002F04_sft.sh\n\n# 6. DPO\nbash scripts\u002F05_dpo.sh\n\n# 7. 与模型对话\nbash scripts\u002F06_chat.sh\n\n# 8. 启动 Tiny LLM Studio（FastAPI + Web UI）\nbash scripts\u002F07_corpus_platform.sh\n# 浏览器访问 http:\u002F\u002Flocalhost:8000\n# 想让 LAN 外的同事也能访问？看下面「公网访问 Web UI（Tunnel 模式）」一节。\n\n# 9. 扩量训练（2-5B tokens）\nbash scripts\u002F08_pretrain_scale.sh\n\n# 10. 评估困惑度\nbash scripts\u002F09_eval.sh checkpoints\u002Fpretrain\u002Flatest.pt\n```\n\n## Smoke test（验证模型代码）\n\n```bash\nPYTHONPATH=src pytest tests\u002F -v\n```\n\n## 目录结构\n\n```text\n100M\u002F\n├── configs\u002F           # YAML 配置（模型、训练超参）\n├── src\u002Fllm\u002F           # 模型、tokenizer、训练、推理\n├── src\u002Fcorpus\u002F        # Tiny LLM Studio 后端（FastAPI + React WebUI）\n├── scripts\u002F           # 一键运行脚本\n├── data\u002F              # 数据（gitignore）\n└── checkpoints\u002F       # 模型权重（gitignore）\n```\n\n## 模型规格\n\n| 配置                      | 值        |\n| ------------------------- | --------- |\n| 参数量                    | ≈ 96M     |\n| `vocab_size`              | 32000     |\n| `hidden_size`             | 768       |\n| `num_hidden_layers`       | 12        |\n| `num_attention_heads`     | 12        |\n| `num_key_value_heads`     | 4 (GQA)   |\n| `intermediate_size`       | 2048      |\n| `max_position_embeddings` | 2048      |\n| `tie_word_embeddings`     | true      |\n\n## 关于在 M4 上的训练时间\n\n实测吞吐约 **8k–15k tokens\u002Fs**（bf16 + MPS）。\n\n| 数据规模    | 预计时间       | 备注                  |\n| ----------- | -------------- | --------------------- |\n| 0.5B tokens | ~12 小时       | 验证 loss 收敛        |\n| 2B tokens   | ~2 天          | 接近 Chinchilla 最优  |\n| 5B tokens   | ~5–8 天        | 极限级训练            |\n\n支持 `--resume` 中断续训，无需一次跑完。\n\n## 镜像加速\n\n国内访问 HuggingFace 慢，使用：\n\n```bash\nexport HF_ENDPOINT=https:\u002F\u002Fhf-mirror.com\n```\n\n## 公网访问 Web UI（Tunnel 模式）\n\n类似 `expo start --tunnel`：本地启动 WebUI 后开一条公网隧道，访问者**不需要**和你在同一局域网（甚至不需要在同一个国家）即可使用 Web UI 和所有 API。\n\n实现基于 [ngrok 官方 Python SDK](https:\u002F\u002Fgithub.com\u002Fngrok\u002Fngrok-python)（`pip install ngrok`，自带 Rust 客户端，**无需**安装外部 `ngrok` 二进制或 `ngrok.yml`）。\n\n> 为什么需要 ngrok？ngrok 服务端从 2022 年起强制要求所有 client 携带 authtoken（用于反滥用），匿名 tunnel 已经被关闭，这是服务端策略，没有任何 SDK \u002F wrapper 能绕过。注册和获取 token 都是免费的，整个流程不到 1 分钟。\n\n### 快速三步\n\n```bash\n# 1. 安装 tunnel 可选依赖（一次性）\npip install -e \".[tunnel]\"\n#  ↑ 等价于 pip install ngrok ；这个依赖体积 ~5MB，且只在你想开 tunnel 时才用，\n#    所以默认不在主依赖里。\n\n# 2. 拿一个 ngrok authtoken（一次性，下面有详细步骤）\nexport NGROK_AUTHTOKEN=\"2abc...你自己的 token...\"\n\n# 3. 启动 Tiny LLM Studio + tunnel\nTUNNEL=1 bash scripts\u002F07_corpus_platform.sh\n```\n\n启动成功后会打印类似 banner（**包含可直接用手机摄像头扫描的二维码**，对齐 `expo start --tunnel` 的体验）：\n\n```text\n================================================================\n  Tiny LLM Studio\n  Session:    tinyllm-9g7xph45b\n  Local URL:  http:\u002F\u002Flocalhost:8000\n  Public URL: https:\u002F\u002F\u003Crandom-pet-name>.ngrok-free.dev\n\n  Scan with your phone camera to open on a mobile device:\n\n ▄▄▄▄▄▄▄ ▄   ▄▄   ▄   ▄▄   ▄▄▄▄▄▄▄\n █ ▄▄▄ █ ▄▀▄ ▄▄ ▄ ▄ ▄█▄▀▄█ █ ▄▄▄ █\n █ ███ █  ██  ▄ ▄ ▄ ▄ ▀▄▀  █ ███ █\n █▄▄▄▄▄█ █▀▄▀▄▀▄▀▄▀▄▀▄▀█ █ █▄▄▄▄▄█\n ...（unicode block QR，约 17 行）...\n █▄▄▄▄▄█ ▄ ▄▄▄▀▀▄▄ ███ █ █▀████  ▄\n\n  WARNING: the WebUI is now exposed to the public internet.\n           Anyone with the URL above can access \u002Fapi\u002F* and\n           trigger jobs \u002F training \u002F publishing. Treat the\n           URL as a secret.\n================================================================\n```\n\n- 把 `Public URL` 发给在 PC 上的访问者；让手机用户直接扫终端里的**二维码**。二维码用 `▀▄█` 半块字符渲染，密度跟 expo 一致，主流终端（macOS Terminal \u002F iTerm \u002F Alacritty \u002F Windows Terminal \u002F VS Code 内置终端）都能正确显示。\n- `Session` 是本地生成的会话标签（也作为 metadata 上报到 ngrok dashboard，方便你在多次启动之间区分会话），它**不是**公网地址。\n- 如果终端没装 `qrcode` 可选依赖，二维码会被静默跳过，URL 仍然正常打印——不会因为缺一个可视化辅助而启动失败。\n\n### 怎么申请 ngrok authtoken（详细步骤）\n\nngrok 全程**免费**（注册免费、tunnel 免费、流量在免费额度内免费），只是要绑定一个账号。\n\n1. **注册账号**：打开 https:\u002F\u002Fdashboard.ngrok.com\u002Fsignup\n   - 用邮箱\u002FGoogle\u002FGitHub 任选一种注册即可\n   - 不需要绑卡、不需要付费\n   - 注册完成后会自动跳到 dashboard\n\n2. **取 authtoken**：打开 https:\u002F\u002Fdashboard.ngrok.com\u002Fget-started\u002Fyour-authtoken\n   - 页面会直接展示你的 authtoken（形如 `2abc...XYZ`，约 50 字符）\n   - 点 **Copy** 按钮复制\n\n3. **设置环境变量**：把 token 写到 shell 配置里，以后就不用再处理了。\n\n   - **macOS \u002F Linux（zsh，macOS 默认）**：\n     ```bash\n     echo 'export NGROK_AUTHTOKEN=\"2abc...你自己的 token...\"' >> ~\u002F.zshrc\n     source ~\u002F.zshrc\n     ```\n   - **macOS \u002F Linux（bash）**：\n     ```bash\n     echo 'export NGROK_AUTHTOKEN=\"2abc...你自己的 token...\"' >> ~\u002F.bashrc\n     source ~\u002F.bashrc\n     ```\n   - **fish**：\n     ```fish\n     set -Ux NGROK_AUTHTOKEN \"2abc...你自己的 token...\"\n     ```\n   - **Windows（PowerShell，永久）**：\n     ```powershell\n     [Environment]::SetEnvironmentVariable(\"NGROK_AUTHTOKEN\", \"2abc...你自己的 token...\", \"User\")\n     ```\n   - **临时**（仅当前 shell 会话有效）：\n     ```bash\n     export NGROK_AUTHTOKEN=\"2abc...你自己的 token...\"\n     ```\n\n4. **验证生效**：\n   ```bash\n   echo $NGROK_AUTHTOKEN\n   #  应当输出你的 token。如果空，说明环境变量没装好，请重开终端或 source 配置文件。\n   ```\n\n### 进阶用法\n\n```bash\n# 自定义端口\nTUNNEL=1 bash scripts\u002F07_corpus_platform.sh 9000\n\n# 不在 shell 里持久化 token，只对一次启动生效（适合临时使用别人电脑）\nNGROK_AUTHTOKEN=\"2abc...\" TUNNEL=1 bash scripts\u002F07_corpus_platform.sh\n\n# 直接调底层 launcher（脚本内部就是这么调的）\nNGROK_AUTHTOKEN=\"2abc...\" python -m corpus.api.launcher --port 8000 --tunnel\n\n# 关掉 tunnel：Ctrl-C 即可，launcher 会同时清理 ngrok session 与 uvicorn 进程\n```\n\n### 常见报错\n\n| 报错 | 原因 | 解决 |\n| --- | --- | --- |\n| `ngrok requires an authtoken` | 没设 `NGROK_AUTHTOKEN` | 按上面步骤导出环境变量 |\n| `ngrok python SDK is not installed` | 没装可选依赖 | `pip install -e \".[tunnel]\"` |\n| `ngrok.forward() failed: ... ERR_NGROK_108` | 你已经有一个免费 session 在跑 | 关掉别的 ngrok 实例（dashboard 也能 kick）|\n| `address already in use` | 端口被前一次未清干净的进程占着 | `pkill -f corpus.api.launcher` 后重试 |\n| 二维码不显示，只看到 URL | 没装 `qrcode` 可选依赖 \u002F 终端不支持 UTF-8 | `pip install -e \".[tunnel]\"`；终端切到 UTF-8 |\n\n### 安全提醒\n\n> ⚠️ Tiny LLM Studio 当前没有内置鉴权，开了 tunnel 等于把所有 `\u002Fapi\u002F*`（数据采集、\n> 训练、发布、删除等）暴露到公网。**任何拿到这个 URL 的人都能用你的机器训练模型 \u002F 删除数据**。\n>\n> 把 URL 当作密钥处理：\n> - 只通过私聊（IM\u002F邮件）发给你信任的人，**不要**发到群、issue、博客\n> - 用完 Ctrl-C 立即关闭，URL 一旦关闭就永久失效（每次启动都是新随机域名）\n> - 如果担心，可在 ngrok dashboard 撤销 session 或 rotate authtoken\n","Tiny LLM Studio 是一个端到端的工作台，旨在帮助用户在 Apple Silicon（M 系列）MacBook 上从零开始训练一个约 0.1B 参数的中文大模型。该项目采用类 LLaMA 架构（RoPE + RMSNorm + SwiGLU + GQA），并通过 FastAPI 和 React 构建了一个 Web UI，以实现从数据采集、Tokenizer 训练到模型预训练及微调的一站式流程。它支持预训练、监督微调（SFT）、直接偏好优化（DPO）等关键功能，并提供了一个流式 chat CLI 用于与模型对话。适用于拥有 M4 Pro \u002F 48GB 统一内存 MacBook 的研究人员或开发者，在有限硬件条件下快速实验和迭代语言模型。",2,"2026-06-11 04:01:39","CREATED_QUERY"]