校验清洗数据集并完成 LoRA 微调训练
31.9/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add phelpsyacht/dsh-finetune该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 32 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装engines.node 要求 >23,不满足 Node 22.19.0
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-finetune(未发布到 npm,仅可源码安装)
✗Node 引擎要求 >23 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 06:57:03
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 30 处,展示前 30 条)
- 发起网络请求lib/provider.js:48
const res = await fetch(new URL(path, this.baseURL), { - 读取本地文件lib/provider.js:71
const content = await readFile(filePath, "utf8"); - 读取本地文件lib/tools/dataset-validate.js:55
const lines = createInterface({ input: createReadStream(args.path, "utf8"), crlfDelay: Infinity }); - 执行外部命令来自配置/变量lib/tools/dataset-clean.js:60
const child = spawn(python, [CLEAN_PY, "--config", configPath], { - 读取本地文件lib/tools/dataset-clean.js:82
const lines = createInterface({ input: createReadStream(path, "utf8"), crlfDelay: Infinity }); - 读取本地文件lib/tools/dataset-clean.js:230
const reader = createInterface({ input: createReadStream(inPath, "utf8"), crlfDelay: Infinity }); - 写入本地文件lib/tools/dataset-clean.js:236
const writer = stageWritePath ? createWriteStream(stageWritePath) : null; - 写入本地文件lib/tools/dataset-clean.js:260
await writeFile( - 删除本地文件lib/tools/dataset-clean.js:273
await unlink(stageWritePath).catch(() => {}); - 写入本地文件lib/tools/dataset-clean.js:305
await writeFile(cfgPath, JSON.stringify(pyConfig, null, 2), "utf8"); - 读取本地文件lib/tools/dataset-clean.js:311
pythonReport = JSON.parse(await readFile(pythonReportPath, "utf8")); - 删除本地文件lib/tools/dataset-clean.js:326
await unlink(cfgPath).catch(() => {}); - 删除本地文件lib/tools/dataset-clean.js:327
await unlink(stageWritePath).catch(() => {}); - 删除本地文件lib/tools/dataset-clean.js:338
if (args.dry_run && pyFinalPath) await unlink(pyFinalPath).catch(() => {}); - 读取本地文件lib/tools/dataset-clean.js:345
const ql = createInterface({ input: createReadStream(quarantinePath, "utf8"), crlfDelay: Infinity }); - 写入本地文件lib/tools/dataset-clean.js:362
await writeFile(reportPath, quarantineHtml(records, summary, { path: inPath }), "utf8"); - 写入本地文件lib/tools/dataset-clean.js:363
await writeFile(csvPath, quarantineCsv(records), "utf8"); - 读取本地文件lib/tools/job-create.js:40
const dataset = validateJsonlDataset(await readFile(args.dataset_path, "utf8")); - 执行外部命令来自配置/变量lib/tools/train.js:78
const child = spawn(python, [TRAIN_PY, "--config", configPath], { - 写入本地文件lib/tools/train.js:146
await mkdir(outputDir, { recursive: true }); - 写入本地文件lib/tools/train.js:150
await writeFile(dataPath, cleanResult.text); - 写入本地文件lib/tools/train.js:161
await writeFile(configPath, JSON.stringify(trainConfig, null, 2)); - 写入本地文件lib/tools/train.js:242
await mkdir(localMetaDir, { recursive: true }); - 写入本地文件lib/tools/train.js:246
await writeFile(dataPath, cleanResult.text); - 写入本地文件lib/tools/train.js:259
await writeFile(configPath, JSON.stringify(trainConfig, null, 2)); - 读取本地文件lib/tools/train.js:382
const text = await readFile(args.dataset_path, "utf8"); - 读取本地文件lib/python.js:75
if (cand.checkPath && !existsSync(cand.argv[0])) continue; - 执行外部命令来自配置/变量lib/python.js:76
const res = spawnSync(cand.argv[0], cand.argv.slice(1), { encoding: "utf8", timeout: 30000 }); - 执行外部命令来自配置/变量lib/python.js:82
const exe = spawnSync(cand.argv[0], [...cand.extra, "-c", PY_EXE], { encoding: "utf8", timeout: 30000 }); - 执行外部命令来自配置/变量lib/remote.js:74
const child = spawn(bin, args, { stdio: ["ignore", "pipe", "pipe"] });
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 校验清洗数据集
- LoRA微调训练
低成本学习微调大语言模型dshweb插件
README
由 DeepSeek 最新模型翻译生成dsh-finetune
面向 DeepSeek Harness 的 LLM 微调插件。
dsh-finetune 把数据集校验、数据清洗、LoRA SFT 微调、训练监控和适配器验证串成一条可直接复用的工具链。它既可以在本机 CPU/GPU 上运行,也可以通过 SSH 调用远端 GPU 机器,或者对接 OpenAI-compatible 的远端微调 API。
Features
- 数据集校验
- 支持 chat、prompt-completion、alpaca、sharegpt 四种格式。
- 检查 JSONL 合法性、格式一致性、assistant 结尾、字段完整性。
- 返回行级错误、格式、approximate token 数和预览。
- 数据清洗
- 去重、类似去重、长度过滤、重复字符过滤。
- 清理控制字符、HTML、URL,支持全角转半角。
- 支持 PII 脱敏:身份证、手机号、邮箱。
- 支持内联 /quarantine 边界样本审查报告。
- 支持按 source 覆盖阈值。
- 可选 PPL 过滤、语言检查、语义去重、主题下采样。
- 本地 LoRA SFT 微调
- 使用 torch + transformers + peft。
- 不依赖 trl / datasets,尽量减少框架依赖。
- 支持 assistant 回复 mask。
展开完整文档(README 剩余 1 节)
dsh-finetune
面向 DeepSeek Harness 的 LLM 微调插件。
dsh-finetune 把数据集校验、数据清洗、LoRA SFT 微调、训练监控和适配器验证串成一条可直接复用的工具链。它既可以在本机 CPU/GPU 上运行,也可以通过 SSH 调用远端 GPU 机器,或者对接 OpenAI-compatible 的远端微调 API。
Features
- 数据集校验
- 支持 chat、prompt-completion、alpaca、sharegpt 四种格式。
- 检查 JSONL 合法性、格式一致性、assistant 结尾、字段完整性。
- 返回行级错误、格式、approximate token 数和预览。
- 数据清洗
- 去重、类似去重、长度过滤、重复字符过滤。
- 清理控制字符、HTML、URL,支持全角转半角。
- 支持 PII 脱敏:身份证、手机号、邮箱。
- 支持内联 /quarantine 边界样本审查报告。
- 支持按 source 覆盖阈值。
- 可选 PPL 过滤、语言检查、语义去重、主题下采样。
- 本地 LoRA SFT 微调
- 使用 torch + transformers + peft。
- 不依赖 trl / datasets,尽量减少框架依赖。
- 支持 assistant 回复 mask。
- 训练完成后保存 adapter、tokenizer 和 training state。
- SSH 远端训练
- 自动上传数据集、配置和 trainer 到远端机器。
- 在远端 GPU 机器上启动训练并轮询日志。
- 适合本机没有 GPU、但有远端训练机的场景。
- 远端微调任务管理
- 适配 OpenAI-compatible /files 和 /fine_tuning/jobs 接口。
- 提供任务创建、状态查询、列表、取消和后台监视。
- 安全
- API key 只从环境变量读取,不进入 tool 参数和模型可见 transcript。
- side-effectful 工具声明为非并发安全,方便接入 permission policy。
Supported Tools
| Tool | Purpose |
| finetune_dataset_validate | 校验 JSONL 微调数据集 |
| finetune_dataset_clean | 清洗、去重、过滤和脱敏数据集 |
| finetune_train | 本地 / SSH LoRA SFT 训练 |
| finetune_job_create | 创建远端微调任务 |
| finetune_job_status | 查询远端微调任务状态 |
| finetune_job_list | 列出远端微调任务 |
| finetune_job_cancel | 取消远端微调任务 |
| finetune_job_watch | 后台监视远端微调任务 |
Requirements
- Node.js >= 22
- Python >= 3.10
- Python packages: torch, transformers, peft
- 本地训练时,模型需在 HuggingFace 缓存或本地路径中
- 远端 API 模式需要服务商支持 OpenAI-compatible fine-tuning endpoints
- DSH 宿主需为 0.2.0 及以上:@deepseek-ai/dsh-tools(^0.2.0-rc.2)、@deepseek-ai/cordis(~4.0.4)、@deepseek-ai/schemastery(~3.18.4)——三者以 peerDependencies 声明,随 DSH 本体升级同步;dsh 自 0.2.0 起会在加载时校验该区间,不匹配的插件会被整包跳过
- 后台监视依赖宿主组合的 jobs 注册表(@deepseek-ai/dsh-jobs-local,由 @deepseek-ai/dsh-base 组合),但它不是必需依赖:插件用 ctx.get("jobs") 惰性读取而非声明 inject,所以没有注册表时 8 个工具仍全部注册——只是 finetune_job_watch 在调用时报错并提示改用 finetune_job_status,finetune_train 退化为 detached 进程运行
- 后台任务按 0.2.0 的 jobs 契约注册:owner 传调用方会话 id(exec.agent.id)、输出经 run(handle).append() 写入任务输出环、done 结算为 JobOutcome({status, detail})。因此本版本不支持 0.1.5 世代的 dsh(run(handle) 与输出环是 0.2.0 新增)
Quick Start
1. 校验数据集
{
"path": "/data/train.jsonl"
}
工具:
finetune_dataset_validate
2. 清洗数据集
{
"path": "/data/train.jsonl",
"out": "/data/train.clean.jsonl"
}
工具:
finetune_dataset_clean
3. 本地 LoRA 微调
{
"dataset_path": "/data/train.clean.jsonl",
"name": "my-first-lora",
"model": "Qwen/Qwen3-0.6B",
"epochs": 2,
"device": "cpu"
}
工具:
finetune_train
4. SSH 远端训练
在插件配置中设置:
transport: ssh
remote:
host: cp.example.com
user: ubuntu
port: 22
keyPath: ~/.ssh/id_rsa
dir: /data/dsh-finetune
python: python3
之后调用 finetune_train 即可。
Project Structure
dsh-finetune/
├── index.js # 插件注册入口 ├── cordis.patch.yml # Bundle patch ├── lib/ │ ├── clean.js # 数据集清洗引擎 │ ├── dataset.js # 数据集格式校验 │ ├── provider.js # OpenAI-compatible fine-tuning adapter │ ├── python.js # Python / torch 环境探测 │ ├── remote.js # SSH 远端训练执行器 │ ├── tools/ │ │ ├── dataset-validate.js │ │ ├── dataset-clean.js │ │ ├── train.js │ │ ├── job-create.js │ │ ├── job-status.js │ │ ├── job-list.js │ │ ├── job-cancel.js │ │ └── job-watch.js │ └── trainer/ │ ├── train.py # 独立 LoRA SFT trainer │ └── clean.py # 可选 Python 清洗层 └── tests/
说明
- 训练方法只支持 LoRA,暂不支持 QLoRA / 全参微调,有扩展能力。
- 本机 CPU 可以训练小模型,但速度较慢;推荐用 GPU 或 SSH 远端机器。
- 本地 trainer 使用 HF_HUB_OFFLINE=1,模型必须已缓存到本地,或指定本地模型路径。
- 远端 API 模式能不能用,取决于服务商是否真的提供 OpenAI-compatible fine-tuning endpoints。
- loss 下降只能说明训练链路在拟合数据,不能替代 held-out 评估和人工评测。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
phelpsyacht/dsh-finetune
校验清洗数据集并完成 LoRA 微调训练
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9