AI算力租赁这两年算是给中小企业开了个方便之门不用一次性砸几十万买显卡按小时付费就能跑起大模型微调、深度学习训练这些重型计算任务。但方便是方便了真到自己下单的时候很多人第一反应是懵的——该租多大的卡租多久为什么账单比预想高这么多回头一看GPU利用率不到20%钱全花在了空转上。这个话题我前后帮几家创业公司量过预算、调过配置踩过的坑不算少。这篇就把中小企业做AI算力租赁时最常见的预算测算思路、配置选型和实操避坑经验整理出来希望能让你少交点学费。1. 先想清楚你真的需要租GPU还是租了个面子1.1 从业务场景反推需求而不是先看卡做预算测算的第一步其实跟显卡参数没关系先搞清楚你的业务到底属于哪种计算类型。我见过不少团队上来就要一张A100一问跑什么——跑一个tuning脚本数据量几千条P100都跑不满。这种配置就属于典型的结构性浪费。目前的AI计算场景大概可以分这么几类大模型微调比如用LoRA、QLoRA微调7B、13B甚至70B的模型这类任务吃显存带宽和算力消耗相对可控最关键的是显存够不够塞下模型权重、梯度、优化器状态和中间激活。大模型推理部署一个模型做实时推理对单卡算力要求较高对显存要求取决于模型规格和并发请求数通常可以用vLLM、TensorRT-LLM这类推理框架做优化。传统深度学习训练CV、NLP领域的CNN/Transformer训练吃GPU算力也吃显存但相比大模型微调更多是追求算力规模能用多卡并行加速。渲染与仿真如果你的GPU需求是渲染3D场景或做物理仿真那跟AI计算完全是两个方向可能更适合考虑CPU云渲染方案不一定非要上GPU。数据分析与BI加速少数情况会用GPU做大规模数据清洗、特征工程加速这种场景对GPU需求其实不强租个CPU高配实例就够了。场景判断完了再评估任务频率和耗时。如果只是偶发性的测试任务按需租几小时足够如果每天都要训练、持续数周那就得按包月甚至包年的逻辑算如果任务是突发批量的、对时间不敏感可以考虑竞价实例。1.2 弄清楚你的任务吃GPU的哪部分能力很多文章一上来就讲显存、算力但实际做配置的时候首先要区分你的任务是“显存敏感型”还是“带宽敏感型”还是“算力敏感型”。显存敏感型任务的典型特征模型权重只能在显存里一放不够就爆内存。比如微调7B模型光权重FP16就是14GB加上Adam优化器状态和梯度随便就超过24GB所以至少要租一张48GB的卡才稳。带宽敏感型任务最典型的就是推理每个token的生成速度很大程度上受到显存带宽的限制A100 80GB的HBM2e带宽高达2TB/s而一些消费级卡往往只有不到600GB/s差距立竿见影。算力敏感型任务则是训练和高强度吞吐的推理这时候看的是FP16/BF16的浮点算力。判断方式很简单用nvidia-smi跑一个小任务观察显存占用、GPU利用率、功耗这三个值。如果显存占用接近上限而利用率只有10%说明显存不够而算力过剩如果利用率一直跑到99%而显存只用了50%这说明算力吃紧、可以考虑多卡方案。2. GPU选型别只盯着显存大小2.1 核心参数逐个拆解不要被营销词带偏正式选型之前把GPU的核心参数弄明白。显存容量只是最直观的一个真正决定性能的还有下面这几项。算力以FP16/BF16的TFLOPS为单位决定你算一个batch要多久。后训练时代还多了一个关注点——FP8算力因为很多新硬件的FP8吞吐是FP16的两倍如果你的框架支持FP8混合精度训练这个参数会直接影响任务时长。显存带宽HBM2e、HBM3、GDDR6之间的差距非常大推理任务尤其吃这个参数。同样是24GB显存的卡专业卡和消费级卡的带宽差别能到两倍以上价格差距当然也摆在那儿。显存容量训练任务建议按“模型权重 梯度 优化器状态 激活值”之和来估算通常取模型参数量的2到4倍。举个例子7B模型FP16训练参数量对应14GB权重实际配卡建议48GB起。推理任务相对简单一点显存需求约等于模型权重 KV Cache预留 余量一般1.2到1.5倍模型体积就够了。CUDA核心/SM数量决定单卡的并行执行能力但也别太迷信这个数字因为不同代架构的SM效率差异很大新架构的SM单位性能可能翻了一倍。互联带宽如果是多卡方案NVLink、PCIe带宽是瓶颈。训练任务里梯度同步频繁互联带宽不足会导致多卡效率剧烈下降。这就是为什么租8张卡的机器不能只盯着卡型还得看卡间互联拓扑。2.2 市面上常见的卡型怎么选做预算的人最怕的就是被一堆型号搞晕。我按定位梳理一下定位典型卡型适用场景价格档位参考入门跑量Tesla T4 / L4轻量推理、小模型训练、视觉任务每小时几块钱中级主力A10 / L20中小模型微调、中大推理每小时十几到几十块高端训练A100 40/80GB大模型预训练、多卡并行每小时几十到上百块旗舰H100 / H800超大规模模型训练、高吞吐推理每小时几十到上百块中国市场环境下还要注意一个词昇腾。如果项目涉及到国产化适配华为昇腾系列如Ascend 910B也是真实可选的算力方向只是生态上跟CUDA不完全兼容部署时多走一层适配。中小企业在模型选型和框架选型上就要提早考虑这个问题别代码全写完了才发现底层不兼容。2.3 模型训练、微调、推理对GPU的不同要求“微调大模型”这个热词很多人都在搜但实际上微调和全量训练是两种配置逻辑。全量训练最耗资源7B模型每token都要更新全部参数梯度同步、优化器状态全部吃显存。如果你的目的是复现论文或者预训练一个领域模型预算基本就奔着H100级别去了。LoRA/QLoRA微调是中小企业更现实的路径只训练低秩适应矩阵显存占用比全量微调小一个数量级7B模型用一张24GB的卡已经能跑起来了实测QLoRA加4bit量化后甚至可以压到14GB以内。推理部署相对省事但要注意显存带宽和KV Cache的优化特别是并发度上来了之后。那“显卡有两个Intel UHD Graphics和NVIDIA GeForce RTX 4060 Laptop GPU”这种问题为什么经常有人在搜因为很多人把笔记本上的双显卡搞混了。核显负责日常显示独显负责计算但PyTorch默认只认CUDA设备。如果代码里torch.cuda.is_available()返回False先检查NVIDIA驱动装没装、CUDA Toolkit版本匹配不匹配而不是怀疑网卡出了问题。在租用的云GPU上也会遇到类似的驱动不匹配问题后面专门讲。3. 预算测算一张表算清楚你的真实成本3.1 利用率是预算里最大的变量说到“怎么配不浪费”最重要的原则一句话按真实利用率和真实时长计费而不是按配置上限计费。很多团队租GPU的习惯是“估一个任务量乘上单价得出预算”。这个逻辑没错但它漏掉了优化空间。同样一个训练任务跑30个小时还是跑8个小时差别不只在硬件价格更取决于数据预处理效率、框架配置、混合精度策略等。我服务过的公司里最典型的浪费案例就是把训练代码原封不动从本地单卡环境搬到8卡租赁环境结果因为没做分布式适配8张卡只有1张在跑利用率不足15%成本翻了8倍。利用率怎么算简单跑任务的时候定时记录nvidia-smi的GPU-Util和显存占用。如果平均利用率低于30%那就是资源配置严重浪费如果稳定在80%以上说明卡选得合理。要做预算优化先连续跑几天任务把利用率基线摸清楚。3.2 时长、单价、存储、带宽四项都要算进去很多人的预算只算了“GPU每小时多少钱”结果月底一看账单多了40%的其他费用。完整的成本模型至少要包含五项GPU租用时长费这是显性成本按每小时或每月计算。按需计费贵包月便宜竞价实例最便宜但可能被中断。存储费用训练数据集动不动几十GB甚至几百GB云盘、对象存储、快照都是按GB月计费的。数据量大的时候存储可能超过计算费用的10%容易被忽略。网络带宽费用下载公开数据集、上传模型结果、做分布式训练时的节点间通信都要走带宽。很多平台的流量费是单向计费的踩过坑的都知道下载一个大模型权重的流量费比跑一次推理还贵。镜像和环境配置费用部分平台会对持久化环境、预置镜像、私有仓库单独收费这个一般不多但属于常驻成本。人工调试成本这个常被忽略但最重要。一个环境问题折腾两天这两天工程师的工资比GPU租金贵得多。选平台时预置镜像丰富度、技术支持响应速度其实都算隐性成本。3.3 一个真实的中小企业场景测算假设你是一家做行业客服机器人的公司产品需要基于开源7B模型做领域微调然后部署为内网API服务。先算训练阶段。使用QLoRA跑一个100万条指令的SFT序列长度控制在1024batch size合理设置下一张24GB显存的卡大概需要35到40小时。按市场主流价格一张A10或者L20每小时的租金大约20到40块取中间值30块训练成本就是40乘30等于1200块左右。如果出差错重跑一次成本直接翻倍这也就是为什么本地先把代码逻辑调通、再上云跑正式训练反而是更省钱的做法。再算推理部署。一个7B模型BF16部署单张A10可以支撑20到50路并发的实时对话取决于平均输出长度和batch策略。如果内部调用量每天只有几千次单张卡绰绰有余。按包月租一张A10大概是2000到3000块一个月加存储和带宽杂费一个月的推理总成本控制在4000块以内就能覆盖。同一套需求如果一开始就拍板租A100 80GB按需跑光训练阶段一个月跑20次的费用就破2万了利用率还未必高。这就是“配置浪费”的典型例子。4. 租赁方案怎么搭不浪费4.1 按需、包月、竞价三种模式怎么选云GPU平台一般都有三种计费模式大多数人只用了最贵的按需计费。按需计费是随开随停按小时计费适合研发测试、未知耗时的探索性任务灵活度最高但单价最贵。包月/包天计费相当于锁定资源适合有稳定训练计划或常驻推理服务的场景单价比按需低30%到50%但要注意包月期间机器不跑也算钱。竞价实例是平台把空闲资源以超低折扣放出来可能比按需便宜70%但随时可能被回收适合容错的批量任务比如大规模数据清洗、超参数搜索。我的建议是把业务按“任务性质”分类训练任务用包月卡跑探索性实验用按需跑批量批处理用竞价卡跑别一个模式打天下。这样整体费用通常能压掉三成以上。4.2 单卡大显存还是多卡小显存这个选择很多人纠结。同样预算租一张48GB的卡还是两张24GB的卡答案是优先单卡大显存。原因很简单多卡并行需要改造代码、处理数据切片、同步梯度工程复杂度直线上升。如果你的模型本身显存需求在48GB以内一张卡能塞下就别分两张卡。只有当单卡显存实在塞不下模型或者你的训练耗时已经长到不能接受、必须多卡并行来缩短时间时才考虑多卡方案。而且多卡并行还要看机器内卡间互联是NVLink还是PCIe后者做高频梯度同步会卡脖子。有一种例外是推理场景。推理是天然可以水平扩展的两张卡背后挂负载均衡吞吐能力约等于两张卡之和。所以推理场景下优先考虑多卡训练场景下优先考虑大卡。4.3 结合容器化做细粒度资源分配如果公司有多个项目组共用同一批GPU资源光靠租卡不够还得在平台上做资源编排。这里正好对应上“GPU计算资源分配”“K8s调用GPU”这些常见搜索词。K8s调用GPU的原理并不复杂通过device plugin将GPU作为可调度的扩展资源暴露给Pod然后利用limits: nvidia.com/gpu来限制每个Pod占用多少张卡。但这里有个细节——K8s早期的调度粒度是整卡你用不了显存碎片一张24GB的卡只跑一个需要12GB的任务剩下的12GB就空着。后来有了MIGMulti-Instance GPU和vGPU虚拟化可以把物理卡切成多个实例比如把A100切出2个40GB的实例或7个10GB的实例这样小任务就不会整卡浪费。实操中如果你只是简单用几个容器跑任务不需要先上K8s。用Docker加NVIDIA_VISIBLE_DEVICES环境变量做隔离就够了只有当多团队共用集群、需要复杂调度策略时才值得上K8s。这东西学习成本和运维成本不低小团队别为了赶时髦去背这个包袱。4.4 数据与镜像的准备很多人到了租卡环境才发现最耗时的不是训练而是搬运数据和构建环境。一个几十GB的训练集从上传统计到上传完毕慢的时候能花去一个晚上而这期间的GPU时钟也在跑钱从指缝里流走了。提高效率的套路是先用脚本做数据预清洗和压缩能切分的任务切分成多个分片并行上传把常用的Python依赖、预训练权重提前放到平台的对象存储里训练实例启动时用内网速度拉取尽量选择带预置镜像的平台比如已经装好CUDA、PyTorch、vLLM的基础镜像启动即跑不用自己折腾驱动。5. 常见问题与排查技巧实录5.1 PyTorch安装和环境适配问题在很多租赁平台上跑PyTorch最常见的第一道坎就是“装好了但跑不起来”。很多人搜“PyTorch安装教程GPU”搜到的教程五花八门但核心就三步先确认驱动支持的最高CUDA版本再选对应版本的PyTorch索引最后用torch.cuda.is_available()验证。但是要注意一个容易栽跟头的点——驱动版本向下兼容但向上不兼容。如果你的显卡驱动只支持CUDA 12.0而你安装了要求CUDA 12.4的PyTorch版本程序不会正常运行。租GPU的时候先看平台给的驱动环境用nvidia-smi确认右上角CUDA Version然后去PyTorch官网选匹配的版本。跑验证代码的时候不仅看is_available()还要执行一个几行的小矩阵乘法并确认结果有输出才能真正放心。顺便提一句有时候你会看到“NVIDIA GeForce RTX 5070 Laptop GPU with CUDA capability sm_120 is not compatible”这种报错。这通常是新卡搭配旧版本PyTorch导致的因为旧版本PyTorch没有包含新架构的编译内核。解决办法就是升级PyTorch到支持该架构的版本换句话说驱动环境与训练框架的版本匹配问题会伴随你每一次换卡。5.2 驱动掉线和错误代码怎么处理“显卡错误代码43”“GPU has fallen off the bus”“Xid 79”这些错误在本地显卡和云GPU上都会遇到。云端的优势是大部分平台支持直接工单换机。如果平台本身没有迁移机制最简单的做法就是释放实例重新申请通常新实例能绕开物理故障。如果是自己装的服务器错误代码43大概率是驱动和显卡状态不匹配按顺序重新安装驱动并重启即可检查一下是否因为供电不足或PCIe插槽老化导致不稳定。对于PC用户还有人搜“Win7查看GPU运行状态”“查看CPU GPU温度”。这属于本地调试场景Win7确实可以在桌面右键进入NVIDIA控制面板查看状态但我更推荐用HWiNFO或者TechPowerUp GPU-Z这类的轻量工具能实时看到GPU使用率、温度、显存占用。了解到自己本机的GPU瓶颈在哪里也会帮助你在租用云GPU时更好地评估需求。5.3 监控GPU利用率的正确姿势刚才已经强调过利用率是预算的核心变量。那怎么科学地监控有几种方式命令快速查询nvidia-smi直接看实时状态nvidia-smi dmon -i 0 -c 100可以按采样间隔持续输出利用率曲线适合短期观察。脚本定时记录用一个简单的Python脚本每隔30秒调一次nvidia-smi把GPU-Util、显存占用、温度记录到CSV里跑完任务后你就能看到资源利用的时间分布。哪个时段没有模型在跑一目了然。专业监控工具如果是长期运行的推理服务建议直接上Prometheus加DCGM Exporter采集指标并接Grafana看板能按周维度分析利用率趋势。这些工具都是免费开源的值得花半天时间搭一套。我在实操中的一条建议给团队立一个规矩——任何训练任务跑到50分钟以上必须有对应的利用率报告存档。没有报告就算资源浪费的黑洞。很多公司买了几万块的GPU时长到头来连一张利用率曲线都拿不出来这钱花了跟没花一样。5.4 推理部署优化与“GPU加速不生效”问题最后再聊聊部署阶段常见的“GPU加速不生效”问题。运维求助时经常碰到两类一边是Chrome或ComfyUI这类图形应用无法启用GPU加速另一边是推理框架比如vLLM部署时提示GPU不支持某个特性。图形应用层面Chrome开启GPU加速的路径在设置里的“系统”栏目但如果没有正确安装显卡驱动、或者系统禁用了硬件加速即使开了也无效。ComfyUI桌面版装Crystools插件提示冲突多见于Python环境和插件依赖版本不匹配解决方式是在干净环境里重新安装插件依赖。推理框架层面用python -c import torch; print(torch.cuda.get_device_capability(0))确认计算能力然后对照推理框架的官方兼容矩阵避免选错框架版本。还有一个值得留意的热词“funasr部署GPU”和“Ollama支持Intel GPU”。语音识别模型FastASR在GPU上部署可以获得明显加速但如果你用的不是NVIDIA卡部署路径就不一样了。Ollama这类推理工具本身已经开始支持Intel GPU但对于多数租用场景而言还是优先选择NVIDIA生态最成熟、踩坑最少。6. 写在最后我的一点实操感受做GPU预算测算这件事说到底不是算数学题而是算“管理题”。同样的业务有人用A100跑废了预算换个人用L4就能跑出结果——差别不在软件技术水平上而是能不能沉下心来把任务拆细、把利用率量化、把路线走对。我个人在实际操作中的体会是AI算力租赁从来不是“选一张卡”那么简单它是一门关于需求拆解、资源配置和成本治理的组合学问。先搞清楚任务类型再选卡型然后用真实利用率反推预算最后用监控机制维持纪律。这套流程走熟了你会发现钱花得比之前少项目推进反而更快。有一个小技巧我可以直接分享如果你的团队预算特别紧有一个很实用的省钱路线——先用云GPU跑通全流程小样再评估是否能本地攒一台二手A100或者多张二手消费级卡长期使用。混合策略有时候比全云方案更经济前提是你得有一份准确到小时的利用率数据来支撑这个决策。数据没跑出来之前别急着做长期承诺。说到底算力只是工具你的核心竞争力永远是模型效果和业务落地。别让GPU的账单喧宾夺主但也别在硬件上抠得太厉害而拖慢进度——找到一个匹配业务节奏的平衡点这才是中小企业玩转AI算力租赁的正确打开方式。
企业数字化 ERP 产品动态
相关推荐
高并发点评系统架构设计与Redis优化实践 1. 项目背景与核心价值"黑马点评"作为一款典型的本地生活服务类应用,其技术实现涉及高并发、分布式、缓存优化等互联网行业的经典技术难题。这个项目之所以成为众多开发者学习的标杆案例,关键在于它完整呈现了一个商业化应用从架构设计到具体实… · 2026/11/3 4:56:53
CPS-1848 RapidIO链路与交换结构联调实战 简介:《CPS 1848 用户手册》面向网络硬件工程师、芯片驱动开发者及RapidIO总线系统设计人员,提供IDT CPS-1848中央分组交换芯片的技术参考。压缩包仅含1个PDF文件,约9.05MB,内容覆盖芯片概述、电气与接口规范、总线连接方式、初始… · 2026/11/3 4:56:53
反向拆解:用逆向思维提升技术学习与排障效率 很多人第一次听到“reverse-skill”这个词,以为是某种黑科技工具,或者某个新出的编程框架。其实它压根不是工具,而是一种反着做事的能力——从结果倒推路径,从答案倒推题干,从对方的问题倒推他真正想要的东西。我这两年… · 2026/11/3 5:27:00
回形针:从物理设计到软件与AI伦理的极小样本解析 回形针这个小东西,大概是办公室抽屉里最不起眼的角色了。但你别小看它:它在设计史上有过一席之地,在软件圈被借去做过文件附件组件的名字,在人工智能领域还引发了著名的思想实验讨论。一根不到一克的钢丝,串起了日常生… · 2026/11/3 5:27:00
深入解析JVM的Stop-The-World机制与优化实践 1. 理解JVM的Stop-The-World机制当Java虚拟机执行垃圾回收时,会触发一个被称为Stop-The-World(STW)的现象。这个术语形象地描述了JVM在执行某些关键操作时需要暂停所有应用线程的状态。就像交通警察在繁忙路口指挥交通时,需要暂时… · 2026/11/3 5:27:00
从“事后诸葛亮”到复盘杠杆:hindsight的认知价值与实践方法 我们都有过这样的时刻:一场考试结束,看到答案的那一刻拍大腿,“这题我明明会”;一次方案评审,别人提出风险点,你恍然“我早就觉得不对劲”;一个项目复盘,所有失败的伏笔在数据面前清… · 2026/11/3 5:27:00
MySQL数据库操作指南:从基础到高级实战 1. MySQL数据库基础操作全指南MySQL作为全球最流行的开源关系型数据库管理系统,在Web应用、企业系统和数据分析等领域占据着核心地位。我使用MySQL已有八年时间,从最初的简单查询到现在的复杂架构设计,积累了不少实战经验。今天我们就从最基础… · 2026/11/3 5:27:00
树形背包DP:核心原理与优化实战 1. 树形背包DP的本质与核心挑战第一次接触树形背包问题时,我盯着那道"选课系统"的题目发了半小时呆——每个课程有学分和先修条件,要求在不违反依赖关系的前提下,选择总学分最高的课程组合。这就像在迷宫里找宝藏,每个岔… · 2026/11/3 5:25:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18