dsh-plugin-c2c:在 DSH 里用 KV-cache 融合驱动双本地模型协作

前言

在 DeepSeek Harness(DSH)里做多模型协作时,常见做法是一个模型把结果写成文本,再交给下一个模型读入。这条通道受 token 表达力限制,中间状态里「写不出来」的信息到不了接收方。

Cache-to-Cache(C2C)的思路是把 sharer 的 KV-cache 投影并融合进 receiver 的 cache,让接收方在生成前就从更完整的工作状态起步,而不是先走一遍文本交接。社区插件 dsh-plugin-c2c(维护者 Alyosha28,分类:工作流)把上游 thu-nics/C2C 运行时封装成一组 c2c_* 智能体工具,供 DSH 会话在本地调用。

这是什么

dsh-plugin-c2c 是 DSH 插件,版本 0.1.0(MIT 许可证)。它不重新实现 C2C 算法,而是打包上游 rosetta 运行时:本地同时跑一个 receiver(负责作答)和一个或多个 sharer,在 receiver 生成任何 token 之前,把 sharer 的 KV-cache 投影到 receiver 的 cache 空间并融合;两模型之间不传文本。

架构上,DSH 智能体通过 c2c_* 工具经 loopback HTTP 访问 c2c_daemon.py,daemon 再调用 PyTorch 侧的 receiver、sharer 与 C2C projectors。Node 插件不 import Python 或 torch,按需拉起 daemon 并转发请求,避免 Python 环境问题拖垮 DSH 启动。

核心功能

插件暴露六个智能体工具:

工具 作用
c2c_status 查看 daemon 与加载状态
c2c_models 列出可用 fuser 模型对
c2c_load 加载并构建融合模型
c2c_chat 在融合条件下作答
c2c_compare 同一 prompt 下对比「融合」与「仅 receiver」
c2c_unload 释放设备显存/内存

上游自带七组 fuser 对,规模从 0.6B+0.5B 到 8B+7B;README 称最小一对可在笔记本上运行。

README 中强调的实际用途包括:融合后两个小模型能答出单独任一模型答不好的题;sharer 与 projectors 在 prompt 阶段只跑一遍,解码成本与仅 receiver 相当;权重、投影与生成均在本地,daemon 仅绑定 loopback,除首次从 Hugging Face 拉权重外无对外请求;daemon 生命周期可长于插件 realm,profile 热重载不必然卸掉已加载对;上游以 Linux+CUDA 为主,该插件在 Apple Silicon(MPS)上做过移植与验证。

论文报告相对单模型与纯文本交接有精度提升;插件 README 明确说明未在此复现论文精度实验,已验证的是管线能端到端跑通及文档中的性能数字(见下文「环境与限制」)。

安装与启用

安装分两步:先准备 C2C 运行时(克隆上游、建 venv、固定 transformers),再向 DSH profile 注册插件。setup 一步不下载权重;约 3.2 GB 模型文件在首次 c2c_load 时下载,缓存在 <root>/models/hf。

1、准备运行时(路径可按需修改 --root):

python python/dsh_c2c_setup.py --root ~/factor_digging/c2c --verify

2、安装插件(须使用资料中的 profile 与仓库标识):

dsh plugin --profile web add Alyosha28/dsh-plugin-c2c

3、重启 DSH 会话。使用 patchReload: startup 的 profile 会在启动时加载插件。

默认无需改配置:repoRoot 与 pythonPath 可自动检测。若需覆盖,在 profile 的 cordis.patch.yml 中设置,例如:

- id: c2c
  config:
    repoRoot: /path/to/c2c           # default: auto-detect
    pythonPath: /path/to/python      # default: <repoRoot>/.venv/bin/python
    port: 8765                       # loopback daemon port
    idleUnloadSeconds: 900           # 0 disables idle release
    loadTimeoutSeconds: 600

环境与依赖(来自 README):

  • Node >= 20(package.json engines)。
  • Python 3.10–3.13。
  • macOS(MPS)、Linux(CUDA)或 CPU;8B+7B 对建议约 32 GB+ 设备内存。
  • setup 脚本将 transformers 固定为 4.52.4(上限而非下限);更高版本可能破坏 KV-cache 融合路径。
  • 需要 accelerate(上游 loader 使用 device_map=)。

插件以当前 dsh 进程权限运行;安装前请自行审阅 GitHub 源码 与 MIT 许可证,确认符合你的安全与合规要求。

典型用法

在 DSH 智能体会话中,可按 README 示例顺序操作:

c2c_load    pair: qwen3_0.6b+qwen2.5_0.5b     # build the fused model
c2c_chat    prompt: "..."                      # answer through the fusion
c2c_compare prompt: "..."                      # fused vs receiver-alone, side by side
c2c_unload                                     # release device memory

c2c_compare 对同一 prompt 跑两次:一次融合 sharer,一次仅 receiver,便于观察融合是否带来差异。

不依赖 DSH 时,也可手动启动 daemon 并用 curl 探测(路径替换为你的 repo-root):

python python/c2c_daemon.py --repo-root /path/to/c2c --port 8765
curl -s localhost:8765/models
curl -s -X POST localhost:8765/generate \
     -H 'content-type: application/json' \
     -d '{"prompt":"Say hello.","mode":"c2c","max_new_tokens":48}'

适用场景与注意

适合谁: 已在用 DSH、希望在本地做双小模型 KV 融合实验或对比「文本交接 vs cache 融合」的开发者;需要 Apple Silicon 或纯本地、无出站推理 API 的场景。

注意:

  • MPS 上不要启用 sampled decoding;README 指出 torch.multinomial 在 MPS 上可能返回零概率索引,默认 greedy 不受影响。
  • 冷加载需数秒,底层模型不适合并发生成,daemon 用锁串行化请求。
  • @deepseek-ai/* 为 peerDependencies,运行时从 $DSH_HOME/profiles/node_modules 解析;若用 dsh plugin add <path> 做符号链接开发,需在 checkout 内 pnpm install 以拉齐 peer。

README 在 arm64 Mac(48 GB 统一内存、最小 Qwen3-0.6B + Qwen2.5-0.5B-Instruct 对)上记录的参考数据:加载约 6.9–7.7 s;仅 receiver 解码约 39 tok/s,融合约 64 tok/s;权重约 3.2 GB。你的硬件与 pair 不同则数字会变化。

小结

dsh-plugin-c2c 把 C2C 论文思路落成 DSH 可调用的本地工作流:六个 c2c_* 工具、独立 Python daemon、可配置的 idle 卸载与 loopback 服务。若你关心的是「模型之间能否不经过文本传递内部状态」,可以从 setup 与最小 model pair 开始试 c2c_compare。

社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态遵循「一切皆插件」,是否采用需自行评估环境与许可。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye