news 2026/9/19 7:13:51

Atlas 300V 24G部署YOLO模型实战:从转换到调优

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Atlas 300V 24G部署YOLO模型实战:从转换到调优

说到Atlas,很多做AI部署的朋友第一反应是华为昇腾那一整套计算产品线。最近两年我在好几个项目里实际用过Atlas系列加速卡,从边缘侧的Atlas 200 DK到数据中心侧的Atlas 300V、300I系列,核心任务基本都落在目标检测和视频分析上,YOLO系列模型是绕不开的常客。这篇文章把我基于Atlas 300V 24G推理卡部署YOLO模型的完整过程做个梳理,从硬件选型、环境搭建、模型转换、推理实现,到性能调优和踩坑记录,尽量写得细一点。如果你正在评估昇腾方案,或者已经拿到板卡准备把YOLO跑起来,这篇内容应该能帮你省下不少查文档的功夫。

先回答一个我在各种技术群里反复看到的问题:Atlas 300V 24G到底是不是运算加速卡?严格说,它是一张面向推理场景的PCIe加速卡,能跑神经网络算子,但它的定位不是通用GPU,也不是用于大模型训练的加速卡。它更像是“视频分析和目标检测任务的专用加速器”,这一点会直接影响你接下来的部署思路。

1. Atlas到底是什么:昇腾计算平台的一点基础认知

1.1 软硬一体的推理平台

Atlas是华为昇腾AI产品的整体品牌,它不是一个单一的硬件,而是一整套软硬协同的计算平台。硬件侧有用于训练侧的Atlas 800T系列服务器、用于推理侧的Atlas 300I/300V系列PCIe加速卡、用于边缘场景的Atlas 200/500系列开发者套件;软件侧则是CANN(Compute Architecture for Neural Networks,昇腾异构计算架构),对标CUDA在GPU生态里的角色。

我在项目里使用Atlas时,最先养成的一个习惯就是:区分清楚“训练”和“推理”。昇腾的训练卡和推理卡在架构设计上的侧重点完全不同,Atlas 300V 24G这种推理卡主要解决的是“模型已经训练好之后,如何在数据中心或边缘侧高效执行推理”的问题。它不会替代你之前的训练流程,你的PyTorch模型训练阶段大概率还是在自己熟悉的GPU环境里完成,训练好后把模型导出来,再转换到昇腾推理卡上运行。

这个认知很重要。很多刚上手的朋友会问“能不能在Atlas 300V上训练YOLO”,我的建议是别折腾。即使你的显存有24GB可以勉强塞下一个小的batch,但缺少完整的训练生态支撑,效率远不如常规GPU环境。Atlas的强项是把训练好的模型高效跑起来,把推理时延压下去,把单卡吞吐拉起来。

1.2 达芬奇架构的核心设计思路

如果你只看官方文档,会被“AI Core”“Cube Unit”“Vector Unit”这些词绕晕。我尝试用人话解释一下:昇腾芯片里的AI Core更像一个高度特化的流水线工厂,里面有几条不同的生产线在协同干活。

Cube Unit负责矩阵运算,专门处理卷积和全连接这类计算密集型的操作,相当于工厂里的大机床,一次能加工一大批材料;Vector Unit负责向量运算,处理激活函数、池化、逐元素操作这类任务,相当于处理精度更高但批量较小的精加工环节;Scalar Unit负责标量运算和控制逻辑,相当于工厂里的调度员。三级缓存结构L0、L1、L2配合数据搬运,让数据在算力单元之间尽量少折腾。

理解这个架构有什么实际用处?最大的用处是帮你建立对“算子支持”的敏感度。你在做模型转换时会遇到某些算子不支持、需要拆解或替换的情况,根源往往是该算子的计算模式无法被Cube或Vector单元高效执行。比如某些自定义激活函数、特殊的注意力实现,在GPU上很常见,但在昇腾上可能就需要手工改写为等价的算子组合。有了这个基础认知,遇到报错时你至少知道问题出在哪个层面,而不是两眼一抹黑。

