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。
## 前置条件
- **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绕过, 请求拦截, 逆向工具