Jamesob 的本地运行 SOTA LLM 指南

Hacker News Top 工具

摘要

一份关于搭建本地环境运行最先进 LLM 的全面指南,涵盖硬件建议(从 2000 美元到 40000 美元)、PCIe 切换以及针对 Qwen、GLM 等模型的 Docker 配置。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/03 17:15

jamesob/local-llm 来源:https://github.com/jamesob/local-llm # jamesob 的本地运行 SOTA 大模型指南 注意:本 README 中除表格外,没有任何内容由 AI 编写。 — 你手头有 2000 美元闲钱,想要运行本地最先进的机器智能?4 万美元怎么样?如果 Dario 和 Altman 让你头疼(他们确实应该),请继续阅读,了解如何本地运行这种新型计算。 — 在这个仓库中,你会找到 - 我用于本地运行 SOTA 的硬件, - 我为什么购买这些硬件以及鲜为人知的配置秘诀, - 如何本地运行语音转文本(STT), - 即用型 Docker 容器配置,用于运行我认为不错的模型。 ## 目录 | 章节 | 概要 | |—|—| | 你愿意花多少钱? | 2000 美元就能获得 Qwen 和良好的 STT(相当不错!);4 万美元可接近 Opus | | 基础系统 | 上一代 EPYC + eBay DDR4,花费 5600 美元 | | GPU | 4× RTX PRO 6000,384GB 显存,钱主要花在这里 | | c-payne 交换机子 BOM | 独立 PCIe 交换机,让 GPU 之间点对点通信 | | GPU 机箱 | 一天的木工活 | | 让交换机正常工作 | BIOS 分叉、链路速率、ASPM | | 内核 / GRUB 参数 | iommu=off 否则 NCCL 会卡死 | | 禁用 ACS | 保持 P2P 流量在交换机内部 | | GPU 功率限制 | 在 110V 电路上运行价值 4.6 万美元的硅片 | | 结果 | Gen4 线速:27.5/50.4 GB/s,亚微秒延迟 | | runners/ | 即用型推理配置:GLM-5.2-594B:vLLM docker-compose,DCP4+MTP5,~80 t/s @ 240k 上下文 | | runners/stt | 即用型语音转文本配置,使用 whisper-large-v3 | | tools/ | measure-gpu-speed.sh:P2P 带宽/延迟基准测试 | | 资源 | rtx6kpro 仓库、c-payne | ## 我的配置 我很幸运(或者说很傻)在 RTX Pro 6000 还便宜的时候买了 4 块。由于现在内存非常昂贵,我选择搭建一台上一代 DDR4 系统来安放这些显卡,零件都是从 eBay 淘来的。这样既能让基础系统成本合理,又能获得大量显存。 我的设备 另一个不太常见的做法是使用 PCIe4 交换机(来自 c-payne.com)。这可以让 GPU 在张量并行的 allreduce 步骤中“直接”以线速通信,而不必将所有数据都通过 PCI 根复合体。好处是减少了卡之间的延迟。因此,我把钱花在显存上(这是关键),而不是花在 PCIe5/DDR5 基础系统上——后者在 2026 年 7 月极其昂贵。我的具体物料清单如下。 ### 你愿意花多少钱? #### 2,000 一个很好的选择是 2 张 RTX 3090,总共 **48GB 显存**。然后你可以运行 Qwen3.6-27B(https://huggingface.co/Qwen/Qwen3.6-27B),这是一个很棒的模型。你还可以使用 `whisper-large-v3`(https://huggingface.co/openai/whisper-large-v3)运行最先进的语音转文本(STT),我觉得这非常有用。就是这个模型——然后你可以通过我的跨平台 `stt` 工具(https://github.com/jamesob/stt)来使用它。我发现本地 STT 出奇地有用——而且用起来很放心,不像托管版本。你可以在 [`./runners/stt`](./runners/stt) 中找到即用型配置,它仅假设 Nvidia GPU 上有约 11GB 显存。 #### ~40,000 在这个价位,你能获得更高一级的模型智能,接近 Claude Opus。你需要购买 4 张 RTX 6000 Pro,总共 384GB 显存。 ##### 目前适合 4× RTX6kPRO 的最佳模型 | 日期 | 最佳模型 | 我的配置 | |—|—|—| | 2026-07 | GLM-5.2-Int8Mix-NVFP4-REAP-594B(https://huggingface.co/madeby561/GLM-5.2-Int8Mix-NVFP4-REAP-594B) | Runner 配置 | ##### 其他方法 注意:这些是我的推荐,但还有其他完全合理的花钱方式。例如,可能在某些情况下,不买 4 张 rtx6kpro,而是把大部分钱用于搭建一个由 4 台 DGX Spark 集群(https://youtu.be/QJqKqxQR36Y?si=MiKNYtIzut_5pnXy)组成的系统,总共 512GB 显存,把它作为慢速但聪明的大脑,驱动 Qwen3.7-27b 快速完成常规任务。 ## 硬件 以下是我为 4× RTX 6000 pro 机器最终购买的硬件。 ### 基础系统 一个适中的、上一代 EPYC 系统,零件几乎全部从 eBay 购买。 | 组件 | 规格 | 价格 | |—|—|—| | 主板 | ASRock Rack ROMED8-2T(SP3,7× PCIe 4.0 x16,双 10GbE) | $715 | | CPU | AMD EPYC Milan 7313P(16 核 3.0GHz) | $504 | | 内存 | 8× 16GB Crucial CT16G4RFD4213 DDR4 ECC RDIMM(总共 128GB,eBay) | $642 | | CPU 散热器 | Dynatron T17 SP3 塔式,280W TDP | $40 | | 机箱 | AAAWave Sluice V2 开放式框架 | $100 | | 电源 | 2× Super Flower 1700W | 750 | | PCIe 交换机 | c-payne Microchip Switchtec PM40100 Gen4(见下方子 BOM) | ~1,330 | | 启动 NVMe | 4TB M.2 | $291 | | 存储 NVMe | (2x) 8TB M.2(模型权重) | $1,200 | | 风扇 | 3× 120mm PWM | 15 | | **总计** | | **5,587** | ### GPU | 组件 | 规格 | 价格 | |—|—|—| | GPU | 4× NVIDIA RTX PRO 6000 Blackwell 工作站(每张 96GB,总共 384GB 显存) | **46,000** | ### c-payne PCIe Gen4 交换机子 BOM (c-payne.com) | 部件 | 数量 | 单价 (€) | 说明 | |---|---|---|---| | PCIe gen4 交换机 5× x16 — Microchip Switchtec PM40100 | 1 | 1.050 | 2× SlimSAS 8i 上行,5× x16 四倍间距下行,辅助 x4 SlimSAS,3× 8-pin EPS 电源 | | SlimSAS PCIe gen4 主机适配器 x16 — REDRIVER AIC (DS160PR810) | 1 | 140 | 插入 ROMED8-2T x16 插槽,为交换机提供上行 | | SlimSAS SFF-8654 8i 线缆 — PCIe gen4 | 2 | ~30 | 每根承载 x8;一对 = x16 上行 | | **总计** | | | **~€1,220 (~1,330 USD)** | ### GPU 机箱 我需要为 PCI 交换机和 GPU 定制一个木质机箱,花了一天时间。 机箱 我发现 PCI 交换机自带的风扇非常吵而且似乎没用,所以我干脆把它从主板上拔掉了。 ### 囤积模型权重 我把所有模型权重保存在本地 ZFS 文件系统上,该文件系统在两个 8TB 硬盘上复制,挂载在 ~/storage 下。对于任何我想运行的模型,我首先使用 hf download --local-dir ~/storage/ 下载模型。 ### 运行模型 模型权重本地缓存后,我为每个模型创建一个特定目录,其中包含 docker-compose.yml 文件,将每个模型的运行隔离到自己的 Docker 容器中。你可以在 ./runners/ 中找到这些配置。每个容器以只读方式挂载 ~/storage/models 以获取本地缓存的权重。然后我使用另一台机器上的 VM 上托管的 opencode 来访问模型,一旦它们在 http://clank.j.co:5000 上提供服务。我使用内部网络 DNS 服务器将 clank.j.co 指向 LLM 机器,但你也可以直接使用 http://<IP>:5000。 ### 让 PCIe 交换机正常工作 为了确保主板不会降级 PCI 交换机速度,我在 BIOS 中进行了大量调整。 #### BIOS 配置 (ROMED8-2T) | 设置 | 值 | 原因 | |—|—|—| | Chipset Configuration → AMD PCIE Link Width(交换机插槽) | x16(之前是 x8/x8) | 分叉将插槽拆分;上行链路训练为 Gen4 x8。需要两个 SlimSAS 8i 线缆都连接(每根承载 x8)。 | | PCIe Link Speed(交换机插槽) | Gen4(非 Auto) | Blackwell Gen5 设备通过 Gen4 交换机自动协商降级时可能训练失败并降级到 Gen1。强制 Gen4 可以稳定。 | | ASPM | 禁用 | ASPM L1 会将空闲链路降至 2.5GT/s。结果发现这是 lspci 显示“Gen1 降级”的原因——链路在负载下实际运行在 Gen4(已通过 p2pBandwidthLatencyTest 验证),但禁用 ASPM 可以消除视觉上的警示和任何重新训练延迟。 | | Re-Size BAR | 启用 | 需要完整暴露 96GB 显存 BAR 并实现 GPU P2P。 | | SR-IOV | 禁用 | 裸金属推理;避免 IOMMU 开销和 P2P 干扰。 | | Preferred IO | Auto | 可选设置为 Manual → 总线 81(c-payne 交换机)以获得微小的延迟提升,但保持 Auto——这是榨取性能的优化,并非修复,并且 BIOS 更改后总线号可能会变化。 | ## 内核 / GRUB 参数 bash # /etc/default/grub GRUB_CMDLINE_LINUX="iommu=off amd_iommu=off nomodeset" sudo update-grub # nvidia_uvm P2P 修复 echo 'options nvidia_uvm uvm_disable_hmm=1' | sudo tee /etc/modprobe.d/uvm.conf sudo update-initramfs -u 如果没有 iommu=off,NCCL 在多 GPU P2P 时会卡死。 ## 禁用 ACS(交换机 P2P 关键) 启用 ACS(默认)时,P2P 流量会被反弹到 CPU 根端口,而不是留在交换机内部,完全抵消了交换机的作用。 pcie_acs_override 需要修补过的内核,因此我们在运行时通过 setpci 禁用。 bash # /usr/local/bin/disable-acs.sh #!/bin/bash if [ "$EUID" -ne 0 ]; then echo "ERROR: must be run as root" exit 1 fi for BDF in $(lspci -d "*:*:*" | awk '{print $1}'); do setpci -v -s ${BDF} ECAP_ACS+0x6.w > /dev/null 2>&1 if [ $? -ne 0 ]; then continue fi echo "Disabling ACS on $(lspci -s ${BDF})" setpci -v -s ${BDF} ECAP_ACS+0x6.w=0000 done 每次启动时通过 systemd oneshot 运行: ini # /etc/systemd/system/disable-acs.service [Unit] Description=Disable PCIe ACS for GPU P2P After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/disable-acs.sh [Install] WantedBy=multi-user.target 验证:lspci -vvv | grep ACSCtl 应显示所有减号,且 nvidia-smi topo -m 应在四个 GPU 之间显示 PIX(而非 PHB/NODE)。使用 ./tools/measure-gpu-speed.sh 轻松测量。 ## GPU 功率限制 为了避免安装 220V 电路,我(可能不明智地)在单个 110V 电路上运行这套设备,但我对显卡进行了功率调节。持久模式 + 功率上限在启动时通过 systemd 应用(install-gpu-power-limit.sh): bash sudo nvidia-smi -pm 1 sudo nvidia-smi -pl 350 # 每 GPU 350W(默认 600W) 350W/GPU = 1,400W GPU 负载,根据电源预算确定。在单 1700W 电源的过渡阶段(在 240V 电路之前),显卡运行在 ~260W(4×260 = 1,040W GPU + ~280W 系统 ≈ 1,320W 总功耗)。 验证:nvidia-smi --query-gpu=index,power.limit,power.draw --format=csv ## 结果 上行:Gen4 x16(~30 GB/s 到 CPU)。通过交换机的 P2P:27.5 GB/s 单向 / 50.4 GB/s 双向,0.37–0.45 μs 延迟,即 Gen4 线速。 注意:如果任何地方启用了 ASPM,空闲时 lspci 可能仍将下游 GPU 链路显示为“2.5GT/s (downgraded)”;这仅是外观问题。链路在负载下会重新训练到 Gen4。 ## 资源 - 关于如何充分利用 4、6 或 8 张 RTX 6000 Pro 显卡的频繁更新仓库:https://github.com/local-inference-lab/rtx6kpro - 我使用的独立 PCI 交换机:https://c-payne.com

相似文章