跨卡通信决定大模型训练效率,真武V900如何把千卡拧成超级芯片
单张显卡的算力早就不是秘密了H100、MI300X、甚至国产旗舰芯片纸面数据一个比一个漂亮。可真正做过大模型训练的人心里都清楚千卡万卡跑起来之后决定你是“线性扩展”还是“效率崩盘”的根本不是单卡峰值而是卡和卡之间那条线的速度。跨卡通信才是那个真正卡脖子的天花板。我见过太多团队预算批了机器上了结果一跑分布式训练MFU模型浮点利用率只有30%多几百张卡在那边干等网络数据。那感觉就像请了一千个厨师却只开了两扇传菜窗口后厨再快也白搭。所以当我听说真武V900这款主打跨卡通信的系统时第一反应不是看它单芯片多强而是想搞清楚它到底怎么把上千张芯片“捏”成一个整体。这篇文章我就从工程实践的角度把我对这套系统的理解以及背后整个跨卡通信领域的关键技术点掰开揉碎了讲清楚。1. 算力扩展的真正瓶颈计算与通信之间的“剪刀差”1.1 为什么说单卡算力是“纸面富贵”在深入真武V900之前得先建立一个共识大模型训练本质上是一个“集体项目”。你训一个千亿参数模型参数矩阵是放不进任何一张单卡的显存里的。哪怕勉强塞进去前向计算和反向传播的耗时也让人无法接受。所以必须把模型拆开让一千张卡各管一部分协同计算。这个“协同”二字就是跨卡通信存在的全部意义。而行业里有一个残酷的“剪刀差”规律计算能力按照摩尔定律或者类似曲线往上翻但互联带宽、尤其是跨节点互联带宽的增速远远跟不上。我举个例子这几年单卡算力可能翻了十倍但PCIe的带宽可能只翻了两三倍网络从100G到200G到400G看着在涨但对比计算需求的膨胀速度通信反而是相对退步了。这就导致一个结果当卡的数量增多时计算时间在缩短但通信时间在延长。因为数据要经过更多跳数要经过更多交换层级要等最慢的那一个链路。当通信占比超过一定阈值你再往集群里加卡总吞吐量不仅不涨甚至可能掉头向下。这不是耸人听闻是无数个失败集群总结出的血泪教训。1.2 三种并行模式对通信的“胃口”截然不同要理解跨卡通信为何复杂得先看训练框架里主流的三种并行模式——数据并行Data Parallelism、张量并行Tensor Parallelism和流水线并行Pipeline Parallelism。它们的通信模式完全不同对网络的需求也天差地别。数据并行最简单每张卡都有完整模型的副本各自吃不同的数据算完梯度之后做一次全局梯度同步AllReduce。这个同步的频率高通信量巨大对带宽的敏感度极高但对时延相对宽容。你可以理解为多个人抄同一本书每个人抄完自己那页然后大家把内容拼到一起对照修正谁抄得慢大家就都得等着。张量并行则是把一层网络里的矩阵乘法拆到多张卡上比如把QK矩阵的列切开。这种并行方式卡与卡之间的距离非常近通信极其频繁每次计算都要做矩阵切片通信不仅吃带宽对时延也极度敏感。在英伟达的方案里这依赖NVLink这种超高速总线穿透机箱直连GPU。流水线并行把模型按层切成多段像工厂流水线一样每个阶段负责几层。这种模式通信量相对小主要是段间传递激活值但通信的发起是有顺序依赖的时延影响显著。就像接力赛跑交接棒的节奏配合不好整体成绩就崩了。这三种模式在实际训练中往往是嵌套使用的。而这正是跨卡通信最核心的矛盾网络必须同时满足高带宽、低时延、抗拥塞这三种本质不同的需求。真武V900这类系统本质上就是冲着这个“既要又要还要”的死结去的。1.3 千卡规模引发的“通信风暴”与非线性增长还有一个需要特别留意的工程问题通信开销不是随着卡数线性增长的它是近似对数甚至多项式增长。以数据并行的AllReduce为例单看一次同步操作通信量是固定的。但问题在于当卡数从128张变成1024张时网络拓扑的层级变深了。你没法把所有卡都接到一台交换机上必须做两层、甚至三层的树形网络。高层交换机的带宽往往成为瓶颈这就是所谓的“收敛比”问题。更头疼的是广播风暴和拥塞。当上千张卡同时发起通信网络中的微突发流量会瞬间打爆交换机的缓存导致丢包。而一旦丢包TCP或者RoCEv2的流控机制会触发重传重传又加剧拥塞形成雪崩效应。很多团队在128卡规模跑得好好的代码上了千卡反而变慢多半就是这个原因。所以真武V900提出“集群级互联”的概念绝不是简单的把高速网卡塞进机器那么简单。它解决的是在超高并发下网络拓扑、流控策略、通信库协同这一整个生态位的问题。2. 真武V900的核心思路把“集群”伪装成“一颗芯片”2.1 系统级视角不能只盯着物理链路真武V900给我的第一印象是它跳出了“板卡”和“服务器”这两个传统层级直接从系统级System Level去思考互联问题。打个比方传统的做法是芯片之间用片内总线计算节点之间用网线这两者是割裂的。你编程的时候要清晰地意识到哪些数据是本地内存哪些要走网络。这种“心智负担”在千卡规模下是灾难性的因为只要有一个地方没考虑到通信就会卡壳。而真武V900的思路是能不能把上千张芯片的互联抽象成类似于“片内总线”的统一内存语义。也就是说程序里访问远端显存和访问本地显存代码风格一致由系统和硬件层去把透明性做出来类似计算中心的“内存语义网络”。这是一个很激进的思路相当于把物理上的“分布式”通过硬件和底层协议伪装成“单机”。这套思路一旦走通工程意义巨大。张量并行的通信代码不需要再去手动管理RC远端内存读写连接的建立和释放也不再需要DeepRec的框架层去刻意规避跨机通信。它把并行编程的难度从“精通网络编程”降级为“会写多线程”这是降低千卡集群使用门槛的最关键一步。2.2 拓扑设计无收敛网络才是“超级芯片”的底座任何系统级互联物理拓扑都是地基。真武V900在这方面走了一种很务实的路线——不是盲目堆全连接而是把常用拓扑的网络瓶颈消除掉。在常见的树形网络里叶子层接入计算节点核心层汇聚流量。如果核心层带宽小于所有叶子带宽之和就叫“有收敛”。在收敛比为1:1的情况下只有所有端口同时全速突发流量时才会出现瓶颈。但大模型训练的AllReduce恰恰就是典型的“全端口突发”流量所以传统树形网络在千卡规模下必死无疑。真武V900采用了一种扁平化的类环面Torus-like或者全连接Mesh的混合结构。我注意到它的宣传重点不在于端口的绝对速率而在于“任意两张卡之间的通信时延可控”这是刻意避开了树形网络里东西向流量不可控的弱点。这种设计的本质是把拥塞控制从“交换机侧”前移到了“网卡侧”。让每张网卡都具备路径选择能力数据流自动避开拥堵链路。这就像一个城市修路如果所有车都挤在一座桥上桥再宽也没用必须有多条平行通道并且导航系统能实时引导车辆分流。2.3 协议栈的取舍RDMA与内存语义的融合说到具体实现就绕不开RDMA远程直接内存访问和NVMe Over Fabric这些传输技术。但真武V900不一样的地方在于它没有简单地把标准RDMA拿来用而是在协议栈上做了一个很重的个性化定制。标准的RDMA能卸载CPU实现内核旁路和零拷贝但它的语义是“消息传递”你需要显式地做Post Send/Post Recv操作。真武V900尝试把一种类似NVLink的“Load/Store”语义搬到网络上去。这意味着传输单元不再是消息包而是直接的内存读取指令。这样做的好处是直截了当的时延大幅降低。因为消息传递需要先打包、再发送、对方接收、再解包而Load/Store语义直接把数据从对方内存“拉”过来。代价是协议栈复杂度飙升需要极其精准的丢包恢复与乱序处理机制。从行业趋势来看英伟达在NVLink和InfiniBand上正是在往这个方向演进国产系统能直接站在这个技术路线上发力方向是对的。3. 藏在细节里的魔鬼集合通信、调度与可靠性的三重考验3.1 集合通信从算法库到硬件协同的演进如果说互联拓扑是骨架那集合通信库比如NCCL或者真武V900自研的类似通信库就是神经系统。在千卡规模下直接决定训练效率的不是峰值带宽而是AllReduce、AllGather这些集合操作的执行效率。为什么这么说因为数据并行训练里每次迭代都要做一次全量梯度同步。假设模型有100亿参数以FP32精度计算是40GB数据就算用混合精度把通信量降一半也是20GB。在几百Gbps的带宽下这也要好几秒而正常一步迭代计算可能只需要不到一秒钟。真武V900的做法是软件硬件一起优化。硬件侧通过网卡和交换机协同支持在网计算In-Network Computing也就是说梯度求和的操作可以在交换机或者网卡内部完成数据不用全部汇聚到某个根节点算完再分发回来使得通信模式从默认的Ring AllReduce升级成了更高效的树形加环形的混合结构。软件侧通信库会实时感知物理拓扑自动选择最优的通信路径和分段大小避免因为某个NIC网络接口卡中断导致通信降级。3.2 负载均衡与拥塞控制短板效应决定的真实算力一个集群能跑多快永远取决于最慢的那条链路。在真武V900的设计中负载均衡不是靠交换机的静态哈希算法而是靠端侧主动探测加全局调度完成的。静态哈希有个致命问题——它看不到数据流的实际大小。比如两个大流撞在同一链路上而旁边链路却空闲这就是经典的“哈希冲突”在AI集群里非常常见。真武V900把每个数据包打上优先级标签配合端侧网卡的“多路径”功能让大流量自动拆散到多条物理路径上这是它实测吞吐能接近线性扩展的关键原因之一。这里要补充一个很多初学者会忽略的点AI训练里的通信大多是同步的。也就是说不管你是多路并行最终一帮卡都要等那个“最慢”的完成同步才能进入下一轮迭代。所以通信调优的核心不是单纯把平均时延降下来而是要把抖动Jitter彻底压制住。哪怕只有一次链路抖动导致某个包多绕了10微秒整个集群的几千张卡都要为这10微秒买单。真武V900强调的端到端QoS就是防这个东西。3.3 稳定性千卡集群的“概率学噩梦”最后必须谈谈稳定性。如果你没在万卡集群上跑过任务可能无法想象几小时训练崩溃重来的痛苦。在千卡规模下硬件的故障率被放大了——单卡MTBF平均无故障时间可能是数年但一千张卡合在一起每小时的故障概率就是千卡之和训练时长又长达几十天。可以说想不遇到故障几乎是不可能的。真武V900在架构上做了两层防护。一是通信层的自动降级当某条链路出现误码或丢包率飙升时系统会在不影响全局拓扑的前提下把流量切换到备用路径而不是像传统方案那样直接拉断整块GPU的训练靠框架层的Checkpoint机制恢复。二是更关键的计算状态保存。它支持把训练状态以一种极低频率同步到容灾节点级联了通信库和训练框架之间的心跳协议。当某个节点发生物理故障系统从备用节点原地拉起而不是重启整个训练。这种技术力在几十款国产算力系统中并不多见。4. 实践视角如何评估一套“超级芯片”系统的好坏4.1 不要只盯峰值算力这软四个指标才是关键对于真正要采购和部署这套系统的团队我建议把注意力从算力榜单换到下面这四个更实际的维度上这是根据我多年搭建训练集群的教训总结出来的。通信带宽利用率跑NCCL AllReduce测试比如nccl-tests的AllReduce_8GB算一下实际吞吐占理论峰值的百分比。好系统应该在90%以上差系统可能连50%都到不了。通信时延一致性Jitter反复跑小消息的AllReduce比如128KB统计P99时延和P50时延的差距。差距越大说明系统抗扰动能力越差长稳训练会很难受。加速比扩展曲线分别在128卡、256卡、512卡、1024卡下跑同一模型看吞吐量是否接近线性增长。如果512卡到1024卡只涨了30%这个系统的天花板已经很明显了。故障恢复时间人为拔掉一张卡或一根网线看训练多久能恢复是秒级还是分钟级还是直接从头再来这是测试容错设计的唯一标准。4.2 从真实训练任务出发的测试方法很多人测试只跑官方通信benchmark这远远不够。我个人的习惯是会做两层测试。第一层是做微基准测试micro-benchmark最典型的就是跑一下nccl-test的 allreduce、allgather、pt2pt。这一层能看到不同消息大小从256KB到8GB下的带宽和时延曲线重点看两个点一个是短消息512KB时延是否在10微秒级别另一个是长消息带宽是否稳定不波动。第二层做端到端模拟。用真实模型比如跑一个中等规模的GPT训练把模型并行度和数据并行度都开到最大观察平均每个step的耗时波动。重点不是看绝对速度而是看长时间例如跑48小时后单个step时间是否有明显漂移。如果前100步是1.5秒最后100步变成了2.8秒说明系统散热、内存碎片、或者通信缓存有泄漏这种问题用benchmark根本测不出来。提示如果你准备评估类似真武V900这种大规模互联系统一定要问厂商要一定时间的真实训练日志而不是只看演示PPT。网络环境一变一切都可能变。4.3 部署中容易踩的“暗坑”清单关于部署这套系统的现场操作我整理了出现过问题的几类情况供参考。第一交换机散热和光模块的稳定度。高速光模块是发热大户尤其是400G/800G的光模块。如果机房空调布局不合理局部高温会导致光模块误码率上升进而触发重传。表面看是通信库报错实际是物理链路不稳。第二网卡中断绑定的CPU亲和性。很多裸金属部署会把网卡中断绑到非最优的CPU核上导致跨NUMA访问。真武V900这类对时延敏感的系统最好将网卡中断和GPU所在的NUMA节点对齐否则时延会增加几百纳秒到几个微秒。第三不要忽视驱动和固件版本的一致性。跨卡通信对端到端CRC校验要求极高如果网卡固件版本不一致可能导致部分链路因为PFC优先级流控制死锁而完全断流而且这种问题时有时无极其难排查。5. 站在工程角度的最终思考算力资源配置的下一步最近行业里有一个很热的说法叫“算力约束下提升大语言模型能力的资源配置建模”说白了就是怎么在有限的电力、有限的芯片、有限的网络条件下多榨出一些模型能力。而真武V900这类系统之所以会引起讨论恰恰说明了一个共识正在形成堆单卡算力的时代已经过去了跨卡通信才是决定集群实际输出能力的胜负手。从资源配置的角度看这带来两个心态上的转变。以前我们买算力看核心数、看TFLOPs现在得学会看“通信域”的大小。你能把多少张卡捏成一个无死角的超级芯片决定了你能训多大的模型。从实用主义出发这比盲目对比两张卡的旗鼓相当更具备工程指导意义。另外混合精度训练FP16/BF16/FP8这几年大幅降低了通信量的压力也提升了计算效率但与此同时也带来了通信模式的改变。以前通信的是FP32梯度现在通信的是FP16或FP8梯度数据量变小了但对通信的实时性要求反而更高了因为计算更快了等待时间更短。这就意味着即使通信总量下降低时延仍然是不能舍弃的核心指标。我在实操中的一个体会是以后评估一套算力系统通信指标的分量会越来越大。你可以容忍单卡比对手弱5%但绝不能容忍跨卡通信比对手差30%。因为那30%的差距会在千卡集群上被放大成远超单卡弱5%的整体吞吐差距。顺着这个标准去评价真武V900它值得关注的不是它自己宣称有多强而是它把“通信”这个曾经被忽略的配菜提升到了主菜的位置。如果你也在规划自己的算力集群或者正在被千卡训练效率低下折磨建议不要只盯着换更强的网卡或者换更贵的交换机先把通信架构从系统级理顺——把上百上千张卡当作一台电脑的CPU内核来管理而不再当作一堆独立服务器来拼凑。这才是真武V900给这个行业带来的最大启示要么不做要做就把它们变成一颗“超级芯片”。

