news 2026/9/2 15:31:24

双机DGX Spark vs M5 Ultra:本地AI部署底座选型全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双机DGX Spark vs M5 Ultra:本地AI部署底座选型全解析

这段时间在本地 AI 选型上,讨论热度最高的两个名字,一个是 NVIDIA 的 DGX Spark,另一个是苹果的 M5 Ultra。很多人的直觉是:M5 Ultra 统一内存动不动就是 256GB,DGX Spark 只有 128GB,那肯定无脑选苹果。但如果我们把“本地 AI 部署”当成一个完整工程来看,结论没这么简单。这篇文章要讨论的组合是:两台 NVIDIA DGX Spark 组成的小集群,对一台搭载 M5 Ultra 的 Mac 工作站,在本地 AI 推理、API 服务、批量任务和模型微调上到底谁更值得做底座。

先把结论放在前面:M5 Ultra 的优势是单机内存大、能效好、通用计算能力强,适合个人开发者和轻量推理;双机 DGX Spark 则在 CUDA 生态、低精度推理、分布式扩展和标准接口服务上更成熟。如果你要的不是“能跑模型”,而是“稳定跑服务”,那 M5 Ultra 可能没有你想的那么强。下面从公开规格、主流部署流程和工程化落地三个角度展开,不跑分,不贴测试榜,只做逻辑推导。

1. 双机 Spark 与 M5 Ultra 核心能力速览

先把两组方案的关键信息放在同一张表里。需要说明的是,M5 Ultra 的具体配置取决于苹果官方选项,DGX Spark 的规格以 NVIDIA 公开资料为准,这里只写不影响判断的确定性内容。

能力项双机 DGX Spark单台 M5 Ultra 工作站
设备定位个人 AI 超级计算机通用高性能工作站
核心芯片2 × GB10 Grace Blackwell1 × Apple M5 Ultra(双 Die)
统一内存2 × 128GB,合计 256GB最高配可达 256GB 级别,以官方配置为准
内存架构LPDDR5x 统一内存苹果统一内存架构
AI 软件生态CUDA + cuDNN + TensorRT + NGCMLX + MPS + llama.cpp + Ollama
低精度推理支持 FP4 / FP8 / BF16 / FP16主要支持 FP16 / BF16,低精度能力有限
多机互联支持 ConnectX-7 组网,可组建分布式集群无官方多机高性能互联方案
典型功耗单机约 300W,双机约 600W 峰值整机功耗远低于 600W,能效优势明显
典型推理框架vLLM / TensorRT-LLM / Triton / OllamaMLX / Ollama / llama.cpp / LM Studio
适合场景推理服务、并发 API、批量任务、模型微调个人实验、大内存模型加载、轻量服务

从表里能直接看出一个问题:两组方案的强项都踩在对方的短板上。M5 Ultra 的最大卖点是单机 256GB 统一内存,几乎能塞进目前所有开源大模型的量化版本;但它的弱点是缺少 CUDA 生态,这让很多生产级推理工具在 macOS 上用不了,或者性能明显打折。双机 DGX Spark 单看一台内存容量不占优,但两台加起来的 256GB 并不输给 M5 Ultra,而且完整的 NVIDIA 软件栈让它更容易变成一台真正能被业务调用的“AI 服务器”。

2. 两种方案的定位差异

2.1 DGX Spark 是“为 AI 定制的专用设备”

DGX Spark 并不是一台普通台式机,它是 NVIDIA 面向本地 AI 场景推出的整机。GB10 超级芯片把 Grace CPU 和 Blackwell GPU 封装在一起,128GB 统一内存、1TB NVMe SSD、双 ConnectX-7 网络接口,出厂预装 DGX 软件栈,支持 NVIDIA NGC 容器。这意味着你拿到机器后,不需要折腾显卡驱动、CUDA 版本、PyTorch 匹配关系,直接拉容器就能跑模型。