2. Atlas 300V 24G硬件解析:它到底是不是“运算加速卡”

2.1 关键规格和定位

Atlas 300V 24G是华为推出的一款半高半长PCIe x16接口的推理加速卡,整卡功耗标称75W左右,不需要外接辅助供电,插上PCIe插槽就能工作。这个功耗水平在数据中心里非常友好,一张单槽半高卡不会占用太大空间,对服务器的散热和供电压力都很小。它配备24GB显存(实际对应昇腾统一编址的存储空间),对目标检测、OCR、视频结构化这类推理场景来说足够宽裕。

关于它是不是运算加速卡这个问题,我的回答是:这里的“运算”需要有定义。如果你说的运算加速卡是指可以做神经网络推理加速,那答案是肯定的,而且YOLO这类模型正好在它的舒适区;如果你说的运算加速卡是指可以做通用并行计算,比如自己写CUDA程序做科学计算或图形渲染,那它不是,昇腾的编程模型主要围绕深度学习算子执行,不支持通用图形渲染,也不适合做复杂的自定义并行计算。清晰定位非常重要,否则你会拿错工具去做错事。

2.2 一张卡能干多少活

实际操作中,我经常用Atlas 300V 24G跑视频流分析任务。单个视频流如果分辨率是1080P,通过卡上的硬件解码单元(DVPP里的VPC模块)做解码和缩放,配合YOLOv5s做检测,单卡处理多路视频流是常见用法。多数项目里,单卡跑8到16路1080P实时检测是可以预期的范围,具体数值取决于模型大小、输入分辨率和帧率要求。

选择这张卡还有一个很现实的原因:它和常见的GPU推理卡在硬件形态上兼容。它走标准PCIe x16接口,不需要改造服务器,只要你有空闲的PCIe插槽,并且主板BIOS能正确识别,就可以把它插到大多数x86服务器上。我最早做验证时用的是一台双路x86服务器,上面既有GPU也有Atlas卡,两者共存没有硬件冲突。

2.3 选型时容易被忽略的三个点

一是功耗与算力的平衡。75W功耗卡的算力肯定不能和动辄300W以上功耗的旗舰级加速卡硬刚,但它也意味着你可以在一台4U服务器里插多张卡而不用担心电源余量。二是不需要外接供电带来的部署便利,这在实际机房环境中非常有用,因为很多老服务器的PCIe供电设计并不充裕。三是24GB大显存的实际价值,跑YOLO这种模型时,24GB不光能让你加载大batch,还能让你在同一个进程里加载多个模型,这在做多模型服务时会很方便。

我自己的总结是:Atlas 300V 24G适合的场景是“数据中心内大批量视频/图像推理”,而不是“单卡极限算力竞赛”。如果你在规划一个新项目,建议把它当作一台优秀的推理资源来纳入预算,而不是当作通用加速卡来看待。

3. 部署第一步:驱动、固件和CANN环境的那些事

3.1 版本匹配才是最大门槛

Atlas的软件栈比普通GPU环境要“啰嗦”不少。GPU驱动装好之后基本就能跑CUDA程序,Atlas则有三层组件必须配套:驱动(Driver)、固件(Firmware)和CANN工具包。这三者之间存在严格的版本匹配关系,官方会提供版本配套表,安装前一定要先确认清楚。

我第一次部署时就吃过版本不匹配的亏。驱动装了新版本,CANN还是旧版,结果调用ACL接口时直接报错,日志里提示算子编译失败。后来我养成了一个习惯:先确定要用的CANN版本,再根据CANN版本去找配套的驱动和固件版本,按官方配套表一次装齐,不在单一组件上追求最新。

3.2 安装过程的关键步骤

以x86服务器安装Ubuntu系统为例,基础流程大致如下。

先下载对应架构(x86_64或aarch64)的驱动和固件安装包,通常是.run文件,然后执行安装:

chmod +x Ascend-hdk-*.run ./Ascend-hdk-*.run --full --install

这里有个小细节:--full会把驱动和固件一起安装,如果分开安装,一般先装固件再装驱动。安装完成后用npu-smi info验证设备是否被识别,这个命令类似NVIDIA的nvidia-smi,能查看卡数量、显存占用、温度、芯片健康状态等关键信息。

接下来安装CANN工具包:

chmod +x Ascend-cann-toolkit_*.run ./Ascend-cann-toolkit_*.run --install

安装完成后需要source环境变量脚本:

source /usr/local/Ascend/ascend-toolkit/set_env.sh

为了让环境变量在每次登录时自动生效,我一般会把source命令追加到~/.bashrc里。这一步看似基础,但漏掉的情况非常多,很多朋友跑Python脚本报找不到acl模块,其实只是环境变量没生效。

3.3 环境安装的实战心得

CANN环境对操作系统的内核版本、gcc版本都有要求。官方主要支持openEuler、Ubuntu、CentOS等常见发行版,但不同CANN版本对Ubuntu内核版本的要求有差异。一个稳妥的做法是:先看官方发布说明里的支持矩阵,再安装操作系统和内核,而不是先把系统装好再去找能匹配的CANN版本,那样容易把自己逼进死胡同。

安装过程中如果出现错误,留意日志信息比反复重装更有用。常见日志路径包括:

/var/log/ascend_seclog/ /var/log/ascend_install.log

我见过很多人装完一切正常,但npu-smi info却报错,这时候优先检查是不是没有root权限,或者驱动和固件版本顺序装反了。另外,同一台机器上不要混装多个版本的CANN,这会造成链接混乱,排查起来非常痛苦。

4. 手把手把YOLO模型部署到Atlas 300V上

4.1 模型转换链路:PyTorch到ONNX再到OM

YOLO模型在GPU环境里跑得好好的,想搬到Atlas上跑,核心工作是把训练好的模型转换成昇腾的离线模型格式OM。转换链路一般是PyTorch导出为ONNX,再用ATC工具把ONNX转换为OM。

导出ONNX这一步在PyTorch里很成熟:

import torch model = torch.load("yolov5s.pt", map_location="cpu")["model"].float() model.eval() dummy_input = torch.randn(1, 3, 640, 640) torch.onnx.export( model, dummy_input, "yolov5s.onnx", opset_version=11, input_names=["images"], output_names=["output0"], dynamic_axes=None )

这里关键点是尽量固定batch和输入尺寸。ATC工具对动态shape的支持没有ONNX Runtime那么灵活,虽然新版CANN支持动态shape,但配置复杂,性能也未必最优。实际部署时,我基本都固定batch为1或4,输入分辨率固定为640x640或1280x1280,这样转换后的OM模型在推理时延上最稳定。

4.2 使用ATC工具把ONNX转换为OM

转换命令是部署过程中最核心的一步,参数看着多,但每个参数都有明确用途。一个典型的转换命令如下:

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表示输入模型是ONNX格式。--soc_version指定芯片型号,具体值可以通过npu-smi info或者官方文档查到,不同型号的卡必须填对,填错会导致转换结果无法在目标设备上运行。--input_shape用来确定输入张量的形状,这里写成1,3,640,640,和导出ONNX时的dummy input对应。--insert_op_conf是用来配置AIPP预处理算子的,后面单独讲。--output_type=FP32表示模型推理的输出数据类型,有些模型后处理对精度敏感,这点需要格外留意。

关于AIPP配置,它是在硬件上完成图像预处理的关键文件。比如YOLO推理前通常需要把图像缩放到640x640,做归一化,把RGB通道顺序调整好。如果不配置AIPP,这些操作就要在CPU上完成,会增加延迟;配置了AIPP后,数据从内存拷到卡上时,硬件会直接完成resize、crop、色域转换和归一化。一个常用的aipp.cfg示例如下:

aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 crop: true load_start_pos_h: 0 load_start_pos_w: 0 crop_size_w: 640 crop_size_h: 640 resize: true resize_w: 640 resize_h: 640 padding: false csc_switch: true rbuv_swap_switch: true min_chn_0: 0 min_chn_1: 0 min_chn_2: 0 var_reci_chn_0: 0.00392156862745098 var_reci_chn_1: 0.00392156862745098 var_reci_chn_2: 0.00392156862745098 }

var_reci_chn对应1/255,也就是把0到255的像素映射到0到1。这个文件里的参数需要根据你的模型预处理逻辑来写,不同版本的YOLO有可能存在差异。

4.3 推理侧实现:pyACL还是C++ ACL

模型转换完成后,接下来就是写推理代码。Atlas提供两种主流开发方式:Python侧的pyACL和C++侧的ACL。pyACL适合快速验证和原型开发,C++ ACL适合最高性能的生产环境。

从我的实际经验来看,建议两条腿走路:前期用pyACL验证模型转换是否正确,跑通后再用C++实现最终的服务化推理。虽然多写一遍代码,但能避免在早期被C++的内存和资源管理问题干扰主要逻辑。

一个最简单的pyACL推理流程包括初始化、设置设备、加载模型、准备输入输出内存、执行推理、解析结果、释放资源这几步。核心伪代码大致如下:

import acl # 初始化 acl.init() ret = acl.rt.set_device(0) context = acl.rt.create_context(0) # 加载模型 model_id = acl.mdl.load_from_file("yolov5s_om") desc = acl.mdl.create_desc() acl.mdl.get_desc(desc, model_id) # 准备输入 input_data = preprocess(image) # 得到符合模型输入的numpy数组 input_size = input_data.nbytes input_ptr = acl.util.np_to_ptr(input_data) # 执行推理 output_ptr = acl.rt.malloc(output_size, 2) acl.mdl.execute_async(model_id, [input_ptr], [input_size], [output_ptr], [output_size], stream) acl.rt.synchronize_stream(stream) # 解析输出 output_data = acl.util.ptr_to_np(output_ptr, output_shape, dtype) boxes = postprocess(output_data) # 释放资源 acl.mdl.unload(model_id) acl.rt.destroy_context(context) acl.rt.reset_device(0) acl.finalize()

写推理代码时最需要注意的是内存管理。pyACL里创建的指针如果不主动释放,长时间跑服务会出现显存泄漏。我在生产环境中遇到过容器运行三天后推理速度明显变慢的情况,排查后发现是推理循环里没有释放临时张量。解决方式是把推理逻辑封装成类,在每次推理的finally块里统一释放资源。

4.4 后处理:从模型输出到检测框

YOLO模型的输出并不是最终的检测框,需要经过解码和后处理。以YOLOv5为例,ONNX导出的输出形状通常是1,25200,85,其中25200是三个尺度特征图的anchor总数,85是4个坐标、1个置信度、80个类别得分。OM模型的输出格式和原来ONNX保持一致,所以后处理逻辑可以复用原来的代码。

我习惯把后处理放在CPU侧执行,包括置信度过滤和NMS。虽然这样会占用一部分CPU资源,但实现简单、调试方便,而且现代服务器的CPU核数普遍充足。对于高吞吐场景,可以用多线程把多路视频的NMS计算分散到不同CPU核上。如果CPU实在吃紧,再考虑把NMS用C++优化,或者拆成多个小batch并行处理。

4.5 数据预处理到底放CPU还是放卡上

这是部署时经常被纠结的问题。我的建议是:能用AIPP的预处理尽量用AIPP,把resize、归一化、格式转换都下沉到卡上的硬件模块。AIPP配好后,你只需要保证喂给模型的原始图像数据是连续内存块,剩下的硬件帮你做,CPU占用几乎可以忽略。

