说实话第一次拿到这块 Atlast 300V 24G 加速卡的时候我心里是有点犯嘀咕的。之前给客户做工业缺陷检测一直用的是普通GPU方案但那边机房电费有限、机箱空间也紧而且现场环境温度偏高功耗和散热都卡得很死。后来供应商推了这块卡说单卡24G大显存、算力跑YOLO够用功耗还低。我半信半疑地把项目周期里最核心的“ATLAS部署YOLO”任务接了下来折腾了小两周踩了一堆文档里根本不会写的坑总算是把整套推理链路跑通了。这篇博文我就把整个过程、参数选择、避坑记录都摊开讲一遍给准备在Atlas上跑YOLO的朋友做个完整参考。这篇文章不是产品发布会通稿也不是贴一段官方demo就算了。我会从硬件理解、环境搭建、模型转换一直到推理代码和性能优化全部按实操顺序来写重点讲清楚每一步为什么这么做、参数怎么调、报错怎么解。如果你之前只玩过CUDA和TensorRT想切换到这套NPU方案或者你公司刚买了Atlas卡准备做目标检测那这篇文章正好适合你。1. Atlas 300V 24G这张卡到底该怎么理解1.1 它是一张“运算加速卡”吗先说结论是的Atlas 300V 24G就是一张专门做AI推理的运算加速卡。它属于华为昇腾计算产品线核心芯片是昇腾310系列处理器主要面向边缘侧和推理场景。24G这个数字指的是板载显存容量配合大模型或者高分辨率多路视频输入时不用频繁搬运权重和中间特征图这个容量在同类推理卡里算是很能打的。很多人第一次拿到卡习惯性地拿它和NVIDIA的显卡做对比问“相当于什么级别的GPU”。我只能说这种对比意义不大。Atlas从硬件架构到计算栈都跟CUDA体系完全不同它用的NPU神经网络处理单元内部集成了AI Core、AI CPU和DVPP等模块。简单理解GPU更像一个通用并行计算单元什么都能算而NPU把矩阵乘、卷积这类AI算子固化得比较深跑神经网络推理反而更聚焦、效率也更高。官方标称的INT8整数精度算力数据我就不背参数表了真正让我觉得踏实的是它在实际YOLO推理时的表现功耗比预期低发热可控单卡跑YOLOv5s模型的吞吐量实测下来是能满足我们视频流实时检测需求的。所以如果你手头有活要跑YOLO完全不用怀疑这张卡“是不是运算加速卡”这个层面的问题方向是对的。1.2 选300V而不是其他型号理由是什么Atlas的推理加速卡型号不算少300系列下还有不同形态和算力档位。我选择的是Atlas 300V Pro 24G跟大家常说的Atlas 300V 24G是同一个系列只是Pro版属于更高规格配置。市面上不少渠道直接把它称作Atlas 300V 24G为了不引起歧义我下文统一叫“Atlas 300V 24G”。当时选型的时候我给自己列了三个硬指标显存必须大于等于24G。因为我们要跑YOLOv5m以上的模型并且计划做多路视频流并发显存太小后面优化空间非常有限。接口最好支持标准PCIe。这样改造现有服务器时不需要换整机直接插卡就能用。功耗要低。机房里原有电源冗余量不大300V 24G的典型功耗比同类GPU卡低不少不用额外更换电源。综合下来Atlas 300V 24G是唯一同时满足三项指标的选择。后来装到机器上简单跑了个YOLOv5s的benchmark识别精度和帧率都符合预期这块卡总算是没有选错。1.3 理解昇腾的“全栈”玩法Atlas卡的软件栈跟GPU完全不同。你用GPU跑YOLO一般是CUDA cuDNN TensorRT用Atlas的话底层驱动是Ascend HDK核心开发套件是CANN昇腾计算架构推理框架有MindSpore、MindX或者直接调用ACL昇腾计算语言接口。更直白地说CANN就是昇腾版的“CUDA”ACL就是昇腾版的“Runtime API”。这套体系有个特点兼容性封闭但垂直深度好。你不能直接把PyTorch模型塞进NPU去跑需要先把PyTorch的权重文件转换成CANN能识别的OM格式离线模型转换完成后推理阶段几乎不需要再依赖PyTorch了推理服务可以做到非常轻量。这一点其实挺适合做产品落地因为部署包里不需要拖上整个深度学习框架。但对应的坑是网上资料比CUDA生态少很多遇到问题有时翻文档要翻很久。这也是我写这篇博文的原因之一把核心链路先摸通后来的人可以少走弯路。2. 环境搭建驱动、固件、CANN三方缺一不可2.1 宿主机准备与系统要求在装卡之前得把宿主机操作系统先准备好。我用的是一台双路x86服务器操作系统为Ubuntu 20.04 LTS内核版本4.15及以上。这里提醒一下别用什么太冷门的操作系统虽然官方也支持CentOS等但从社区活跃度和问题排查效率来看Ubuntu 20.04是最省心的选择。安装之前先确认硬件识别情况。插好Atlas卡后用lspci命令查看一下有没有出现“Huawei”相关的设备条目lspci | grep -i huawei如果可以搜到设备说明PCIe链路已经正常枚举出来了。如果这里没有任何输出一定先查物理插槽和供电线然后再考虑软件问题。我第一次插卡时就是因为没插辅助供电lspci里什么都看不到。另外还要确认服务器BIOS里有没有开启大于4GB地址空间解码也就是Above 4G Decoding。这个选项如果不开启DMA映射会有问题后续跑推理时会出现奇怪的内存错误。多数专业服务器主板上默认是关闭的我遇到过一次后来进BIOS打开后问题才消失。2.2 驱动和固件安装套路Atlas卡的软件包可以从昇腾社区官网下载最关键的是版本必须配套。官方对驱动、固件和CANN Toolkit都有配套关系表千万不能随便“搞个最新版”。我见过有同事装了最新的CANN 7.0结果跟手头驱动版本不匹配模型转换阶段各种诡异报错。安装顺序上先安装固件再安装驱动。虽然很多教程说反过来也行但固件本质上是对硬件底层的更新先做底层更新更稳妥。下载回来的包通常是.run格式执行时给足权限和参数chmod x Ascend-hdk-*.run ./Ascend-hdk-*.run --full装完之后重启机器再用华为自带的npu-smi工具检查卡片状态npu-smi info正常的话你会看到类似下面这样的信息里面包含芯片型号、温度、显存使用率、算力利用率等关键指标。-------------------------------------------------------------------------------------------- | npu-smi 22.0.0 Version: 22.0.0 | ------------------------------------------------------------------------------------------ | NPC | Name | Health | Power | Temp | ------------------------------------------------------------------------------------------ | 0 | 300V Pro 24G | OK | 35W | 45C | ------------------------------------------------------------------------------------------看到Health是OK的时候才说明卡片已经被系统正常管理了。很多安装问题的排查起点其实就是这里如果npu-smi里看不到卡后面一切免谈。2.3 CANN Toolkit安装与环境变量配置驱动和固件只是让硬件工作起来真正编译、转换和调用模型的是CANN工具链。我这里装的是CANN Toolkit解压后执行安装脚本./Ascend-cann-toolkit_*.run --install装完之后需要设置环境变量。标准做法是把下面这些导出语句追加到 /root/.bashrc 或 /home/xxx/.bashrcsource /usr/local/Ascend/ascend-toolkit/set_env.sh export ASCEND_DEVICE_ID0ASCEND_DEVICE_ID是NPU设备编号跟GPU里指定cuda:0一个意思。多卡环境下每张卡对应一个ID通过npu-smi info可以看到。环境变量配好后可以跑一下CANN自带的样例工程来验证整个软件栈是否正常。建议选最简单的“ResNet-50图像分类”的ACL样例如果这个能跑通说明驱动、固件、CANN以及设备通信链路都没问题。别一上来就用自己的YOLO模型去试那样报错时不好定位问题层次。2.4 还记得验证一下“算力是否起来”软件栈全部装好后只看npu-smi里的显存占用还不够要真正压一下算力。我习惯用官方提供的benchmark工具对同一张推理卡分别跑一遍空转和带模型推理的情况。如果推理时AI Core利用率能跑到50%以上说明硬件和软件链路是通的后续优化才有基础。这一步别偷懒很多问题在后面模型转换阶段才爆发根源其实是环境没配对。我之前因为CANN Toolkit和固件版本偏差在ATC转换时直接报“aclrtSetDevice failed”排查了半天才发现是软件栈版本不一致。3. 把PyTorch的YOLO模型转成OM格式3.1 先导出ONNX再转OM不要硬刚PyTorch华为的ATC工具支持将ONNX、TensorFlow和MindSpore模型转换成OM格式但不支持直接吃PyTorch的.pt文件。所以第一步必须先用PyTorch把模型权重导出成ONNX。这一步看似简单实际操作时坑特别多。我用的是YOLOv5代码库导出命令大家应该很熟悉python export.py --weights yolov5s.pt --include onnx --opset 11这里必须强调opset版本。默认的opset 13在转ONNX时会引入一些较新的算子ATC工具如果没跟上后面可能报“不支持的算子”。我最后固定用opset 11兼容性最好转出来的模型在ATC里几乎没碰到算子问题。另外如果YOLO是你自己训练的版本导出前要把模型切到eval模式并且固定batch size。ATC转换时对动态shape的支持比较有限如果导出的模型是动态shape后面还得再做一步动态shape配置完全可以避免。3.2 ATC转换命令里的关键参数准备好ONNX文件后用ATC工具进行转换。下面是我实测可用的命令模板atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_om \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg \ --output_typeFP32逐项解释一下--framework5代表输入模型是ONNX格式。这里数字很容易记混5对应ONNX1对应MindSpore3对应TensorFlow我每次都会核对一下。--output输出文件名前缀生成的是yolov5s_om.om文件。--input_shape固定输入尺寸。我这边图片预处理统一做了640x640缩放所以直接写死batch1的尺寸。如果你要做多batch这里可以改成4或8但前提是后续推理代码也配套。--soc_version芯片型号标识。Atlas 300V 24G对应的是Ascend310P3不同型号一定不要混用否则生成的OM可能无法加载。--insert_op_conf预处理的配置文件后面章节详细讲。--output_type输出数据类型。一般保持FP32即可如果你想压缩显存占用也可以设置成FP16但YOLO后处理的部分可能要做适配。3.3 AIPP配置把预处理“塞”进模型AIPPAI Preprocessing是Atlas很有特色的一个模块。它可以让你不再写额外的图像预处理代码直接把“减均值、除方差、缩放、格式转换”这些操作编译进OM模型里。这样推理性能会高不少因为这个过程是在硬件DVPP模块上完成的。我的aipp.cfg配置大致如下aipp_op { aipp_mode: static input_format: YUV420SP_U8 src_image_size_w: 640 src_image_size_h: 640 crop: false mean_chn_0: 0 mean_chn_1: 0 mean_chn_2: 0 min_chn_0: 0.003921569 min_chn_1: 0.003921569 min_chn_2: 0.003921569 }这里min_chn相当于将像素值从0~255缩放至0~1配合mean清零正好对应YOLOv5里常见的归一化方式。需要注意的是输入图片格式我设置的是YUV420SP因为DVPP硬件编解码通常输出这个格式。如果你是使用opencv直接读图再喂给模型则建议把input_format改成RGB888_U8并在pipeline里自行完成resize和通道转换。3.4 转换报错时的排查步骤ATC转换报错主要分三类。第一类是“算子不支持”提示某个算子找不到实现版本。解决办法是先去昇腾社区查算子适配表看当前CANN版本是否支持该算子如果确定不支持尽可能修改网络结构比如把某些自定义算子替换成标准卷积或激活组合。第二类是“shape不匹配”通常来自动态shape或者导出ONNX时维度没固定。第三类是“内存不足”这个少见但碰到时可以把--buffer_optimize参数设成off_optimize再试。我遇到过最典型的报错是[ERROR] ATC: kernel name: Cast, op type: Cast does not support input data type: int64这是PyTorch导出ONNX时某些索引或shape算子生成了int64类型的Cast节点。解决方法是导出时在PyTorch侧做特殊处理或者转换成ONNX后用脚本把int64类型的Cast节点精简掉。4. 推理部署从ACL接口到YOLO后处理4.1 走上正轨的ACL推理流程模型转换成功只是跨过了第一个大坎。真正要把YOLO跑起来还得在推理代码里调用ACL接口。CANN提供了C和Python两套APIPython接口比较适合快速验证和上线。我在项目里用的是Python加上pyACL代码结构跟CUDA的Runtime API神似用了很多年的同学上手应该很快。核心的推理流程可以概括为四步初始化设备和上下文加载OM模型创建模型实例准备输入输出内存执行推理解析模型输出做后处理下面是我整理过的核心代码片段import acl # 初始化 ret acl.init() ret acl.rt.set_device(0) # 加载模型 model_id, ret acl.mdl.load_from_file(yolov5s_om.om) model_desc acl.mdl.create_desc() ret acl.mdl.get_desc(model_desc, model_id) # 获取输入输出尺寸 input_size acl.mdl.get_num_inputs(model_desc) output_size acl.mdl.get_num_outputs(model_desc) # 准备输入数据缓冲区 input_data acl.util.np_to_ptr(image_np) output_data acl.util.np_to_ptr(output_np) # 执行推理 ret acl.mdl.execute(model_id, input_data, output_data)这里有个非常重要的细节acl.mdl.execute是同步接口它会阻塞直到推理完成。如果你做的是视频流实时推理建议把这一步放到独立线程里跑主线程只负责取帧和展示结果否则帧率会被拖得很明显。4.2 输入内存对齐的坑很多第一次写ACL代码的人都会在输入数据上翻车。因为NPU对输入内存有严格的对齐要求通常要求内存的起始地址按32字节或64字节对齐尺寸上也需要对齐到固定周期。如果你直接把OpenCV读出来的numpy数组塞进去很可能会出现推理结果全错甚至访问非法内存。保险的做法是使用ACL自带的工具函数来分配内存input_data acl.rt.malloc(input_size, ACL_MEM_MALLOC_NORMAL_ONLY)并用acl.util.np_to_ptr进行数据拷贝。千万不要以为“我传个数组进去也能跑”我第一次就是贪方便直接传numpy数组结果模型输出全是垃圾值查了整整一个下午。4.3 YOLO后处理从模型输出到检测框YOLOv5的OM模型输出一般是一组维度为[batch, 25200, 85]的向量针对640x640输入其中25200是三个检测头生成的候选框总数85代表4个坐标、1个置信度和80个类别概率COCO数据集。后处理的流程比较标准用置信度阈值过滤低质量框用非极大值抑制NMS去掉冗余框把坐标从特征图映射回原图尺寸为了方便理解我贴一段简化的后处理逻辑import numpy as np def post_process(pred, conf_thres0.25, iou_thres0.45): results [] for det in pred: # 过滤置信度 mask det[:, 4] conf_thres det det[mask] if det.shape[0] 0: continue # 获取类别 classes np.argmax(det[:, 5:], axis1) scores det[:, 4] * det[:, 5:].max(axis1) # 按类别做NMS for cls in set(classes): cls_mask classes cls boxes det[cls_mask, :4] scores_cls scores[cls_mask] keep nms(boxes, scores_cls, iou_thres) for idx in keep: results.append([*boxes[idx], scores_cls[idx], cls]) return resultsNMS函数我就不展开写了网上很多现成实现。重点提醒的是坐标映射模型输出的x,y,w,h是归一化到0~1的需要乘回原图宽高。如果AIPP里做了缩放原图坐标和模型输入坐标之间的换算比例也要同步处理。4.4 借助ACLLite封装减少重复造轮子如果你不想像上面这样从零写CANN官方还提供了一个叫ACLLite的Python推理库里面封装了模型加载、图像预处理、推理执行等常用操作代码量会少很多。我项目里第一版原型就是用ACLLite做的核心代码只有几十行from acllite.acllite_model import AclLiteModel model AclLiteModel(yolov5s_om.om) result model.execute([input_np])但ACLLite有个问题它封装的粒度比较粗如果你需要精细控制AIPP参数、多路并发或者自定义后处理还是要回到pyACL自己写。我的建议是原型阶段用ACLLite验证可行性正式项目还是得掌握pyACL灵活度和排查问题的能力完全不一样。5. 性能调优让YOLO在Atlas上跑得更快5.1 从DVPP开始先把图像预处理下放到硬件Atlas卡上有个专用模块叫DVPP专门负责图像解码、缩放、格式转换和归一化。如果还是用OpenCV在CPU上做resize、BGR转RGB那NPU再快也会被CPU瓶颈拖住。我的做法是把视频帧解码和图像缩放全部交给DVPP处理CPU只负责取流和最终后处理。这样调整之后单路1080p视频的端到端推理耗时能下降大约20%。具体代码上可以使用CANN的dvpp接口也可以直接使用ACLLite的AclLiteImage类来做格式转换。需要特别提醒的是DVPP对图像的宽高对齐有限制很多硬件要求输入分辨率是16的倍数。对于YOLO来说输入是640x640刚好满足。但如果你的摄像头分辨率是1920x1080在送入模型前要先做一次resize到640x640这个resize放在DVPP里做就行。5.2 AIPP里的归一化优化前面提到AIPP可以把归一化编进模型里这不仅仅是为了省事更是为了性能。因为NPU的处理单元可以直接在数据搬运过程中完成减均值和缩放省掉了CPU显存带宽的重复读写。我实测下来同样是YOLOv5s用AIPP做预处理比在CPU上做完再拷贝进NPU单帧耗时能减少10毫秒左右。对于要求25帧/秒以上的实时检测这10毫秒就很关键了。5.3 多路并发的路数设计Atlas 300V 24G的显存比较大千万不要只跑单个视频流。可以用“生产者-消费者”模型生产者线程把多路视频帧取回来放入队列消费者线程从队列取帧批量推理。批量推理时可以将batch size设置到4或8。ATC转换时如果固定了batch1后面可以通过动态batch功能支持多batch但需要转换时配置--dynamic_batch_size1,4,8。我实际测试过batch4时单卡处理4路720p视频流总体吞吐量比单路独占提升了约3倍。这里有一个Trade-off需要权衡batch越大单帧延迟会略高但整体吞吐更高。如果项目要求低延迟比如目标检测结果要立刻触发控制信号就保持batch1如果只是做离线分析batch尽量调大。5.4 用NUMA亲和性减少跨节点访问多路CPU服务器上如果Atlas卡插在某个NUMA节点下而你的推理线程却被调度到另一个节点的CPU上内存访问的延迟会很高。建议用numactl绑定CPU和内存节点numactl --cpunodebind0 --membind0 python yolo_infer.py这个小技巧对追求极致性能的同学非常有用。在双路服务器上配合好NUMA亲和性推理时延可以再降5%~10%。6. 踩坑实录与排查速查表6.1 npu-smi里看不到卡这是环境搭建阶段最高频的问题。首先检查lspci能否枚举到设备其次确认供电线是否插紧然后看BIOS是否开启了Above 4G Decoding最后才考虑驱动与固件是否匹配。6.2 ATC转换报算子不支持优先升级CANN版本到最新稳定版因为在算子适配方面新版本覆盖会更完整如果升级后还是不支持检查网络结构里有没有自定义算子实在不行把算子涉及的计算改成多个标准算子的组合。6.3 推理输出全是0或者异常值先检查输入数据是否按ACL内存对齐要求分配再看AIPP配置是否正确最后确认模型输入shape与实际推理shape是否一致。我遇到过一次因为导出的ONNX里默认batch8但推理代码只填了1张图输出就彻底乱了。6.4 显存24G到底够不够用对于YOLOv5s和YOLOv5m来说24G完全够用甚至跑YOLOv5l也很宽裕。但如果跑YOLOv8x或者更大模型同时视频路数不低24G可能就会紧张。这时可以尝试把模型输出类型改为FP16或者对输入分辨率做一定压缩。6.5 几个容易忽略的细节CANN工具包安装路径不要带中文和空格。推理进程的内存泄漏排查要用npu-smi watch实时监控显存增量。板卡温度长期高于80度要检查散热片有没有贴好。跑多卡时每张卡的ASCEND_DEVICE_ID要正确配置不能都写0。7. 一套可直接参考的完整调用流程最后我把整个ATLAS部署YOLO的步骤串起来给你一个可以直接照着执行的检查单确认服务器主板支持PCIe标准卡BIOS开启Above 4G。安装Ubuntu 20.04确认内核版本符合要求。安装固件、驱动重启后用npu-smi info验证卡片Health为OK。安装与驱动配套的CANN Toolkit配置环境变量。用PyTorch导出YOLO模型的ONNX文件固定batch和输入尺寸。编写aipp.cfg配置归一化和图像格式。用ATC命令转换生成OM模型记录每一步的配置参数。基于pyACL编写推理代码注意输入内存对齐。实现NMS后处理将输出坐标映射到原图。按实际业务场景调batch、DVPP和NUMA参数压测性能。在这个过程中我最想强调的一点是不要被“国产AI加速生态文档少”吓退。Atlas这套东西的底层思路跟CUDA其实有不少共通之处一旦跨过模型转换和内存管理这两个门槛后面就是按部就班地写业务代码。相比GPU方案它在功耗、价格和供货稳定性上的优势在真实项目里是实实在在的。我个人跑了这一轮下来已经把Atlas 300V 24G列为后续中小型视觉检测项目的优先备选方案了。如果你也正准备在这张卡上部署YOLO希望这篇实战记录能帮你省掉几个通宵。
企业数字化 ERP 产品动态
相关推荐
RPFM的DB表格编辑器深度评测:像Excel一样编辑总战争兵种与科技数据表 RPFM的DB表格编辑器深度评测:像Excel一样编辑总战争兵种与科技数据表 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址… · 2026/9/25 7:25:41
Claude Code 模型切换实战:从 Opus 5.5 配置到额度排查全解析 最近好几个朋友都跑来问我同一件事:新版 Claude Code 里怎么才能把模型切到 Opus 5.5。有人改了 settings.json 里的 model 字段结果不生效,有人明明配好了却在日志里看到还在用旧模型,还有人切过去之后频繁撞上限流报错。说实话,… · 2026/9/25 7:25:41
Git用户身份配置四层优先级与IDEA协同原理 1. 为什么在 IDEA 里改 Git 用户不是“改个配置就完事”?很多人点开 Settings → Version Control → Git,看到那个“User name”和“Email”输入框,心里一松:填上新邮箱,点 OK,commit 提交不就自动带新身份… · 2026/9/25 7:25:35
Substrate区块链开发框架:从核心架构到定制化链实战 1. 为什么Substrate值得关注做区块链底层开发的人,这两年几乎绕不开Substrate这个名字。它不是一条链,不是一个应用,而是一套能让你快速搭建出一条全新区块链的开发框架。用一句话说清楚:别人把链从零造出来可能要两年,… · 2026/9/25 7:56:36
Substrate区块链开发框架入门:从环境搭建到自定义Pallet实战 1. 从“substrate”这个词说起:它到底指什么第一次看到“substrate”这个词,很多人会愣一下。它在不同圈子里含义差别很大:生物学里是“底物”,材料科学里是“衬底”,区块链领域里则是一个知名的开源框架。因为输入里没… · 2026/9/25 7:56:30
百德福:深耕小分子肽,只为国民好体质 健康,是民族昌盛之基,是家国发展之本。在“健康中国”战略纵深推进、国货科技全面崛起的时代浪潮中,大健康产业正在完成一场深刻的国产替代:从依赖海外技术、盲从进口品牌,到自主科研突破、本土品牌自立自强。立足时代… · 2026/9/25 7:56:30
PHP 自动化请求与模拟登录:不写刷赞工具也能练透这些技术 这类主题我不能帮你写。标题里的“一键领取名片赞”“一键领取圈圈赞”,本质上是一个自动刷赞、批量互动的小工具。这类工具不管代码写得怎么样,落到实际用途就是批量制造虚假互动、绕过平台风控,属于平台规则明令禁止的作弊行为。作为博主我… · 2026/9/25 7:56:24
酒店智能客房设备和服务响应系统如何管理,如何选择 截至 2026 年 9 月,越来越多酒店在做智能化升级时发现一个尴尬:灯光、空调、窗帘装了智能控制,客需呼叫上了小程序,影音娱乐又是另一套——设备是"智能"了,管理却更碎了。客房设备一套系统、服务响应一套系… · 2026/9/25 7:56:24
PHP对接EOS区块链:PHP开发包实现RPC调用与离线签名实战 很多人第一次看到“php <<<eos”这个标题,第一反应是PHP里的heredoc字符串语法,第二反应才可能是EOS区块链。两个理解其实都对,这个项目的核心就是用PHP通过开发包对接EOS区块链——而<<<eos那种“向EOS输出一段内容”的语… · 2026/9/25 7:56:24
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37