🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

强化学习微调 xiciyang/training-rl

DeepSeek Harness
xiciyang11 天前有提交已提供中文文档扫描:含敏感能力

在真实 GPU 上训练并验收收益与 KL 预算

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xiciyang/training-rl
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · dev
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 55 处,展示前 36 条)
  • 读取本地文件
    src/index.mjs:69
    if (!existsSync(p)) continue
  • 读取本地文件
    src/index.mjs:70
    const text = readFileSync(p, 'utf8')
  • 读取本地文件
    src/core.mjs:65
    function schemaPath() { return existsSync(SCHEMA_FILE) ? SCHEMA_FILE : null }
  • 读取本地文件
    src/core.mjs:204
    if (!promptsDir || !existsSync(join(promptsDir, 'train.jsonl'))) {
  • 读取本地文件
    src/core.mjs:207
    const lineage = JSON.parse(readFileSync(join(promptsDir, 'lineage.json'), 'utf8'))
  • 读取本地文件
    src/core.mjs:218
    if (!existsSync(join(baseModel, 'config.json'))) throw new ToolError(ERROR_CODES.E_BASE_MODEL_NOT_FOUND, { hint: `基座模型目录不合法:${baseModel}`, recoverable
  • 读取本地文件
    src/core.mjs:240
    const rewardVectors = JSON.parse(readFileSync(join(PKG_ROOT, 'tests', 'fixtures', 'reward-vectors.json'), 'utf8'))
  • 读取本地文件
    src/core.mjs:404
    try { return createHash('sha256').update(readFileSync(f)).digest('hex') } catch { return null }
  • 写入本地文件
    src/core.mjs:863
    writeFileSync(join(run.runDir, 'eval-result.json'), `${JSON.stringify(evalResult, null, 2)}\n`)
  • 执行外部命令固定命令
    src/core.mjs:1030
    try { gpu = execFileSync('nvidia-smi', ['--query-gpu=name,driver_version', '--format=csv,noheader'], { encoding: 'utf8', timeout: 20000 }).trim() } ca
  • 执行外部命令固定命令
    src/core.mjs:1034
    imageId = execFileSync('docker', ['images', '-q', TRAINING_IMAGE], { encoding: 'utf8', timeout: 20000 }).trim() || null
  • 读取本地文件
    src/train.mjs:59
    const doc = JSON.parse(readFileSync(FIXTURE, 'utf8'))
  • 写入本地文件
    src/train.mjs:235
    if (fp.hash) writeFileSync(join(runDir, s.dir, 'adapter-fingerprint.json'), `${JSON.stringify(fp, null, 2)}\n`)
  • 写入本地文件
    src/train.mjs:285
    writeFileSync(join(runDir, 'metrics.jsonl'), steps.map((s) => JSON.stringify(s)).join('\n') + (steps.length ? '\n' : ''))
  • 读取本地文件
    src/data/prepare.mjs:38
    return readFileSync(p, 'utf8').split('\n').filter((l) => l.trim()).map((l) => JSON.parse(l))
  • 读取本地文件
    src/data/prepare.mjs:75
    if (!existsSync(trainFile) || !existsSync(heldoutFile)) {
  • 读取本地文件
    src/data/prepare.mjs:78
    details: { train: existsSync(trainFile), heldout: existsSync(heldoutFile) },
  • 读取本地文件
    src/data/prepare.mjs:113
    if (!existsSync(out) || force) {
  • 写入本地文件
    src/data/prepare.mjs:114
    mkdirSync(out, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/data/prepare.mjs:115
    writeFileSync(join(out, 'train.jsonl'), `${train.map((r) => JSON.stringify(r)).join('\n')}\n`)
  • 写入本地文件
    src/data/prepare.mjs:116
    writeFileSync(join(out, 'heldout.jsonl'), `${heldout.map((r) => JSON.stringify(r)).join('\n')}\n`)
  • 读取本地文件
    src/data/prepare.mjs:122
    if (existsSync(upLineage)) { try { upstream = JSON.parse(readFileSync(upLineage, 'utf8')) } catch { upstream = null } }
  • 读取本地文件
    src/data/prepare.mjs:122
    if (existsSync(upLineage)) { try { upstream = JSON.parse(readFileSync(upLineage, 'utf8')) } catch { upstream = null } }
  • 写入本地文件
    src/data/prepare.mjs:148
    writeFileSync(join(out, 'lineage.json'), `${JSON.stringify(lin, null, 2)}\n`)
  • 写入本地文件
    src/data/prepare.mjs:149
    writeFileSync(join(out, 'train.prompts.jsonl'), `${train.map((r) => JSON.stringify({ prompt: r.prompt, h: recordHash(r, (x) => x.prompt) })).join('\n'
  • 读取本地文件
    src/measurement-identity.mjs:113
    const sha256OfFile = (p) => `sha256:${createHash('sha256').update(readFileSync(p)).digest('hex')}`
  • 读取本地文件
    src/measurement-identity.mjs:122
    try { return JSON.parse(readFileSync(join(datasetDir, 'lineage.json'), 'utf8')) } catch { return null }
  • 读取本地文件
    src/serving-client.mjs:23
    if (existsSync(cfg)) {
  • 读取本地文件
    src/serving-client.mjs:24
    const p = readFileSync(cfg, 'utf8').trim()
  • 读取本地文件
    src/serving-client.mjs:25
    if (p && existsSync(p)) return { root: p, serverPath: join(p, 'mcp', 'server.mjs'), from: 'config file', tried }
  • 读取本地文件
    src/serving-client.mjs:31
    if (existsSync(join(cand, 'mcp', 'server.mjs'))) return { root: cand, serverPath: join(cand, 'mcp', 'server.mjs'), from: 'sibling/env', tried }
  • 执行外部命令来自配置/变量
    src/serving-client.mjs:48
    this.child = spawn(process.execPath, [this.serverPath], { stdio: ['pipe', 'pipe', 'pipe'] })
  • 发起网络请求
    src/serving-client.mjs:66
    await this.request('initialize', { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'training-rl', version: PACKAGE_VERSION } })
  • 发起网络请求
    src/serving-client.mjs:88
    const res = await this.request('tools/call', { name, arguments: args })
  • 发起网络请求
    src/serving-client.mjs:95
    const res = await this.request('tools/list', {})
  • 执行外部命令固定命令
    src/worker.mjs:74
    this.child = spawn('docker', this.args(), { stdio: ['pipe', 'pipe', 'pipe'] })
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
@xiciyang/training-rl 强化学习微调(RL):在真实 GPU 上训练,奖励适配器可替换;并对「收益是真的」「KL 没失控」「同一套判据只有一份实现」分别取证。 DSH(DeepSeek Harness)插件包,同时可作为普通 Node 库使用。 它解决的问题 RL 阶段最容易自欺的三件事: 1. 奖励涨了但没意义——奖励是实现里的常数,或者前后对比没有显著性。本包把奖励规则固定成可复算的向量,验收时先判差异是否成立。 2. KL 漂移——策略跑飞而 loss 好看。本包按预算记账,越界的 run 直接判失败。 3. 判据多份实现——训练侧、验收侧各写一份门禁逻辑,改一处忘另一处。本包的判据来自共享库(@xiciyang/testing-core),不在插件内重写。
展开完整文档(README 剩余 1 节)
@xiciyang/training-rl

强化学习微调(RL):在真实 GPU 上训练,奖励适配器可替换;并对「收益是真的」「KL 没失控」「同一套判据只有一份实现」分别取证。

DSH(DeepSeek Harness)插件包,同时可作为普通 Node 库使用。

它解决的问题

RL 阶段最容易自欺的三件事:

1. 奖励涨了但没意义——奖励是实现里的常数,或者前后对比没有显著性。本包把奖励规则固定成可复算的向量,验收时先判差异是否成立。
2. KL 漂移——策略跑飞而 loss 好看。本包按预算记账,越界的 run 直接判失败。
3. 判据多份实现——训练侧、验收侧各写一份门禁逻辑,改一处忘另一处。本包的判据来自共享库(@xiciyang/testing-core),不在插件内重写。

安装

dsh plugin add github:xiciyang/training-rl

要求:

- Node.js >= 20,engines.dsh >= 0.2.0 < 0.3.0
- 真实训练需要 NVIDIA GPU + 容器运行时 + 训练镜像;training_rl_health 会逐项报告
- 奖励适配器可插拔:内置一份契约(contract.json),也可以指向自己的实现

工具面(DSH)

| 工具 | 作用 |
| training_rl_prepare | 数据/提示集准备,奖励向量与契约落盘 |
| training_rl_train | 训练:预算闸门、KL 记账、权重指纹、checkpoint 保留、审计链 |
| training_rl_validate | 验收:收益显著性 + KL 在预算内,先判测量有效性再判数值 |
| training_rl_rollback | 回退到指定 run;purge 只允许删本插件 run 目录 |
| training_rl_get_report | 取人类可读报告 |
| training_rl_health | 环境自检:GPU / 容器 / 镜像 / 基座 / 奖励适配器 |

配置(不把本机布局写死)

| 环境变量 | 用途 |
| DSH_BASE_MODEL | 基座模型本地目录(同时是 KL 锚点的 reference) |
| DSH_MMLU_PATH | 评测数据路径(可选门禁) |
| TRAINING_RL_ROOT | 运行目录根(默认 ~/.ai-infra) |

奖励模型/偏好数据缺失时,工具会说明缺哪一层并拒绝开跑,而不是用「没有奖励模型」跑出一轮看似成功的训练。

测试

node tests/run.mjs

纯逻辑与契约测试应全绿;依赖本机历史产物的判据自检在产物缺失时显式 SKIP 并写明原因。

安全边界

- 训练需显式确认令牌;预算超限直接拒绝
- 回退只作用于本插件自己的 run 目录
- 审计链可第三方复算

许可

BSD-3-Clause。见 LICENSE。
预览分享卡片长什么样 ↓xiciyang/training-rl
分享 · DeepSeek Harness Hub
xiciyang/training-rl

在真实 GPU 上训练并验收收益与 KL 预算

回到顶部