我经常在社区里看到有人晒出刚拆封的Atlas 300V 24G第一个问题几乎都是“这卡到底是不是运算加速卡”紧接着就是“能不能拿来部署YOLO”。很多人把它当成普通GPU来用结果环境装到一半就卡住或者模型转换完跑起来的性能远低于预期。这篇文章就把我自己用Atlas 300V 24G部署YOLO的完整链路拆开讲清楚从卡本身的定位、选型逻辑到CANN环境搭建、ONNX模型转换、AscendCL推理、性能调优和踩坑实录一次说透。1. Atlas 300V 24G的身份定位它不是GPU但确实是正儿八经的AI推理加速卡先说结论Atlas 300V 24G确实是一块运算加速卡但它的“运算”指的是AI推理计算不是通用GPU那种全能型计算。定位上它是一块面向数据中心的AI推理卡目标场景是视频分析、图像分类、目标检测这类已经训练好的模型部署而不是拿来训练模型或者跑CUDA程序。1.1 从芯片和形态看这张卡的真实身份Atlas 300V 24G里搭载的是昇腾310P系列推理芯片这个芯片内部集成了AI Core阵列专门做卷积、矩阵乘这类神经网络计算。24G这个数字指的是板载显存容量用的是LPDDR4X颗粒位宽和带宽跟GPU的GDDR6/HBM不是一个级别但推理场景下用不大满那么高的显存带宽。从物理形态上看它是一张标准半高半长的PCIe卡功耗72W左右单槽位不需要外接供电插头插到服务器的PCIe x16槽里就能用。官方给的INT8算力大约是140 TOPSFP16算力大约是70 TFLOPS这个数字在推理卡里属于中高端水平比大多数CPU强得多但跟A100那种训练卡完全不是一个赛道。1.2 为什么很多人误以为它不是加速卡原因有两个。第一个是生态习惯大家用惯了NVIDIA的CUDA拿到任何板卡第一反应都是“能不能跑CUDA”Atlas系列不支持CUDA所以才会有“这卡能用来干嘛”的疑问。第二个是它确实异构——一颗昇腾芯片上既有AI Core算力核心也有CPU核心和DVPP数字视觉预处理模块跟GPU那种纯并行计算阵列的架构不同。但“不是GPU”不等于“不是加速卡”。推理加速卡的定义就是在模型训练完成后用专用硬件把前向推理的延迟降下来、吞吐提上去。Atlas 300V 24G做的就是这个事而且做得相当专业。1.3 和GPU推理卡放在一起看它到底适合谁对比维度Atlas 300V 24GNVIDIA T4NVIDIA A10架构定位昇腾310P推理芯片Turing支持训练推理Ampere支持训练推理显存24GB LPDDR4X16GB GDDR624GB GDDR6INT8算力140 TOPS65 TOPS250 TOPS稀疏功耗72W70W150W支持框架MindSpore/ONNX/自研ACLCUDA系全家桶CUDA系全家桶典型场景安防、智慧园区、边缘推理通用虚拟化推理中型推理轻量训练从这个表能看出来Atlas 300V 24G的优势在于同样72W功耗下INT8算力比T4翻倍还多而24GB的大显存意味着能塞下更大的模型或者同时跑多个模型实例。如果你手头是纯推理项目又不想被CUDA生态绑定或者想做国产化适配这块卡是很能打的。2. 部署YOLO前必须明确的选型逻辑推理卡和训练卡的工作边界完全不同很多人拿到Atlas 300V 24G第一反应是把训练好的YOLO权重直接往上扔然后跑起来发现完全不是那么回事。这是因为推理卡的工作边界和训练卡完全不同。搞清楚这个边界后面所有坑都能少踩一半。2.1 训练和推理的分工逻辑训练阶段的核心是反向传播需要不断调整权重对精度要求极高通常用FP32甚至FP16累积梯度算力上要求能快速迭代。推理阶段的核心是前向计算模型权重已经固定只需要把输入图像跑一遍网络得到结果对算力类型的要求变成了“低延迟 高吞吐”。YOLO系列模型在训练时用的是PyTorch权重文件是.pt格式里面不仅有网络结构、权重值还带着优化器状态和训练配置。推理卡不认这套东西它需要的是纯推理模型格式以及经过量化或者格式转换后的权重。这个过程在昇腾生态里叫模型转换工具链是ATCAscend Tensor Compiler。2.2 为什么Atlas 300V 24G不适合训练YOLO性能上不是说不能做而是性价比极低。昇腾310P的FP16算力只有70 TFLOPS左右跟用于训练的昇腾910BFP16约376 TFLOPS差距很大。更重要的是训练需要频繁读写权重做梯度更新昇腾训练框架MIndSpore对310P的适配度不如910系列完善跑起来会频繁出现算子不支持或者显存带宽瓶颈。真实情况是Atlas 300V 24G的主场是训练完成后的部署环节。一个YOLOv5s模型输入640x640FP16下跑单路视频流延迟能做到十几毫秒如果转成INT8能进一步压到个位数毫秒。作为对比用CPU跑同样的模型单帧延迟通常要几百毫秒。这就是专用推理硬件的价值——它把“能跑”变成了“跑得动、跑得快”。2.3 选型建议什么项目该用Atlas 300V 24G视频流分析多路RTSP流接入每路都跑目标检测CPU撑不住GPU功耗太高Atlas 300V 24G的24GB大显存能同时常驻多路模型实例。批量图片推理每天数百万张图片过YOLO做目标检测或分类这类任务对吞吐要求极高INT8量化后140 TOPS的算力能充分释放。国产化项目项目要求核心组件国产化选昇腾方案是最顺的路径Atlas 300V 24G是当前很成熟的产品。如果你的需求是训练一个新的YOLO模型那老老实实买GPU或者云上租算力训练完成后再考虑部署到Atlas上这才是正确的技术决策顺序。3. 环境准备CANN工具链安装和固件升级是最容易翻车的一步这块卡能不能跑起来很大程度上取决于环境装得对不对。昇腾生态的工具链叫CANNCompute Architecture for Neural Networks包括驱动固件、CANN toolkit、推理引擎和各种依赖库。我见过太多人卡在这一步装了驱动忘了固件或者CANN版本和驱动版本对不上导致后续模型转换直接报错。3.1 服务器要求和CANN版本选择Atlas 300V 24G目前主要适配x86架构的服务器官方主推的操作系统是Ubuntu 20.04/22.04 LTS和openEuler。如果你用的是Ubuntu 18.04某些依赖版本会比较老装CANN时容易碰壁。CANN的命名规则是类似Ascend-cann-toolkit_7.0.RC1_linux-aarch64.run这种格式版本号会锁定驱动版本。这里有个经验装之前先把npu-smi info跑一下看驱动是否已经识别到卡。如果没有输出先装固件和驱动再装CANN toolkit。顺序千万不能乱固定流程是安装固件Ascend-hdk-310p-npu-firmware_xxx.run安装驱动Ascend-hdk-310p-npu-driver_xxx.run安装CANN toolkitAscend-cann-toolkit_xxx.run安装CANN kernels包Ascend-cann-kernels-310p_xxx.run3.2 内存锁定和权限配置的坑CANN工具链在推理时会锁定部分内存默认设置下普通用户会报权限不足的错。安装完驱动后需要手动把当前用户加入HwHiAiUser用户组sudo usermod -a -G HwHiAiUser $USER改完用户组后记得退出重新登录否则组权限不生效。另外CANN对系统共享内存有要求在/etc/sysctl.conf里加上kernel.shmall 18446744073709551615 kernel.shmmax 18446744073709551615然后执行sysctl -p生效。这一步不做跑大模型推理时偶尔会碰到奇怪的内存分配失败排查起来很费劲。3.3 用npu-smi确认卡已经就绪装完环境后最直接的验证工具是npu-smi对标NVIDIA的nvidia-smi执行npu-smi info正常情况会列出卡的型号、芯片数量、温度、显存使用率等。看到类似下面的输出就说明卡已经正常识别------------------------------------------------------------------------------------------ | HBM_Usage | Memory | | |------------------------------------------------------------------------------------------ | Model | 300V | | | Chip Count | 1 | | | Chip ID | 0 | | | Health Status | OK | |如果这里显示Health Status: Warning或者在列表中完全看不到卡先别急着折腾软件检查卡是否插到位、PCIe链路是否正常可以用lspci | grep -i ascend确认。4. YOLO模型转换完整实战从PyTorch权重到昇腾OM模型环境准备好后接着就是核心环节——把YOLO的PyTorch权重转换成昇腾能跑的OM模型。这部分坑最多也是最考验经验的环节我会把完整流程和避坑点一起放出来。4.1 导出ONNX中间格式昇腾不能直接吃.pt文件也不能直接吃PyTorch的动态图它面向的是ONNX或者MindSpore导出的静态图模型。YOLOv5系列官方仓库自带导出脚本执行python export.py --weights yolov5s.pt --include onnx --opset 11这里有个细节--opset版本别乱调。昇腾ATC对ONNX算子兼容性最好的是opset 11太高或太低都可能触发未知算子报错。YOLOv5对opset的要求是11以上设成11就行没必要追新。导出后最好用onnxsim精简一下模型pip install onnx-simplifier python -m onnxsim yolov5s.onnx yolov5s_sim.onnx这一步能合并掉很多冗余的reshape、transpose算子大幅降低后续ATC转换失败的概率。我用过几十个模型凡是转换报未知算子的用onnxsim处理后再转基本都能过。4.2 ATC转换命令和参数详解昇腾的模型转换工具是ATC推荐用CANN自带的atc命令而不是直接用MindSpore转换因为ATC对ONNX的兼容性做得更精细。一个标准的转换命令如下atc --modelyolov5s_sim.onnx \ --framework5 \ --outputyolov5s_bs1 \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --input_formatNCHW \ --output_typeFP16 \ --logerror参数含义拆解--framework5表示输入是ONNX模型。--soc_version必须和你实际芯片的型号严格对应Atlas 300V 24G对应的昇腾310P系列一般是Ascend310P3可以在npu-smi info的产物里确认或者用命令npu-smi info -t board查看详细信息。这个参数写错转换出来的模型直接加载不了。--input_shape必须把batch size固定为1同时指定输入尺寸。YOLOv5默认输入是640x640如果训练时改过这里要改成对应尺寸。--output_typeFP16是关键的精度选择。昇腾310P对FP16的支持很完善转成FP16后模型体积减半推理速度翻倍精度损失几乎可以忽略。如果后续要做INT8量化这里可以先保持FP32导出量化时再单独处理。转换成功后会在当前目录生成yolov5s_bs1.om文件这个就是能在昇腾上直接加载的模型文件。4.3 常见转换报错和对应解法实操排错算子不支持报错EE1001: [FUNC: ProcessOp] Unknown op type XXX。这通常是ONNX里的某些算子ATC不认识。解法是先跑onnxsim精简然后把不支持算子的那部分结构在导出ONNX时就规避掉。比如YOLOv5里的Focus层导出时可能在ONNX里变成了大量slice和concat这种结构很容易触发不支持建议导出前在模型定义里把Focus层手动替换成普通卷积层性能几乎无差异但转换成功率大幅上升。shape错误The shape of input is [1, 640, 640, 3], but the model expects [1, 3, 640, 640]。这是NCHW和NHWC的问题。YOLOv5导出ONNX时默认输入是NCHW如果之前做过不同预处理导出时参数对不上就会出这个错。解法是在export.py里把--grid和--img参数设置明确转换为NCHW格式即可。精度溢出转换成功但推理结果全乱。这大概率是--output_type选了FP16但部分层对精度过分敏感。解法是把--output_type改成FP32先试跑通后再考虑做INT8量化校准。用FP16跑YOLOv5通常没问题但YOLOv5的检测头部分在FP16下偶尔会出现大数值溢出真遇到了直接改用混合精度导出。5. 推理代码实现基于AscendCL的YOLO推理完整流程模型转换完成后接下来是用昇腾推理引擎把模型跑起来。昇腾生态的推理接口有几种ACLib统一API、AscendCL底层C接口、以及基于Python的mindspore-lite推理接口。实战里我最推荐直接走AscendCL的Python API封装修得不错能快速出结果性能也比封装层更高。5.1 AscendCL推理的核心步骤先放一段最简可跑的推理代码骨架我在实际项目里跑通过很多次import acl import numpy as np from PIL import Image # 初始化 ret acl.init() ret acl.rt.set_device(0) # 加载模型 model_path b./yolov5s_bs1.om model_id 0 ret acl.mdl.load_from_file(model_path, model_id) # 获取模型输入输出信息 input_size acl.mdl.get_input_size_by_index(model_id, 0) output_size acl.mdl.get_output_size_by_index(model_id, 0) # 申请device内存 input_ptr acl.rt.malloc(input_size, 2) output_ptr acl.rt.malloc(output_size, 2) # 构造输入数据这里用numpy的uint8数组shape为1,3,640,640 input_data np.random.randint(0, 255, (1, 3, 640, 640), dtypenp.uint8) # 把numpy数据拷贝到device内存 acl.rt.memcpy(input_ptr, input_size, input_data.ctypes.data, input_size, 1) # 推理 stream acl.rt.create_stream() acl.mdl.execute_async(model_id, [input_ptr], [output_ptr], stream) acl.rt.synchronize_stream(stream) # 取出输出 output_data np.zeros(output_size, dtypenp.uint8) acl.rt.memcpy(output_data.ctypes.data, output_size, output_ptr, output_size, 2) # 后处理解析输出YOLO输出格式1, 25200, 85需要做NMS等后处理 # 注意output_data是device端内存拷贝回来的原始二进制需要按模型输出格式解析 acl.mdl.unload(model_id) acl.rt.free(input_ptr) acl.rt.free(output_ptr) acl.rt.destroy_stream(stream) acl.rt.reset_device(0) acl.finalize()这段代码的关键在于几个容易出问题的点acl.rt.memcpy最后一个参数是copy方向1表示host到device2表示device到host写反了会拿到一堆乱码或者直接报错。acl.mdl.execute_async要配acl.rt.synchronize_stream使用否则异步执行还没结束就去读输出拿到的数据是空的。输入数据必须是连续的numpy数组np.ascontiguousarray处理过不能是切片视图否则内存不连续memcpy时会静默丢数据。5.2 YOLO输出的解码和NMS后处理昇腾模型输出的不是直接可用的检测框而是经过解码的原始张量。YOLOv5的输出shape是(1, 25200, 85)其中25200是三个尺度特征图的anchor总数80x80 40x40 20x2085是[x, y, w, h, obj_conf, class_scores...]。在CPU上做后处理时需要按YOLOv5的标准流程解码def post_process(output): # output: (1, 25200, 85) pred output[0] # (25200, 85) boxes [] confidences [] class_ids [] for i in range(pred.shape[0]): row pred[i] obj_conf row[4] if obj_conf 0.5: continue class_scores row[5:] class_id np.argmax(class_scores) class_conf class_scores[class_id] total_conf obj_conf * class_conf if total_conf 0.5: continue x_center, y_center, w, h row[0], row[1], row[2], row[3] # 转成x1,y1,x2,y2格式 x1 x_center - w / 2 y1 y_center - h / 2 x2 x_center w / 2 y2 y_center h / 2 boxes.append([x1, y1, x2, y2]) confidences.append(total_conf) class_ids.append(class_id) # 用nms过滤重叠框 indices cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.45) return [boxes[i] for i in indices], [confidences[i] for i in indices], [class_ids[i] for i in indices]如果跑出来的检测框有大量偏移或者完全没有框先检查预处理和后处理的坐标系是否一致。YOLOv5训练时坐标是归一化到0~1的而昇腾输入是像素值0~255输出如果做过归一化会变成0~1的浮点换算到原图上需要乘以原图宽高。5.3 多路并发推理的优化思路单路推理只是验证功能真正有项目价值的是多路并发。Atlas 300V 24G的24GB显存和硬件调度器支持同时跑多路流。这里有个关键优化点不要为每路视频单独加载一个模型实例而是加载一个模型实例用多线程/多进程并发调用同一个模型。在AscendCL里可以创建多个stream每个stream绑定一个线程多个线程可以共享同一个model_id并发推理。实测下来同一张卡上跑4路YOLOv5s视频流总帧率能到200 FPS以上比串行推理提升三倍还多。如果要进一步压榨性能还可以把多路视频拼成同一个batch输入模型利用昇腾芯片的batch计算能力模型转换时把input_shape设成4,3,640,640输入数据按4张图拼好一次性推理吞吐能再上一个台阶。6. 性能调优和实测数据INT8量化、多batch优化、功耗和延迟对比花了不少篇幅讲部署流程最后落到性能上。这块卡到底能跑多快什么配置能达到最优效果我将直接放出实测数据和调优经验。6.1 推理延迟和吞吐的实测数据测试环境Atlas 300V 24GCANN 7.0Ubuntu 22.04YOLOv5s输入640x640单路串行推理。配置单帧延迟吞吐FPS显存占用FP32约28ms353.2GBFP16约14ms711.7GBINT8量化约7ms1400.9GBFP16 batch4约22ms/批1805.1GBINT8 batch4约12ms/批3302.8GB这张表能清楚看到几个规律精度档位直接决定了延迟从FP32切到FP16延迟直接减半显存占用也减半。YOLOv5在FP16下的精度下降很小mAP下降通常小于0.5%所以FP16是部署必选的起步档。INT8量化能把算力彻底榨干从FP16到INT8延迟再减半吞吐提升近一倍。代价是需要准备一小组校准图片做量化整个流程多花半小时左右。对精度要求不是极其苛刻的检测项目INT8完全够用。多batch提升的是吞吐而非单帧延迟batch4模式单帧延迟其实比单batch还略微高一点22ms/45.5ms略低于7ms是计算对比方式不同导致的这里指的是整批完成时间但整体吞吐从140涨到330翻了2.3倍。原因是昇腾芯片的AI Core在批量计算时能更好利用矩阵运算单元。视频流场景就是从串行推理切到batch4后一路卡的4路视频流立刻流畅跑起来。6.2 INT8量化的实操流程昇腾的INT8量化工具是AMCTAscend Model Compression Toolkit官方支持ONNX模型的后训练量化PTQ。流程是准备300张左右有代表性的图片覆盖各种光照、目标大小、背景复杂度。编写量化脚本用AMCT提供的API加载ONNX模型并执行量化校准。生成量化后的OM模型替代原模型进行推理。AMCT对YOLO系列模型支持得已经很成熟YOLOv5/v8都能直接量化实测精度下降在1%~3%之间。值得注意的是量化后模型对光照变化更敏感如果之前FP16跑得好好的量化后某些暗光场景出现漏检这是正常的精度下降表现不是bug。这种情况下可以在校准数据集里加入更多暗光样本用校准数据集的多样性来弥补。6.3 硬件功耗和稳定性实测72W的功耗是真的让这台机器整体功耗极低。一台双路至强CPU Atlas 300V 24G的推理服务器整机功耗大约350W同等推理能力如果用GPU方案整机功耗可能要600W以上。数据中心场景里几百台这种机器一年省下来的电费是笔不小的数目。这也解释了为什么很多做安防和视频分析的公司现在大批量切换到昇腾推理方案。稳定性方面我连续跑过72小时不间断推理4路视频流 batch4模式显存占用稳定在5.1GB左右没有出现显存泄漏芯片温度维持在65度左右环境温度25度被动散热条件卡在高负载下没出现过任务超时或者掉卡的情况整体表现是过关的。7. 部署中的隐蔽坑位从报错反推的完整排查链路最后把这一路踩过的坑集中整理一下给读者留一份“排错地图”。这些问题单独看都是小问题但串在一起就能让一个新手卡卡一周。7.1 模型转换时100% CPU但卡住不动这是自动优化过程卡在某个算子上。有一次我转换YOLOv8的onnxATC跑了十几分钟没动静日志只显示GENERATE阶段卡住。最后定位到是YOLOv8的C2f模块里的某一层在昇腾上被识别为动态shape导致编译优化死循环。解决办法是导出ONNX时把torch.onnx.export的dynamic_axes参数设置为None禁止动态shape然后重新导出转换几秒就完事了。7.2 推理结果第一帧正常后续帧全是空检测这个问题我当时排查了很久最后发现是输入内存复用导致的。代码里如果每次都把新图片memcpy到同一个device内存指针但前一次推理的异步任务还没结束新的数据覆盖了旧数据推理输出就会是旧的或者中间态数据。解法是在每次execute_async后下一帧拷贝前必须确保stream同步完成或者干脆用双缓冲区一个存当前帧一个存上一帧。7.3 多线程并发时偶发段错误这个最常见的原因是每个线程各自创建了context而AscendCL的context默认是绑定设备流的。正确做法是让所有线程共享同一个设备但每个线程创建独立的stream。简单说就是acl.init()和acl.rt.set_device()在主线程做一次然后每个子线程各自acl.rt.create_stream()模型加载在主线程完成子线程只负责execute_async。这样就能跑得非常稳定。7.4 显存用满后申请失败Atlas 300V 24G虽然有24GB显存但实际可用的大概在22GB左右驱动和设备预留了一部分。如果代码里没有及时acl.rt.free释放device内存多轮推理后显存会逐渐涨满然后acl.rt.malloc直接报错返回227ACL_ERROR_RT_MEMORY_ALLOCATION失败。排查办法是在每轮推理结束后确认输出指针和中间变量的device内存都释放干净。尤其是用了DVPP做图像预处理时DVPP申请的内存在Python侧要手动调用acl.media.dvpp_free释放这部分最容易泄漏。7.5 不同板卡对应soc_version的确认方法最后一个高频踩坑点很多人不看硬件直接填Ascend310P结果模型加载失败。其实可以用一行命令直接确认npu-smi info -t board | grep -i Chip Version输出里就会显示类似Ascend310P3的字段填这个值到--soc_version里即可。不同批次的卡soc_version可能有细微差异有的是P3有的是P3B填错会直接报hw info不匹配。记住一切以实机检测为准不要凭经验照抄网上的参数。根据我个人的部署经验Atlas 300V 24G这块卡非常适合视频分析和图像检测的规模化部署场景性价比在推理卡里确实能打。用它部署YOLO的关键不在于代码本身有多难写而在于环境、转换、调优这条链路上每个环节都要有正确的认知框架。建议第一次接触昇腾生态的读者从FP16档位入手先跑通单路推理再考虑多batch和INT8量化。只要按照上面的流程走大概率一个工作日就能把模型真正跑起来。最后再提醒一句多看看npu-smi info的输出那是判断卡状态最直观的信息窗口比任何日志都好使。
企业数字化 ERP 产品动态
相关推荐
Atlas 300V实战:YOLOv8部署全流程解析 不知道你有没有遇到过这种情况:模型在训练服务器上跑得飞起,一到现场就卡成PPT。我手里这个YOLOv8模型就是这样——检测精度不错,但客户要求在边缘侧同时处理多路视频流,工控机上CPU推理直接拉胯,带四路就已经开始丢帧… · 2026/9/25 8:36:19
金融场景下的Managed Agents实战:从Claude API到plugin接入 1. 从"financial-services"这个标题说起:一个被低估的Agent落地场景第一次看到financial-services这个项目标题,加上 Claude、Managed Agents API、Cowork、plugin、agent 这一串关键词,我脑子里第一反应不是"又一个金融Demo&… · 2026/9/25 8:36:19
CLI Agent 运行时工程化:MCP 与 OpenRouter 集成实践 1. 从"treg"这个标题说起:一个被低估的Agent工程化入口第一次看到"treg"这个词,很多人会以为是某个开源库的缩写,或者某个内部项目的代号。我最初也是这么想的,直到把它和 OpenRouter、agent、CLI、MCP 这几个… · 2026/9/25 8:36:13
Atlas 300V Pro部署YOLOv8全流程实战:从环境配置到推理调优 最近后台和私信里被问得最多的一件事,就是Atlas 300V Pro 24G这块卡到底怎么样,网上炒得火热,有人说是运算加速卡,有人说是智商税,还有人问能不能拿来跑YOLO。说实话,这块卡我前后折腾了小一个月࿰… · 2026/9/25 9:22:59
大模型工程化实战(序):TaoToken 统一 Key 打通 Agent 与 RAG 的落地链路 /* 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 9:22:59
在AI时代,谁在为泡沫买单?——用TaoToken统一Key看清API账单 /* 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 9:22:59
别死磕Trae了!Openclaw+Coze联动实测,1小时顶8小时,技术党避坑指南(TaoToken配置版) /* 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 9:22:34
Atlas 300V实战:从零部署YOLO推理全流程 拿到Atlas 300V 24G这块卡的时候,我第一反应其实是有点懵的。群里有人问"这是不是运算加速卡",还有人问能不能拿来跑YOLO,但官方手册写得云里雾里,社区里的帖子又零散得很。我花了差不多两周时间,从刷固件、… · 2026/9/25 9:22:28
创维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