跳到正文
原文
Hacker News· pfeifferj·· 1 小时前精选AI 评分48

在 ASUS ProArt P16 上安装 Arch Linux ARM 并用 vLLM 本地运行 Qwen 推理

Putting Linux on my RTX spark laptop because I don't have a Microsoft account

AI 导读

Arch Linux 包维护者 pfeifferj 在 ASUS ProArt P16 H7607BA-SE033W(128GB RAM、6144 CUDA 核心)上成功安装 Arch Linux ARM 并开源了构建脚本与补丁。

推荐理由

原文给出了在 ASUS ProArt P16 上安装 Arch Linux ARM 的具体补丁与构建脚本,以及与 Windows 的 7-Zip 和 Qwen 推理基准,方便有同款硬件的读者复现本地推理环境。

正文 · AI 翻译

简短结论 —— 微软坏坏。Arch Linux 在 7-Zip 中与 Windows 表现持平,并向操作系统和 CUDA 报告相同的 116.0 GiB 内存池。我最初的启动盘设置和补丁在 这里。这台机器是 ASUS ProArt P16 H7607BA-SE033W:配置 128 GB 内存、6,144 个 CUDA 核心和 2 TB 固态硬盘。

Fastfetch showing Arch Linux ARM on the ASUS ProArt P16 with an NVIDIA N1X GPU.

当传言开始流传,说有一款笔记本电脑的 GPU 可以访问超过 100 GiB 内存时,我开始思考能用它构建些什么,以及可以用多长时间来折腾各种优化。我非常支持开放权重模型。能够在本地运行东西,并在笔记本上玩玩 RL、量化和微调,那就太爽了。我已经在 Hugging Face 上发布了我自己的 GGUF 量化模型,过去一个月下载量超过 16 万次。

所以当我发现 只支持 Windows 的官方说明时,心情就不那么美丽了。讨厌 Windows 的理由多得很。我的理由包括安装时对隐私做出的让步,多年等待微软让人们再次把任务栏放到屏幕侧面,以及广告。最后一个链接是真实 Windows 推广内容的拼贴画,由 Pureinfotech 提供。你应该懂。我能一直说下去,所以我还是回到正题。

Arch 是我偏好的发行版,我是 Arch 团队的软件包维护者。我已经把它装到了 IBM 大型机上(我的 FOSDEM 幻灯片),所以它自然会成为我这里的起点。这个构建使用了 Arch Linux ARM,它是独立的项目,将 Arch 软件包移植到 ARM,并在此基础上添加了硬件支持。

NVIDIA 一直在为 Ubuntu 做内核工作,这给了我一个起点。我将其整合进来,修复了获得控制台所需的 ACPI 覆盖分配和 framebuffer 映射,并从笔记本自身的表中推导出了 ACPI 覆盖(感谢 astra <3)。NVIDIA 驱动和 ASUS 扬声器固件来自互联网上的官方渠道(请别起诉我,电脑公司们)。键盘支持需要一个打过补丁的 hid-asus,而音频也需要它自己的机器驱动。

我把这个组合到一张可启动的 U 盘中,并扩展了上游 Archinstall 4.5 来安装硬件支持。仓库里有构建脚本和补丁,包括如何本地转储你自己的 ACPI 表以及从 ASUS 驱动包中提取扬声器固件的步骤。我这台运行固件 H7607BA.300。

构建输入已经按哈希锁定。我周末整理出来的硬件软件包都使用我的 Arch Linux Package Maintainer 密钥签名,ACPI 覆盖则来自笔记本自身。

显示器以 3840 × 2400、120 Hz 运行,我使用 NetworkManager、PipeWire,以及带 NVIDIA CDI 的无 root 模式 Podman。安装器用 IgnorePkg 锁定内核、NVIDIA、电源管理和固件软件包,而普通软件包则继续从 Arch Linux ARM 持续更新。

CPU 性能

我于 10 月 19 日在原生 Arch Linux ARM 上运行了测试套件,使用的是内核 7.0.0-1022-nvidia 和 NVIDIA 驱动 615.78.08。笔记本接通电源,并选择了性能模式(performance profile)。在 CPU 对比方面,我使用了已发布的 Windows 测试结果。

CPU 测试是原生 ARM64 7-Zip 26.04,使用固定的 32 MiB 字典。我在每个线程数下都跑了一次热身和三组正式测试,然后取中位数:

线程数 压缩 (MiB/s) 解压缩 (MiB/s)
1 6.18 118.26
20 141.77 1,629.60

StorageReview 测试了一台搭载同款 20 核 N1X、运行原生 Windows ARM64 二进制的 128 GB HP OmniBook Ultra 16。他们报告的是 GIPS 单位的 7-Zip 评分,所以我把原始日志里的 MIPS 评分除以 1,000 来对齐。数值越高越好。

7-Zip 工作负载 我的 ProArt,Linux(GIPS) HP OmniBook,Windows(GIPS) 差距
单线程压缩 7.221 7.31 −1.2%
单线程解压缩 10.779 10.87 −0.8%
20 线程压缩 165.754 157.9 +5.0%
20 线程解压缩 148.471 144.5 +2.7%

