这个领域发展得很快。两张 4060 通过张量并行运行主模型权重。通过 RPC 将草稿模型卸载到 AMD Strix。额外腾出了 2–3GB 显存用于上下文,性能没有损失。
摘要
作者通过修补 llama.cpp,在 2x RTX 4060 张量并行基础上把 DFlash2 草稿模型经 RPC 卸载到 AMD Strix 设备,实现混合 Nvidia+AMD 硬件下上下文从 150k 提升到 195k 且不损失性能,并附上了可复现的构建补丁与 PR 合并步骤。
通过 RPC 混用 Nvidia+AMD 硬件通常意味着只能使用按层拆分模式。我成功让按张量拆分模式保持正常运行,并修改了我的 llama-rpc,把草稿模型转移到我的 strix 上。这让我能将上下文从 150k -> 195k,同时保持相同的张量并行速度……不错。我的智能体在这套配置上帮了大忙:- 这款 10Gbps USB 网卡刚在 9 月上市。根本没有驱动,但和 GPT 聊了一轮之后,我们就开始用 git 拉取代码并修改两个文件,为我所用的操作系统版本编译驱动。- llamacpp 这边需要合并 2 个 PR,再加上 1 个本地补丁。第 3 个补丁甚至不值得提交 PR,因为现在 PR 经常会搁置,所以我把它留在这里,让你的智能体能根据主分支当时的状态为你生成补丁。理论上,这可以卸载到任何有 2–3GB 内存的设备上 [35051] 0.06.133.020 I load_tensors: 正在将 4 个重复层卸载到 GPU [35051] 0.06.133.020 I load_tensors: 已将 6/6 层卸载到 GPU [35051] 0.06.133.024 I load_tensors: RPC0[10.44.0.6:13315] 模型缓冲区大小 = 1821.88 MiB [35051] 0.10.019.793 I llama_context: 正在构建 llama_context [35051] 0.10.019.798 I llama_context: n_seq_max = 1 [35051] 0.10.019.799 I llama_context: n_ctx = 190208 # ============================================================================ # Qwen3.8 DFlash2 张量并行目标模型 + 远程 RPC 草稿模型 # # 已验证可用的 llama.cpp 基础提交:# 77c4540ce4667f4577753fe034a3a8042f510b8f # # 修改:# 1. PR #26636 提交 1a6fee5 # 允许草稿模型上下文使用共享目标模型张量所需的后端。# # 2. PR #27858 移植提交 1784fc3 # 支持 DFlash2 张量并行 CPU 选择器。# # 3. 本地补丁 # 始终使用 DFlash2 CPU 选择器,允许目标模型使用 target=CUDA0,CUDA1 张量并行 # 同时将草稿模型单独固定到 RPC0/coal。# ============================================================================ BASE=77c4540ce4667f4577753fe034a3a8042f510b8f git switch -C exp-dflash-tensor-rpc "$BASE" # PR #26636 git fetch origin refs/pull/26636/head:pr-26636 git cherry-pick 1a6fee5 # PR #27858 较新的移植版本 git fetch https://github.com/henrique-simoes/llama.cpp.git \ mv/dflash-tp:henrique-dflash-tp git cherry-pick 1784fc3 # 本地 RPC DFlash 选择器补丁 cat > /tmp/dflash-coal-rpc.patch <<'PATCH' diff --git a/common/speculative.cpp b/common/speculative.cpp index 775df85c7..e76caef0b 100644 --- a/common/speculative.cpp +++ b/common/speculative.cpp @@ -1062,7 +1062,7 @@ struct common_speculative_impl_draft_dflash : public common_speculative_impl { selector_top_k = llama_model_dflash_selector_top_k(model_dft); is_dflash2 = selector_top_k > 0; // 在张量并行模式下,lm_head 被拆分,图内选择器无法运行 - is_dflash2_cpu = is_dflash2 && llama_model_get_split_mode(model_dft) == LLAMA_SPLIT_MODE_TENSOR; + is_dflash2_cpu = is_dflash2; mask_token_id = llama_vocab_mask(llama_model_get_vocab(model_dft)); if (is_dflash2_cpu) { diff --git a/src/models/dflash.cpp b/src/models/dflash.cpp index e707c6b03..7942058fe 100644 --- a/src/models/dflash.cpp +++ b/src/models/dflash.cpp @@ -153,7 +153,7 @@ void llama_model_dflash::load_arch_tensors(llama_model_loader &) { // 在张量并行模式下,lm_head 沿词表维度拆分,// 图内选择器无法处理,因此 DFlash2 在 CPU 上进行排序,并直接从 GGUF 文件读取这些表;// 否则,图内选择器会在模型中使用这些表 - const bool use_cpu_selector = params.split_mode == LLAMA_SPLIT_MODE_TENSOR; + const bool use_cpu_selector = true; dflash_selector_prev = create_tensor(tn(LLM_TENSOR_DFLASH_SELECTOR_PREV, "weight"), { rank, n_vocab }, use_cpu_selector ? TENSOR_SKIP : 0); dflash_selector_next = create_tensor(tn(LLM_TENSOR_DFLASH_SELECTOR_NEXT, "weight"), { rank, n_vocab }, use_cpu_selector ? TENSOR_SKIP : 0); dflash_selector_hidden = create_tensor(tn(LLM_TENSOR_DFLASH_SELECTOR_HIDDEN, "weight"), { n_embd, rank }, 0); @@ -807,7 +807,7 @@ llama_model_dflash::graph<false>::graph(const llama_model & model, const llm_gra // 在张量并行模式下,DFlash2 根据汇集后的 lm_head 输出在 CPU 上进行排序,// 因此解码器隐藏状态通过 nextn 槽位传递;不使用张量并行时,图内 // 选择器则将其候选格打包到该槽位中(见下文)- if (model.dflash_selector_hidden && model.split_mode() == LLAMA_SPLIT_MODE_TENSOR) { + if (model.dflash_selector_hidden) { res->t_h_nextn = cur; } @@ -862,7 +862,7 @@ llama_model_dflash::graph<false>::graph(const llama_model & model, const llm_gra } // 当 lm_head 未沿词表维度拆分时,DFlash2 在图内对候选项进行排序 - if (model.dflash_selector_hidden && model.split_mode() != LLAMA_SPLIT_MODE_TENSOR) { + if (false && model.dflash_selector_hidden) { build_dflash2_selector(*this, model, inp_tokens); } } PATCH git apply /tmp/dflash-coal-rpc.patch
相似文章
Reddit r/LocalLLaMA
一位 Reddit 用户用 8 张 Radeon Pro V620(256GB VRAM)和自定义 vLLM fork,让 Qwen3.8-Flash-Next 达到 60-100 t/s 解码速度和 3000+ t/s 预填充,比 llama.cpp 快约 800%。
Reddit r/LocalLLaMA
本文对 llama.cpp 和 ik_llama.cpp 在双 RTX 3060 硬件上运行 Qwen3.8-Flash-Next 模型进行基准测试,展示了优化 tensor splitting 和 ubatch 设置可以将预填充速度从 36 t/s 大幅提升至 400 t/s,并对比了 RAM 使用情况。
Reddit r/LocalLLaMA
一位用户分享了他基于 Strix Halo 128GB 主机加解锁版 CMP 170HX eGPU 的本地 LLM 推理方案,运行 Qwen 3.8 Flash Next 与双路 Qwen 27B 子代理,聚合吞吐达到约 1700 tok/s 预填充和 100 tok/s 生成,成本约 3000 美元,已完全取代其云端订阅用于日常 DevOps 工作流。
X AI KOLs Following
一套新工具集(DFlash + PFlash)在 AMD Ryzen AI MAX+ 395 iGPU 上实现了比 llama.cpp 快 2.5 倍的推理速度,展示了 Qwen3.6-27B 在 128 GiB 统一内存下的显著加速效果。
Reddit r/LocalLLaMA
一位用户分享了在 RTX 2060 6GB 显存 + 32GB 内存的消费级硬件上运行 Qwen 3.6 35B A3B(Q4_K_M 量化)的 llama.cpp 完整启动配置,实现了 131K 上下文与视觉能力,约 600 tok/s 预填充与 23 tok/s 解码速度,通过将 MoE 专家层与视觉投影器卸载到 CPU 来控制显存占用。