news 2026/9/25 7:39:23

Atlas 300V Pro上部署YOLOv5:CANN环境搭建与模型转换全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Atlas 300V Pro上部署YOLOv5:CANN环境搭建与模型转换全攻略

团队上个月拿到一块Atlas 300V Pro 24G的时候,群里第一个问题是:“这卡能拿来跑YOLO吗?”第二个问题是:“它到底算不算运算加速卡?还是说只是个视频解码器?”这两个问题看起来简单,但真要把环境搭起来、把模型跑起来,中间涉及的CANN生态、模型转换、AscendCL编程,每一步都能让人卡上好几天。

这篇文章就围绕我自己在Atlas 300V Pro 24G上部署YOLOv5的实际经历来写,把硬件选型逻辑、环境搭建、模型转换到推理调优的完整链路都过一遍,最后附上我踩过的坑。如果你手头正好有Atlas系列设备,或者正在纠结要不要入手,这篇应该能帮你少走不少弯路。

1. Atlas到底是不是“运算加速卡”:型号谱系与芯片架构认知

先说结论:Atlas 300V Pro 24G确实是一块运算加速卡,但它不是像NVIDIA那样“什么都能算”的通用GPU,而是针对AI推理场景做了专门优化的NPU加速卡。这个区别决定了后面所有部署方案的走向。

1.1 昇腾芯片与Atlas产品线的对应关系

华为的AI硬件产品线,核心芯片是昇腾(Ascend)系列,目前市面上能见到的Atlas设备基本都是基于昇腾310和昇腾910两颗芯片来的。

昇腾310定位是低功耗推理芯片,8W到几十瓦的功耗区间,常见于边缘计算盒子、加速卡;昇腾910定位是训练芯片,性能强,功耗也高,主要用于训练服务器。Atlas 300系列推理卡、Atlas 200/300系列开发套件,多数走昇腾310;Atlas 800/900训练服务器走昇腾910。

Atlas 300V Pro 24G用的是昇腾310P,属于昇腾310的增强版本,把视频编解码能力和AI算力做在了一起,所以很多人会误以为它是“视频卡”。实际上它的全称是AI加速卡,视频能力只是附带的强项,核心计算单元还是为神经网络推理服务的。

1.2 Atlas 300V Pro 24G的真实定位与参数

这块卡我在部署前后查了很多资料,结合我自己实测,先放一份关键参数对比。注意这里不同批次固件可能有差异,以官方规格书为准。

参数项Atlas 300V Pro 24GAtlas 300I Pro (对比)说明
芯片昇腾310P昇腾310P同代芯片
显存24GB LPDDR4X24GB/48GB300V Pro统一24G
AI算力约140 TOPS INT8约140 TOPS INT8不同资料有出入,按实际固件为准
视频解码支持,多路H.264/H.265不支持或弱化这是300V和300I最大的区别
形态PCIe全高全长PCIe全高全长标准服务器显卡尺寸
功耗约72W约72W不需要外接供电,这点很方便

所以回答热搜那个问题:Atlas 300V 24G是运算加速卡,不是单纯的视频卡。只不过它把视频编解码单元也集成进去了,在智能安防、视频分析场景下特别吃香,正因为如此,很多人会误以为它只是视频处理设备。

1.3 买卡之前必须想清楚的一件事:你的负载是“视频流”还是“小图批处理”

我在部署过程中慢慢意识到一个问题:Atlas 300V Pro和NVIDIA GPU的“脾气”很不一样,它更挑数据形态。

如果你的业务是“摄像头拉流 -> 视频解码 -> 逐帧推理”,那300V Pro 24G是性价比很高的选择,因为它自带硬件解码单元,能从RTSP流直接解码成YUV数据喂给NPU,省掉CPU软解的负担。这条路我后来用MindX SDK跑通过,整体链路非常顺。

但如果你只是“一堆图片丢进去做批量检测”,那24G显存其实很难吃满。因为NPU的张量计算单元和显存带宽设计更偏向流式小图(比如1080P及以下),单张超大图(比如8K)或者超大batch反而不是昇腾310P的强项,性能和显存利用率都会打折。

这个判断直接影响部署架构:视频流场景优先用MindX SDK的pipeline方式;纯图片批处理场景用AscendCL会更灵活。