相关新闻

素数算法详解:从试除法到线性筛,避开这些坑

素数算法详解:从试除法到线性筛,避开这些坑

素数这玩意儿,大学课本里三行定义,实际写起来三天三夜都不一定写得干净。作为“动手学算法”系列的第04篇,这篇我打算把素数的判断、生成、进阶证明和几个容易踩的坑一次性捋清楚。不管你是为了面试刷题,还是做密码学相关开发&…

2026/10/1 18:41:47 阅读更多 →
农企信息管理平台毕业设计全攻略:从数据闭环到答辩应对

农企信息管理平台毕业设计全攻略:从数据闭环到答辩应对

做农企信息管理平台这套题,我太熟了。每年毕业季都能看到一堆人拿这类管理系统当选题,不是因为它简单,而是它恰好踩在毕业设计的“安全区”上:业务场景明确、技术栈成熟、功能边界清晰,既能展示工程能力,又…

2026/10/1 18:41:47 阅读更多 →
KKBox用户流失预测实战:Python建模源码全解析

KKBox用户流失预测实战:Python建模源码全解析

简介:这套源码基于KKBox音乐网站真实业务场景,面向数据分析初学者、机器学习实践者及音乐平台运营人员,用Python完成用户流失预测全流程开发,为制定用户留存策略提供数据支撑。压缩包共47个文件、5.18MB,以33个IPython…

