news 2026/9/20 20:49:46

Atlas 300V 24G 推理加速卡上 YOLO 模型部署实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Atlas 300V 24G 推理加速卡上 YOLO 模型部署实战指南

最近好多人在问「Atlas 300V 24G 是不是运算加速卡」,还有人直接抛出一句「atlas 部署 YOLO 怎么弄」。这两个问题放在一起特别有意思:前者说明大家还没搞清这张卡的定位,后者说明已经想把它用到实际业务里了。我前后在 Atlas 300V 系列上折腾过两三个项目,从最开始连驱动都装不上,到后来把 YOLOv5 转成 OM 模型在 24G 显存版本上跑视频流,踩过的坑不说有一箩筐,至少也能攒出一篇避坑指南了。

这篇东西我会先把 Atlas 300V 24G 的硬件定位讲透,再按完整流程给大家演示一遍 YOLO 的部署:PyTorch 模型怎么导出 ONNX、怎么用 ATC 转成昇腾的 OM 模型、AIPP 预处理怎么配、推理代码最小怎么写、最后再列一些高频问题和排查思路。无论你是刚收到一张卡不知道怎么下手,还是已经开始了但卡在转换或精度上,这篇都值得看完。

1. Atlas 300V 24G 到底是张什么卡

1.1 先回答那个热搜问题:是运算加速卡吗

是,而且不是一般意义上的运算加速卡。它是一张专业做 AI 推理的加速卡,核心不是 CPU 也不是 GPU,而是昇腾的 NPU 芯片。很多人第一次见到这张卡,习惯性拿它和显卡比,问能不能用来跑 3D 渲染,能不能玩游戏,答案都是不能。它不输出显示信号,没有显示接口,定位非常单一:把已经训练好的深度学习模型,比如 YOLO、ResNet、OCR 模型,以极高的吞吐量跑起来。

注意我强调的是「推理」。Between 训练和推理,两者对硬件的要求完全不一样。训练要的是灵活的算子、大的算力、高精度支持,所以通常用 GPU;推理追求的是功耗、成本、延迟。Atlas 300V 24G 这种卡,就是为推理场景专门设计的。

还有一个容易误会的地方:它不能单独工作。它是一张 PCIe 扩展卡,必须插在一台服务器或者工控机上,靠主机的 CPU 做任务调度和数据搬运。你可以把它理解成一个“外挂的推理引擎”,主机负责喂图、收结果、做业务逻辑,它负责把模型跑出结果。

1.2 它的硬件底子怎么样

Atlas 300V 系列的 24G 版本,用的是昇腾 310P 芯片,板载 24GB 显存。昇腾 310P 这颗芯片的几个关键点:

  • 算力主要看 INT8 和 FP16,而不是 FP32。推理模型通常转成 INT8 或 FP16 来跑,这正好是这张卡的强项。
  • 支持硬件视频解码,H.264/H.265 的码流可以直接交给卡上的 DVPP 模块去解,不用占用 CPU 资源。这个特性对视频流分析太重要了,后面我会专门展开。
  • 功耗控制得不错,整卡通常几十瓦级别,和动不动两三百瓦的 GPU 相比,在机房部署的散热压力小很多。

24G 显存能干什么?以 YOLOv5s 为例,640×640 输入,FP16 模型大概只占几百 MB 显存。24G 意味着你可以把 batch size 调大,或者同时加载多路检测任务,也可以跑更大分辨率、更大体量的模型。实际项目里,24G 版本更多是向着“一路机器带多路摄像头”的方向去用的。

所以总结一句话:Atlas 300V 24G 是一张 AI 推理运算加速卡,不是 GPU,不是显卡,不能用来干图形渲染,它专门为深度学习推理服务。

2. 为什么都在问 Atlas 部署 YOLO

2.1 YOLO 在边缘端的应用实在太广了

这几年智慧城市、工业质检、明厨亮灶、安防监控这些场景,几乎都在用 YOLO 做目标检测。摄像头越来越多,视频流二十四小时不间断,CPU 根本扛不住;如果用 GPU,单价太高,整机功耗也压不住。Atlas 这类推理卡的出现,就是来解决这个矛盾的:AI 算法芯片化,给服务器插上一张卡,检测能力直接升一个数量级。