2. 部署YOLO前必须搞懂的CANN生态:驱动、固件、推理框架三层

把Atlas设备当成GPU来用,第一步就会碰壁。NVIDIA装个驱动就能跑CUDA,但昇腾这边要装的是CANN(Compute Architecture for Neural Networks),它包含的东西比驱动多得多,分层也更清晰。

2.1 三种安装包:HDK、NNAE、Toolkit各自干什么

我一开始看到官网下载页面有三个大块,整个人是懵的。后来实际装了两遍才彻底理顺。简单说:

  • HDK(Hardware Development Kit):包含驱动和固件。驱动是操作系统识别PCIe设备的底层软件,固件是设备本身运行的固件程序。这一层必须先装,不装的话npu-smi都跑不起来。
  • NNAE(Neural Network Acceleration Engine):算子是NPU执行计算的最小单元,NNAE就是算子库。没有它,模型转换和推理都会报算子不支持的错。
  • Toolkit(Ascend Toolkit):开发套件,包含ATC模型转换工具、AscendCL运行时、调试工具等。开发者做模型转换和推理编程主要跟这一层打交道。

对应到实际安装顺序,就是“驱动/固件 -> 算子库 -> 开发套件”,一层一层往上叠。我见过不少人在论坛说“CANN装好了但跑不了模型”,绝大多数情况是NNAE没装或者版本和Toolkit不匹配。

2.2 开发机还是板卡的形态差异

Atlas设备分两种形态:插在x86服务器里的PCIe加速卡,以及昇腾自带CPU的模组(比如Atlas 200DK这种开发板)。两种形态的部署方式完全不同。

PCIe卡形态下,你的宿主机还是普通服务器,装好驱动后,NPU是作为一个PCIe设备存在的,Python/C++代码在宿主机上跑,通过AscendCL API把计算任务下发到NPU。Atlas 200DK这种板卡形态则相反,NPU和CPU在一个板子上,你直接在板子上交叉编译、运行程序,更像一台嵌入式AI计算机。

我们用的是PCIe形态,所以下文讲的都是这种部署方式。如果你用的是板卡形态,安装包会换成对应的mini版本,原理类似,但路径和包名差异较大,可以官方文档为准。

2.3 验证环境是否装好:npu-smi信息解读

装完HDK后,第一时间在终端敲:

npu-smi info

正常情况下能看到类似这样的输出:

+------------------------------------------------------------------------------------------------+ | npu-smi 22.0.0 Version: 22.0.0 | +-------------------+-----------------+------------------------------------------------------+ | NPU Name | Health | Power | Temp | Hugepages | | Chip Device | Bus-Id | AICore | Memory-Usage | | +===================+=================+======================================================+ | 0 310P | OK | 38.5W | 54°C | 0 / 0 | | 0 0 | 00000000:01:00.0| Active | 1234MiB / 24576MiB| | +-------------------+-----------------+------------------------------------------------------+

重点关注几列:

  • Health状态是OK,说明驱动和固件工作正常。
  • Memory-Usage显示当前占用,如果程序跑完退出后占用还居高不下,说明有进程没释放,后面要排查。
  • AICore是Active,说明NPU计算核心已就绪。

我第一次装的时候,npu-smi info能正常显示,但一调用AscendCL就报设备初始化失败,后来排查发现是固件版本比驱动旧,重启后系统加载的还是旧固件。驱动和固件版本必须严格匹配,这是安装阶段最容易埋雷的点。官方文档里有版本配套表,最好按表格里的推荐组合来。

3. YOLO模型从PyTorch到OM的转换全流程

环境装好之后,接下来就是模型侧的工作。PyTorch训练的YOLO权重不能直接扔给NPU跑,昇腾的推理引擎只认自家的**OM(Offline Model)**格式,所以需要先把模型转成ONNX,再用CANN的ATC工具转成OM。

3.1 导出ONNX时容易埋雷的设置

如果你用的是官方YOLOv5仓库,导出ONNX的命令一般是:

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