2026/10/1 18:41:47 阅读更多 →

最新新闻

ChatGPT/Claude半价使用指南:按量计费与模型路由的工程化省钱方案

ChatGPT/Claude半价使用指南:按量计费与模型路由的工程化省钱方案

上个月核对信用卡账单时我愣了一下——ChatGPT Plus 20美金,Claude Pro 20美金,再算上偶尔往API里临时充值的零头,一个月小40美金就这么没了。身边不少朋友其实都踩在同一个坑里:看到AI订阅就咬牙上了,实际用量根本没跑…

2026/10/1 19:18:04 阅读更多 →
Oracle重做日志组扩容实战:从判断依据到在线操作全流程指南

Oracle重做日志组扩容实战:从判断依据到在线操作全流程指南

做Oracle数据库运维这行,早晚都会碰到重做日志组扩容的需求。我在重庆思庄做数据库技术支持这些年,处理过不少核心生产库因为业务量上来、日志切换过于频繁导致性能下降的案例,Oracle重做日志组扩容几乎是最常见的变更操作之一。这篇文章把我…

2026/10/1 19:18:04 阅读更多 →
从零构建AI工程能力:数据、模型与推理服务实战指南

从零构建AI工程能力:数据、模型与推理服务实战指南

1. 从零搭建AI工程能力:为什么我劝你别一上来就调包这两年“AI工程”这个词被说得太多了,多到有点变味。招聘JD上写着“熟悉AI工程化落地”,点进去一看,要求会调三个API、会写Prompt、会用某个框架搭个Demo。说实话,这…

