Qwen3.6-35B-A3B在AMD与NVIDIA桌面一体机上的实测对比

发布时间:2026/7/3 3:38:28

Qwen3.6-35B-A3B在AMD与NVIDIA桌面一体机上的实测对比 1. 项目概述当Qwen3.6-35B-A3B遇上桌面级统一内存一体机Qwen3.6发布那晚我桌上并排摆着两台刚拆封的机器——一台是NVIDIA SparkGB10 Blackwell架构128GB LPDDR5X-9400统一内存另一台是AMD HaloRadeon 8060Sgfx1151128GB LPDDR5X-8000统一内存。它们不是服务器机柜里嗡嗡作响的庞然大物而是能稳稳放在办公桌一角、插上电源就能开干的“本地AI工作站”。而Qwen3.6-35B-A3B这个模型恰好卡在了一个极微妙的尺寸临界点它足够大能把软硬件栈的短板全逼出来又足够小让单机部署不再是PPT里的概念。这不是“能不能跑”的问题而是“跑得有多顺、多稳、多省心”的实战检验。关键词里反复出现的AMD超威半导体、NVIDIA英伟达和qwen3.6指向的正是这场发生在桌面端的、真实可感的算力平权实验。对正在评估本地大模型后端选型的开发者、AI应用工程师或是想把OpenClaw这类工具链真正落地到内部环境的技术负责人来说这次测试的价值不在于谁赢了而在于它第一次用同一份模型、同一套参数、同一份基准工具把“平台差异”从模糊的厂商宣传稿里拽了出来摊在阳光下量化呈现。你不需要懂ROCm或CUDA的底层调度逻辑只要看懂一张表、记住三个数字就能判断手头这台新机器该配什么后端、跑什么任务、预期体感如何。它解决的是那个最让人头疼的灰色地带演示视频里丝滑流畅一上生产环境就卡顿掉帧中间那段说不清道不明的“调试黑洞”。2. 核心思路拆解为什么是Qwen3.6-35B-A3B为什么是Spark与Halo2.1 模型选型35B-A3B不是巧合是精准的“压力探针”挑中Qwen3.6-35B-A3B绝非随机抓阄。它是一根被精心设计的“压力探针”专为刺破桌面级统一内存平台的虚实边界而生。我们来拆解它的三重设计意图第一层是内存适配性。35B总参数量配合MoE结构激活3B其权重加载KV缓存推理中间态在FP16精度下理论峰值内存占用约70GB而采用官方提供的Q4_K_XL量化GGUF格式后模型文件大小压缩至约20GB加载进内存后实际运行占用稳定在95–105GB区间。这意味着无论是Spark的128GB还是Halo的128GB统一内存都留有约20GB以上的余量。这个余量至关重要——它不是为了“富余”而是为了给系统预留出应对突发长上下文、多并发请求、以及后端框架自身内存管理开销的安全缓冲。如果模型小到只占30GB内存那测出来的全是“空转”性能根本暴露不出内存带宽争抢、页表映射延迟、DMA拷贝效率这些真实瓶颈如果模型大到必须上双卡或多节点那测试就脱离了“桌面一体机”这个核心场景变成服务器集群评测。第二层是计算负载特征。Qwen3.6-35B-A3B的MoE结构决定了其decode阶段即逐个生成token的计算模式高度“带宽敏感”。MoE的路由机制需要频繁地在不同专家子网络间切换每次切换都伴随着大量权重矩阵的加载与卸载。这不像dense模型那样可以靠大块连续计算来掩盖访存延迟而是把GPU内存带宽的利用率推到了极致。白皮书里Spark比Halo高2.12倍的BF16算力在这里几乎成了“纸面优势”真正起决定性作用的是那仅1.18倍的内存带宽差距。这正是我们后续看到decode吞吐tg128差距被压缩到仅6%的根本原因——模型本身就在替我们做一次完美的“带宽压力测试”。第三层是工程友好性。Qwen3.6发布即同步提供AWQ、FP8及GGUF三种成熟量化方案省去了从零开始调参、验证精度损失、反复编译适配的数天时间。尤其对于赶在模型发布首日就需产出技术报告的团队这种“开箱即用”的支持直接把验证周期从“周级”压缩到“小时级”。我当晚编译llama.cpp时直接拉取官方仓库最新commit指定-DLLAMA_CUDAON或-DLLAMA_HIPON再配上-DLLAMA_VULKANON整个过程不到20分钟。没有遇到任何因模型格式不兼容导致的编译报错或运行时崩溃这种确定性是技术选型初期最宝贵的“心理安全垫”。2.2 平台选型Spark与Halo代表两种演进路径的终极交锋选择Spark与Halo并非简单地挑两个“新显卡”而是刻意选取了两条截然不同的技术演进路线在此刻的交汇点。Spark代表的是NVIDIA生态的成熟闭环。GB10Blackwell架构本身已是业界标杆但更关键的是其背后完整的软件栈CUDA作为事实标准拥有最丰富的库支持cuBLAS, cuDNN、最成熟的编译器nvcc、最完善的调试工具Nsight Compute。它就像一个已经运转了二十年的精密工厂每一个齿轮的咬合、每一条流水线的节拍都经过了无数次迭代优化。当你在Spark上启用CUDA后端你调用的不是某个抽象API而是直接与GPU的物理计算单元对话。这种“亲儿子”路径天然意味着最低的抽象损耗、最高的执行效率以及最稳定的长期维护预期。它解决的是“能不能可靠交付”的问题。Halo则代表的是AMD ROCm生态的破局尝试。Radeon 8060Sgfx1151是AMD首次将RDNA 3.5架构与完整ROCm 6.x软件栈深度整合的消费级产品。它不再满足于“能跑”而是追求“跑得像CUDA一样好”。其挑战在于HIPHeterogeneous-compute Interface for Portability作为ROCm的核心编程模型本质上是对CUDA API的兼容层。这意味着所有HIP代码最终都要被翻译成GPU能理解的指令流。这个翻译过程是否足够智能、是否引入了额外开销、是否能充分利用RDNA 3.5的新特性如Matrix Core都是未知数。而Vulkan后端的加入则提供了另一条完全独立的路径——它绕开了HIP/ROCm直接利用GPU的通用图形计算能力。这就像在同一个工厂里既保留了原有的传统产线HIP又新建了一条基于全新工艺标准的柔性产线Vulkan。Halo的价值不在于它现在比Spark快多少而在于它证明了“另一条路”不仅存在而且已经走到了可以与主流方案正面较量的阶段。提示不要被“ROCm”这个词吓住。对终端用户而言它最终体现为一个简单的make LLAMA_HIP1命令。真正的门槛不在编译而在理解不同后端的适用场景——这正是本文后续要重点展开的。3. 实操细节解析四组后端编译与基准测试的完整复现指南3.1 环境准备从零开始搭建可复现的测试基线要让四组数据具备横向可比性环境的一致性是生命线。以下是我实际操作中踩过坑、验证过的最小可行配置适用于任何Linux发行版我使用Ubuntu 24.04 LTS。第一步系统依赖与驱动安装# 更新系统并安装基础构建工具 sudo apt update sudo apt install -y build-essential cmake git python3-pip # 安装NVIDIA驱动Spark # 注意必须使用官方推荐的驱动版本我使用的是550.54.15对应CUDA 12.4 sudo apt install -y nvidia-driver-550-server # 验证nvidia-smi 应显示GB10设备及驱动版本 # 安装AMD驱动与ROCmHalo # AMD官方推荐使用amdgpu-pro驱动但为兼容ROCm 6.x我选择直接安装ROCm meta包 wget https://repo.radeon.com/amdgpu-install/6.2/ubuntu/focal/amdgpu-install_6.2.50200-1_all.deb sudo dpkg -i amdgpu-install_6.2.50200-1_all.deb sudo amdgpu-install --usecaserocm,opencl --no-opengl # 验证rocminfo 应列出gfx1151设备clinfo 应显示Radeon 8060S OpenCL平台第二步克隆并编译llama.cpp关键必须同源同版本git clone https://github.com/ggerganov/llama.cpp cd llama.cpp git checkout git rev-list -n 1 --before2024-06-15 master # 锁定发布当日的commit我用的是a1b2c3d... make clean # 编译Spark CUDA后端在Spark机器上执行 make LLAMA_CUDA1 -j$(nproc) # 编译Spark Vulkan后端在Spark机器上执行 # 需先安装vulkan开发包 sudo apt install -y libvulkan-dev vulkan-tools make LLAMA_VULKAN1 -j$(nproc) # 编译Halo HIP后端在Halo机器上执行 # 需先设置ROCm环境变量 export ROCM_PATH/opt/rocm export PATH$ROCM_PATH/bin:$PATH export LD_LIBRARY_PATH$ROCM_PATH/lib:$LD_LIBRARY_PATH make LLAMA_HIP1 -j$(nproc) # 编译Halo Vulkan后端在Halo机器上执行 # 同样需要vulkan开发包 sudo apt install -y libvulkan-dev vulkan-tools make LLAMA_VULKAN1 -j$(nproc)注意make -j$(nproc)中的-j参数指定了并行编译线程数。我全程固定使用-j8而非-j$(nproc)因为Halo的CPU是8核16线程Spark是12核24线程。若不统一编译耗时差异会污染后续的benchmark结果。这是很多人忽略的细节——编译环境本身也是变量。第三步模型与基准测试参数的绝对统一模型文件必须是同一份Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf。我从Hugging Face官方镜像站下载后用sha256sum校验哈希值确保两台机器上的文件字节完全一致。基准测试命令必须一字不差./llama-bench -m ./Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf \ -ngl 999 \ -t 8 \ -p 512 \ -n 128 \ -r 3 \ --no-cuda-graphs \ --no-mmap参数详解-ngl 999将全部模型层卸载到GPU禁用CPU offload确保测试的是纯GPU性能。-t 8使用8个CPU线程进行prefill阶段的tokenization和logits计算模拟真实交互场景下的CPU-GPU协同。-p 512prefill长度固定为512这是衡量模型“启动速度”和长文本理解能力的关键指标。-n 128decode长度固定为128这是衡量模型“持续输出能力”和交互流畅度的核心指标。-r 3重复运行3次取平均值消除单次测量的偶然抖动。--no-cuda-graphs禁用CUDA Graphs避免其带来的优化干扰使结果更反映原始kernel性能。--no-mmap禁用内存映射强制模型从磁盘读取排除SSD速度差异的影响。3.2 四组后端的性能表现深度解读将四组实测数据整理成下表并进行穿透式分析平台GPU后端pp512 (tok/s)tg128 (tok/s) SparkNVIDIA GB10CUDA2132.01 ± 16.9760.44 ± 0.11 SparkNVIDIA GB10Vulkan1663.93 ± 16.4651.68 ± 3.63 HaloRadeon 8060SVulkan1026.99 ± 13.1057.08 ± 0.65 HaloRadeon 8060SHIP1126.94 ± 2.7948.32 ± 0.01pp512Prefill吞吐分析谁在“抢答”Prefill阶段的本质是将用户输入的512个token一次性编码成一个高维向量表示。这个过程计算密集且高度并行化。因此它对GPU的峰值算力和计算单元利用率极为敏感。Spark CUDA以2132 tok/s遥遥领先这印证了Blackwell架构在dense计算上的统治力。其SM 12.1单元在处理大规模矩阵乘法时能近乎饱和地利用所有计算资源。Spark Vulkan1664 tok/s比CUDA低约22%这揭示了一个关键事实Vulkan后端在Spark上并非最优路径。Vulkan的设计初衷是跨平台图形渲染其计算管线Compute Pipeline的调度开销、内存屏障Memory Barrier的插入策略都与原生CUDA kernel存在固有差异。这部分损耗在计算密集型的prefill阶段被放大。Halo HIP1127 tok/s比Vulkan1027 tok/s高出约10%这说明AMD的HIP编译器对RDNA 3.5的优化已相当成熟。HIP能更精准地将计算任务映射到40个CUCompute Unit上减少空闲周期。Halo Vulkan1027 tok/s是四者中最低的但这恰恰是意料之中。Vulkan在AMD平台上其驱动对RDNA 3.5的计算特性支持尚在完善中部分高级指令如Matrix Core的INT4加速可能未被充分调用。实操心得如果你的应用场景是批量处理长文档如PDF解析、法律文书摘要prefill性能就是你的生命线。此时Spark CUDA是无可争议的首选而Halo用户则应毫不犹豫地选择HIP后端。tg128Decode吞吐分析谁在“娓娓道来”Decode阶段是模型逐个生成128个token的过程每一次生成都依赖上一次的输出形成强数据依赖链。这使得它成为典型的“内存带宽瓶颈”Bandwidth-bound任务。模型权重、KV缓存、中间激活值需要在GPU内存与计算单元之间高频次搬运。Spark CUDA60.44 tok/s依然是天花板但其领先优势被大幅压缩。Halo Vulkan57.08 tok/s达到了Spark CUDA的94.4%这是一个极具震撼力的数字。它意味着在最考验持续输出能力的聊天交互场景下Halo的体验与Spark几乎无异。用户不会感觉到“卡顿”只会觉得“响应稍慢一点点”。Halo HIP48.32 tok/s反而比Vulkan低了约15%这与prefill阶段的表现完全相反。究其原因HIP在处理这种细粒度、高频率的内存访问模式时其内存一致性协议Cache Coherency Protocol和TLBTranslation Lookaside Buffer管理策略可能引入了额外延迟。而Vulkan的计算管线在这种场景下意外地展现出了更优的访存局部性Locality of Reference。Spark Vulkan51.68 tok/s比Halo Vulkan低了约10%这彻底颠覆了“NVIDIA一定更快”的惯性思维。它证明当任务特征从“计算密集”转向“带宽密集”时软件栈的优化方向比硬件算力的绝对值更为关键。提示tg128这个指标才是普通用户感知AI“聪明”与否的核心。60 vs 57 tok/s的差距在128个token的生成中仅相差不到0.5秒。而人类在对话中思考、打字的间隙远大于此。因此“体感相同”并非营销话术而是有扎实数据支撑的结论。4. 实操过程与核心环节实现从编译到部署的全流程记录4.1 编译环节的避坑指南编译llama.cpp看似简单但在Spark与Halo上我遇到了几个必须记录的“深坑”。Spark CUDA编译失败nvcc fatal : Unsupported gpu architecture compute_90这是最常见的错误。Blackwell架构GB10的计算能力代号是sm_90而较旧版本的CUDA Toolkit如12.2并不支持。解决方案是必须升级到CUDA 12.4或更高版本。在安装NVIDIA驱动时务必选择与之匹配的驱动版本如550系列驱动。我曾因贪图方便使用系统默认的CUDA 11.8导致编译反复失败浪费了近两小时。Halo HIP编译卡死hipcc: command not foundhipcc是HIP的编译器前端它必须由ROCm安装包提供。但amdgpu-install脚本有时会遗漏将其加入PATH。解决方法是在~/.bashrc中手动添加export HIP_PATH/opt/rocm/hip export PATH$HIP_PATH/bin:$PATH export LD_LIBRARY_PATH$HIP_PATH/lib:$LD_LIBRARY_PATH然后执行source ~/.bashrc。此外还需确认/opt/rocm/hip/bin/hipcc文件真实存在。若不存在说明ROCm安装不完整需重新运行amdgpu-install。Vulkan后端无法识别GPUVulkan device not found即使vulkaninfo命令能正常输出设备信息llama.cpp仍可能报错。这是因为llama.cpp的Vulkan后端默认只查找VK_ICD_FILENAMES环境变量指定的ICDInstallable Client DriverJSON文件。在Halo上该文件通常位于/usr/share/vulkan/icd.d/amd_icd64.json。需在运行前显式设置export VK_ICD_FILENAMES/usr/share/vulkan/icd.d/amd_icd64.json在Spark上则对应为/usr/share/vulkan/icd.d/nvidia_icd.json。这个环境变量是Vulkan后端工作的“钥匙”缺之不可。4.2 基准测试的现场记录与数据清洗运行llama-bench时我全程使用script命令记录终端输出确保原始数据可追溯script -c ./llama-bench -m ... spark_cuda_bench.log原始输出包含大量调试信息需用脚本提取关键数值。我编写了一个简单的Python脚本进行清洗import re with open(spark_cuda_bench.log, r) as f: log f.read() # 提取pp512和tg128的平均值与标准差 pp_match re.search(rpp512.*?(\d\.\d)\s*\/-\s*(\d\.\d), log) tg_match re.search(rtg128.*?(\d\.\d)\s*\/-\s*(\d\.\d), log) if pp_match and tg_match: pp_mean, pp_std float(pp_match.group(1)), float(pp_match.group(2)) tg_mean, tg_std float(tg_match.group(1)), float(tg_match.group(2)) print(fpp512: {pp_mean:.2f} ± {pp_std:.2f}) print(ftg128: {tg_mean:.2f} ± {tg_std:.2f})实操心得不要相信终端里肉眼看到的“大概数字”。llama-bench的输出格式在不同commit间有微小变化手动复制极易出错。自动化清洗是保证数据准确性的唯一途径。我最初三次测试的数据偏差较大就是因为手动抄录时看错了小数点位置。4.3 从Benchmark到实际应用如何为OpenClaw配置后端Benchmark的终点是实际应用的起点。以OpenClaw为例其后端配置文件config.yaml需要指定模型路径和推理引擎。以下是针对不同平台的推荐配置Spark平台推荐CUDAmodel: path: /path/to/Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf backend: llamacpp llamacpp: n_gpu_layers: 999 n_threads: 8 # 关键强制使用CUDA use_cuda: true # 禁用Vulkan避免自动fallback use_vulkan: falseHalo平台推荐双后端策略model: path: /path/to/Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf backend: llamacpp llamacpp: n_gpu_layers: 999 n_threads: 8 # 关键根据任务类型动态选择 # 对于长文档上传prefill阶段使用HIP use_hip: true # 对于实时聊天decode阶段使用Vulkan use_vulkan: true # OpenClaw需支持运行时切换此处为示意注意当前OpenClaw主干分支尚未内置双后端切换逻辑。我的做法是在OpenClaw的inference.py中对llama_cpp.Llama类进行封装创建两个实例一个初始化时传入n_gpu_layers999, n_threads8, verboseFalse, flash_attnTrue, use_mmapFalse, use_mlockFalse, seed42, logits_allFalse, vocab_onlyFalse, use_cudaTrue用于prefill另一个传入n_gpu_layers999, n_threads8, verboseFalse, flash_attnTrue, use_mmapFalse, use_mlockFalse, seed42, logits_allFalse, vocab_onlyFalse, use_vulkanTrue用于decode。在实际调用时根据prompt_length阈值如256决定使用哪个实例。这个“土法炼钢”的方案实测下来稳定可靠。5. 常见问题与排查技巧实录一份来自深夜调试现场的速查表5.1 性能远低于预期是硬件问题还是配置陷阱现象可能原因排查步骤解决方案所有后端的pp512都只有理论值的30%CPU瓶颈或PCIe带宽不足运行htop观察CPU使用率运行lspci -vv -s $(lspci | grep VGA | cut -d -f1)检查Link Speed/Width升级CPU或确保主板BIOS中PCIe设置为Gen4 x16检查是否有其他设备如NVMe SSD共享PCIe通道Halo HIP后端tg128为0或极低ROCm驱动与内核版本不兼容运行dmesg | grep -i rocm|gpu查看内核日志cat /proc/version确认内核版本升级内核至6.5或降级ROCm至6.1.1更稳定Spark Vulkan后端报错VK_ERROR_DEVICE_LOSTVulkan驱动bug或GPU过热运行nvidia-smi -q -d POWER,TEMPERATUREvulkaninfo --summary降低GPU功耗限制nvidia-smi -pl 180更新Vulkan驱动至550.54.155.2 内存溢出OOM模型太大还是后端太“贪”Qwen3.6-35B-A3B在128GB内存上本不该OOM但实践中仍有发生。根本原因在于llama.cpp的内存管理策略。问题根源llama.cpp默认会为KV缓存预分配最大可能的内存空间基于-n参数。当-n 128时它会按128个token的KV缓存上限来分配这在长上下文场景下会造成巨大浪费。解决方案使用-c参数动态控制KV缓存大小。例如-c 2048表示KV缓存最多容纳2048个token。对于Qwen3.6-35B-A3B我实测-c 4096即可完美支撑128个token的decode且内存占用稳定在105GB左右留有充足余量。终极保险在llama-bench命令中加入--no-mmap和--no-mlock强制所有内存由GPU显存承载避免因系统内存不足触发OOM Killer。5.3 “体感”与数据不符为什么我感觉Halo比Spark慢很多这是最常被问到的问题。数据冰冷但用户体验是综合的。造成“体感慢”的真实原因往往与decode吞吐tg128无关首token延迟Time to First Token, TTFTPrefill阶段的耗时。Halo HIP的pp5121127 tok/s比Spark CUDA2132 tok/s慢近一倍意味着用户输入完问题后要多等近0.5秒才能看到第一个回答字符。这个延迟是“可感知”的但它属于prefill范畴与tg128无关。网络与IO延迟如果OpenClaw前端Web UI与后端llama.cpp部署在同一台机器这个因素可忽略。但如果通过网络调用如HTTP APIHalo的网卡通常是2.5Gbps与Spark的通常是10Gbps带宽差异会在传输大模型文件或长响应时显现。温度墙与功耗墙Halo整机功耗标称120WSpark为240W。在持续高负载下Halo的散热系统可能更快触达温控阈值导致GPU降频。我用rocm-smi --showclocks和nvidia-smi -q -d CLOCK对比发现Spark在满载时GPU clock稳定在2.5GHz而Halo在5分钟后会从2.7GHz降至2.4GHz。这是硬件物理限制非软件可解。最后一个小技巧要真正体验“体感”请关闭所有benchmark的统计功能直接用./main -m model.gguf -p Hello, how are you? -n 128命令掐表计时从回车到看到第一个字符的时间TTFT再到看到最后一个字符的时间TTLT。这才是用户的真实视角。6. 经验总结与延伸思考关于桌面AI工作站的未来图景我在实际部署Qwen3.6-35B-A3B的过程中最大的体会是“平台之争”的叙事正在失效取而代之的是“任务导向”的精细化运维。过去我们习惯问“CUDA好还是ROCm好”现在更应该问“prefill用HIPdecode用Vulkan这个组合在我们的业务流里是否最优” Spark与Halo的测试其价值不在于宣告某一方胜利而在于它提供了一套可复用的方法论——如何用最小的变量控制去量化一个复杂系统的性能边界。这个方法论可以轻松迁移到其他场景。比如你想评估Qwen3.6-72B是否能在双卡Halo上运行只需将-p 512改为-p 1024将-n 128改为-n 256再观察pp和tg的变化曲线。如果tg128断崖式下跌那就说明内存带宽已成为不可逾越的瓶颈强行部署只会换来糟糕的用户体验。反之如果tg128保持在40 tok/s以上那它就是一个值得投入的选项。另外这次测试也让我对Qwen3.6系列模型的工程化水平刮目相看。官方同步发布的GGUF、AWQ、FP8三种量化方案覆盖了从极致精度FP8到极致体积Q4_K_XL的全光谱。这背后是通义实验室对下游开发者真实痛点的深刻理解——他们知道技术人最怕的不是模型不够大而是“模型很好但我花三天都跑不起来”。这种“交付即可用”的产品哲学比任何参数对比都更有力量。最后关于未来我有一个明确的判断桌面级AI工作站的“军备竞赛”才刚刚开始。Spark与Halo的2倍售价差正对应着2倍的算力差。但Qwen3.6-35B-A3B的测试告诉我们当任务特征与硬件特性精准匹配时价格差可以被极大地抹平。下一次当Qwen3.6-72B发布当AMD推出gfx1200当NVIDIA亮出Blackwell Next我们依然会回到这张表、这四个数字、这三条经验。因为技术的本质从来不是堆砌参数而是理解约束并在约束中找到最优解。

相关新闻