从工程角度看,DGX Spark 的价值在于它把“AI 服务器”这个概念压缩成了一台约 300W 功耗的桌面设备。两台 Spark 组网后,可以通过 RDMA 网络做跨节点的张量并行或流水线并行,这是 M5 Ultra 完全不具备的能力。NVIDIA 给这套硬件规划的软件路径很明确:CUDA 生态下的任何东西,跑在 Spark 上只是性能强弱问题,不存在“跑不了”的问题。

2.2 M5 Ultra 是“通用计算能力很强的 Mac”

M5 Ultra 本质上是苹果把两颗 M5 Max 封装在一起,目标是覆盖高端创意工作、视频剪辑、3D 渲染、软件开发以及本地 AI 推理。它的统一内存由操作系统统一管理,CPU 和 GPU 可以访问同一份数据,省去了显存拷贝。这种架构在“单进程加载大模型”上非常舒服,256GB 内存可以加载接近满规格的 70B 甚至百亿参数模型。

但苹果的定位决定了它的限制:macOS 上能用的 AI 推理框架数量远少于 Linux + CUDA,许多为 NVIDIA 高性能推理优化的库没有官方支持,只能通过第三方移植间接使用。Mac 平台的 GPU 算力释放依赖 Metal + MPS 后端,而 MPS 在很多算子上的性能没有达到可用级别,个别算子甚至回退到 CPU 执行。

2.3 本地 AI 的真正瓶颈不是内存,是软件栈

公开讨论里很容易把“本地 AI 成败”等同于“内存是否足够大”,这个看法不够全面。真正决定一个本地 AI 平台能不能长期使用的,是三个问题的交集:模型能不能跑、跑起来能不能达到可用吞吐、能不能被外部工具稳定调用。

M5 Ultra 在“模型能不能跑”这一项上得分很高,256GB 内存意味着几乎所有开源模型都可以先加载进来。但下一步“可用吞吐”就开始分化:如果推理框架对 MPS 支持不完整,或者模型无法充分利用低精度计算单元,内存再大也是空欢喜。再下一步“被外部工具调用”,macOS 上虽然有 Ollama、LM Studio 等工具能做本地 API 服务,但高并发场景下的线程调度、GPU 占用管理、请求队列,都和成熟的高性能推理服务器有差距。

3. 本地 AI 部署环境准备

3.1 双机 DGX Spark 环境准备

DGX Spark 出厂预装 DGX 操作系统和 NVIDIA 容器运行时,环境准备的核心工作是初始化网络和拉取镜像。如果是双机组网,需要先确认两台机器的 ConnectX-7 网口能互通,然后在同一网段内配置 IP,再确保 Docker 容器能访问网卡设备。

# 常见初始化步骤,实际命令取决于 DGX OS 版本 # 1. 检查 GPU 是否正常识别 nvidia-smi # 2. 验证网络接口 ip addr show ping <另一台Spark的IP> # 3. 拉取推理镜像 docker pull nvcr.io/nvidia/pytorch:25.03-py3

这种环境准备方式对熟悉 Docker 和 Linux 的开发者非常友好。你不需要手工安装 CUDA,也不需要编译 PyTorch,NGC 容器里已经把版本匹配关系固定好了。

3.2 M5 Ultra 环境准备

M5 Ultra 的环境准备更像传统 Mac 开发环境。首先确认芯片型号和内存容量,然后安装 Python 环境和模型运行框架。比较省事的方式是直接用 Ollama 或 LM Studio,它们已经把模型下载和推理环境打包好了,适合不想碰底层细节的用户。

# 安装 Homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 安装 Ollama brew install ollama # 拉取一个量化模型 ollama pull qwen3:32b

如果想用更底层的 MLX 框架,需要额外安装 Python 包:

pip install mlx mlx-lm

从部署体验上看,M5 Ultra 的上手成本更低,几分钟就能把 Ollama 跑起来;DGX Spark 则需要一点 Linux 网络和容器基础。但反过来看,DGX Spark 的下限更高,因为它的软件栈是给 AI 场景专门打磨过的,不容易出现框架和系统依赖打架的问题。

3.3 通用检查清单