单线程基本持平。20 线程全开时,我的 Linux 方案在压缩上领先约 5%,解压缩上领先 3%。HP 的评测没有标明 7-Zip 版本和字典大小,所以这些百分比比较的是两台笔记本的设置。

ComputerBase 也测试了一台搭载 20 核 N1X 的 ProArt P16。换算成 GIPS 后,它的 Windows 7-Zip 分数为 155.774;我三次运行的中位总数为 157.084。他们的结果落在我三次运行的 155.759 到 157.193 GIPS 范围内。他们测试的是 64 GB 配置,运行 7-Zip 26.00,图表里也没给出字典大小。

内存划分

内存才是更大的优势所在。我的 Linux 运行报告 116.0 GiB 同时作为系统内存和 CUDA 总容量,来自同一块物理内存池。Windows 把内存划分为专用 GPU、共享和仅 CPU 三个区域。CPU 工作负载无法使用专用 GPU 区域,GPU 分配也无法使用仅 CPU 区域。

Windows 的 NVIDIA 应用允许你更改专用预留并重启;Frandroid 的 128 GB ProArt P16 达到了 96 GiB。CUDA 还可进一步通过从共享内存分配来扩展,但受限于 Windows 的内存预算。

在 91 GiB 专用预留下,Frandroid 的 Windows 设置报告的 CUDA 总量为 109.7 GiB(含共享内存)。我的 Linux 设置报告为 116.0 GiB,多出约 6.3 GiB。我看重的是能让这块大内存也用于 CPU 工作,而不需要在不同工作负载之间来回拖动预留滑块并重启。

本地运行 Qwen

我在原生 ARM64 容器中,通过带有 B12X CUDA 内核的 vLLM 运行了 NVIDIA 的 Qwen3.8-Flash-Next-FP4-Local 检查点,使用混合量化和 FP8 KV 缓存。这次运行我关闭了思考模式。

加载模型前,Linux 报告可用内存 110.9 GiB。vLLM 记录模型加载占用 68.2 GiB,并为 KV 缓存另外分配了 21.1 GiB。在一台笔记本上,模型加 KV 缓存的分配接近 90 GiB。

模型加载和编译在首个请求到来前耗时约 16 分钟。下文计时从预热完成后开始。PLE 嵌入表由磁盘支撑,受益于温热的页面缓存;其他组件使用 CPU 卸载。CUDA 负责推理,模型部分超出 GPU 内存。

我让 Qwen 审查两个有缺陷的 Python 辅助函数,在一份包含一条失败操作的长事件日志中定位该操作,并把一条付款说明转换为 JSON。每个任务在预热后运行三次,并以已知答案进行核对。我想知道需要等多久,以及它是否返回了正确的字段。

任务 输入 tokens 首个 token,中位(秒) 完整响应,中位(秒) 通过检查项
Python 代码审查 208 0.316 4.008 3/3
在 128 条记录的事件日志中定位失败 9,775 4.532 5.768 3/3
付款说明抽取 87 0.256 2.035 3/3

事件任务读取了近 10,000 个 token,在 6 秒内返回了正确的请求、原因和后续动作。其回答仅有 39 个 token,折算下来整个请求约 6.8 tokens/s。大部分等待时间花在了处理提示上,所以对这个任务来说,响应时间比 tokens/s 数值更有参考意义。

对于代码审查,我将生成速度估算为(output tokens − 1) / (response time − time to first token),两次计时都以秒为单位。这包含流的开销。Frandroid 在其 Windows ProArt 上运行了 Qwen3.8-Flash-Next 编码任务:

系统 量化与运行时 生成速度(tokens/s)
我的 ProArt P16,Linux FP4-Local, vLLM B12X 30.9(3 次中位数)
Frandroid 的 ProArt P16,Windows UD-IQ4_XS, llama.cpp 29.4 and 31.4

两套 ProArt 配置速度都约为 30 tokens/s。推理方面,Frandroid 使用了 85 GiB 的专用预留,上下文限制为 262,144 tokens;我的上下文限制为 32,768 tokens。提示词、量化、运行时以及计时方法均不同。这里比较的是两套可运行的配置,并不能孤立出操作系统的影响。

我还一次性发送了四个代码审查请求。中位数批次耗时 5.314 秒,四个请求合计生成 86.6 输出 tokens/s。该速率包含提示词处理与响应开销。三个批次共计 12 个回答全部通过检查。

随后我让它在三个任务之间循环,一次一个请求,持续运行十分钟。它完成了 150 个请求,每个任务各 50 个,全部回答都通过了检查。代码审查的中位响应时间为 4.036 秒,日志任务为 5.921 秒,抽取任务为 2.046 秒。对比每个任务的前十次和后十次重复,中位响应时间增长不到 1.6%。

全部 171 个测得的响应均通过检查。这是三个提示词在确定性解码下重复执行的结果;代码审查检查会验证回归输出。我保留了每一个回答和原始事件流,并将它们与摘要进行了核对。

来源:Hacker News · josie.lol