事情的起因很简单:我需要一台NAS,也想玩本地大模型,但不想买两台机器。更不想跟老婆解释,为什么需要单独搞一台电脑来跟一个偶尔说胡话的聊天机器人对话。说胡话这事,我岳父就够了。
所以在规划NAS的时候,我把配置往上拉了一档,赌它能身兼两职。最坏的结果,无非是一台性能过剩的NAS,永远不会满载。我能接受。
结果它真跑起来了,而且远超预期。
硬件是Minisforum N5 Pro,搭载AMD Ryzen AI 9 HX PRO 370处理器,12核24线程,16个RDNA 3.5计算单元的核显。96GB DDR5内存,5块26TB企业级硬盘组RAIDZ2阵列,大约70TB可用空间,跑TrueNAS SCALE系统。日常承担Jellyfin硬件转码、自动追剧下载、内网穿透等一堆容器服务,在我碰大模型之前就已经物超所值了。
模型选的是Qwen3-Coder-Next,800亿参数,混合专家架构,每个token只激活30亿参数。用llama.cpp的Vulkan后端跑Q4_K_M量化版本。整个优化过程像爬楼梯,每一层都差点让我放弃。
第一次跑通,CPU推理,Q8量化,每秒3个token。技术上算成功,体感上接近酷刑。换成Q4_K_M量化,到了5。尝试Vulkan把部分层卸载到核显,49层里先放了30层上去,到了10。然后发现一个关键问题:在UMA统一内存架构下,CPU和GPU共享同一块物理内存,而`--no-mmap`这个参数会强制把模型在同一块内存里分配两份,一份给CPU,一份给GPU映射。难怪我明明内存够用却总是爆内存。去掉这个参数,49层全部加载,46GB的Vulkan缓冲区一次到位。最后开启Flash Attention,又多了3个token。
从3到5到10到15到18,每一步都离放弃只有一个发现的距离。
最终成绩:生成速度每秒18个token,提示词处理每秒53.8个token,KV缓存内存减半,任意上下文长度下输出连贯。这一切发生的同时,Jellyfin正在给客厅的孩子们播动画片。
有人说,同样的钱买台Mac Mini M4 Pro不是更好?64GB版本大约2299美元,同模型能跑到每秒20到25个token,苹果焊死的LPDDR5x确实有带宽优势。但Mac Mini跑不了我的媒体服务栈,也装不下70TB的RAIDZ2存储池。我不是要踩谁,只是我不需要同时买两台机器。这就是全部的出发点。
优化空间还很大。投机解码可能带来两到三倍的等效加速,EXPO内存配置文件可能根本没启用,意味着内存带宽还停留在JEDEC默认值。更值得期待的是DeltaNet线性注意力机制,这个模型本身就是为它设计的,不是后期改装。标准注意力随上下文长度呈二次方增长,DeltaNet是线性的。目前融合内核已经能在单线程上跑到每秒16个token且输出正确,但多线程还有bug。一旦修复,配合12核加Vulkan卸载,提升空间相当可观。
18是现在的数字,但大概率不是天花板。
评论区也很精彩。有人用赛扬处理器的群晖NAS跑同一个模型,每秒0.01个token,一个问题等了两小时才吐出67个字。有人质疑800亿参数的说法,因为每次只激活30亿。这就像说一颗64核CPU名不副实,因为你的程序只用了8个线程。核心都在那里,45GB的模型完整加载在内存里,混合专家架构只是让推理更聪明地选择激活哪些参数。
有人说这台机器根本不算NAS,因为配置太高了。对此原作者创造了一个虚构的布道者“Nasus Christ”来回应:一台只会存储的NAS,是一台从未真正活过的NAS。
对个人聊天和代码辅助来说,每秒18个token已经比任何人的阅读速度都快。我们其实已经跨过了“够用”的门槛,只是大多数人还没注意到。真正需要极致速度的是智能体工作流,当你有上百个连续动作要执行时,每秒多几个token才会累积成真实的时间差。而内存带宽才是一直以来真正的瓶颈,不是核心数,不是显存大小。DDR5每一代都在爬升,LPDDR5x已经突破每秒200GB,远没到极限。一两年后,这种在NAS上跑大模型的事情可能根本不值一提。
这才是真正让人兴奋的部分。
reddit.com/r/LocalLLaMA/comments/1r1lkfw/my_nas_runs_an_80b_llm_at_18_toks_on_its_igpu_no