dsh-fine-tune 0.0.0-stage → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dsh-fine-tune contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,203 @@
1
- # Temporary Holding Version
1
+ # dsh-fine-tune
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **在 DeepSeek Harness 里微调一个小模型,跑在你自己的显卡上。**
4
+
5
+ 导入数据 → 训练 → 评测,全在一个面板里完成。产物是一个 LoRA 适配器,几十 MB。
6
+
7
+ > ## 只在一种配置上验证过
8
+ >
9
+ > 本插件**只在 RTX 3060 Laptop 6 GB + Windows 11** 上完整跑通过:
10
+ > 安装、训练、评测、导出都实测过。其他环境**没有测**,包括:
11
+ >
12
+ > | 未验证 | 说明 |
13
+ > |---|---|
14
+ > | **Linux** | 代码写了,安装器和训练都**一次都没在 Linux 上跑过**。安装器目前直接拒绝非 Windows 平台。 |
15
+ > | **其他显卡** | 只测过 3060。8/12/24 GB 的能力判断是按显存推算的,不是实测。 |
16
+ > | **真实远程 SSH** | 有端到端测试(11/11 通过),但用的是**模拟 SSH 服务器**,没连过真实远程 GPU。 |
17
+ > | CUDA 11.8 轮子 | 驱动太旧时安装器会选它,未实测。 |
18
+ >
19
+ > 在这些环境上遇到问题,请开 issue 并附上 `nvidia-smi` 输出和安装日志。
20
+
21
+ ---
22
+
23
+ ## 它能做什么,不能做什么
24
+
25
+ **能做**
26
+
27
+ - 用 QLoRA / LoRA 在本地或远程 GPU 上训练 Qwen / Llama 系的开源模型
28
+ - 从 JSONL 导入数据,训练前看到数据卡(样本数、token 分布、去重结果)
29
+ - 训练前估算显存,放不下就不启动 —— 不用跑到一半 OOM
30
+ - 评测并给出可判定的数字(工具调用准确率)和文本相似度
31
+ - 导出 adapter、合并权重、导出 GGUF 给 Ollama
32
+
33
+ **不能做**
34
+
35
+ - **微调不了你正在聊天的那个云端模型。** 它跑在别人的服务器上,你没有它的权重。这个插件训练的是**下载到你本机的开源小模型**。
36
+ - macOS 没有 CUDA,训练不可行。
37
+ - 显存不够训大模型 —— 这是物理限制,不是配置问题。
38
+
39
+ ---
40
+
41
+ ## 要求
42
+
43
+ | 项 | 要求 |
44
+ |---|---|
45
+ | 系统 | **Windows 10/11**(Linux 未验证,见文档开头) |
46
+ | 显卡 | **NVIDIA,6 GB 显存起** |
47
+ | 驱动 | 支持 CUDA 11.8 以上 |
48
+ | Python | 3.10+(用来建虚拟环境) |
49
+ | 磁盘 | 约 10 GB(依赖 3-5 GB + 模型 1 GB + 数据) |
50
+
51
+ 显存对应的能力,按实测:
52
+
53
+ | 显存 | 能训 |
54
+ |---|---|
55
+ | 6 GB | 0.5B(QLoRA, seq ≤ 1024),显存峰值 2.86 GiB |
56
+ | 8 GB | 1.5B |
57
+ | 12 GB | 3B |
58
+ | 24 GB | 7B |
59
+
60
+ ---
61
+
62
+ ## 安装
63
+
64
+ 1. 在插件市场安装本插件
65
+ 2. 打开面板 → 顶部会提示「训练需要 Python 环境」,点**安装环境**
66
+ 3. 等待 10-20 分钟(下载 torch 等约 3-5 GB)
67
+ 4. 装完会验证 GPU 真的能跑矩阵乘法,不只是能 import
68
+
69
+ 环境装在 `$DSH_HOME/fine-tune/venv`,**重装插件不用重下**。
70
+
71
+ ### 安装失败怎么办
72
+
73
+ | 报错 | 原因 |
74
+ |---|---|
75
+ | `nvidia-smi 不可用` | 没有 N 卡,或驱动没装 |
76
+ | `没有匹配的 torch 轮子` | 驱动太旧,升级驱动 |
77
+ | `显存不足` | 4 GB 以下训练不可行(装完也训不动,所以不下载) |
78
+ | `找不到 Python 3.10+` | 装 Python 并勾选 Add to PATH |
79
+
80
+ ---
81
+
82
+ ## 用法
83
+
84
+ ### 1. 准备数据
85
+
86
+ JSONL,每行一个对话:
87
+
88
+ ```jsonl
89
+ {"messages":[{"role":"user","content":"问题"},{"role":"assistant","content":"答案"}]}
90
+ ```
91
+
92
+ 或简写:
93
+
94
+ ```jsonl
95
+ {"prompt":"问题","response":"答案"}
96
+ ```
97
+
98
+ **建议 100 条以上。** 少于 20 条,训出来的差别大概率在噪声里。
99
+
100
+ 装完的面板上会有一个「导入示例数据集」按钮(60 条),点一下就能先把流程跑通。
101
+ 它只在数据集列表为空时出现;文件在 `sample/sample.jsonl`。
102
+
103
+ **训练出来的模型只认识示例内容**,用来验证环境和流程,不是给生产用的。
104
+
105
+ ### 2. 训练
106
+
107
+ 「数据」页勾选数据集 → 「下一步」→ 选模型和序列长度 → 「开始训练」
108
+
109
+ **关键参数**(其余默认):
110
+
111
+ | 参数 | 6 GB 显卡的值 |
112
+ |---|---|
113
+ | 模型 | `Qwen2.5-0.5B-Instruct` |
114
+ | 训练方式 | QLoRA |
115
+ | 序列长度 | 1024 |
116
+
117
+ 看显存预估框是绿色再点开始。
118
+
119
+ ### 3. 评测
120
+
121
+ 「评测与发布」页,跑 20 条,看**工具准确率**。
122
+
123
+ ---
124
+
125
+ ## 实测数据(RTX 3060 Laptop 6 GB)
126
+
127
+ 在 1614 条工具调用样本上训练 Qwen2.5-0.5B:
128
+
129
+ | 项 | 结果 |
130
+ |---|---|
131
+ | 耗时 | 18.3 分钟(190 步) |
132
+ | 显存峰值 | **2.86 GiB** |
133
+ | loss | **1.49 → 0.68** |
134
+ | **工具调用准确率** | **0% → 10%** |
135
+ | 文本相似度 F1 | 0.005 → 0.271 |
136
+ | 沾题率 | 0% → 90% |
137
+
138
+ 底座 0% 是正常的:0.5B 原本不会输出那个 JSON 结构。
139
+
140
+ **10% 是 0.5B 的真实水平**,不是训练没做好。要更高准确率只能换更大模型,需要更大显存。
141
+
142
+ ### 一个踩过的坑
143
+
144
+ 把数据集的上下文压缩掉之后(为了塞进更短的序列),train_loss 卡在 1.61 不降,**完全学不到东西**。原版数据能降到 0.68。
145
+
146
+ **提示里的历史上下文是决策依据,不是冗余。** 不要为了省显存去裁剪它 —— 用更大的序列长度,或者接受截断。
147
+
148
+ ---
149
+
150
+ ## 已知限制
151
+
152
+ **已验证**
153
+
154
+ - Windows 11 + RTX 3060 6 GB
155
+ - torch 2.5.1+cu121 / transformers 4.46.3 / peft 0.13.2 / bitsandbytes 0.44.1
156
+ - 本机训练、评测、导出完整链路
157
+
158
+ **未验证项目已在文档开头列出**。在这些环境上发现问题,请开 issue。
159
+
160
+ | Linux | 代码写了,**一次都没跑过** |
161
+ | 其他显卡型号 | 只在这块 3060 上测过 |
162
+ | 远程 SSH 后端 | 有端到端测试(11/11 通过),但用的是模拟 SSH 服务器,**没连过真实远程 GPU** |
163
+ | CUDA 11.8 轮子 | 驱动太旧时会选它,但没测过 |
164
+ | 多卡 | 不支持 |
165
+
166
+ ---
167
+
168
+ ## 架构
169
+
170
+ ```
171
+ index.js 宿主:路由、权限门、训练进程管理
172
+ client/client.js 面板(浏览器)
173
+ lib/
174
+ hardware.mjs 显存估算(含实测标定)
175
+ training.mjs 参数校验与能力探测
176
+ bootstrap.mjs CUDA 轮子选择、显卡解析
177
+ install.mjs 安装流程
178
+ backend.mjs 本机 / SSH 后端
179
+ dataset.mjs 数据集读写、切分、合并
180
+ python/fnt_worker/ Python worker:训练、评测、导出
181
+ ```
182
+
183
+ **为什么用 venv 而不是打包依赖**:torch 的版本取决于用户的显卡,3-5 GB 的包也远超插件该有的体积。装错版本比不装更难排查。
184
+
185
+ ---
186
+
187
+ ## 开发
188
+
189
+ ```powershell
190
+ node test/unit.mjs # 55 个单元测试
191
+ node test/host.mjs # 宿主接口
192
+ node test/client.mjs # 面板 bundle
193
+ cd python; python -m unittest discover -s tests # 20 个
194
+ node test/ssh-e2e.mjs # SSH 传输(11 项)
195
+ ```
196
+
197
+ `scripts/sync.mjs` 把代码复制到 DSH profile,文件清单是**扫描目录得到的**,不是手写的。
198
+
199
+ ---
200
+
201
+ ## 许可
202
+
203
+ MIT