不管哪套方案,部署前都建议检查以下项目:

  • 内存是否为当前配置上限,量化模型文件是否接近内存容量上限。
  • 磁盘剩余空间是否足够存放模型文件、日志和输出结果。
  • 是否开启防火墙,端口是否被占用。
  • 是否有稳定的散热环境,长时间满载测试时更容易触发降频。
  • 是否具备合法授权的模型权重和测试数据,尤其是商用场景。

4. 模型部署与启动方式

4.1 双机 Spark 上部署 vLLM

在 NVIDIA 平台上,生产级推理服务最常用的是 vLLM。它支持连续批处理、PagedAttention、张量并行,对高并发场景非常友好。双机 DGX Spark 可以通过分布式执行后端把模型切分到两台机器的 GPU 上。

# 通用 vLLM 示例,实际模型名和并行参数需要按部署环境调整 python -m vllm.entrypoints.openai.api_server \ --model Qwen3-32B-AWQ \ --tensor-parallel-size 2 \ --distributed-executor-backend gloo \ --host 0.0.0.0 \ --port 8000

这里要注意,具体能否使用 tensor-parallel-size 2,取决于模型大小和网络带宽。DGX Spark 的 ConnectX-7 网卡设计目标之一就是支持这种跨节点推理,所以双机组网比单机更接近生产部署的形态。如果只是为了快速测试,也可以每台机器各自启动一个独立 API 服务,通过反向代理统一入口。

4.2 M5 Ultra 上部署 MLX 和 Ollama

M5 Ultra 的主力推理框架是 MLX,它是苹果开源的机器学习框架,专门针对 Apple Silicon 优化。MLX 的好处是 CPU 和 GPU 都能用,并且支持 4-bit 量化模型的加载。最简单的启动方式是先用 Ollama 跑一个本地 OpenAI 兼容接口:

# 启动 Ollama 后台服务,默认监听 11434 端口 ollama serve # 在另一个终端执行对话 ollama run qwen3:32b

Ollama 会提供一个 OpenAI 风格的/v1/chat/completions接口,方便接进第三方工具。但如果要更高的吞吐和更细粒度的控制,可以用 MLX 启动一个 OpenAI 兼容服务器:

python -m mlx_lm.server \ --model mlx-community/Qwen3-32B-4bit \ --host 127.0.0.1 \ --port 8080

MLX 的服务端也实现了 OpenAI API 风格接口,对本地工具链接入比较友好。但从整体功能看,MLX 提供的服务端选项远比 vLLM 少,例如没有内置的 PagedAttention 机制,在高并发下的表现会受到一定限制。

5. 功能测试与效果验证

5.1 推理吞吐验证

要判断一组本地 AI 方案是否适合生产使用,需要先测吞吐。最简单的做法是用 Python 脚本向 API 服务发送连续请求,记录每秒完成的 token 数。更完整的做法是准备一批固定输入,连续跑多轮,统计平均时延和 P95 时延。由于本文没有做独立实测,具体数字不做断言,但可以按以下思路验证:

  • 单请求 128 个输出 token 的耗时。
  • 并发 8 个请求时,服务是否出现超时。
  • 连续运行 30 分钟后,吞吐是否明显下降,判断是否存在降频。
  • 模型加载后的预热时间。

双机 DGX Spark 的核心优势在于 vLLM 的连续批处理机制:多个并发请求会被动态拼成一个 batch 送入 GPU,吞吐在并发上升时依然能保持稳定。M5 Ultra 在单请求场景下表现通常不错,但随着并发上升,MPS 后端的调度能力可能成为瓶颈。

5.2 长上下文与精度测试

本地 AI 部署中,长上下文是一道分水岭。M5 Ultra 大内存对长上下文天然友好,因为 KV Cache 占用大量内存时不容易爆显存。双机 Spark 的 128GB 单机内存对 128K 上下文也有足够余量。

不过长上下文不仅要看内存,还要看计算效率。随着上下文变长,注意力计算量呈线性或二次方增长,GPU 算力不足时响应时间会明显拉长。可以从公开规格推测,Blackwell GPU 在低精度矩阵计算上的算力密度高于 Apple GPU,因此双机 Spark 在长上下文连续生成时可能更有优势。实际效果需要以模型和推理引擎的 benchmark 为准。