但有一个坑值得提醒:AIPP是固定配置的,意味着不同尺寸的输入图像最好在送入前由CPU统一做letterbox操作,确保填充后的图像符合AIPP里设置的宽高。如果原图比例和目标尺寸差得很远,letterbox产生的黑边会影响检测精度,这个问题在YOLO部署中很常见,需要特别留意训练时预处理和推理时预处理的一致性。

5. 性能实测与调优心得:让300V 24G跑得更快

5.1 一组实测参考数据

先给一组我项目中观察到的参考数据,方便你有个直观预期。

模型输入尺寸数据类型单次推理耗时(不含预处理)备注
YOLOv5s640x640FP32约10-15ms比较保守的配置
YOLOv5s640x640INT8约6-9ms需量化校准
YOLOv8s640x640FP32约12-18ms模型复杂度略高
YOLOv8s640x640INT8约8-12ms量化后精度需验证

这些数据跟你用的CANN版本、服务器CPU、内存频率、PCIe版本都有关,不要当作绝对标尺,但数量级可以作为方案评估的参考。真实项目中,YOLOv5s在300V 24G上跑出几十路视频流处理的案例并不少见。

5.2 调优三板斧:AIPP、多batch、多卡并行

第一板斧是AIPP下沉预处理。这一步能省下的时间通常有2到3毫秒,在低延迟场景里非常可观。

第二板斧是多batch推理。很多人的第一版代码是batch=1循环推理,这其实没有充分压榨卡的算力。我测试过YOLOv5s在batch=4和batch=8时的总耗时,即使batch=8的总推理时间比batch=1的单次推理时间多一些,但折合单张图的平均耗时能下降30%以上。做法是维护一个队列,攒够batch再提交,或直接用MindSpore Lite的Batch推理接口。

第三板斧是多卡并行。一台服务器插多张Atlas 300V后,可以通过多个进程分别绑定不同device id来实现线性扩展。需要注意PCIe带宽争用问题,多卡同时传输数据时,如果PCIe通道不够,会形成瓶颈。所以插卡时尽量选择不同的CPU NUMA节点对应的PCIe控制器,这和GPU服务器多卡配置的思路一致。

5.3 量化:从FP16到INT8的实践

Atlas推理卡对INT8的支持比较成熟。把模型从FP32转成INT8之前,我先在GPU上用混合精度FP16跑了一遍,确认精度损失可以接受,再做完整的INT8量化。

昇腾的量化工具AMCT(Ascend Model Compression Toolkit)支持离线量化。流程是先准备少量校准图片(几百张足够),提取模型每个层的激活值范围,然后基于这些范围把权重和激活从FP32映射到INT8。目标检测模型量化后精度一般会下降1到3个mAP点,如果业务对精度要求很高,建议先在验证集上测一下再决定。

量化能在不改变硬件的前提下把速度提升一截,但也不要盲目追求INT8。如果FP32的时延已经满足业务指标,没必要折腾量化。我通常会把FP32作为基准线,让业务方确认精度可接受后,再做INT8加速作为可选优化项。

5.4 用msprof定位性能瓶颈

模型部署后如果性能不达标,不要凭感觉调参,用昇腾提供的profiling工具msprof来分析。它能统计每个算子的耗时、数据搬运耗时、内存分配耗时等。

采集命令很简单:

msprof --output=./prof_data ./your_inference_app

分析产出的结果文件时,重点关注两类问题:一是某个算子耗时异常高,说明模型转换时可能选择了低效算子实现,可以尝试修改转换参数或升级CANN版本;二是数据搬运耗时占比过高,说明预处理或内存拷贝在PCIe链路上花了太多时间,这时候需要回头检查AIPP配置和内存复用逻辑。

6. 项目实战中的踩坑记录与排查思路

6.1 常见错误速查表

下面这个表是我在实际项目中遇到的典型问题,整理出来希望你能少走弯路。