这里有三个细节直接影响后续ATC转换:

  • opset版本选11。我试过opset 13、17导出的模型,ATC转换时偶尔会遇到某些算子不识别的问题,opset 11是最稳的。
  • 导出后要检查输出节点。YOLOv5的ONNX输出通常是三个尺度的feature map,形状类似[1, 255, 80, 80]、[1, 255, 40, 40]、[1, 255, 20, 20]。后面后处理要自己接,所以转换前想清楚是输出原始feature map还是已经decode好的框。YOLOv5默认输出decode后的结果,但昇腾上更推荐输出原始张量,把decode和后处理放到CPU端做,方便后续调优。
  • 动态轴问题。默认导出的ONNX是静态batch=1,如果后续想用多batch推理,需要在导出时把batch维度设为动态。这个后面第3.2节会展开讲。

导出完成后用onnxsim或其他工具验证一下模型能否正常加载:

python -c "import onnx; m = onnx.load('yolov5s.onnx'); onnx.checker.check_model(m); print('OK')"

这一步很快,能在进ATC之前筛掉一批模型结构问题。

3.2 ATC转换的核心参数:input_format、dynamic batch、AIPP

ATC工具是CANN里最常用的模型转换工具,路径通常在CANN安装目录下的bin/atc。我用的典型转换命令如下:

atc --model=yolov5s.onnx \ --framework=5 \ --output=yolov5s_bs1 \ --soc_version=Ascend310P3 \ --input_shape="images:1,3,640,640" \ --input_format=NCHW \ --output_type=FP16 \ --insert_op_conf=aipp.cfg

拆开解释:

  • --framework=5表示ONNX。
  • --soc_version=Ascend310P3是昇腾310P对应的SoC版本号。这里要注意,310P有多个小版本(P1/P2/P3),填错了ATC会直接报错。查询方式是npu-smi info看Name列,或者用ascend-dmi工具查询,我的卡对应的是Ascend310P3。
  • --input_shape="images:1,3,640,640"显式指定输入张量形状。这里还有个坑:ONNX模型的输入名不一定叫images,要看导出时怎么命名的,可以用onnx.load后打印graph.input查看。
  • --input_format=NCHW指定输入排布格式。CANN的NPU内部对NHWC更友好,但如果不是为了极致性能,NCHW也够用。
  • --output_type=FP16可以减小模型体积、提升推理速度,代价是精度轻微下降。YOLO这种目标检测任务,FP16的掉点通常可以忽略。
  • --insert_op_conf=aipp.cfg用来配置图像预处理(AIPP),把归一化、Resize等操作下沉到NPU上。这个配置写得好不好,直接影响预处理耗时和精度一致性。

我的aipp.cfg长这样:

aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_h: 640 src_image_size_w: 640 csc_switch: false rbuv_swap_switch: false 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 }

这里的关键是var_reci_chn,它的值是1/255,因为YOLOv5训练时归一化用的就是除以255。不少人在这一步填错成0.5或者其他值,导致推理结果框的位置对但置信度全乱。

3.3 转换成功的判断标准与常见报错

转换成功的标志是生成.om文件,同时终端输出RESULT: Success。我积累的常见报错大致有这几类:

报错现象原因解决方案
E40001: Input shape is inconsistentONNX动态维度没固定补全--input_shape,把所有维度都写死
E10001: Unknown op type某个算子在CANN版本里不支持换opset版本重新导出ONNX,或换更新版本的CANN
E19999: Soc version not supportedsoc_version填错npu-smi info查询实际SoC版本后重填
转换成功但推理结果全0AIPP配置与训练前处理不一致检查归一化系数、通道顺序、Resize方式

我的建议是:第一次转换尽量用官方YOLOv5不带任何魔改的结构,最省心。如果加了自定义模块(比如注意力机制、自定义NMS),就要逐个检查新增算子在ATC里的支持情况,这块只能用穷举办法,把不支持的算子替换成等价实现。

4. 用AscendCL手写推理程序:从申请context到拿到框

OM模型转换好了,接下来就是写推理程序。昇腾推理有两种主流路径:一种是走MindX SDK的pipeline,配置化程度高,适合视频流;另一种是直接用AscendCL API手写,自由度高,适合深入研究。我先说手写这条路,因为只有理解了AscendCL的执行流程,后面遇到问题才知道去哪查。

4.1 初始化流程的五步

AscendCL的推理代码结构其实很固定,核心就是五个步骤,这里用Python的pyACL接口来演示:

import acl # 1. 初始化 ret = acl.init() assert ret == 0, f"acl.init failed, ret={ret}" # 2. 设置设备 ret = acl.rt.set_device(0) assert ret == 0, f"set_device failed, ret={ret}" # 3. 创建context context, ret = acl.rt.create_context(0) assert ret == 0, f"create_context failed, ret={ret}" # 4. 加载模型 model_id, ret = acl.mdl.load_from_file("yolov5s_bs1.om") assert ret == 0, f"load model failed, ret={ret}" # 5. 创建输入输出数据集 input_dataset, output_dataset = create_dataset(model_id)

这个流程和CUDA很像:init对应cudaFree(0)之类的全局初始化,set_device对应cudaSetDevice,create_context对应创建CUDA context,load模型对应cuModuleLoad。如果你有CUDA编程经验,这套东西上手很快。

有个小细节:Python接口(pyACL)里acl.init()和acl.rt.set_device(0)的顺序不能反,否则会报错acl.rt.set_device failed with error code 500002。我第一次就栽在这。

4.2 数据从CPU到NPU的搬运

AscendCL里没有像cudaMemcpy那样直白的API,输入数据是放在一个叫acl_data_buffer的结构里的。搬运逻辑大致是:

# 获取输入buffer的地址 input_buffer = acl.mdl.get_dataset_buffer(input_dataset, 0) data_buffer, ret = acl.mdl.get_data_buffer(input_buffer) addr = acl.util.bytes_to_ptr(data_buffer) # 把numpy图像数据拷贝到buffer acl.rt.memcpy(addr, nbytes, img_ptr, nbytes, ACL_MEMCPY_DEVICE_TO_DEVICE)

这里有个容易搞混的概念:ACL_MEMCPY_DEVICE_TO_DEVICE看起来像是“设备到设备”,但实际上你的图像数据先通过np.ndarray的ctypes.data拿到内存指针,再通过acl.util.numpy_to_ptr转成ACL认识的指针,最终本质上还是“CPU数据到设备内存”的拷贝。命名有点反直觉,别被API名字误导了。

图像预处理方面,如果已经配置了AIPP,那么送入NPU的输入直接是原始BGR/JPEG数据,NPU内部会做Resize和归一化。如果没有AIPP,就得自己在CPU端把图像resize到640x640,转成float32并归一化,再拷进去。实测下来,用AIPP的预处理耗时基本可以忽略,而CPU端自己处理每张图要增加3-5毫秒。所以在转换阶段配置好AIPP,收益非常明显。

4.3 后处理在CPU还是NPU

模型推理结束,拿到的是三组原始的feature map张量。YOLO的后处理(decode、置信度过滤、NMS)我强烈建议放到CPU端做。

原因是:Atlas 300V Pro的NPU擅长的是固定shape的大规模矩阵运算,而NMS这种带循环、动态shape的逻辑在NPU上支持不好,硬要做的话要么算子难找,要么性能反而更差。把后处理放CPU,一张图几十个目标的情况下,整个后处理时间在2-5毫秒量级,远小于推理时间,没必要为了“全部都在NPU上跑”这种执念增加复杂度。

用pyACL拿输出的核心逻辑是这样的:

output_data = [] for i in range(acl.mdl.get_dataset_num_buffers(output_dataset)): buffer = acl.mdl.get_dataset_buffer(output_dataset, i) data = acl.util.ptr_to_numpy(acl.mdl.get_data_buffer(buffer), (batch, 255, 80, 80), np.float16) output_data.append(data)

注意输出的numpy dtype:我转模型时用了--output_type=FP16,所以这里要用np.float16去读,用np.float32读会直接花屏。这个坑非常隐蔽,建议转换时可以用FP32输出,降低初期的调试难度。

4.4 实测性能数据参考

我在自己的测试机上(具体配置:两颗至强银牌4210,64GB内存,Atlas 300V Pro 24G)跑YOLOv5s、640x640输入,记录了几组数据:

配置batch=1batch=4batch=8
FP16 + AIPP约12-15ms/张约35-40ms/4张约60-70ms/8张
FP32 + AIPP约15-18ms/张约40-45ms/4张约70-80ms/8张
FP16 无AIPP(CPU预处理)约16-20ms/张约45-50ms/4张约80-90ms/8张