5.3 批量任务验证

批量任务是最能体现“能不能干活”的测试场景。假设要把一个 500 条记录的文本批量生成摘要,双机 Spark 可以起一个任务队列,通过 vLLM 的异步接口逐批提交,配合失败重试。M5 Ultra 用 Ollama 同样能完成,但并发能力和任务恢复机制相对原始,遇到一次 OOM 或进程异常,需要自己处理任务断点。

一个通用批量测试脚本可以这样写:

import requests import time def batch_generate(prompts, endpoint="http://127.0.0.1:8000/v1/chat/completions"): results = [] for prompt in prompts: try: resp = requests.post( endpoint, json={ "model": "local-model", "messages": [{"role": "user", "content": prompt}], "max_tokens": 256, "temperature": 0.3 }, timeout=120 ) data = resp.json() results.append(data["choices"][0]["message"]["content"]) print(f"完成第 {len(results)} 条") except Exception as err: results.append(f"ERROR: {err}") print(f"第 {len(results)} 条失败: {err}") time.sleep(0.2) return results

这类脚本在两个平台都能跑,但真实区别在任务规模和稳定性。双机 Spark 在 vLLM 下面可以更稳定地承接数百条任务;M5 Ultra 适合小批量、对时间不敏感的本地处理。

6. 接口 API 与批量任务

6.1 双机 Spark 的高并发 API

DGX Spark 出厂软件栈里带了一整套 NVIDIA 的推理服务组件。即使不额外安装,也可以基于 NGC 容器快速启动 Triton Inference Server,或者直接跑 vLLM 的 OpenAI 兼容 API。对开发者来说,这意味着你能拿到一个标准接口,直接对接现有的自动化工具链。

更关键的是,双机 Spark 可以组建一个小型推理集群,把一个大模型切成跨节点并行,也可以两台机器分别跑不同模型,再通过 Nginx 或 Kong 做流量分发。这种灵活的可扩展性,是 M5 Ultra 很难复制的。

6.2 M5 Ultra 的 API 能力

M5 Ultra 上最简单的 API 方案是 Ollama。它内置了/v1/chat/completions/v1/embeddings接口,足够个人工具链使用。如果要接入到 RAG 或者 Agent 系统,Ollama 的长处是轻量、快速、兼容性好,支持从一些现有工具里直接替换 Base URL 的模型服务。

但要注意,Ollama 和 MLX 服务端的并发控制粒度有限,官方建议的并发连接数不高。如果做高并发的 B 端业务接口,M5 Ultra 单机方案容易在连接数上升时出现 GPU 资源竞争和延迟抖动。

6.3 批量任务与队列设计

无论选哪套方案,批量任务的工程化流程都一致:输入任务队列、执行推理、写入结果、失败重试。区别在于底层的容错能力。DGX Spark 配合 Docker 和 Kubernetes 等工具,可以把任务队列、服务实例、日志收集都标准化;M5 Ultra 在这方面的工具链更偏向个人脚本,要自己实现任务断点保存和恢复。

如果一定要用 M5 Ultra 做批量任务,建议加一层 Redis 队列,把任务状态和模型推理解耦。下面是一个非常简单的任务轮询架构:

  • 任务写入 Redis List。
  • Worker 从 List 中取出任务,调用本地模型 API。
  • 结果写入结果队列。
  • 主程序定期检查失败任务并重新投递。

双机 Spark 同样可以用这种架构,但更容易升级成多实例并发 Worker,因为 Docker 和容器编排在 Linux 上更顺手。

7. 微调、训练与横向扩展

7.1 低精度推理是隐藏差距

这部分是“M5 Ultra 看起来很强,实际未必”的核心原因之一。NVIDIA 的 Blackwell 架构把 FP4/FP8 这类低精度推理作为重点,DGX Spark 在宣传中明确对标 200B 参数模型,靠的正是低精度量化之后的内存节省和算力提升。而 Apple Silicon 当前主推的是 FP16/BF16 精度,低精度支持力度有限。

