返回

文章详情

修复了三个错误,使Qwen3.5-122B成为Mac Studio的日常驱动程序

Hacker News2026年7月11日 22:54

2026年7月10日 · 12分钟 在一场50,000个令牌的对话中,首次令牌出现前花费了三到五分钟。不是完整的答案,而是第一个令牌。这不是一个聊天机器人,而是一个批处理作业,你可以在它思考的时候去泡杯咖啡。对于其他十几个着迷于最大化Mac Studio的极客,我带来了好消息。所谓好消息是,我花了三周时间调试一个缓存泄漏,所以你不必这么做。这始于antirez/ds4,这是一个在消费级硬件上运行大型模型的出色实验。两个月前,我冲动购买了M3 Mac Studio Ultra。我担心RAM价格会很快让96GB的配置变得无法获得(剧透:确实如此),我真的想在休育假期间深入研究本地推理堆栈。目标很简单:在一台机器上运行前沿模型,保持活跃,并拥有一个真正理解上下文的对话AI。但事实比这复杂得多。该模型适合统一内存,并能连贯回答,但经过几周的日常使用,我进行了一个重大转变:我放弃了DS4 Flash,切换到Qwen 3.5 122B。然后发生了两个独立的事情,值得将它们分开。模型交换是一个速度和适配的决策。使新模型真正可用意味着要修复我自己的服务堆栈中的三个与我运行的模型无关的错误。为什么我换模型 # DS4 Flash确实是一个优秀的模型,antirez的堆栈更是出色的作品。只是这不是我所需的模型。这是一个适配的故事,而不是责任的故事。我的用例是长上下文的自主编码:成对编程,其中模型持有数千个对话、代码和工具输出的令牌,我需要近乎即时的反应以保持灵感。在特定的工作流中,预填延迟是致命的。在50,000个令牌之后,一个简单的跟进问题要花三到五分钟,才能出现第一个令牌,而你无法与一个让你等待泡茶的模型成对编程。到它赶上时,我已经转向下一个问题。这并不是说DS4在某种绝对意义上很慢,而是该设置在处理我硬件上的长上下文预填时与我的工作流需求不匹配。Qwen 3.5 122B在我关心的每个方面看起来更适合M3 Ultra:接近前沿,完全本地。没有API调用,没有速率限制,没有数据离开机器。一个与专有系统相媲美的122B模型,完全离线运行。适合Ultra带宽的活跃参数大小。M3 Ultra的内存带宽非常大。一个大约有10B活跃参数的122B MoE处于一个甜蜜点,GPU可以在不停滞的情况给计算单元供给。工具调用和推理的良好平衡。足够的推理深度来处理复杂的代码逻辑,足够强大以便可靠的功能调用和智能代理编排。统一KV缓存的合适大小。凭借96GB的统一内存,一个低位宽的122B模型留出了足够的头部空间,以支持一个深度的SSD支持KV缓存,这是在不进行交换的情况下进行长上下文保持的关键。我能找到的最接近的服务堆栈是rapid-mlx。但它在混合注意力方面采取了不同的方向。鉴于这种差异,我选择了分叉。结果是qMLX ,可以在GitHub上找到。这个分叉专门针对混合注意力(更多内容在最后)。真正的工作:杀死三个错误 # 模型适配,但由于一系列与模型本身无关的原因,它开箱即用不可用:每个后续消息都从头开始重新处理整个对话。在一个130,000个令牌的上下文中,这是在模型发出一个字之前的多分钟等待。原因在于混合注意力架构,这是一种GatedDeltaNet(SSM)层和密集注意力的混合。SSM层中的递归状态无法回退或修剪到早期位置,因此为了避免内存泄漏,内存中的缓存会丢弃包含这些层的任何条目。对于这个模型,内存中的前缀缓存每次都未命中。在正常窗口中,我测量到的内存命中为零,而磁盘命中为109。保持模型活跃的唯一东西是磁盘缓存:检查点将注意力KV保存到SSD,然后在下一个回合时恢复。磁盘恢复在这里不是备用选项,而是整个缓存。而且它不断出错,三种不同的方式,每一种都隐藏在最后。第一个错误:系统提示中的时间戳 # KV重用是逐字精确的。如果提示略有改变,匹配将在第一个差异处失败,并重新计算其后的所有内容。代理框架在每次轮次中都将一个唯一的消息ID印入系统提示中。这个独特的值位于130,000个令牌提示的顶部附近,这意味着提示从未字节稳定。第二轮与第一轮在前几百个令牌中就有所不同。缓存的代理被抛弃,整个系统提示被重建,匹配过早地发生了偏离。每次轮次都冷却。修复方法是删除该行。消息ID是装饰性的,实际未被使用。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