实际项目中,一张 Atlas 300V 24G 可以接多路 1080p 视频流,靠卡上的硬件解码和 NPU 推理,完成实时检测。相比纯 CPU 方案,单路延迟更低;相对 GPU 方案,同等的并发路数下整机成本更可控。这也是为什么好多人一拿到卡就想把 YOLO 部署上去。

2.2 部署 YOLO 到底是在做什么

网上动不动就有人说“部署 YOLO”,听起来好像就一条命令的事,实际上包含三层工作:

第一层是模型转换。PyTorch 或者 TensorFlow 训练出来的模型,是通用的计算图,不能直接在 NPU 上跑。你要先用 ATC 工具把模型转成昇腾的 OM 模型格式,转换过程中还会做算子适配、图优化、内存复用,甚至可以把图像预处理算子也编排进模型里。

第二层是推理代码。你需要在 Atlas 主机上写一段推理程序,把图片或者视频帧送入模型,取回检测结果。可以用 CANN 的 ACL 底层接口,也可以用 MindSpore Lite 之类的高层封装,甚至可以先用官方提供的 msame 工具验证一个模型能不能跑通。

第三层是业务集成。单纯跑通一个模型没有意义,真正的项目要把 RTSP 拉流、视频解码、图像缩放、推理、NMS 后处理、结果上报这些环节串起来。这部分往往比模型本身更费时间。

换句话说,“Atlas 部署 YOLO”不是一个点,而是一条链路。很多人卡住,恰恰是链路中某个环节没打通。

3. 部署前的环境准备:驱动、固件和 CANN 一套装齐

3.1 先确认硬件和主机

展开实操之前,先把主机要求说清楚。Atlas 300V 必须插在服务器主板的 PCIe 卡槽上,然后装到机器里再开机。主机方面,我建议满足这些条件再开始:

  • CPU 平台:x86_64 或 ARM64 都行,Ubuntu 18.04 / 20.04 这类常见发行版优先,别拿太冷门的系统为难自己。
  • 内存:板卡本身有 24G 显存,但主机内存也要留足,因为模型加载、数据预处理、后处理都占主机内存,建议 32G 起步。
  • 磁盘:CANN 工具链加起来有十几个 G,预留 50G 空间比较稳。
  • 电源:注意 PCIe 供电是否足够,服务器主板一般没问题。

机器起来以后,先进 BIOS 确认 PCIe 设备能被识别,然后安装完驱动再查卡的状态。

3.2 驱动、固件、CANN 的安装顺序和坑

昇腾官方的安装文档里经常出现“驱动、固件、CANN 工具包”这三个词。它们的关系可以这样理解:驱动让操作系统能识别硬件,固件是卡上芯片的底层运行环境,CANN 是给你写推理程序用的开发套件,三者缺一不可,而且版本必须匹配。

我踩过最大的一次坑,就是驱动装的是新版,CANN 还是旧版,结果跑推理时直接报算子不匹配。后来学乖了,一律去昇腾社区下载成套版本,也就是同一个版本号下的驱动 + 固件 + CANN Toolkit 放一起装,避免天南地北地拼版本。

安装顺序基本固定:

# 1. 安装驱动,以 root 身份执行 ./Ascend-hdk-310P-npu-driver_XX.X.X_linux-aarch64.run --full # 2. 安装固件 ./Ascend-hdk-310P-npu-firmware_XX.X.X_linux.run --full # 3. 安装 CANN Toolkit,解压后执行 ./Ascend-cann-toolkit_XX.X.X_linux-aarch64.run --install

这里有几个细节值得留意:

  • 安装驱动和固件前,最好先把系统自带的某些冲突包清掉,比如npu相关残留文件。
  • 装完驱动后立刻用npu-smi info验证一下。能看到卡的型号、芯片数量、温度和显存信息,就说明驱动正常。如果提示No devices,大概率是驱动和固件没配对,重启一下再查。
  • CANN 装完后,需要 source 一下环境变量文件:
source /usr/local/Ascend/ascend-toolkit/set_env.sh

每次开新终端都得重新 source,或者直接写进~/.bashrc。这一步不做,后面的atc命令会提示找不到。

3.3 npu-smi 怎么看

第一次装好,npu-smi info的输出大概是这样(不同版本字段略有差异):

