跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(LCZ-Blue)
  • 不使用皮肤
  • LCZ-Green
  • LCZ-Blue
  • LCZ-Black
折叠
品牌标识

抡锤者

首页 版块 标签
硬件
装备秀
AI 广场
PhoenixRise2026P

PhoenixRise2026

@PhoenixRise2026
德高望重
取消关注 关注
关于
帖子
38
主题
6
分享
0
群组
1
粉丝
1
关注
1

帖子

最新 最佳 有争议的

  • 我之前也以为 X99 基本没法搞 P2P,不过最近在 E5-2697A v4 + X99 + 双 R9700 上实际折腾下来,已经把跨 Root Port 的 Direct P2P 跑通了。
    PhoenixRise2026P PhoenixRise2026
    AI硬件 x99 r9700 多卡部署

    我之前也以为 X99 基本没法搞 P2P,甚至已经在看 TRX40 / WRX80 和 PCIe Switch 板子了。

    不过最近在 E5-2697A v4 + X99 + 双 R9700 上实际折腾下来,已经把跨 Root Port 的 Direct P2P 跑通了。

    这件事不是改一个开关就行,我这边大概做了下面几层。

    1. 先确认硬件拓扑没问题

    两张 R9700 都是 CPU 直出的 PCIe 3.0 x16,但挂在不同的 Broadwell Root Port 下。

    基础设置:

    • Above 4G Decoding 开
    • ReBAR 开
    • CSM 关
    • 两张卡确认都是 8GT/s x16
    • 检查 BAR / IOMMU / PCIe topology

    另外把整条 PCIe Path 的 MPS 都查了一遍。

    X99/Broadwell Root Port 最大只支持 256B MPS,所以最终就保持256B,没有去强行改512/1024。


    2. 先解决 AMDGPU / HSA 层面的跨 Root Port P2P

    Broadwell-EP 这里有个比较麻烦的问题:

    跨 Root Port P2PDMA + 44-bit DMA address / 大 BAR 映射 默认并不顺畅。

    我这边最后使用了定制的:

    6.8.12-r9700-p2p-dma44

    内核,把 X99/Broadwell 这层 P2P DMA 映射问题处理掉。

    之后先不碰 SGLang,直接做底层测试。

    HIP IPC 也单独验证过,使用:

    HSA_ENABLE_IPC_MODE_LEGACY=0

    两张卡之间的 IPC 可以正常建立。

    然后用 TransferBench / hipMemcpyPeerAsync 验证真正的 GPU→GPU 数据通路。

    实测:

    • GFX Push / Posted Write:约 10.29 GB/s
    • SDMA / hipMemcpyPeerAsync:约 10.26~10.29 GB/s
    • 双向同时传输 aggregate:约 19.7 GB/s

    也就是说 PCIe 3.0 x16 的跨 Root Port P2P 实际已经跑到了比较正常的水平。

    这里很重要的一点是:

    先证明 GPU P2P 本身能工作,再折腾 RCCL。


    3. RCCL 是第二个坑

    底层 P2P 通了以后,Stock RCCL 还是不会自动使用它。

    原因是两张卡跨 CPU Root Port,RCCL 把拓扑识别为:

    PATH_PHB

    Stock RCCL 会退回:

    via SHM/direct/direct

    也就是说底层明明能 P2P,但 RCCL 还是绕系统内存。

    当时实测:

    • Stock RCCL SendRecv 1G:约 6.9 GB/s
    • AllReduce BusBW:约 4.5 GB/s

    所以还需要处理 RCCL。


    4. 给 RCCL 做了一个很小的 patch

    我现在用的是 patched RCCL 2.27.7。

    修改其实很小,在:

    src/graph/paths.cc

    里只有大约 6行顺序调整。

    核心问题是 RCCL 对 Intel 平台设置默认 P2P level 的顺序,会把用户指定的 PHB override 覆盖掉。

    修改后,让:

    NCCL_P2P_LEVEL=PHB

    成为最终生效值。

    这里要注意:

    只设置环境变量没用。

    我实际验证过:

    • Stock RCCL + NCCL_P2P_LEVEL=PHB → 还是 SHM
    • Patched RCCL,不设置 PHB → 还是 SHM
    • Patched RCCL + NCCL_P2P_LEVEL=PHB → Direct P2P

    两者必须同时有。

    我没有使用:

    HSA_FORCE_FINE_GRAIN_PCIE=1


    5. RCCL Direct P2P 打通后的结果

    还是同一套 rccl-tests:

    • SendRecv 1G:约 9.75 GB/s
    • AllReduce BusBW:约 9.51 GB/s
    • AllGather BusBW:约 9.16 GB/s
    • ReduceScatter BusBW:约 8.92 GB/s

    SendRecv 已经达到 TransferBench P2P Push 的约95%。

    这时候基本可以确认:

    RCCL 已经不是 SHM,而是真正走 GPU Direct P2P。


    6. 最后再接 SGLang TP2

    SGLang 启动后继续检查日志,不只是看“服务能跑”。

    现在能够看到类似:

    isAllDirectP2p 1

    以及:

    via P2P/IPC

    确认 TP2 通信真正走 Direct P2P。

    目前跑 Qwen3.8-27B AWQ,已经从1K一直测到251.5K context:

    • 251.5K Prefill:约 712 tok/s
    • 251.5K Native Decode:约 10.08 tok/s
    • 251.5K input + 512 output:0 OOM

    连续高负载测试也没有看到 PCIe AER、GPU reset 或 P2P掉线。


    所以我现在对 X99 的看法和最开始完全不一样。

    X99/Broadwell 不是硬件上完全不能 P2P,而是默认的软件路径很难直接用。

    我这边实际上处理了两层:

    第一层:
    X99/Broadwell + AMDGPU/HSA 的跨 Root Port P2P DMA。

    第二层:
    让 RCCL 接受 PATH_PHB 下的 Direct P2P,而不是自动退回 SHM。

    两层都打通以后,PCIe 3.0 x16 本身反而没有想象中那么差。

    所以如果你的X99也是两张卡 CPU直连 x16+x16,我建议先把现有平台的 P2P 路径查清楚,不一定需要马上买 PCIe Switch。

    Switch可以改善拓扑,但如果真正的问题是 AMDGPU / RCCL 软件策略,单纯加Switch未必就能解决。

    后面我准备把 X99 双 R9700 从内核、TransferBench、RCCL到SGLang TP2的完整过程整理一下,应该比单独贴一个“跑通了”的结果更有参考价值。


  • R9700 32GB 跑 Qwen3.8-27B:llama.cpp Vulkan + MTP 实测与踩坑记录
    PhoenixRise2026P PhoenixRise2026
    LLM讨论区 r9700 qwen-27b llama.cpp

    最近在一张 AMD Radeon AI PRO R9700 32GB 上折腾 Qwen3.8-27B,前后试了 ROCm 下的 SGLang、vLLM,以及 llama.cpp 的 HIP / Vulkan 路线。

    最后这台机器上比较稳定、速度也比较理想的方案,是:

    llama.cpp + Mesa RADV Vulkan + Q4_K_M + MTP + 128K Context

    先说结论:如果手里已经有 R9700,现阶段我更建议优先试 llama.cpp Vulkan。至少在我这套环境里,它比我之前折腾的 ROCm 路线省心得多。

    下面的数据只代表这台机器、当前驱动和对应版本下的结果,不建议直接外推到所有 R9700 或所有模型。全程使用Gemini 3.7 flash 配置。


    1. 测试环境

    3c5fd039-4a59-4168-b40c-9e74da4cf18b-image.jpeg
    硬件大致如下:

    • 华南金牌 X99-TF
    • Xeon E5 v4 2697A
    • 128GB DDR4
    • AMD Radeon AI PRO R9700 32GB
    • PCIe 3.0 x16
    • 机器里同时还有一张 NVIDIA 4080s 32G

    软件环境:

    • Ubuntu 24.04
    • Mesa 25.2.x / RADV Vulkan
    • llama.cpp Vulkan 构建
    • Qwen3.8-27B Q4_K_M
    • 视觉模型使用对应的 F16 mmproj

    BIOS 里开启:

    • Above 4G Decoding
    • Resizable BAR

    2. 目前的实测结果

    c7be7696-b82f-415e-a93b-aa2428a49116.png

    场景 实测
    长文本 Prefill,约 2322 tokens 730.89 t/s
    非思考模式,代码生成 53.10 t/s
    思考模式,数学证明 44.81 t/s
    视觉问答生成 35.80 t/s
    视觉问答 TTFT 约 927 ms
    Context 128K
    运行时显存占用 约 20.3 GiB

    其中 53 t/s 并不是所有问题都能稳定达到。

    Qwen3.8 的 MTP 对任务类型比较敏感。代码、JSON、工具调用这类下一 token 比较容易预测的任务,接受率高,速度会明显上去;开放式写作、视觉问答这类任务,接受率下降,速度也会跟着掉。

    我这边两个比较典型的数据:

    • 代码生成:MTP acceptance 约 68.7%,53.10 t/s
    • 数学证明:MTP acceptance 约 54.9%,44.81 t/s

    所以以后看别人贴 R9700 / Qwen3.8 的速度,最好先看他测的是什么题、有没有开 MTP,而不是只看一个 t/s。


    3. 我现在用的关键参数

    核心启动参数大概是下面这样:

    export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.json
    
    ./llama-server \
      --model /path/to/Qwen3.8-27B-Q4_K_M.gguf \
      --mmproj /path/to/mmproj-Qwen3.8-27B-F16.gguf \
      --ctx-size 131072 \
      --cache-type-k q4_0 \
      --cache-type-v q4_0 \
      --n-gpu-layers 999 \
      --no-mmap \
      --spec-type draft-mtp \
      --spec-draft-n-max 5 \
      --cache-ram 32768 \
      --flash-attn on \
      --parallel 1 \
      --jinja
    

    几个我觉得比较关键的地方。

    ① 双显卡环境最好显式指定 Vulkan ICD

    我的机器同时有 AMD 和 NVIDIA 卡。

    如果直接让 Vulkan 自己探测,偶尔会碰到加载错 ICD 的问题。显式指定:

    VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.json
    

    之后省事很多。

    如果是纯 AMD 单卡机器,未必需要这么做。

    ② 128K 下 KV Cache 用 q4_0

    我现在是:

    --cache-type-k q4_0
    --cache-type-v q4_0
    

    这样 128K Context 可以装下,整套运行时显存大约 20.3 GiB,还能留出十来 GB 余量。

    如果 KV Cache 直接上高精度,32GB 显存会紧张很多。

    ③ MTP 我这里 n-max=5 比较合适

    --spec-type draft-mtp
    --spec-draft-n-max 5
    

    我试过把步数继续往上加,但不是越大越快。

    草稿猜错以后需要重新验证,步数过大反而可能拖慢整体 Decode。至少我这组测试里,5 是比较合适的点。

    ④ Prompt Cache 别留太小

    长对话下,如果 --cache-ram 太小,日志里可能看到 cache skipping,后续请求又重新做 Prefill。

    我最后给到:

    --cache-ram 32768
    

    这主要吃系统内存,不是显存。机器内存够的话可以适当放大。


    4. ReBAR 值得检查

    这是这次折腾里我觉得最值得单独说的一点。

    最开始这台 X99 平台没有把 ReBAR 配好,长 Prompt 的 Prefill 大约在 450 t/s 左右。

    BIOS 开启:

    • Above 4G Decoding
    • Resizable BAR

    并确认系统里 R9700 的 BAR 映射正常后,同一套环境下长文本 Prefill 测到 730.89 t/s。

    从这组结果看,提升大约 62%。

    不过这里我更愿意把它理解成“这台机器上的实测现象”,而不是说所有 R9700 开 ReBAR 都一定能涨 60%。

    老平台、PCIe 拓扑、驱动版本都可能影响结果。

    如果 Prefill 明显偏慢,我建议先查 ReBAR,而不是一上来就怀疑模型或 llama.cpp。


    5. Vulkan、SGLang、vLLM,我最后为什么留 Vulkan

    我前面也折腾过 ROCm。

    当时大概是这个情况:

    路线 我这台机器上的情况
    SGLang / ROCm 可以跑,但大上下文下 Decode 大约 11 t/s,空闲功耗表现也不理想
    vLLM / ROCm 128K 需要继续调 KV Cache 和请求限制,当时 Decode 大约 7~8 t/s
    llama.cpp HIP 可以用,但我测试时稳定性和 MTP 表现不如 Vulkan
    llama.cpp Vulkan 当前最省事,MTP、Flash Attention、128K、mmproj 都能正常用

    这里要特别说明:

    这不是严格的同权重、同量化、同版本横向 benchmark。

    SGLang / vLLM 当时使用的权重格式和运行条件并不完全一样,所以这些数字只能说明“我最后为什么选 Vulkan”,不能拿来证明 Vulkan 理论上一定比 ROCm 快多少。

    后面 ROCm、vLLM、SGLang 对 RDNA4 的支持继续完善以后,结果完全可能变化。


    6. 几个比较容易踩的坑

    ReBAR 没开

    表现:

    • 长 Prompt Prefill 偏慢
    • 视觉输入响应也可能不理想

    先检查 BIOS 的 Above 4G Decoding 和 ReBAR。

    用几十个 token 测 Prefill

    短 Prompt 固定开销占比太高,数据没什么参考意义。

    我现在至少用 2000 tokens 左右的输入来观察 Prefill。

    MTP 步数一味往上加

    n-max=8、10 不一定比 5 快。

    接受率掉下来后,可能越调越慢。

    128K 还坚持高精度 KV Cache

    32GB 显存很容易被吃满。

    如果目标就是单请求 128K,q4_0 KV Cache 是一个比较实用的取舍。

    双卡机器不指定 Vulkan ICD

    AMD + NVIDIA 混插时尤其值得注意。

    遇到 Vulkan 启动异常,可以先确认实际加载的是不是 RADV。


    7. 关于老 X99 / E5 v4 会不会拖后腿

    这也是我一开始比较担心的。

    从目前的监控看,Decode 阶段 GPU 利用率很高,CPU 占用并不高。至少在我这套单请求测试里,E5 v4 还没有表现成明显瓶颈。

    这不代表 CPU 完全不重要。

    高并发、大量预处理、复杂 Agent 工作流或者频繁 CPU↔GPU 数据交换时,老平台还是可能影响整体体验。

    但如果只是单用户本地 LLM 推理,我暂时没有因为 X99 去换平台的打算。


    8. 目前还没测的东西

    这篇主要是单实例、单请求测试。

    还没有认真做:

    • --parallel 4 之类的多并发压力测试
    • 128K 下长时间并发稳定性
    • 接入Hermes的测试
    • 不同 GGUF 量化之间的质量和速度对比

    所以现在更适合把它看成一份 R9700 + llama.cpp Vulkan 的实机配置记录,不是完整 benchmark。


    结论

    如果是 R9700 32GB + Qwen3.8-27B,我目前会推荐:

    Q4_K_M + llama.cpp Vulkan + MTP + q4_0 KV Cache

    我这台机器上可以稳定跑 128K,上下文显存余量也比较充足;普通生成大约在 40~50 t/s,代码这类 MTP 接受率高的任务可以到 50 t/s 以上。

    另外,如果 Prefill 明显低于预期,建议优先检查 Above 4G Decoding / ReBAR。

    :::


  • R9700 + Strata 实测:双卡 128K Prefill 3708 tok/s,兼测 IQ3_XXS / IQ3_S
    PhoenixRise2026P PhoenixRise2026
    LLM讨论区 r9700 strata qwen-flash

    最近在 X99 平台上集中测试了 Strata,主要看两个问题:

    1. 单张和双张 Radeon AI PRO R9700 跑 Qwen3.8-Flash-Next GSQ-RCO GGUF,性能能到什么水平;
    2. 在我的平台上,IQ3_XXS 和 IQ3_S 的性能差异有多大。

    先说结论

    • 单卡 R9700 + IQ3_XXS:128K Prefill 约 2168 tok/s,Decode 约 62 tok/s。
    • 双 R9700 + Layer Split + IQ3_XXS:128K Prefill 约 3708 tok/s,双卡扩展比约 1.71×;TTFT 从约 59.6 秒降到 35.1 秒。
    • 双卡后 24,576 个 experts 可以全部驻留 GPU,Host Resident Expert 从 18.63 GiB 降到 0。
    • 在我的 X99 平台上,Layer Split 明显优于 Peer Device。
    • IQ3_S 即使双卡实现 100% expert 显存驻留,128K Prefill 仍比 IQ3_XXS 慢约 15.9%。
    • 性能方面目前明显更适合 IQ3_XXS;质量方面,IQ3_S 和 IQ3_XXS 还没有做足够完善的高难度 Agent/Coding 对比,因此暂不下结论。

    一、IQ3_XXS:单 R9700 与双 R9700

    测试平台与关键参数

    项目 配置
    主板 / CPU X99-TF / Xeon E5-2697A v4
    内存 128GB DDR4
    GPU 2 × AMD Radeon AI PRO R9700 32GB
    PCIe X99 / PCIe 3.0,P2P、HIP IPC 已验证
    OS Ubuntu 24.04 Server
    Strata v0.1.38,99f3dbd0b21d1401b3769e0c0d963913607f380b
    ROCm 10.2.0a20260914
    模型 Qwen3.8-Flash-Next-GSQ-RCO-GGUF
    主要量化 IQ3_XXS
    关键设置 STRATA_RESIDENT_PIN=1、STRATA_HIP_WMMA=1、STRATA_SELECT_WMMA=1、pcie-frac=0、hipBLASLt tuning OFF

    前期探索里影响最大的是 Resident Expert Pinning:pageable resident memory 改为 pinned 后,128K Prefill 从约 1506 tok/s 提升到约 2177 tok/s。后续单、双卡测试都以这条内存路径作为基线。

    单卡 vs 双卡结果

    
    image.jpeg

    最直观的结果: 15K 下双卡提升约 20%,到了 128K,Prefill 从 2168.5 tok/s 提升到 3708.4 tok/s,扩展约 1.71×。

    128K 下 TTFT 从 59.65 秒降到 35.11 秒,少了约 24.5 秒。对于需要不断追加上下文、反复 Tool Calling 的 Agent 工作流,这个变化比单纯 Decode 快几 tok/s 更有意义。

    指标 单 R9700 双 R9700 / Layer Split 变化
    15K Prefill ≈2140 tok/s 2586 tok/s ≈+20%
    128K Prefill 2168.5 tok/s 3708.4 tok/s 1.710×
    128K TTFT 59.65 s 35.11 s -24.54 s
    128K Decode 62.0 tok/s 64.9 tok/s 基本无损
    Expert Slots 15,508 24,576 / 24,576 100% 驻留
    GPU Expert ≈25.15 GiB 39.96 GiB ↑
    Host Resident Expert 18.63 GiB 0 GiB 完全消除
    Host Staging ≈1.5 s 0 消失
    Wait Copy ≈1.8 s 0 消失
    128K Multi-Needle 5/5 PASS 5/5 PASS 一致
    C1 / C2 / C3 PASS PASS 一致

    当前 Layer Split 为 0–20 层 / 21–47 层。

    这个 1.71× 不能简单理解成传统 TP2 的扩展效率。更准确地说,收益来自三部分叠加:更多 experts 驻留 GPU、Host 搬运基本消失、Layer Split 带来的跨卡流水执行。

    Layer Split 与 Peer Device

    两种双卡模式都做了实际测试:

    模式 128K Prefill 相对单卡
    Single 2170.3 tok/s 1.000×
    Layer Split 3699.3 tok/s 1.704×
    Peer Device 1546.1 tok/s 0.712×

    Peer Device 在我的平台上反而比单卡慢,因此后续双卡路线直接选择 Layer Split。


    二、IQ3_XXS 与 IQ3_S 对比

    这里主要想验证一个问题:IQ3_S 单卡更慢,是因为它占用更大、更多 experts 落到 Host,还是当前 Strata / ROCm / gfx1201 路径下本身就有更高的执行成本?

    单卡与双卡的 128K 性能

    
    image.jpeg

    单卡时:

    指标 IQ3_XXS IQ3_S IQ3_S 相对变化
    15K Prefill 2140.2 tok/s 1833.9 tok/s -14.31%
    128K Prefill 2168.5 tok/s 1863.7 tok/s -14.05%
    128K TTFT 59.65 s 69.28 s +16.14%
    128K Decode 62.0 tok/s 57.0 tok/s -8.06%
    Host Resident Expert 18.63 GiB 25.91 GiB IQ3_S 更高

    单卡时 IQ3_S 的 Host Resident 更大,因此一开始的假设是:双卡如果把 IQ3_S 的 experts 全部放进显存,性能差距也许会明显缩小。

    但双卡结果没有支持这个假设:

    指标 Dual IQ3_XXS Dual IQ3_S IQ3_S 相对变化
    15K Prefill 2586.1 tok/s 2182.0 tok/s -15.63%
    128K Prefill 3708.4 tok/s 3119.3 tok/s -15.89%
    128K TTFT 35.11 s 41.68 s +18.71%
    128K Decode 64.9 tok/s 62.1 tok/s -4.39%
    Dual Scaling 1.710× 1.674× IQ3_S 略低
    Expert Slots 24,576 / 24,576 24,576 / 24,576 均 100%
    GPU Expert 39.96 GiB 46.83 GiB +6.87 GiB
    Host Resident 0 GiB 0 GiB 一致
    128K 最小可用显存 1.6 / 9.2 GiB 3.2 / 3.2 GiB 均安全

    双卡已经把两种量化的 experts 都全部放进 GPU,IQ3_S 仍然慢约 15.9%。

    Timing:差距主要出现在哪里

    128K Timing IQ3_XXS IQ3_S 变化
    Expert Dequant 1495 ms 7274 ms +386.6%
    Expert MMQ 7324 ms 9564 ms +30.6%
    Dense GEMM 5745 ms 7015 ms +22.1%
    Wait Copy 0 ms 100 ms 基本可忽略

    因此目前可以确认的是:在 Strata v0.1.38 + ROCm 10.2 + gfx1201 这套实现下,IQ3_S 的 GPU-side execution path 存在明显更高的执行成本。

    至于更底层究竟主要来自 quant format、packing、dequant、MMQ kernel、memory traffic 还是其他因素,目前没有继续做 kernel profiling,所以这里不做过度归因。


    关于 IQ3_XXS 和 IQ3_S 的质量

    这一部分目前测试还不够完善,我不打算下确定结论。

    项目 IQ3_XXS IQ3_S
    Agent 任务 7/8 7/8
    C1 Strict JSON PASS PASS
    C2 Tool Calling PASS PASS
    C3 Python Coding PASS PASS
    128K Multi-Needle 5/5 5/5

    这些结果只能说明:目前没有测出 IQ3_S 明显的质量优势。

    但 8 个 Agent 任务样本太少,也不足以证明两者质量相同。真正可能拉开差距的,应该是复杂代码修复、多文件依赖、长链路推理、失败后的自我修正、复杂 Tool Calling、长上下文约束保持等更困难任务。

    所以目前我的结论只限定在:

    性能:IQ3_XXS 明显更好。
    质量:证据不足,暂不判断 IQ3_S 是否更好。

    以后如果继续比较质量,会单独设计更大的高难度 Agent / Coding 测试集。


    最终结果

    项目 当前结果
    单卡性能量化 IQ3_XXS
    双卡性能量化 IQ3_XXS
    双卡模式 Layer Split
    单卡 128K Prefill ≈2168.5 tok/s
    双卡 128K Prefill ≈3708.4 tok/s
    双卡 128K TTFT ≈35.11 s
    双卡 128K Decode ≈64.9 tok/s
    双卡扩展比 ≈1.71×
    双卡 Expert Residency 24,576 / 24,576
    Host Resident 0 GiB
    Peer Device 当前平台不推荐
    IQ3_S 性能 明显慢于 IQ3_XXS
    IQ3_S vs IQ3_XXS 质量 目前证据不足,暂不下结论

    从这次测试来看,X99 虽然只有 PCIe 3.0,但在双 R9700、P2P / HIP IPC 正常、使用 Strata Layer Split 的情况下,128K Prefill 仍然从约 2168 tok/s 提升到 3708 tok/s。

    对 Flash-Next 这种 expert residency 很重要的模型来说,第二张卡的价值并不只是增加算力,更重要的是把单卡放不下的 experts 从 Host 搬进 GPU。

    以上数据仅代表我的 X99 + 双 R9700 + Strata v0.1.38 + ROCm 10.2 环境。不同 PCIe 拓扑、驱动、Strata 版本、ROCm 版本以及量化文件,结果都可能不同。


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战

    这篇主要解决一个问题:X99 / Broadwell-EP 上,两张位于不同 CPU Root Port 的 AMD Radeon AI PRO R9700,怎样真正跑通 Direct P2P,并确认它最终对 SGLang + Qwen3.8 有实际收益。

    我把内容分成两部分:前半部分是“可以直接抄作业”的配置与验收流程;后半部分再解释 Huge BAR、44-bit DMA、Linux P2PDMA、RCCL PHB 等问题为什么会卡住。


    先看结果

    硬件平台:

    • CPU:Intel Xeon E5-2697A v4
    • 主板:华南金牌 X99-TF GAMING V6.0
    • 内存:128GB DDR4
    • GPU:2 × AMD Radeon AI PRO R9700 32GB
    • 两张 GPU 位于不同 CPU Root Port
    • PCIe:Gen3 x16 ×2
    • 系统:Ubuntu 24.04 Server
    • Kernel:6.8.12-r9700-p2p-dma44
    • RCCL:2.27.7 + P2P level patch
    • SGLang:v0.5.18 系列
    • 模型:Qwen3.8-27B-AWQ-MTP
    • Tensor Parallel:TP=2

    image.jpeg

    P2P / RCCL

    项目 实测
    GPU0 → GPU1 GFX Push ≈10.29 GB/s
    GPU1 → GPU0 GFX Push ≈10.29 GB/s
    DMA / SDMA P2P ≈10.26–10.29 GB/s
    双向同时 GFX aggregate ≈19.76 GB/s
    双向同时 DMA aggregate ≈19.70 GB/s
    RCCL SendRecv 1GB ≈9.75 GB/s
    RCCL AllReduce BusBW ≈9.51 GB/s
    RCCL AllGather BusBW ≈9.16 GB/s
    RCCL ReduceScatter BusBW ≈8.92 GB/s

    最终日志确认:

    isAllDirectP2p 1
    via P2P/IPC
    

    不是 SHM。

    SGLang + Qwen3.8 Cold Prefill

    cached_tokens=0:

    Context Prefill Throughput TTFT
    1K 1566 tok/s 0.654 s
    64K 1250 tok/s 52.42 s
    96K 1104 tok/s 89.04 s
    128K 988 tok/s 132.65 s
    192K 816 tok/s 240.90 s
    224K 751 tok/s 305.32 s
    Near256K / 251.5K 712 tok/s 353.35 s

    Native Decode / MTP

    Context Native MTP MTP 相对 Native
    1K 31.40 tok/s 44.04 tok/s +40.25%
    64K 27.70 tok/s 36.51 tok/s +31.81%
    128K 24.79 tok/s 27.47 tok/s +10.81%
    192K 22.40 tok/s 25.48 tok/s +13.75%
    224K 21.40 tok/s — —
    Near256K / 251.5K 20.76 tok/s — —

    真实 Agent 工作负载

    场景 Total Gain Warm Gain
    64K Coding Loop +3.31% +18.77%
    Tool Loop +32.49% +31.39%
    Mixed Thinking + Code +51.68% —
    128K Multi-Turn -4.74% -16.22%

    64K / 128K 多轮对话中 Prefix Cache 均正常命中,REPEATED_FULL_PREFILL = NO。

    另外,对比 Stock SHM 与 Direct P2P,长上下文 Prefill 提升约:

    +30.6% ~ +36.7%
    

    TTFT 降低约:

    23.4% ~ 26.9%
    

    一句话结论

    X99 的问题不是“PCIe 3.0 天生不能做双卡 AI 推理”,而是默认软件栈没有替你处理好跨 Root Port P2PDMA、Huge BAR、44-bit DMA 和 RCCL P2P level。

    把这些层逐一跑通后,这套双 R9700 可以做到约 10.3GB/s 单向 P2P、约 19.7GB/s 双向聚合,并且能实际转化成 SGLang TP2 的长上下文 Prefill、Decode 和 MTP 收益。


    第一部分:直接抄作业

    1. 最终稳定配置

    BIOS

    Above 4G Decoding = ON
    Resizable BAR     = ON
    CSM               = OFF
    

    Linux / HIP

    Ubuntu 24.04 Server
    Kernel: 6.8.12-r9700-p2p-dma44
    

    HIP IPC:

    export HSA_ENABLE_IPC_MODE_LEGACY=0
    

    我的最终稳定配置不需要:

    HSA_FORCE_FINE_GRAIN_PCIE=1
    

    RCCL

    export NCCL_P2P_LEVEL=PHB
    

    并使用调整了 P2P level 优先级的 RCCL 2.27.7。

    SGLang Native

    TP=2
    Graph ON
    BF16 PV
    BF16 KV
    num_kv_splits=8
    Direct P2P PHB
    patched RCCL
    

    MTP

    steps=3
    top_k=1
    draft_tokens=4
    RDNA4 Patch065
    

    当前生产路由:

    <=192K → MTP_FAST
    >192K  → NATIVE_SAFE
    

    2. 推荐验收顺序

    不要跳步骤,建议严格按下面顺序:

    1. BIOS
       ↓
    2. PCIe Topology / Link
       ↓
    3. BAR / ReBAR / DMA Address
       ↓
    4. Kernel P2PDMA
       ↓
    5. HIP IPC
       ↓
    6. TransferBench Push
       ↓
    7. TransferBench DMA
       ↓
    8. Bidirectional TransferBench
       ↓
    9. RCCL SendRecv
       ↓
    10. RCCL Collectives
       ↓
    11. SGLang Direct P2P
       ↓
    12. Native Model Benchmark
       ↓
    13. Speculative Decode
       ↓
    14. Real Agent Workload
    

    核心原则:

    先证明底层链路,再证明通信库,再证明推理框架。不要用最终 tok/s 倒推 P2P 是否成功。


    3. 每一层的 PASS 标准

    层级 我使用的 PASS 标准
    PCIe 两张卡均为 Gen3 x16
    HIP IPC 双向 IPC handle 可正常 open / access
    TransferBench Push / DMA 约 9–10GB/s 级
    双向 TransferBench aggregate 明显高于单向;我的结果约 19.7GB/s
    RCCL SendRecv 应尽量逼近 TransferBench;我的结果 9.75 vs 10.29GB/s
    SGLang isAllDirectP2p 1 + via P2P/IPC
    Qwen3.8 Native 251.5K Context 能稳定运行
    MTP 1K–192K 相对 Native 保持正收益

    如果 TransferBench Push / DMA 只有 2–3GB/s,不建议继续往上层调 RCCL。


    4. 最短检查命令

    检查 PCIe 链路

    sudo lspci -vv -s <GPU_BDF> | grep -E "LnkCap|LnkSta"
    

    正常应看到类似:

    LnkSta: Speed 8GT/s, Width x16
    

    看 PCIe 拓扑

    lspci -tv
    lspci -nn
    

    建议保存:

    lspci -tv > pcie-topology.txt
    sudo lspci -vv > lspci-vv.txt
    

    HIP IPC

    export HSA_ENABLE_IPC_MODE_LEGACY=0
    

    然后分别验证 GPU0 → GPU1 和 GPU1 → GPU0 的 IPC handle 打开与访问。

    RCCL

    export NCCL_P2P_LEVEL=PHB
    

    最终必须从日志确认真正使用 P2P,而不是只看程序成功启动。


    第二部分:P2P 是怎么跑通的

    5. 先确认:PCIe x16 不等于 GPU P2P 已经可用

    我的两张 R9700 都能看到:

    LnkSta: Speed 8GT/s, Width x16
    

    但它们位于不同 CPU Root Port。

    因此真正要解决的是:

    1. Linux 是否允许跨 Root Port P2PDMA;
    2. GPU BAR 是否落在 DMA 可以访问的地址范围;
    3. HIP / RCCL 是否愿意真的使用 Direct P2P;
    4. 最终 SGLang 是否走 P2P/IPC 而不是 SHM。

    6. MPS / MRRS:不要先在这里浪费时间

    Broadwell 这套平台 Root Port 和 endpoint 的最大 MPS 是 256B。

    因此不要照搬某些平台的:

    MPS=512
    MPS=1024
    

    调优。

    另外,即使 Root Port 看到 MRRS 128B,也不能直接得出“GPU DMA 只能低速”的结论。

    我的实测最终仍然有:

    DMA / SDMA P2P ≈10.26–10.29 GB/s
    

    7. 第一个核心问题:Huge BAR + 44-bit DMA

    开启 Above 4G / ReBAR 后,R9700 会获得很大的 BAR。

    我的环境中曾出现约:

    56 TiB
    

    区域的 BAR 映射。

    而相关 DMA 路径存在约:

    44-bit DMA addressability
    

    44-bit 可直接表示的地址空间约为:

    16 TiB
    

    这会导致一种非常迷惑的状态:

    CPU 能访问 BAR
    GPU 枚举正常
    ReBAR 正常
    PCIe x16 正常
    但另一张 GPU 的 DMA engine 无法正确访问该 BAR 地址
    

    所以:

    lspci 看起来一切正常,不等于 GPU P2P 就已经正常。


    8. 第二个核心问题:Linux 跨 Root Port P2PDMA

    Linux P2PDMA 会根据:

    • provider
    • client
    • PCI bridge
    • Root Port
    • topology

    判断 P2P 是否允许。

    我的 Broadwell Root Port 属于:

    8086:6f00
    

    最终使用的自定义内核:

    6.8.12-r9700-p2p-dma44
    

    主要处理两个问题:

    1. Broadwell 8086:6f00 跨 Root Port P2PDMA;
    2. Huge BAR + 44-bit DMA 地址限制。

    这里不建议使用“所有跨 Root Port 一律允许”的暴力 patch。

    更合理的方式是只针对已经确认、已经实测通过的拓扑处理。


    9. 内核通过后先测 HIP IPC

    不要直接进入 RCCL。

    测试逻辑应该是:

    GPU0 分配显存
    ↓
    生成 IPC handle
    ↓
    GPU1 打开
    ↓
    GPU1 访问
    

    然后反方向再做一次。

    我的环境:

    export HSA_ENABLE_IPC_MODE_LEGACY=0
    

    双向 HIP IPC 通过以后,才继续做 TransferBench。


    10. TransferBench:底层 P2P 的关键验收

    至少应该分别看:

    • GFX Push
    • GFX Pull
    • DMA / SDMA
    • 双向同时传输

    GFX Push

    GPU0 -> GPU1 ≈10.29 GB/s
    GPU1 -> GPU0 ≈10.29 GB/s
    

    DMA / SDMA

    ≈10.26–10.29 GB/s
    

    这两项正常后,才能比较有把握地说:

    跨 Root Port Direct P2P 数据路径已经跑通。

    GFX Pull

    我的结果:

    GPU1 read GPU0 ≈3.13–3.16 GB/s
    GPU0 read GPU1 ≈1.46–1.49 GB/s
    

    Pull 明显比 Push 慢,而且有方向差异。

    但因为 Push、DMA、RCCL 最终都正常,所以:

    不要只看 GFX Pull 就判断 P2P 是否成功。

    双向同时传输

    GFX simultaneous bidirectional ≈19.759 GB/s aggregate
    DMA simultaneous bidirectional ≈19.701 GB/s aggregate
    

    这证明两个方向可以同时接近 10GB/s,并不是“双卡共享一个总共 10GB/s 的瓶颈”。


    11. TransferBench 正常,但 Stock RCCL 仍然慢

    最初 Stock RCCL:

    SendRecv 1GB ≈6.90 GB/s
    

    明显低于:

    TransferBench Push ≈10.29 GB/s
    

    继续查日志后发现,RCCL 并没有按预期走跨 Root Port Direct P2P,而是退到了类似:

    SHM / direct / direct
    

    这一步非常关键:

    底层 PCIe P2P 已经跑通,不代表 RCCL 一定会选择 P2P。


    12. RCCL 2.27.7:Intel P2P level 覆盖问题

    最终问题定位到 RCCL 的路径选择逻辑。

    我在:

    src/graph/paths.cc
    

    调整了 Intel 默认 P2P level 和:

    ncclGetUserP2pLevel
    

    的处理顺序。

    核心原则:

    用户显式设置的 NCCL_P2P_LEVEL 应该最后生效,而不是再被平台默认值覆盖。

    然后:

    export NCCL_P2P_LEVEL=PHB
    

    这里需要强调:

    Patch + NCCL_P2P_LEVEL=PHB 两者都需要。


    13. RCCL 最终验收

    修复后:

    SendRecv 1GB ≈9.75 GB/s
    

    其他 collective:

    AllReduce BusBW     ≈9.51 GB/s
    
    AllGather AlgBW     ≈18.31 GB/s
    AllGather BusBW     ≈9.16 GB/s
    
    ReduceScatter AlgBW ≈17.83 GB/s
    ReduceScatter BusBW ≈8.92 GB/s
    

    TransferBench Push ≈10.29GB/s,RCCL SendRecv ≈9.75GB/s:

    9.75 / 10.29 ≈94.7%
    

    测试期间:

    AER error = 0
    DMAR error = 0
    GPU reset = 0
    

    到这里我才把底层 P2P 标记为真正通过。


    14. 最后一层:SGLang 必须确认不是 SHM

    TP=2 能启动,不代表 Direct P2P 已经工作。

    最终必须确认日志:

    isAllDirectP2p 1
    via P2P/IPC
    

    如果仍然看到 SHM,那么模型虽然能跑,但并没有进入前面验证好的 Direct P2P 路径。


    第三部分:跑通 P2P 后,Qwen3.8 实际能到什么水平

    15. Qwen3.8 测试配置

    SGLang v0.5.18
    Qwen3.8-27B-AWQ-MTP
    TP=2
    Dual R9700 32GB
    Direct P2P PHB
    patched RCCL
    Graph ON
    BF16 PV ON
    BF16 KV
    num_kv_splits=8
    

    16. Cold Prefill

    cached_tokens=0:

    Context Prefill Throughput TTFT
    1K 1566 tok/s 0.654 s
    64K 1250 tok/s 52.42 s
    96K 1104 tok/s 89.04 s
    128K 988 tok/s 132.65 s
    192K 816 tok/s 240.90 s
    224K 751 tok/s 305.32 s
    Near256K / 251,500 tokens 712 tok/s 353.35 s

    Near256K 单卡 Peak VRAM:

    ≈28.1 GB / 31.9 GB
    

    余量约:

    3.8 GB/card
    

    因此这套 X99 + 双 R9700 可以实际运行约 251.5K Context。


    17. Direct P2P 对长上下文 Prefill 的收益

    做过:

    Stock SHM
    vs
    Direct P2P
    

    对照。

    长上下文 Prefill:

    +30.6% ~ +36.7%
    

    TTFT:

    降低约 23.4% ~ 26.9%
    

    所以 P2P 并不是只让通信 benchmark 好看,而是会直接影响长 Prompt 和 Agent 第一轮 TTFT。


    18. Native Decode

    最终 Native:

    Context Decode TPOT
    1K 31.40 tok/s ≈31.85 ms
    64K 27.70 tok/s 36.10 ms
    128K 24.79 tok/s 40.34 ms
    192K 22.40 tok/s ≈44.67 ms
    224K 21.40 tok/s ≈46.73 ms
    Near256K / 251.5K 20.76 tok/s 48.17 ms

    Near256K 多轮:

    CV ≈0.074%
    

    19. MTP Decode

    最终 MTP:

    steps=3
    top_k=1
    draft_tokens=4
    RDNA4 Patch065
    
    Context Native MTP 提升
    1K 31.40 44.04 tok/s +40.25%
    64K 27.70 36.51 tok/s +31.81%
    128K 24.79 27.47 tok/s +10.81%
    192K 22.40 25.48 tok/s +13.75%

    64K:

    accepted length ≈3.07
    speculative cycle ≈83.81 ms
    break-even ≈110.68 ms
    

    当前 BF16 KV MTP 配置:

    max_total_num_tokens ≈203,558
    

    因此生产路由选择:

    <=192K → MTP_FAST
    >192K  → NATIVE_SAFE
    

    当前首先限制 MTP 深度的是 BF16 KV Token Pool,而不是 192K 已经出现性能 crossover。


    20. 真实 Agent 工作负载

    Coding Loop:64K Prefix,3 Turns

    Cold 首轮完整 Prefill,后续 Radix Cache 命中:

    TTFT 从约55s降到约1~2s
    

    结果:

    Total Gain = +3.31%
    Warm Gain  = +18.77%
    

    Tool Loop:3 Turns

    流程:

    Tool Call
    → Tool Result
    → 下一次 Tool Call
    → Final JSON
    

    Correctness 全部通过:

    Total Gain = +32.49%
    Warm Gain  = +31.39%
    

    Mixed Thinking + Code

    MTP    = 51.9 tok/s
    Native = 31.5 tok/s
    

    任务总耗时:

    +51.68%
    

    同时通过:

    <think> 正常闭合
    Python compile PASS
    行为测试 PASS
    

    128K Multi-Turn

    D1 Cold TTFT:

    ≈133~139s
    

    D2 / D3:

    ≈2~3s
    

    确认:

    REPEATED_FULL_PREFILL = NO
    

    这一组 wall-clock:

    Total Gain = -4.74%
    Warm Gain  = -16.22%
    

    主要原因是某轮 MTP 生成了明显更长的 Thinking / 输出,而不是 Prefix Cache 失效或 Decode tok/s 低于 Native。


    第四部分:P2P 跑通以后做的性能优化

    这一部分不是“跑通 P2P”的必要步骤。如果你的目标只是让双卡 Direct P2P 正常工作,到上一部分已经完成。下面是继续优化 Qwen3.8 时的结果。

    21. BF16 P×V

    Full Attention 的 P×V 改成:

    BF16 WMMA
    +
    FP32 accumulator
    

    以后,192K Full Attention Stage1:

    54.01 ms
    ↓
    12.85 ms
    

    192K Native Decode:

    11.83 tok/s
    ↓
    22.42 tok/s
    

    224K:

    10.71 tok/s
    ↓
    21.41 tok/s
    

    说明在 RDNA4 上,软件 kernel 路径本身也可能是非常大的瓶颈。


    22. num_kv_splits:8 vs 64

    192K:

    splits=8  → 22.42 tok/s
    splits=64 → 22.43 tok/s
    

    差异:

    +0.045%
    

    Stage1:

    12.92 ms
    vs
    12.94 ms
    

    所以最终继续使用:

    num_kv_splits=8
    

    23. FP8 KV:更像容量模式,不是默认性能模式

    192K:

    BF16 KV → 22.41 tok/s
    FP8 KV  → 23.12 tok/s
    

    提升:

    +3.17%
    

    Token Pool:

    BF16 → 261,096
    FP8  → 520,145
    

    几乎翻倍。

    但 192K Prefill TTFT:

    BF16 → 239.7s
    FP8  → 335.6s
    

    恶化约:

    +40%
    

    所以当前:

    BF16 KV 用作默认性能模式,FP8 KV 只保留为超长上下文 / 容量模式候选。


    24. 为什么 MTP 一开始很慢,以及 Patch065 的作用

    Qwen3.8 自带 MTP Head。

    一开始直接跑 MTP,64K:

    Native ≈27.7 tok/s
    错误 verify 路径只有个位数 tok/s
    

    后来定位到 gfx1201 上 Target Verify 走了低效的:

    extend_attention_fwd
    

    最终采用 RDNA4 split-KV tree verify(Patch065)。

    核心调度思路:

    KV Head + split
    +
    GRP × Draft Tokens
    

    让同一组 GQA Q heads 共享 KV tile,避免重复读取 Prefix KV。

    最终才得到前面列出的 1K–192K MTP 正收益。


    第五部分:常见误区

    25. 不要把 MPS 强行改到 512 / 1024

    Broadwell 这里最大就是 256B。


    26. 不要只看 GFX Pull

    我的 Pull 只有约 1.5~3.2GB/s,但:

    Push ≈10.29GB/s
    DMA  ≈10.28GB/s
    RCCL ≈9.75GB/s
    

    最终都正常。


    27. hipMemcpyPeer 成功不等于高速 Direct P2P

    必须实际测吞吐。


    28. 不要只跑 RCCL

    如果 RCCL 慢,应先通过 TransferBench 判断问题究竟在:

    • PCIe
    • Kernel / P2PDMA
    • HIP IPC
    • RCCL

    哪一层。


    29. TP=2 能启动不代表 Direct P2P 已经成功

    SHM 同样可以让 TP 工作。

    最后一定要确认:

    isAllDirectP2p 1
    via P2P/IPC
    

    30. 社区参数不要机械照搬

    例如:

    num_kv_splits=64
    

    在我这套 Qwen3.8 + BF16 PV 上几乎没有收益。

    Speculative Decode 也一样:一定要确认真正使用的 verify path,否则很容易把一个本来有正收益的 MTP 跑成负优化。


    第六部分:最终结论

    这套机器最终证明:

    X99 / Broadwell
    +
    E5-2697A v4
    +
    PCIe Gen3 x16 ×2
    +
    双 Radeon AI PRO R9700 32GB
    

    可以做到:

    单向 GPU P2P      ≈10.3GB/s
    双向 aggregate    ≈19.7GB/s
    RCCL SendRecv     ≈9.75GB/s
    

    在 SGLang + Qwen3.8-27B 中:

    Cold Prefill 128K ≈988 tok/s
    Cold Prefill 251.5K ≈712 tok/s
    
    Native Near256K ≈20.76 tok/s
    
    MTP 64K  ≈36.51 tok/s
    MTP 192K ≈25.48 tok/s
    

    并且 64K / 128K Agent 多轮 Prefix Cache 能稳定复用。

    所以如果手里已经有 X99 / Xeon E5 v4:

    不要因为“PCIe 3.0”几个字就先入为主地认为必须换平台。

    先按照:

    Topology
    → DMA Address
    → P2PDMA
    → HIP IPC
    → TransferBench
    → RCCL
    → SGLang
    → Model Benchmark
    

    把每一层分别验证清楚。

    如果 TransferBench 已经可以跑到接近链路的实际有效能力,而 RCCL 或模型仍然慢,那么问题大概率已经不在 PCIe 本身,而是在上层通信或 kernel 路径。


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    @fcme 说:

    @PhoenixRise2026
    又看了一遍这个帖子,老哥牛逼了。看来RDNA4的驱动你在sglang里面搞定了,就像版主说的,由于SGlang优秀的缓存机制,其实pp这一块重要性没有那么高,那你可以考虑把dflash2给加进去吗?这样的话,这个蛋疼的tg速度就可以解决了。SGlang本身是支持的。
    你要是把这个也搞定的话,那你基本上功德无量了😃😂

    这两天懈怠了,十一前把dflash2测了


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    谢谢老特肯定。打通P2P和调试SGLang的过程都是Agent来操作的,包括内核编译、遇到问题寻找解决方法。5.5小时双卡几乎满功率推理测试,没有出现问题。


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    @fcme 说:

    但是看起来好像你这个运行速度也不是太好啊,Pp才1000左右。看看https://github.com/Eliovp-BV/paiton-vllm-plugin。 单卡运行速度就炸裂,昨天刚配置好的

    Screenshot_20260925_081952_com_android_chrome_ChromeTabbedActivity.jpg

    Paiton 单卡确实很强,这个后面有时间我也会测。
    我这篇主要验证的是 X99 双 R9700 的 P2P 可行性和双卡 scaling,SGLang 只是目前先跑通的 serving stack。现在这些 PP/TG 数据主要看单卡→双卡提升,不是在做 SGLang vs vLLM 横评。
    后续会补 vLLM/Paiton,同模型同参数下再比较。


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    更新一下进展:

    已经把 X99 / Broadwell-EP(8086:6f00)的 P2PDMA 白名单补丁提交给 Linux PCI 维护者,目前被正式接收,已进入 pci/p2pdma 和 pci/next 分支,目标合并至 Linux v7.4。官方更新后未来不需要再编译内核了。

    目前还未确认进入 Linus 主线,后续有进展再更新。


  • 我之前也以为 X99 基本没法搞 P2P,不过最近在 E5-2697A v4 + X99 + 双 R9700 上实际折腾下来,已经把跨 Root Port 的 Direct P2P 跑通了。
    PhoenixRise2026P PhoenixRise2026
    AI硬件 x99 r9700 多卡部署

    完整作业:https://lcz.me/topic/1925


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    @Terry 没问题。Linux 7.4预计正式发布可能得12月或1月了。要是正式被合并到主干了,我就发一帖,这也是第一次为开源社区贡献代码。


  • 我之前也以为 X99 基本没法搞 P2P,不过最近在 E5-2697A v4 + X99 + 双 R9700 上实际折腾下来,已经把跨 Root Port 的 Direct P2P 跑通了。
    PhoenixRise2026P PhoenixRise2026
    AI硬件 x99 r9700 多卡部署

    @suboyang 说:

    我没看懂你的帖子,如果是单路 CPU E5 系列,两个GPU 应该是挂在一个root complex 下啊?怎么还会跨 Root Port P2P?

    这颗CPU :Intel Xeon E5-2697A v4 支持P2P. 一颗CPU 怎么会挂在不同的 Broadwell Root Port ?

    image.jpeg

    谢谢指出问题。是我帖子里“不同 CPU Root Port”这个说法不严谨。
    我的机器是单路 E5-2697A v4,两张 GPU 都挂在同一颗 CPU 下,只是分别接在这颗 CPU 的不同 PCIe Root Port 上。
    所以这里说的“跨 Root Port P2P”是同一 CPU、不同 Root Port 之间的 P2P,不是跨 CPU。


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    @Kins-Ho 说:

    尋求大老給問,我目前有2台洋垃圾,就差在顯卡與電源供應器。
    也可以建置嗎?

    處理器 雙路 Intel Xeon E5-2696 v4
    主機板 HUANANZHI X99 F8D
    記憶體 海力士DDR4-2133 128GB
    顯示卡 2080ti / 3060
    電源 750w /850w

    双路 E5-2696 v4 + X99 F8D + 128GB 内存本身没有明显问题,不过如果想跑双卡,关键不在 CPU 和内存,而是在 主板 PCIe 拓扑。

    不同 X99 双路板的 PCIe 插槽可能分别挂在不同 CPU / Root Port 下,所以目前还不能只看型号就确定 P2P 一定能打通。

    你可以先在这台 F8D 上执行:

    lspci -tv

    让AI来评估是否可以打通P2P

    另外,电源建议多打出一些余量,双卡至少1000w以上。我的双r9700,用振华1300w电源,几乎满功率300w运行5.5小时,非常稳定。


  • R9700 32GB 跑 Qwen3.8-27B:llama.cpp Vulkan + MTP 实测与踩坑记录
    PhoenixRise2026P PhoenixRise2026
    LLM讨论区 r9700 qwen-27b llama.cpp

    @exllm 谢谢提醒,补一个q8_0的测试结果
    15ac13bc-d61a-48a0-9431-9e5740df43f7.png


  • R9700 32GB 跑 Qwen3.8-27B:llama.cpp Vulkan + MTP 实测与踩坑记录
    PhoenixRise2026P PhoenixRise2026
    LLM讨论区 r9700 qwen-27b llama.cpp

    @AGI 谢谢大神指导,运行效果确实不错
    b9c95087-b68f-4a77-aff6-f3d657585b21.png


  • 请教各位大神:魔改 32GB RTX 4080 SUPER 开启 ReBAR 后,BAR1 最大仍只有 16GB,正常吗?
    PhoenixRise2026P PhoenixRise2026
    AI硬件 rtx4080s resizeablebar

    我这张是魔改 32GB 的 RTX 4080 SUPER,主板 BIOS 已开启 Above 4G Decoding 和 Resizable BAR,Linux 下也确认 ReBAR 已正常生效。

    目前 nvidia-smi 显示:

    BAR1 Memory Usage
    Total : 16384 MiB
    Used  : 9 MiB
    Free  : 16375 MiB
    

    lspci 进一步确认:

    Physical Resizable BAR
    
    BAR 0: current size: 16MB, supported: 16MB
    BAR 1: current size: 16GB, supported:
           64MB 128MB 256MB 512MB 1GB 2GB 4GB 8GB 16GB
    BAR 3: current size: 32MB, supported: 32MB
    

    也就是说,这张卡虽然已经魔改为 32GB VRAM,但 PCIe ReBAR Capability 目前仍然只声明 BAR1 最大支持 16GB。系统已经选择了它支持的最大值,所以当前状态是:

    • 实际显存:32GB
    • ReBAR:已开启并正常工作
    • BAR1:16GB
    • BAR1 最大支持:16GB
    • 32GB 显存仍然可以被 CUDA / ComfyUI / llama.cpp 等正常完整使用,并不是只有 16GB 显存可用

    看起来限制更可能来自这张魔改 4080 SUPER 的 VBIOS / PCIe Resizable BAR capability,而不是主板 MMIO 地址空间不足。我的主板 MMIO High Size 已设置为 256GB。

    想请教一下,有没有同样使用 32GB 魔改 4080 / 4080 SUPER 的朋友测试过:你们的 BAR1 最大也是 16GB,还是有能够识别到 32GB ReBAR 的 VBIOS?


  • R9700 32GB 跑 Qwen3.8-27B:llama.cpp Vulkan + MTP 实测与踩坑记录
    PhoenixRise2026P PhoenixRise2026
    LLM讨论区 r9700 qwen-27b llama.cpp

    @Leaner-Financial 后来继续排查了一下 R9700 的风扇策略,确实发现原厂默认设置比较保守,所以我又让 AI 帮忙重新调了一条风扇曲线。

    修改前:原厂自动风扇策略

    R9700 默认由 SMU/固件自动控制风扇,并不会直接显示一条完整的 5 点曲线。

    我这张卡实测到的默认参数大致是:

    • 低温/空闲:约 20% PWM / 890 RPM
    • Fan Target Temperature:85°C
    • Acoustic Target:2100 RPM
    • Acoustic Limit:5000 RPM

    也就是说,默认策略更倾向于安静,低温时风扇转速压得比较低,温度上去以后再由 SMU 自动提高。

    修改后:自定义风扇曲线

    目前改成:

    25°C   → 25%
    50°C   → 30%
    70°C   → 45%
    85°C   → 70%
    100°C  → 100%
    

    这条曲线相比原厂明显更积极一些,尤其是 70°C 以后会更早提高风扇转速,主要考虑长时间跑 LLM / ComfyUI 时显存和 Hotspot 的散热。

    另外我也实际测试了一下手动控制是否真的生效:

    35% PWM
    → 实际 PWM:89 / 255 ≈ 34.9%
    → 风扇转速:1189 RPM
    

    所以目前可以确认,R9700 在 Ubuntu 下通过:

    /sys/class/drm/card*/device/gpu_od/fan_ctrl/fan_curve
    

    可以正常控制风扇曲线。

    需要注意的是,我这里还需要在 GRUB 中启用 AMDGPU OverDrive:

    amdgpu.ppfeaturemask=0xfff7ffff
    

    启用以后 gpu_od/fan_ctrl 相关接口才出现。

    目前这条曲线只是我先采用的基线,后面准备根据长时间满载时的 edge / junction / mem 温度和风扇 RPM 再继续微调。


  • X99 打通双 R9700 P2P 后:SGLang TP2 + DFlash2 实测
    PhoenixRise2026P PhoenixRise2026
    LLM讨论区 r9700 sg-lang qwen-27b

    先说结论

    这次测试的前提是:

    X99 平台上的两张 Radeon AI PRO R9700 已经先打通 P2P,再进行 SGLang TP2 测试。

    基于目前已经完成的测试,可以确认:

    • X99 + 双 R9700 在 P2P 打通后可以实际运行 SGLang TP2。
    • 在后续正式的对比中,Plain / MTP / DFlash2 使用的是同一个 Qwen/Qwen3.8-27B-FP8 target,因此这组 8K / 32K / 64K 数据可以用于比较三种 decode 路径。
    • DFlash2 相比普通 MTP:
      • 8K:42.29 → 51.44 tok/s,约 1.22×
      • 32K:45.32 → 55.39 tok/s,约 1.22×
      • 64K:28.60 → 59.81 tok/s,约 2.09×
    • 后续单独对 FP8 + DFlash2 做完整长上下文 characterization 时,192K decode 中位数为 33.75 tok/s。
    • 当前已经完成 224,000 input tokens 的单次容量验证,HTTP 200、输出正确,两张 GPU 都有持续计算活动。
    • 当前这套 DFlash2 TP2 runtime 中,/v1/models 可报告 max_model_len=262144,但 R8N 日志中实际 request admission ceiling 为 227701 tokens。因此本文只声称 224K 已验证,不声称 256K 已验证。
    • 同样的 Qwen/Qwen3.8-27B-FP8 + DFlash2 在单张 R9700 32GB 上无法完成初始化,OOM 发生在 DFlash draft worker 权重构造阶段,因此目前没有严格 apples-to-apples 的 TP1 / TP2 吞吐 scaling 数据。

    另外需要说明:

    我此前也测试过 shawnw3i/Qwen3.8-27B-AWQ-MTP 路线,并尝试过在 AWQ target 上挂 DFlash2。那属于更早阶段的探索,不是本文 P5B-R 里 51.44 / 55.39 / 59.81 这组 DFlash2 数据。

    本文会把两条路线分开写,避免混淆。


    一、测试平台与 P2P 前提

    硬件环境

    CPU:
    Intel Xeon E5-2697A v4
    
    RAM:
    128GB DDR4
    
    主板:
    华南金牌X99-TF GAMING V6.0
    
    GPU:
    2 × AMD Radeon AI PRO R9700 32GB
    
    本文后续所有双卡 TP2 数据,均是在:
    
    X99
    +
    双 R9700
    +
    P2P 已打通
    +
    SGLang TP2
    

    这一前提下取得。

    此前已经单独完成过双卡 P2P / HIP IPC 验证,参加帖子 https://lcz.me/topic/1925/52 X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战

    本文不重复讨论 P2P 打通方法,只讨论打通之后的 SGLang TP2 与 DFlash2 表现。

    需要区分:

    • P2P 是否打通:属于双卡通信前置条件;
    • 两张卡是否真的参与同一次 TP2 推理:后续通过运行时状态及 AMD-SMI 按 PCI BDF 的活动采样进行确认。

    二、权重口径:AWQ 早期路线与后续 FP8 路线要分开

    这一点是整篇帖子最需要避免混淆的地方。

    1. 早期 AWQ-MTP 路线

    上一个帖子曾经使用:

    shawnw3i/Qwen3.8-27B-AWQ-MTP
    

    进行 MTP / speculative 相关探索。

    也尝试过:

    shawnw3i/Qwen3.8-27B-AWQ-MTP
    +
    DFlash2 draft
    

    但这一阶段属于更早的 AWQ 路线测试。

    本文后面引用的 51.44 / 55.39 / 59.81 tok/s,不是这条 AWQ + DFlash2 路线的数据。

    因此:

    shawnw3i/Qwen3.8-27B-AWQ-MTP
    

    只作为早期历史路线说明,不和后面的FP8 数据混在一起。


    2. MTP / DFlash2 正式对比

    后续 DFlash2 测试正式对比统一使用:

    Target:
    Qwen/Qwen3.8-27B-FP8
    

    三种运行方式分别是:

    Plain

    Qwen/Qwen3.8-27B-FP8
    无 speculative decoding
    

    MTP

    Qwen/Qwen3.8-27B-FP8
    +
    MTP
    

    DFlash2

    Target:
    Qwen/Qwen3.8-27B-FP8
    
    Draft:
    z-lab/Qwen3.8-27B-DFlash2
    

    因此本次测试的:

    Plain
    vs
    MTP
    vs
    DFlash2
    

    是在同一个 FP8 target 下完成的对比。

    这组数据才是本文用于判断 DFlash2 相对普通 MTP 效果的主要依据。


    3. 后续 DFlash2 characterization

    后续 8K / 32K / 64K / 128K / 192K 的完整 characterization,以及 224K capacity probe,继续统一使用:

    Target:
    Qwen/Qwen3.8-27B-FP8
    
    Draft:
    z-lab/Qwen3.8-27B-DFlash2
    

    因此后半部分的 DFlash2 数据也是同一条 FP8 + DFlash2 路线。


    三、后续 FP8 + DFlash2 测试的启动条件

    后续独立 DFlash2 characterization 使用的核心运行条件如下。

    SGLang:
    0.5.18 + RDNA4 patch
    
    Image:
    sglang-rdna4-production:v0.5.18-r1
    
    Image ID:
    sha256:bea0f21f6e2ebcac99274b3f14f271281bf1249111840d9798542f3383191b49
    
    Patch SHA256:
    2f78d14d12787d029453671979229a4a26a6c2b3ccd732b422754a2c82f99cce
    
    Frozen launch SHA256:
    15f266c4934d89cf6463422b768446341edf3292ed6bbec0b36575e691223a47
    
    Target:
    Qwen/Qwen3.8-27B-FP8
    
    Draft:
    z-lab/Qwen3.8-27B-DFlash2
    
    Tensor Parallel:
    2
    
    GPU count:
    2
    
    GPU BDF:
    0000:05:00.0
    0000:08:00.0
    
    KV cache dtype:
    FP8 e4m3
    
    DFlash2:
    ON
    
    BN:
    32
    
    SSM precision:
    FP32
    
    ReplaySSM:
    OFF
    
    Default thinking:
    enable_thinking=false
    

    Context 配置

    完整 8K–192K characterization 阶段使用的是当时冻结的常规测试配置。

    后续为了验证 200K 以上容量,只对测试用 TP2 runtime 的 context cap 做了临时调整,其它核心模型和 DFlash2 条件保持不变。

    /v1/models max_model_len:
    262144
    

    但 229000-token 请求被 SGLang 拒绝,日志给出的实际 request admission ceiling 为:

    227701 tokens
    

    随后使用:

    input tokens:
    224000
    
    max output tokens:
    128
    

    完成单次成功验证。

    测试结束后,临时 context 调整已撤销,launcher 已恢复原状态。


    四、Plain / MTP / DFlash2 同一 FP8 Target 对比

    这一组是本文最重要的性能对比。

    三种模式的 target 都是:

    Qwen/Qwen3.8-27B-FP8
    

    同时:

    TP:
    2
    
    KV:
    FP8 e4m3
    

    DFlash2 模式额外挂载:

    z-lab/Qwen3.8-27B-DFlash2
    

    实测 decode:

    Context Plain MTP DFlash2 DFlash2 / MTP
    8K 21.48 tok/s 42.29 tok/s 51.44 tok/s 1.22×
    32K 19.21 tok/s 45.32 tok/s 55.39 tok/s 1.22×
    64K 16.82 tok/s 28.60 tok/s 59.81 tok/s 2.09×

    Plain → MTP

    MTP 本身已经带来明显提升。

    例如 32K:

    Plain:
    19.21 tok/s
    
    MTP:
    45.32 tok/s
    

    MTP → DFlash2

    DFlash2 在同一个 FP8 target 下继续提高 decode。

    8K:

    42.29 → 51.44 tok/s
    ≈ 1.22×
    

    32K:

    45.32 → 55.39 tok/s
    ≈ 1.22×
    

    64K:

    28.60 → 59.81 tok/s
    ≈ 2.09×
    

    因此在这组同 target 测试里,可以直接说:

    DFlash2 相比普通 MTP 有明确提升。

    但也需要注意:

    这三个倍数是对应这组具体 workload 的实测结果,不应直接外推为所有 prompt、所有输出类型下都固定存在相同倍数。

    Speculative decoding 的实际速度仍然会受到:

    accept rate
    accept length
    verify latency
    

    等因素影响。


    五、FP8 + DFlash2 完整长上下文 characterization

    后续重新固定了一套 benchmark workload,对 FP8 + DFlash2 单独进行完整长上下文测试。

    当前结果:

    Context Decode Prefill TTFT E2E
    8K 40.78 tok/s 1747.70 tok/s 4.69s 4.96s
    32K 40.00 tok/s 1499.38 tok/s 21.85s 23.28s
    64K 35.48 tok/s 1248.14 tok/s 52.51s 52.82s
    128K 34.38 tok/s 929.67 tok/s 140.99s 142.64s
    192K 33.75 tok/s 739.79 tok/s 265.76s 267.33s

    从这组数据本身看:

    8K      40.78 tok/s
    32K     40.00 tok/s
    64K     35.48 tok/s
    128K    34.38 tok/s
    192K    33.75 tok/s
    

    8K 到 192K 的 decode 下降约 17%。

    Prefill:

    8K      1747.70 tok/s
    32K     1499.38 tok/s
    64K     1248.14 tok/s
    128K     929.67 tok/s
    192K     739.79 tok/s
    

    需要特别注意:

    这组 40.78 / 40.00 / 35.48 / 34.38 / 33.75 不能直接和之前的 51.44 / 55.39 / 59.81 做“版本性能回归”判断。

    因为两轮:

    • prompt 不同;
    • output workload 不同;
    • cache 状态不同;
    • benchmark harness 不同;
    • streaming / timing 方法不同。

    所以两组数据用途不同:

    • 前面一组:Plain / MTP / DFlash2 同 target 对比;
    • 后续 characterization:观察 FP8 + DFlash2 自己的长上下文性能曲线。

    六、224K 单次容量验证

    在完成 192K benchmark 后,又继续验证更长输入。

    R8N-1 最终只发送一次长请求:

    Actual input tokens:
    224000
    
    Max output tokens:
    128
    

    服务器报告:

    prompt tokens:
    224000
    
    HTTP:
    200
    
    output:
    READY
    
    TTFT:
    330.757s
    
    E2E:
    330.872s
    

    GPU 采样:

    GPU 05:
    319 samples
    GFX average = 100%
    GFX peak = 100%
    
    GPU 08:
    319 samples
    GFX average = 100%
    GFX peak = 100%
    

    峰值显存:

    GPU 05:
    30132 MB
    
    GPU 08:
    29849 MB
    

    请求期间未发现:

    OOM
    GPU reset
    GPU hang
    HIP fatal
    page fault
    

    因此可以直接确认:

    X99 双 R9700 P2P + SGLang TP2 + Qwen/Qwen3.8-27B-FP8 + DFlash2 已经实际完成 224,000-token 输入。

    这里的 224K 是 server-reported prompt tokens,不是文本长度估算值。


    七、为什么本文不写“256K 已验证”

    R8N 中:

    /v1/models:
    max_model_len = 262144
    

    但:

    229000-token input
    

    被 SGLang request layer 拒绝。

    日志给出的实际 request ceiling:

    227701 tokens
    

    所以目前有三个不同数字:

    模型报告 max_model_len:
    262144
    
    当前 DFlash2 TP2 runtime 已知 request ceiling:
    227701
    
    最高实际成功验证 input:
    224000
    

    它们不能混为一谈。

    本轮测试只证明:

    当前 runtime 能接收并完成 224K;229K 超过了当时 runtime 给出的 admission limit。

    至于:

    262144 → 227701
    

    中间的差额究竟有多少来自:

    DFlash2 draft
    draft KV
    target KV
    token pool
    其它 runtime reservation
    

    本文并没有逐项隔离,所以不把它写成已证明的单一因果关系。

    因此本文不会声称:

    双 R9700 硬件最多只能 227.7K
    

    也不会声称:

    DFlash2 固定只能到 227.7K
    

    准确结论只有:

    当前这套冻结 DFlash2 TP2 runtime 实测成功到 224K,R8N 日志给出的 admission ceiling 为 227701 tokens。


    八、为什么没有 TP1 性能对比

    原计划还想做:

    TP1 DFlash2
    vs
    TP2 DFlash2
    

    计算第二张 R9700 带来的纯 throughput scaling。

    但是严格相同的 FP8 + DFlash2 stack 在单卡上无法完成启动。

    TP1 使用:

    GPU:
    1 × R9700 32GB
    
    TP:
    1
    
    Target:
    Qwen/Qwen3.8-27B-FP8
    
    DFlash2:
    ON
    

    分别尝试:

    32K
    64K
    128K
    

    三档都在启动阶段 OOM。

    32K 的典型状态:

    GPU total:
    31.86 GiB
    
    allocated:
    31.41 GiB
    
    free:
    112 MiB
    
    next allocation:
    170 MiB
    
    result:
    OOM
    

    64K、128K 的失败点和显存状态基本一致。

    后续初始化顺序审计确认:

    OOM 发生在 DFlash draft worker 权重构造阶段。

    此时:

    KV pool
    attention backend
    CUDA/HIP graph
    

    都还没有初始化。

    因此可以确认:

    32K / 64K / 128K 全部失败并不是上下文长度本身导致的,而是当前 FP8 target + DFlash2 stack 在单张 32GB R9700 上无法完成初始化。

    所以目前没有合法的:

    TP2 / TP1 decode speedup
    

    可以计算。

    如果为了获得 TP1 数字而改:

    模型精度
    权重量化
    offload
    CPU spill
    

    那就已经不是同一个测试对象。


    九、这组测试实际说明了什么

    1. X99 打通 P2P 后,双 R9700 TP2 可以实际工作

    本文不是只验证:

    系统识别两张 GPU
    

    而是在真实长上下文请求期间观察两张卡的运行活动。

    224K 请求:

    05:00.0:
    319 个 1 秒样本
    GFX 平均 100%
    
    08:00.0:
    319 个 1 秒样本
    GFX 平均 100%
    

    因此至少对于这套机器,可以确认:

    X99 老平台在 P2P 打通以后,可以承载实际双 R9700 TP2 推理。


    2. DFlash2 对同一个 FP8 target 的提升明确存在

    P5B-R:

    Target:
    Qwen/Qwen3.8-27B-FP8
    

    实测:

    8K:
    MTP 42.29
    DFlash2 51.44
    ≈1.22×
    
    32K:
    MTP 45.32
    DFlash2 55.39
    ≈1.22×
    
    64K:
    MTP 28.60
    DFlash2 59.81
    ≈2.09×
    

    这一组可以用于直接比较:

    同一个 FP8 target 下,普通 MTP 与 DFlash2 的实际表现。


    3. FP8 + DFlash2 的长上下文能力已经实际验证到 224K

    正式 characterization:

    192K decode:
    33.75 tok/s
    

    单次 capacity probe:

    224000 input tokens:
    PASS
    

    因此这里不只是模型配置上“允许长上下文”,而是真实请求已经跑过。


    4. 双卡首先解决的是容量问题

    单卡:

    Qwen/Qwen3.8-27B-FP8 + DFlash2
    → draft worker 初始化 OOM
    

    双卡:

    X99 + P2P + TP2
    → 正常启动
    → 192K benchmark 完成
    → 224K request 完成
    

    因此这套 stack 上第二张 R9700 的第一层价值是:

    让完整 FP8 + DFlash2 从单卡无法初始化,变成双卡可以正常运行长上下文。

    至于纯粹 TP1 → TP2 的 throughput scaling,因为 TP1 同配置没有可运行基线,目前不能给出严谨数字。


  • X99 + 双 AMD Radeon AI PRO R9700 跑通跨 Root Port P2P:从内核、RCCL 到 SGLang Qwen3.8 实战
    PhoenixRise2026P PhoenixRise2026
    AI硬件 r9700 x99 多卡部署

    @Terry 已加到签名栏。

    正在测试dflash2,目前看比mtp的decode要更快,还在调试参数

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组