以上换算成吞吐,batch=1时大概每秒67-83张,batch=8时能达到每秒110-130张。作为对比,我同事在RTX 3060上用TensorRT跑YOLOv5s,大概每秒120-150张。Atlas 300V Pro的绝对性能不如消费级游戏卡,但它的优势是24G显存、低功耗(70W出头)、以及自带视频编解码,所以在视频流多路并发场景里,性价比是另一回事。这块卡的设计初衷也的确不在对标RTX 3060,而是对标海康、大华等安防场景的AI盒子。

5. 我在Atlas 300V上部署YOLO踩过的坑:完整排查链路

最后这部分我打算写细一点,因为环境问题、配置问题在被你碰到时,如果没有一个完整的排查链路,很容易陷进去出不来。这里挑三个我印象最深的真实案例。

5.1 案例一:24G显存用了不到一半就报内存不足

现象:连续推理约几百张后,程序报acl.mdl.execute failed, error code 507018,后面所有推理都失败。用npu-smi info看,显存占用不到12GB,但新请求就是分不到内存。

排查过程:

  1. 先用npu-smi info看进程列表,确认是不是有残留进程占着显存。发现没有。
  2. 查日志。CANN的日志默认在~/ascend/log,打开plog目录下的日志,搜Acquire Memory相关关键词,定位到是acl.rt.malloc申请连续显存失败。
  3. 怀疑是设备连续运行后显存碎片化了。我们的程序是每次推理都新malloc一块输入输出buffer,推理结束后释放,频繁申请释放导致碎片。
  4. 修复方案:复用模型输入输出buffer,在程序启动时申请一次,整个生命周期内反复使用,不频繁malloc/free。同时在最终推理结束前,适当增加time.sleep(0.01)这类节奏控制,减少瞬时压力。

改完之后连续跑了8小时没再复现。这类问题日志里通常有很明确的提示,但默认日志级别是INFO,不够细。可以把CANN日志级别调成DEBUG再复现一次:

export ASCEND_GLOBAL_LOG_LEVEL=1 export ASCEND_SLOG_PRINT_TO_STDOUT=1

注意查完改回去,DEBUG日志量非常大,跑久了会占满磁盘。

5.2 案例二:转成OM后,检测框全乱了

现象:OM推理时,检测框的位置还基本对,但置信度全部很低(0.01到0.1),阈值设到0.05才能看到几个框。

排查过程:

  1. 先怀疑AIPP的归一化系数。重新检查aipp.cfg里的var_reci_chn_0,确认是0.003921569(1/255),不是0.5。没问题。
  2. 怀疑是通道顺序。YOLOv5训练用的是RGB还是BGR?官方YOLOv5在数据加载器里用的是RGB,但很多魔改版本或者OpenCV读图是BGR。我用的是OpenCV读图,输入是BGR,而模型训练时是RGB,通道反了会导致检测异常。
  3. 我的aipp.cfg里csc_switch: false,rbuv_swap_switch: false,意味着没有做通道交换。但训练时用的是RGB顺序,所以这里应该加一个rbuv_swap_switch: true,或者直接在CPU端把BGR转成RGB再进NPU。
  4. 修复后重新转换、推理,置信度恢复正常。

这是个非常典型的“训练与部署前处理不一致”问题。遇到检测框错乱、置信度偏低,优先查三件事:归一化系数、通道顺序、Resize方式。

5.3 案例三:为什么推理速度忽快忽慢

现象:用batch=8推理时,有时候一帧只要60ms,有时候要120ms,波动很大。第一次碰到时,我以为是系统负载问题,但看CPU占用并不高。

排查过程:

  1. 用npu-smi info连续监控NPU利用率,发现不稳定的时间段里,NPU利用率并不是100%,说明瓶颈不在NPU计算。
  2. 用top和pidstat查看CPU,发现Python进程在频繁进行内存分配和释放,同时python3和npu驱动的几个内核线程在争抢CPU核。
  3. 进一步定位到是因为预处理(resize、归一化)在CPU端做的时候,用的是Python的PIL/numpy操作,这些操作没有绑定到特定CPU核,导致CPU调度器在多个核之间切换,缓存命中率低。
  4. 修复方案:使用taskset把Python进程绑核,例如绑定到4个物理核:
    taskset -c 4-7 python3 infer.py
    同时把图像的resize操作从PIL换成OpenCV的cv2.resize,实测单帧预处理时间从5-6ms降到了2ms左右,整体吞吐提升了约15%。