现象可能原因解决办法
npu-smi info看不到卡驱动未正确加载,或固件版本不对检查dmidecode确认板卡是否被BIOS识别;重新安装匹配版本的固件和驱动
模型转换报错E10001输入模型里包含不支持的算子用ATC日志定位到具体算子,替换为支持的等价算子组合
推理执行报task timeout数据输入尺寸与模型不匹配,或AIPP配置导致异常检查input_shape是否正确,AIPP里的宽高是否和模型输入一致
多进程同时加载模型显存不足没有按device区分进程,或显存碎片化设置不同的device id,并合理规划显存分配
模型输出全为0AIPP归一化参数错误,或输入数据被硬件截断检查aipp.cfg中的min_chn和var_reci_chn,验证原始输入图像
推理结果有偏移预处理缩放和letterbox参数与训练时不一致统一训练和推理时的预处理逻辑

6.2 多进程服务化的工程经验

在正式环境中,我建议把单张Atlas卡的服务设计成常驻多进程架构:主进程负责接收请求和调度,多个worker进程分别绑定不同device id或时间片。每个worker加载模型后常驻内存,通过队列接收输入图像,推理完成后返回结果。这样做的好处是省去了每次推理都加载模型的开销,同时避免单进程崩溃导致整个服务不可用。

内存复用是另一个容易忽略的点。推理卡的显存和普通内存一样需要精心管理。如果在循环里反复申请、释放显存,会出现碎片化,后期可能明明还有空闲显存,但就是分配不出来。我在代码实现里会预分配一组输入和输出缓冲区,推理时轮换使用,避免频繁申请释放。

6.3 日志与调试技巧

昇腾的日志系统默认会记录详细的运行信息,日志级别可以通过环境变量控制。排查问题时可以临时把日志级别调高:

export ASCEND_GLOBAL_LOG_LEVEL=1

但生产环境一定要调回默认级别,否则日志量会非常大,拖慢整体性能。我在调试阶段也会在推理代码外层加一个简单计时器,统计预处理、模型推理、后处理三段耗时,先定位时间花在哪,再针对性打开profiling工具细看。

个人经验中的一个小技巧

最后分享一个我自己的习惯。拿到一张新的Atlas卡和新的CANN版本时,我通常会先跑一个最简单的分类模型(比如ResNet50),验证整个环境链路是通的,再上YOLO这类检测模型。这样能把问题范围缩小,如果分类模型正常但检测模型出错,问题大概率出在模型转换和后处理环节;如果分类模型本身就出错,那就是环境问题,不用牵扯模型细节。这个排查顺序帮我节省了无数时间。

另外,Atlas官方社区和文档更新很快,遇到问题先搜官方版本的release notes,再搜社区经验,很多时候你自己的“疑难杂症”其实是某个版本已知的问题,升级或回退版本就能解决。Atlas 300V 24G这张卡不大,但如果定位准确、配套合理,它在视频检测和图像分析场景里能带来的价值相当可观。希望这篇记录能帮你少走弯路。

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

传统柳琴花本工艺与现代纺织技术解析

1. 柳琴花本工艺解析柳琴花本作为传统纺织工艺中的经典纹样,其独特的构图方式和色彩搭配在民间工艺美术中占据重要地位。yy极图603是其中最具代表性的图案变体之一,以六边形为基础骨架,通过经纬线的交错变化形成立体感强烈的视觉效果。1.1 纹…

作者头像 李华
网站建设 2026/9/19 7:08:43

达梦数据库定时数据迁移:存储过程与DBMS_SCHEDULER实战

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

作者头像 李华
网站建设 2026/9/19 7:07:32

Python3操作MySQL全指南:驱动选择、连接与事务实践

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

作者头像 李华
网站建设 2026/9/19 7:06:56

Cline 跑支付宝支付 MCP,模型 Key 走 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/19 7:06:45

从DDPM到SDE:扩散模型连续化视角与概率流ODE采样加速

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

作者头像 李华
网站建设 2026/9/19 7:04:44

VeRL与Ray协同:RLHF训练中WorkerGroup资源调度与弹性容错全解析

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

作者头像 李华