+-------------------------------------------------------------------------------------------+ | npu-smi 22.0.0 Version: 22.0.0 | +-------------------------------+-----------------------------------------------------------+ | NPU Name | Health Power Hugepages-Usage | | Chip Device | Bus-Id AICore Memory-Usage | +===============================+===========================================================+ | 0 300V Pro | OK 65W 0 / 0 | | 0 0 | 0000:81:00.0 24 23720 / 24192 MB | +-------------------------------+-----------------------------------------------------------+

重点看两列:Name确认板卡型号是 300V 系列,Memory-Usage确认显存大小是 24G 左右。如果这些都对,说明硬件链路没问题,可以进入模型转换阶段了。

4. YOLO 模型从 PyTorch 到 OM 模型的转换全过程

4.1 先把 PyTorch 模型导出成 ONNX

昇腾的 ATC 工具不支持直接吃 PyTorch 的.pt文件,它最常吃的是 ONNX 格式。所以第一步就是用 YOLOv5 自带的导出脚本把权重转成 ONNX。

如果你用的是官方 YOLOv5 仓库,导出命令很简单:

python export.py --weights yolov5s.pt --include onnx --opset 11 --batch-size 1

有几个参数我一般会固定下来:

  • --opset 11:ONNX 算子集版本,太新可能在 ATC 上算子支持不全,太旧又可能漏算子,opset 11 兼容性最好。
  • --batch-size 1:先固定 batch=1,把一条链路跑通,后面要优化吞吐再转动态 batch 版本。
  • 不导出带 NMS 的端到端版本:很多人图省事想用带 NMS 的 ONNX,但昇腾这边部署时我更推荐把 NMS 放到 CPU 上做后处理,模型本身只负责输出检测框和置信度。原因后面说。

4.2 ATC 转换命令和参数解释

拿到了yolov5s.onnx之后,接下来是最关键的一步:用 ATC 把它转成 OM 模型。

source /usr/local/Ascend/ascend-toolkit/set_env.sh atc --model=yolov5s.onnx \ --framework=5 \ --output=yolov5s_om \ --soc_version=Ascend310P3 \ --input_shape="images:1,3,640,640" \ --insert_op_conf=aipp.cfg \ --output_type=FP32

逐个说下参数的意思:

  • --framework=5:5 代表 ONNX。ATC 支持多种框架的模型输入,ONNX 对应的就是 5。
  • --soc_version:一定要和你实际的芯片版本对上。Atlas 300V 系列的 310P 芯片,常见的是Ascend310P3,但同样一片卡,不同批次或者不同驱动固件下识别出来的 SoC 版本可能略有不同,最稳妥的办法是查昇腾对应版本的《Atlas 300V 产品文档》,或者直接在安装目录下看硬件型号。这个参数填错,转换大概率会直接失败,报ascend_toolkit_so_xxx之类的错误。
  • --input_shape:这个值和导出 ONNX 时的输入名、输入维度要一致。YOLOv5 的输入名一般是images,所以写法是images:1,3,640,640。如果你用的是别人魔改过的模型,输入名可能不一样,可以用 Netron 打开 ONNX 看一眼再填。
  • --insert_op_conf:指定 AIPP 预处理配置文件。这个配置允许你把图像预处理算子插入到模型计算图里,让归一化和格式转换直接在硬件上完成,省去 CPU 预处理的时间。很多新手漏掉这一步,模型也能转换成功,但推理前就得自己在代码里做一遍像素归一化,性能差不少。
  • --output_type=FP32:默认输出可能是 FP16,显存占用小但精度可能受影响。如果后处理对精度敏感,转 FP32 输出更稳妥。当然,如果你做了 INT8 量化,输出类型的选择要结合量化策略来看。

转换成功后会生成yolov5s_om.om文件。如果失败,绝大多数原因是soc_version不匹配、算子不支持、或者输入 shape 和实际模型不一致。

4.3 AIPP 配置文件怎么写

AIPP 是这个转换流程里信息量最大的东西,我单独拎出来说。它的作用是让 NPU 在模型输入前自动完成图像格式转换和像素处理。YOLOv5 推理时的预处理,通常要经历:OpenCV 读入 BGR → 转 RGB → resize 到 640×640 → 除以 255 归一化 → 把 HWC 变成 CHW。这些步骤如果全在 CPU 上做,非常耗时间。

有了 AIPP,只需要在配置文件里告诉 NPU:输入是 BGR 还是 RGB,要不要做色彩空间转换,均值和方差是多少。一个典型的配置长这样:

aipp_op { aipp_mode: static input_format: RGB888_U8 csc_switch: true rbuv_swap_switch: false mean_chn_0: 0 mean_chn_1: 0 mean_chn_2: 0 min_chn_0: 0 min_chn_1: 0 min_chn_2: 0 var_reci_chn_0: 0.003921569 var_reci_chn_1: 0.003921569 var_reci_chn_2: 0.003921569 }

几个字段说明一下:

  • input_format表示送入 NPU 的图像原始格式。如果你在代码里已经把 OpenCV 的 BGR 转成了 RGB,这里就填RGB888_U8,上面csc_switchrbuv_swap_switch也不用打开。
  • mean_chn_0mean_chn_2是三通道均值,YOLOv5 官方预处理里没有减均值,所以填 0。
  • var_reci_chn_0var_reci_chn_2是方差倒数,实际上就是缩放系数。官方把像素值乘1/255,那么缩放系数就是1/255 ≈ 0.003921569

这里有个容易踩的坑:如果 AIPP 里做了归一化,你代码里就不要再做除法了,否则等于归一化两次,检测精度会明显变差。反过来,如果没配 AIPP,你在代码里必须手动做归一化,否则模型输出的框和置信度都会离谱。

4.4 转换成功后,怎么快速验证 OM 模型

OM 模型不像 PyTorch 模型可以直接 print 出来,验证它到底能不能用,最方便的办法是用 CANN 自带的 msame 工具。它不依赖任何自写代码,可以直接喂一张图片进去,把推理输出落盘。

msame --model yolov5s_om.om --input test.bin --output ./out --outfmt BIN

test.bin是经过预处理后的一段二进制数据,尺寸要严格等于1,3,640,640,并且数据顺序是 CHW。这一步的意义在于:它能验证明明模型在 NPU 上能不能跑、输出维度对不对。等这个跑通了,再写业务代码,就把“模型环节”和“代码环节”解耦了,排查问题会轻松很多。

5. 在 Atlas 上把 YOLO 推理真正跑起来

5.1 Python ACL 推理的最小实现

msame 是验证工具,真实项目还是得写代码。CANN 提供了底层 ACL 接口,Python 能用acl这个包。我贴一个最小可运行的推理片段,把关键流程写清楚。

import acl import numpy as np import cv2 # 初始化 acl.init() acl.rt.set_device(0) # 加载 OM 模型 model_path = "yolov5s_om.om" ret, model_id = acl.mdl.load_from_file(model_path) assert ret == 0 # 读取图片,先做尺寸调整 img = cv2.imread("test.jpg") img = cv2.resize(img, (640, 640)) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = img.astype(np.float32) / 255.0 img = np.transpose(img, (2, 0, 1)) # HWC -> CHW img_data = np.ascontiguousarray(img) # 创建输入输出数据集 desc = acl.mdl.create_desc() acl.mdl.get_desc(desc, model_id) input_size = acl.mdl.get_num_inputs(desc) output_size = acl.mdl.get_num_outputs(desc) input_data = acl.util.np_to_ptr(img_data) output_data = np.zeros((1, 25200, 85), dtype=np.float32) # 按模型实际输出形状调整 output_ptr = acl.util.np_to_ptr(output_data) # 执行推理 ret = acl.mdl.execute(model_id, [input_data], [img_data.size], [output_ptr], [output_data.size]) assert ret == 0 # 从输出指针里取回数据 acl.util.ptr_to_numpy(output_ptr, output_data.shape, output_data.dtype) print("推理完成,输出维度:", output_data.shape) # 清理资源 acl.mdl.unload(model_id) acl.rt.reset_device(0) acl.finalize()

这段代码非常基础,但跑通了就说明整个环境和模型都没问题。有几个点需要提醒:

  • 输入张量的内存地址必须是通过acl.util.np_to_ptr转出来的指针,直接传 numpy 数组给acl.mdl.execute是不行的。
  • 输出 shape 在不同 YOLO 版本里不一样。YOLOv5s 在 640×640 输入下,输出通常是(1, 25200, 85)。如果模型是 YOLOv8s,输出结构更复杂,建议先用 msame 看输出维度再写死 shape。
  • 如果配了 AIPP 归一化,上面代码里的/ 255.0必须去掉,否则等于处理了两遍。