2026/10/1 19:18:04 阅读更多 →
AI性能优化安全指南:Algocode差分测试与回滚机制实践

AI性能优化安全指南:Algocode差分测试与回滚机制实践

1. 性能优化这件事,为什么让人又爱又怕 做开发的人都有一个共识:功能跑通只是及格线,性能才是拉开差距的地方。但真到了要动手改代码优化性能的时候,绝大多数人的第一反应不是兴奋,而是心虚。原因很简单—— 功能代码…

2026/10/1 19:18:04 阅读更多 →
Agent记忆架构实战:基于MCP与Docker的hindsight记忆层设计

Agent记忆架构实战:基于MCP与Docker的hindsight记忆层设计

1. 从“hindsight”说起:为什么Agent的记忆问题值得单独拎出来做“hindsight”这个词本身很有意思,字面意思是“事后的洞察力”,也就是我们常说的“后见之明”。把这个词放到Agent Memory(智能体记忆)的语境里&#xf…

2026/10/1 19:18:04 阅读更多 →
Windows平台搭建标准NTP服务器的三大可行方案

Windows平台搭建标准NTP服务器的三大可行方案

1. 为什么Windows自带的w32time不是真正的NTP Server——从协议层看本质差异很多人在搜索“Windows NTP server”时,第一反应是:Windows系统里不是自带时间服务吗?点开服务列表找到w32time,右键启动,再改个注册表&…

2026/10/1 19:17:04 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/1 1:01:17 阅读更多 →