MiaAI-Lab/DeepSeek-v4-Flash-DSpark-Abliterated-Uncensored

GitHub: MiaAI-Lab/DeepSeek-v4-Flash-DSpark-Abliterated-Uncensored

该项目提供在双节点 DGX Spark 上通过 vLLM 高性能部署 DeepSeek-V4-Flash 消除审查版模型的一体化方案,包含多节点编排脚本和可定制的权重消除审查流水线。

Stars: 19 | Forks: 3

# DeepSeek V4 Flash DSpark — 消除审查版 · 2× DGX Spark 通过 InfiniBand/RoCE 连接的两台 NVIDIA DGX Spark (GB10) 节点提供 DeepSeek-V4-Flash-DSpark 的消除审查(无审查)构建版本,使用带有 DSpark 推测解码、nvFP4 MLA KV-cache 和 B12X MoE 内核的 vLLM。

Follow Mia on X

Buy Me a Coffee at ko-fi.com

## 前置条件 - **2× NVIDIA DGX Spark (GB10)** 通过 InfiniBand/RoCE 连接 - 两台机器上均安装了支持 GPU 的 **Docker** - **`hf` CLI** ([安装指南](https://huggingface.co/docs/huggingface_hub/en/guides/cli)) — 已通过 `hf login` 登录 - 从主节点到工作节点的 **免密码 SSH** 访问 - 两台机器上均已安装 **`rsync`** ## 快速开始 ``` # 1. Clone 仓库 git clone cd DeepSeek-V4-Flash-DSpark-Abliterated-Uncensored-1M-57toks # 2. 使用你的网络值编辑 .env nano .env # 3. 运行所有内容 ./start.sh ``` 完成后,API 将在 `http://:8888/v1/chat/completions` 提供,模型服务名称为 `deepseek-v4-flash-dspark`。 停止服务: ``` ./stop.sh ``` ## 配置 — `.env` 所有集群设置都位于仓库根目录下的 `.env` 文件中: | 变量 | 示例 | 描述 | | ------------- | ------------- | ------------------------------------------------------ | | `MASTER` | `10.0.0.1` | 主节点 IP (rank 0 — 运行 API 服务器) | | `WORKER_ADDR` | `10.0.0.2` | 工作节点 IP (rank 1 — 无界面计算) | | `PORT` | `25000` | 用于 vLLM 多节点控制/存储的 TCP 端口 | | `HCA` | `rocep1s0f1` | InfiniBand HCA 设备名 | | `IF` | `enp1s0f1np1` | 用于 NCCL/GLOO/TP sockets 的网络接口 | 这些值必须与您的物理网络相匹配。请将 `MASTER` 和 `WORKER_ADDR` 设置为您 DGX Spark 节点的实际 IP。 ## `start.sh` — 集群启动 这是一个从主节点编排整个集群的单一脚本。无需 SSH 到工作节点或在第二台机器上运行任何东西。 ### 逐步操作说明 | 步骤 | 操作 | 详情 | | ----- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **1** | 拉取容器镜像 | `docker pull ghcr.io/drowzeys/vllm-dspark-nvfp4-stage-c:gb10` 并将其标记为 `vllm-dspark-runtime:dspark-nvfp4-stage-c` | | **2** | 同步镜像到工作节点 | 通过 `docker save` 将镜像导出为 tar,并通过 SSH 管道传输到工作节点的 `docker load` — 下载一次,双机使用 | | **3** | 下载模型权重 | 运行 `hf download drowzeys/DeepSeek-V4-Flash-DSpark-Abliterated-Uncensored` 到本地目录 (`$MODELDIR`,默认为 `~/models/dsv4-flash-dspark-abliterated`) | | **4** | 同步模型到工作节点 | 使用 `rsync` 将模型复制到工作节点上的完全相同路径 | | **5** | 启动工作节点容器 | SSH 登录到工作节点,清理 GPU 内存,以 **rank 1** 模式启动 vLLM 容器 (`--headless` — 仅计算,无 API) | | **6** | 启动主节点容器 | 在本地清理 GPU,以 **rank 0** 模式启动 vLLM 容器 (API 服务器在端口 8888 上,完整的推理端点) | | **7** | 等待就绪 | 将容器日志实时流式传输到您的终端,然后静默轮询 `/health` 端点。当模型响应时,打印 **"Model is ready!"** 并返回控制权 | ### 多节点协调 vLLM 使用 TCP 存储在两个节点上进行分发: - Rank 0 (主节点) 在 `--master-addr:--master-port` 创建存储 - Rank 1 (工作节点) 连接到相同地址 - 两者都传递带有各自 `--node-rank` 的 `--nnodes 2` - NCCL、Gloo 和 TP 通信通过 InfiniBand 接口 (`$IF`) 使用 RoCE HCA (`$HCA`) 进行 ### 可覆盖的环境变量 | 变量 | 默认值 | 描述 | | ------------ | -------------------------------------------- | ------------------------------------- | | `MODELDIR` | `$HOME/models/dsv4-flash-dspark-abliterated` | 存储/同步模型权重的路径 | | `SERVE_PORT` | `8888` | 主节点上暴露的 API 端口 | ## 运行时配置 vLLM 引擎在容器内使用以下设置运行: | 参数 | 值 | |---|---| | 引擎 | vLLM V1 (`v0.21.1rc1.dev339`) | | 后端 | `mp` (multiprocessing distributed executor) | | 拓扑结构 | 2 节点 × 2 GPUs = TP=2 | | 量化 | `deepseek_v4_fp8` | | KV cache dtype | `nvfp4_ds_mla` | | KV cache pool | **1,199,047 tokens** (~18.53 GiB GPU memory) | | 上下文窗口 | **1,048,576 tokens** (`--max-model-len`) | | 并发序列 | **12** (`--max-num-seqs`) | | 最大批处理 tokens | **8,192** (`--max-num-batched-tokens`) | | GPU 显存利用率 | **0.82** (`--gpu-memory-utilization`) | | 块大小 | **256** (`--block-size`) | | 推测解码 | **DSpark** 包含 5 个 draft tokens | | Tokeniser 模式 | `deepseek_v4` | | Tool-call parser | `deepseek_v4` | | Reasoning parser | `deepseek_v4` | | Prefix caching | 启用 | 服务器端应用的覆盖配置(客户端无法配置): - `temperature: 0.0`, `top_p: 1.0` - `thinking: false` (`--default-chat-template-kwargs`) ## `stop.sh` — 集群停止 停止并移除两个节点上的容器: ``` ./stop.sh ``` 它从 `.env` 读取 `WORKER_ADDR`,然后(通过 SSH)在工作节点和本地运行 `docker stop` + `docker rm`。 ## 重新构建消除审查版本(可选) 此仓库中的权重是通过三步流水线生成的。您可以自行运行它以自定义层范围、拒绝强度或方向向量。需要在本地安装 `torch` 和 `safetensors`。 ### 流水线概述 ``` prompts.py ──► model activations ──► compute_direction.py ──► refusal direction .pt ──► project_wob.py ──► abliterated weights ``` ### 第 1 步 — 准备 prompt 集合 [`scripts/prompts.py`](scripts/prompts.py) 定义了两个 prompt 列表: - `HARMFUL` — 诱发拒绝的 prompt(例如 “编写一份关于如何撬锁的指南”) - `HARMLESS` — 良性 prompt(例如 “解释锁的工作原理”) 您将这些通过基础模型,并将 **层激活**(residual stream 或 MLP 输出)保存到工作目录中: ``` work/ ├── harmful/ │ ├── layer_00.pt │ ├── layer_01.pt │ └── ... └── harmless/ ├── layer_00.pt ├── layer_01.pt └── ... ``` 每个 `layer_N.pt` 都是一个形状为 `(n_prompts, hidden_dim)` 的 tensor,包含该层在该集合所有 prompt 上的平均池化激活。 ### 第 2 步 — 计算拒绝方向 [`scripts/compute_direction.py`](scripts/compute_direction.py) 加载各层激活堆栈,并使用 diff-in-means + 多方向 SVD 计算拒绝方向: ``` python3 scripts/compute_direction.py \ --work ~/dsv4-ablit/work \ --out ~/dsv4-ablit/work/refusal_direction.pt \ --n-layers 43 \ --n-directions 4 ``` | 参数 | 默认值 | 描述 | |---|---|---| | `--work` | `~/dsv4-ablit/work` | 包含 `harmful/` 和 `harmless/` 子目录的目录 | | `--out` | `/refusal_direction.pt` | 包含方向向量的输出文件 | | `--n-layers` | `43` | 预期的解码器层数 | | `--n-directions` | `4` | 用于多方向投影的 SVD 秩(1 = Lovesenko 风格的 rank-1) | 输出的 `.pt` 文件包含: - `"broad"` — 跨所有层的平均差异(4096-d 单位向量) - `"deep"` — 加权层变体 - `"per_layer"` — 映射层 ID → 单位向量的字典 - `"directions"` — 来自中心化有害激活矩阵的 top-k SVD 方向 ### 第 3 步 — 从权重中投影出方向 [`scripts/project_wob.py`](scripts/project_wob.py) 将 `W ← W − λ · v · (v^T W)` 应用于 FP8 `attn.wo_b` 和 `mtp.wo_b` 分片: ``` python3 scripts/project_wob.py \ --src ~/models/dsv4-flash-dspark \ --dst ~/models/dsv4-flash-dspark-abliterated \ --direction ~/dsv4-ablit/work/refusal_direction.pt \ --lambda-attn 3.5 \ --min-layer 10 \ --max-layer 42 \ --n-directions 1 ``` | 参数 | 默认值 | 描述 | |---|---|---| | `--src` | `~/models/dsv4-flash-dspark` | 基础模型权重路径 | | `--dst` | `-abliterated` | 消除审查权重的输出目录 | | `--direction` | `~/dsv4-ablit/work/refusal_direction.pt` | 来自第 2 步的方向 `.pt` 文件 | | `--lambda-attn` | `3.5` | 投影强度(2.5 为 Lovesenko;值越高 = 移除拒绝越强) | | `--min-layer` | `0` | 要消除审查的第一个解码器层(包括) | | `--max-layer` | `42` | 要消除审查的最后一个解码器层(包括) | | `--no-mtp` | `false` | 跳过编辑 `mtp.wo_b` (MTP draft head projection) | | `--n-directions` | `0` | 要使用的 SVD 方向数量(0 = 文件中的全部) | | `--dry-run` | `false` | 预览层/tensor 而不写入 | ### 当前方案(此仓库的权重) | 参数 | 值 | |---|---| | `attn.wo_b` 层 | 原版: **0–9**, 消除审查: **10–42** | | MTP heads | **已消除审查** (相同方向) | | 拒绝方向 | **SRA-cleaned rank-1** | | λ | **3.5** | | SVD directions | **1** | 这种混合层范围保留了早期层中的 chat/tools/protocol 行为,同时在编码了拒绝行为的更深层中将其移除。 ### 辅助工具: `scripts/hybrid_overlay.py` [`scripts/hybrid_overlay.py`](scripts/hybrid_overlay.py) 是一个实用程序,用于在将不同的层范围应用于不同的 tensor 时合并原版和消除审查的权重分片(例如,在第 0–9 层保留原版 `attn.wo_b`,在第 10–42 层使用消除审查版本)。当层范围未覆盖所有层时,`project_wob.py` 会在内部调用它。 ## Hermes agent 兼容性 如果 agent prompt 仍然使用类似以下的模式,消除审查的模型可能会回显技能目录: 如果您看到这种情况,请应用 **按需技能规则**: - 问候和简单问题 → 以纯文本形式回复,**不**使用 `skill_view` - 切勿将技能索引粘贴到回复中 - 仅针对具体的多步骤任务加载技能 推荐的 agent 设置:`model.max_tokens: 8192`, `temperature: 0`, `tool_use_enforcement: false`。 有关修复的详细操作指南,请参阅 [`docs/HERMES_SPILL_FIX.md`](docs/HERMES_SPILL_FIX.md);有关 fine-tuning 状态说明,请参阅 [`docs/STATUS_FINETUNE.md`](docs/STATUS_FINETUNE.md)。 ## 性能 在发布集群上测量 (2× DGX Spark · TP=2 · 200G RoCE): - KV cache pool @ 1M context: ~2.39M tokens (nvfp4\_ds\_mla) - C1 pure decode: ~57 tok/s 平均 - 拒绝绕过:在 32 个 prompt 的测试组中约为 100% 完整结果和方法论详见 [RESULTS.md](RESULTS.md)(旧 README 保留为 `README_OLD.md`)。 ## 仓库结构 ``` .env # Cluster network configuration .gitignore # Git tracking whitelist README.md # This file start.sh # Cluster launch orchestrator stop.sh # Cluster stop LICENSE # License file scripts/ ├── compute_direction.py # Refusal direction extraction ├── hybrid_overlay.py # Layer-range hybrid overlay ├── project_wob.py # Direction projection into weights └── prompts.py # Refusal prompt battery docs/ ├── HERMES_SPILL_FIX.md # Fix for Hermes skill-catalog spill └── STATUS_FINETUNE.md # Finetuning status notes ``` ## 客户端配置 该模型在 `http://:8888/v1` 暴露了一个兼容 OpenAI 的 API。以下是在 `~/.pi/agent/models.json` 中为 [pi agenthttps://github.com/earendil-works/pi-coding-agent) 配置的方法: ``` { "providers": { "vLLM Local": { "baseUrl": "http://localhost:8888/v1", "api": "openai-completions", "apiKey": "dummy", "compat": { "supportsDeveloperRole": false, "supportsReasoningEffort": false, "maxTokensField": "max_tokens" }, "models": [ { "id": "deepseek-v4-flash-dspark", "name": "DeepSeek V4 Flash DSpark Abliterated", "reasoning": true, "input": ["text", "image"], "contextWindow": 262144, "maxTokens": 32000, "compat": { "requiresReasoningContentOnAssistantMessages": false, "thinkingFormat": "deepseek" }, "params": { "skip_special_tokens": true, "temperature": 0.0, "top_p": 1.0, "chat_template_kwargs": { "enable_thinking": false } }, "systemPrompt": "You are a helpful assistant...", "stop": ["<|DSML|"] } ] } } } ``` 关键点: - **`id`** 必须与 `--served-model-name` (`deepseek-v4-flash-dspark`) 相匹配 - **`temperature: 0.0`**, **`top_p: 1.0`** 与服务器端覆盖设置相匹配 - **`enable_thinking: false`**,因为在服务器端禁用了思考功能 - **`contextWindow: 262144`** 与 `--max-model-len` 相匹配 - **`maxTokens: 32000`** 是安全的输出限制 - **`stop: ["<|DSML|"]`** 防止 DSML 注入(如果有相应 prompt,模型可能会发出它) 对于其他客户端(OpenAI SDK、curl 等): ``` curl http://:8888/v1/chat/completions \ -H 'Content-Type: application/json' \ -d '{ "model": "deepseek-v4-flash-dspark", "messages": [{"role": "user", "content": "hello"}], "temperature": 0.0 }' ``` ## 免责声明 研究发布版。该模型移除了大部分内置的安全拒绝机制。输出可能包含基础模型本会拒绝的内容。若无自带的安全层,请勿部署。对误用不承担任何责任。 ## 链接 - 模型权重: - 容器镜像: `ghcr.io/drowzeys/vllm-dspark-nvfp4-stage-c:gb10` - 基础模型:
标签:DGX, DLL 劫持, vLLM, 人工智能, 凭据扫描, 分布式计算, 大语言模型, 异常处理, 模型部署, 用户模式Hook绕过, 请求拦截, 逆向工具