5.2 后处理:NMS 还是留到 CPU 做

之前我说导出 ONNX 时不要带 NMS,原因就在这里。NPU 擅长的是卷积和矩阵运算,NMS 这种大量 if-else、排序、循环的逻辑,放进模型图里反而浪费 AI Core。把原始输出拿回 CPU 做阈值过滤和 NMS,灵活度高,也方便调试。实际性能差距,在 YOLOv5s 这种模型上几乎可以忽略。

后处理思路很固定:

  1. (1, 25200, 85)里取出置信度大于阈值(比如 0.25)的框。
  2. 每个框有[cx, cy, w, h]和一个类别得分,需要转换回[x1, y1, x2, y2]
  3. 对不同类别分别做 NMS,IoU 阈值一般取 0.45。
  4. 最后把坐标还原到原图尺寸,注意如果输入模型前做了 letterbox 变换,这里要把偏移和缩放比例算回来。

很多项目最后卡在“模型跑通了但画出来的框歪了”,十有八九就是这一步坐标还原没做好。

5.3 多路视频流怎么用上硬件解码

到了真实项目里,很少有人会一张张读图片去推理,更多是从摄像头拉 RTSP 流。CPU 软解 4 路 1080p 就得占掉不少核,如果还想用 CPU 做预处理,服务器很容易被拖垮。Atlas 300V 的杀手锏就是板卡上的 DVPP 模块,可以直接把 H.264/H.265 码流解码成 YUV 图像,再交给 NPU 推理。

完整的视频流水线大致是:

  • FFmpeg 或海康 SDK 拉 RTSP 流。
  • 把编码后的 H.264 裸流分发给 DVPP 的 VDEC 模块进行硬件解码。
  • VDEC 输出 YUV 图像后,可以用卡上的 VPC 模块做 resize 和 crop,输出到模型需要的 640×640。
  • AIPP 负责把 YUV 转成 RGB、做归一化,然后送入模型。
  • 模型推理完,CPU 只做轻量的后处理。

这套链路的好处是,CPU 只负责拉流和业务逻辑,解码、缩放、模型推理全部在卡上完成,单机并发路数能拉得很高。要想用好这张卡,DVPP 是绕不开的一环,建议部署正式项目前先把 DVPP 的 sample 代码跑通。

6. 常见问题与排查实录

6.1 驱动、固件和 CANN 版本不匹配

这是出现频率最高的问题,具体表现为:驱动装好了npu-smi能查到卡,但跑到 ATC 转换或者加载模型时,报各种E10007RUNTIME算子错误、或者so库不存在的错误。

排查方法很直接:先看驱动和固件版本,再看 CANN Toolkit 版本,确保他们属于同一个大版本。昇腾社区每个版本页面都会列出配套的驱动固件编号,照着下载就完事。另外,/usr/local/Ascend/driver/version.info这个文件里能看到驱动打包时间,可以用来核对。

6.2 soc_version 填错导致转换失败

ATC 转换时最经典的一个报错是:

E10010: Please set the right --soc_version.

很多人看到这个就懵了,不知道怎么填。我的经验是:先确定你的板卡是 300V 系列还是 300I 系列,然后去对应产品文档里查“支持的 SoC 版本”。310P 芯片通常对应的是Ascend310P3,但如果 CANN 版本比较新,可能也支持Ascend310P1Ascend310P2等更细的区分。实在不确定,就装一个小版本的 CANN 自带的 sample,里面经常会在配置里写明当前硬件使用的 soc_version。

6.3 推理结果不准,或者检测框整体偏移

模型转换和推理都正常,但跑出来的结果和 PyTorch 侧差距很大,优先排查两件事。

第一件事是预处理是否重复。上面说过,AIPP 配了归一化,代码里不要再用img / 255,否则输入分布完全不是模型期望的样子。

第二件事是坐标变换是否做对了。YOLOv5 输入前如果用了 letterbox,缩放比例和填充偏移必须在后处理时还原。很常见的一个错误是把原始图直接 resize 成 640×640,然后后处理又把坐标映射到w / 640的缩放比例,最后画框偏得不成样子。

6.4 显存占用高或 OOM

24G 显存照理不算小,但如果有多个业务共享一张卡、或者模型转换成 FP16 时输出缓冲留得很大,也会出现out of memory。这时候先用npu-smi info看当前显存占用,确认是不是其他进程占着没释放。CLI 无法查看进程?可以用npu-smi info -t process -i 0查看卡上的进程内存占用。