这会导致一个结果:同一个 70B 模型,M5 Ultra 可能只能用 4-bit 量化加载,而双机 Spark 可以用更激进的量化方案跑出更高吞吐。如果软件的算子库不支持,M5 Ultra 的 256GB 内存优势会被“算不快”抵消掉。

7.2 微调工具链对比

微调是本地 AI 的进阶需求。NVIDIA 生态下有成熟的技术栈:PyTorch + CUDA + DeepSpeed + FSDP,配合 LoRA 和 QLoRA 方案,可以在消费级设备上完成参数高效微调。DGX Spark 的 Arm CPU 和 NVIDIA GPU 组合,配合官方 PyTorch 容器,开箱即可跑微调任务。

M5 Ultra 可以用 MLX 的 LoRA 工具做轻量微调,社区里也有不少成功案例,但整体生态比 CUDA 平台小很多。如果遇到算子不支持,需要等待社区适配或手动改代码。对深度定制模型的企业用户来说,这个差距会更明显。

7.3 横向扩展:两台 Spark 的真正价值

DGX Spark 最容易被忽略的能力是网络互联。通过 ConnectX-7,多台 Spark 可以连成一个推理集群,数据并行、张量并行、流水线并行都可行。M5 Ultra 没有官方多机互连方案,最多通过网络 API 与服务端交互,分布式训练基本无法和 NVIDIA 生态相比。

所以“双机 Spark”的意义不只是内存相加,而是把两台机器变成一个更大的逻辑设备。在这种配置下,M5 Ultra 的单机内存优势几乎没有了,CUDA 生态优势反而被放大。

8. 资源占用与功耗观察

8.1 功耗与散热

从公开资料看,DGX Spark 单机典型功耗约 300W,双机满载约 600W 规模,需要稳定的电力供应和良好散热。M5 Ultra 的整机功耗远低于这个水平,能效比优势突出,放在普通桌面环境下几乎不会吵到人。

但要注意,低功耗也可能意味着持续输出的算力上限低。如果长时间跑批量推理,M5 Ultra 在持续负载下可能因为散热设计降频,导致任务时间比预期更长。DGX Spark 虽然耗电高,但它被设计成可长时间满载工作的设备,散热和供电余量也更充足。

8.2 内存带宽与显存占用

模型推理对内存带宽非常敏感。NVIDIA 在 DGX Spark 上使用 LPDDR5x 统一内存,带宽参数需要在 NVIDIA 官方规格中确认;M5 Ultra 的内存带宽同样以苹果官方信息为准。实际操作中,推理时的“显存占用”不是只看有多少内存,而是看 KV Cache、模型权重、临时激活值三者的总和,以及内存带宽能否满足生成速度。

在同一个模型上,量化精度越低,内存占用越少,但算力要求会变化。建议测试时同时观察内存占用和每秒生成速度,不要只看“模型加载成功”就下结论。

8.3 降载与稳定性

生产环境最怕的事情是服务在运行 20 分钟后突然变慢或崩溃。M5 Ultra 在 macOS 上跑长任务时,需要注意进程生命周期管理和内存压力,有时需要手动释放没有及时回收的缓存。双机 Spark 在 Linux 容器环境下,更便于限制资源配额、重启容器、收集日志,工程上更稳定。

9. 常见问题与排查方法

问题现象可能原因排查方式解决方案
双机 Spark 无法相互通信网口配置错误或防火墙拦截检查 IP、路由和连通性配置同一网段,开放所需端口
vLLM 启动后提示显存不足模型量化版本过大或并行参数配置错误查看日志中的显存使用量使用更小量化模型或调整并行度
M5 Ultra 加载模型后生成速度很慢模型未使用 MPS/MLX 后端,回退到 CPU检查推理框架日志里的后端信息确认安装 mlx 并加载 MLX 量化模型
Ollama 服务启动后无法访问端口被占用或防火墙拦截查看端口监听状态更换端口或停止占用进程
批量任务跑到一半卡住任务粒度过大导致单请求超时查看请求日志和资源占用拆小任务、增加超时时间、加断点续跑
批次推理时显存占用波动大并发请求过多,PagedAttention 未生效观察 GPU 内存曲线调低并发、启用连续批处理