这个案例给我最大的启发是,NPU推理卡不代表所有环节都在NPU上,预处理和后处理的CPU侧优化,往往比NPU算子优化更容易拿到收益。很多教程一上来就教你怎么调整ATC参数、怎么换算子,但大多数应用瓶颈出在数据流水线上,而不是NPU算力本身。

6. 如果重新部署一次,我会怎么做

把整个流程走完一遍,如果让我重新来过,我的路线会很明确:

  • 硬件选择:确认业务是视频流还是图片批处理。视频流优先Atlas 300V Pro,大规模训练优先昇腾910或干脆上云。
  • 安装顺序:严格按官方版本配套表,先装HDK,重启,再装NNAE,再装Toolkit。每一步都跑一遍官方自带的检查脚本,确认没问题再进下一步。
  • 模型路线:YOLOv5结构保持原样,先转一个FP16 + AIPP的OM,跑通端到端之后再考虑优化。
  • 推理框架:如果只是项目交付,我甚至建议你直接用MindX SDK。它内置了视频拉流、解码、模型推理、后处理等模块,通过配置文件就能组合出来,不需要自己写AscendCL。但如果你想把性能压榨到极致,或者模型结构有特殊定制,那就绕不开AscendCL。
  • 调优顺序:先看数据流水线(预处理是否可下沉AIPP、多batch是否充分利用),再看模型编译选项,最后才考虑算子层面的优化。

我自己在实际部署后最大的感触是,Atlas 300V 24G作为一块NPU加速卡,它真正好用的场景其实是“多路视频流 + 轻量级模型”,如果你拿它当通用GPU去跑各种奇奇怪怪的模型,会经常被算子和转换折腾得很难受。但一旦把场景对上了,这块卡的性价比确实是很多专用设备无法比的。

最后再分享一个小技巧:如果你在多台服务器上都要部署CANN环境,建议打包一个Docker镜像。CANN官方提供了带昇腾驱动的容器镜像仓库,也可以自己写Dockerfile,把Toolkit、模型、推理代码都封装进去。这样做的好处是,后续换机器、加节点时,几分钟就能拉起一个可运行的推理环境,不用每次都在驱动和固件的版本匹配上重新踩一遍坑。

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

网络设备开局配置生成器实战:从Excel参数到批量配置生成与验证

/* 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 7:38:43

混合驱动框架下主轴轴承热网络模型与粒子滤波温度场预测

简介:这是一份结合数据驱动与模型驱动方法的机械工程专业资料,面向具备机械工程或热力学背景的研究人员、工程师,尤其适合从事主轴轴承系统热特性分析与设计优化的专业人士。文档基于论文方法,完整实现了混合驱动框架,…

作者头像 李华
网站建设 2026/9/25 7:37:12

蓝牙Mesh芯片选型实战:Telink、Nordic、Silicon Labs等五款对比

/* 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 7:35:11

小红书香港老号自动筛选全流程:量化标准与批量部署实操

/* 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 7:34:41

Atlas 300V 24G推理加速卡如何高效部署YOLOv5?昇腾平台实战解析

先说结论:Atlas 300V 24G 确实是一张运算加速卡,但它和大众理解的“GPU 通用计算卡”不是一回事。如果你手头有这张卡,或者正在调研用昇腾平台部署 YOLO,那么这篇内容应该能帮你省掉不少弯路。我最近刚好基于 Atlas 300V 24G 完整…

作者头像 李华
网站建设 2026/9/25 7:33:57

Apache Doris深度解析:架构原理、数据模型与部署实战指南

做数据平台的同学,这两年应该没少听说 Doris。不管是实时数仓、大数据分析,还是 BI 报表加速,Doris 几乎都会出现在候选名单里。我第一次在一个几十亿行明细的网约车订单场景里跑 Doris 时,说实话是被它的查询速度吓了一跳的——一…

作者头像 李华