代码层面要注意,创建输入输出数据集后,如果每次推理都重新分配,内存碎片会越来越大,跑一晚上之后 OOM 率明显增加。正确做法是在初始化时才分配一次 buffer,推理循环里复用同一块内存。

6.5 推理速度上不去

碰到“明明算力很高,但跑起来帧率很低”的情况,先别急着怀疑卡,先查数据路径。我见过最夸张的一个案例,瓶颈在把图像从 CPU 拷贝到卡内存时,每帧都在做cv2.resizenp.transpose,CPU 反而成了最慢的一环。

优化的正确顺序是:

  1. 尽量用 DVPP 做视频解码和缩放,不要用 CPU 的 OpenCV resize。
  2. AIPP 能做掉的归一化、格式转换,全部交给 AIPP。
  3. 批量推理,把多帧拼成一个 batch,比单帧循环推理吞吐高很多。
  4. 后处理用 numpy 向量化,不要写 Python for 循环。

把这些都做干净之后,性能才会真正体现出来。

7. 关于“运算加速卡”的重新理解和个人心得

回到最开始那个问题。Atlas 300V 24G 是运算加速卡吗?是,但是它的“运算”和 GPU 的“通用计算”是两个方向。GPU 是什么都能算,ATLAS 是专精 AI 推理。如果你手里有现成的 PyTorch 模型想部署成服务,它非常合适;如果你想拿它当显卡跑渲染,那确实是选错工具了。

我在实际项目里复用最多的一条经验是:不要一上来就追求“一行代码跑通”。硬件环境、模型转换、推理代码、后处理,四段链路分开验证,每一段能给出明确的成功标志,再往下一步走。很多人卡了半个月,最后问题不过是环境变量没 source 或者 soc_version 填错。

如果你正准备在 Atlas 300V 24G 上部署 YOLO,我建议的第一步是:装好环境、跑通 msame、再跑通我上面贴的那段 Python 代码。等这一步看到了输出,后面的视频流和业务集成都只是时间问题。

这篇文章全部是基于我自己在 Atlas 300V 系列上的实操经验写的,不同 CANN 版本在细节上会有一点点差异,但整体流程是通用的。遇到具体报错,优先去昇腾社区按照报错码搜,比我在这里猜你遇到什么问题要靠谱得多。祝各位都能顺利把 YOLO 跑起来。

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

四自由度机械臂建模:Matlab Robotics Toolbox实战指南

1. 为什么四自由度机械臂是入门机器人建模的“黄金切口”我带过十几届自动化和机电专业的学生做课程设计,也帮过七八家初创机器人公司搭仿真底座。每次被问“该从哪开始学机器人建模”,我的第一反应从来不是直接扔出DH参数表或推导雅可比矩阵——而是先拉…

作者头像 李华
网站建设 2026/9/20 20:48:02

基于 Spring Boot 的社区志愿时长统计管理系统设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 引言 随着社区治理的不断深化,志愿服务已成为社区建设的重要组成部分。然而,传统的人工登记方式在志愿时长统计方面存在记录易丢失、统计效率…

作者头像 李华
网站建设 2026/9/20 20:45:24

react className 敲空格才出提示?用 TaoToken 接 Codex 对着插件配置查

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

作者头像 李华
网站建设 2026/9/20 20:44:53

右键菜单事件,让 Codex 走 TaoToken 排查 popup 坐标

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

作者头像 李华
网站建设 2026/9/20 20:44:27

RPCS3 汉化补丁 3 步装好:中文乱码、文字截断一次说清

RPCS3 汉化补丁 3 步装好:中文乱码、文字截断一次说清 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 RPCS3 的中文补丁装不上、打了补丁还显示乱码?这篇直接给你一套可照…

作者头像 李华
网站建设 2026/9/20 20:44:17

铁路信号继电电路计算机辅助设计及仿真研究

简介:这份PDF是《铁路信号继电电路的计算机辅助设计及仿真的研究》论文原稿,适合铁路信号设计人员、轨道交通相关专业学生及从事联锁电路开发的技术工程师阅读。内容围绕传统继电电路设计效率低、易出错的问题,提出基于VC6.0与MFC框架的计算机…

作者头像 李华