排查原则很简单:先看日志,再看资源,最后看网络。不要一上来就重装系统或重建环境,绝大多数本地 AI 部署问题都出在版本不匹配或端口冲突上。

10. 选型建议与最佳实践

10.1 什么场景选 M5 Ultra

如果预算有限,只需要在本地跑实验、写 Agent 原型、处理小批量文本,M5 Ultra 是很好的选择。它安静、省电、上手快,256GB 大内存对单模型大上下文很友好。日常做代码补全、文档总结、轻量 OCR 或图片理解,M5 Ultra 完全够用。配合 Ollama 或 MLX,几分钟就能搭出可用的本地 AI 环境。

10.2 什么场景选双机 DGX Spark

如果目标是长期跑 API 服务、批量处理大量请求、做模型微调,或者希望保留后续横向扩展的可能,双机 DGX Spark 更合适。它的 CUDA 生态本身就是行业默认标准,几乎所有开源 AI 项目都优先支持 NVIDIA 平台。双机方案看起来前期成本高,但部署效率和服务稳定性通常能回本。

10.3 合规与安全使用建议

本地 AI 部署绕不开模型版权和数据隐私问题。使用开源模型前,要确认模型的许可证是否允许商用和二次分发;处理人脸、语音、版权素材时,必须获得合法授权。不要把未经脱敏的隐私数据直接丢进本地模型,也不要让本地 API 服务暴露在公网无防护状态下。建议本机配置防火墙,API 服务只监听 127.0.0.1 或内网地址。模型文件从正规源下载,并在测试环境验证后再进入生产流程。

11. 总结

M5 Ultra 的确是一款优秀的硬件,单机 256GB 统一内存在本地 AI 场景中有很强的吸引力。但“本地 AI 部署”不是只看内存条大小,软件生态、低精度推理、分布式扩展和服务稳定性同样重要。双机 DGX Spark 的优势恰恰集中在这些工程化指标上。如果你的诉求是“先跑起来试试”,M5 Ultra 会给你很好的体验;如果你的诉求是“跑起来以后长期用”,更稳妥的选择可能是双机 Spark,或者至少需要认真评估 Mac 平台的软件栈能否满足你的完整工作流。

这里最容易踩的坑,是只看内存不看精度支持,只看跑分不看持续负载,只看单机能力不看多机扩展。建议在决定之前,用统一的模型、统一的测试脚本、统一的并发数量,在两套方案上各跑一轮完整流程,再根据真实数据做决定。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 15:29:52

nRF Sniffer抓包实战:从固件烧录到Wireshark分析BLE协议

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 15:26:18

MiniMax H3开源短剧工作流:从人脸一致性到分镜拼接

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 15:25:49

墨绿色高级商务风:论文开题报告PPT制作全攻略

又到了开题季&#xff0c;我猜你最近正在为论文开题报告发愁。打开 PPT 模板网站&#xff0c;搜索“开题报告”&#xff0c;会得到上万条结果&#xff0c;但大多数只有两个走向&#xff1a;要么像十年前的教学课件&#xff0c;要么过度设计&#xff0c;五颜六色压不住台面。很多…

作者头像 李华
网站建设 2026/9/2 15:22:27

Modbus 调试工具(Qt Widgets + Modbus)

# Modbus 调试工具(Qt Widgets + Modbus) ## 项目概述 - 技术栈:**Qt Widgets + Qt Modbus** - 运行平台:统信UOS / 银河麒麟(x86_64 / ARM) - 用途:工业现场 Modbus RTU/TCP 设备调试、寄存器读写、线圈/离散量操作、通信参数配置、日志查看 - 复杂度:中等,同时支持 …

作者头像 李华
网站建设 2026/9/2 15:19:28

Vibe Coding不是提示词竞赛,工程规范才是关键

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 15:19:24

嵌入式工程师职业发展:从技术栈迭代到反脆弱体系构建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华