返回栏目
首页人工智能 • 正文

含AI算法工程师眼泪的经历

发布时间:  来源:河洛网

以前优化过部署模式。 这几天终于有需求了,又开始训练一些新模型。 这次机会总结了以往的训练模式的笔记,可能很复杂。 请扔球。 当然这是不完全的统计经验,不仅仅是训练部分,还有很多安排好的漏洞。

含AI算法工程师眼泪的经历

培训模型阶段1 .算法工程师的50%的时间是与数据的交流,有时复制数据(从多个文件夹分别复制到某个文件夹)。 有时过滤数据(过滤质量差的数据); 有时会重命名数据或加前缀。 (多尺度和多个图像增强战略等,为了在后续训练时区别数据的特性)等,这些工作可能每月重复n次以上,所以最好总结一下。 可以用Python和shell脚本处理,也可以保存jupyter notebook常用的文件处理代码。

2 .获取的数据来源和可靠性不明时,请首先通过find ./ -size -1k -exec rm {} \等命令进行简单过滤。 前面的命令扫描并删除1k (或其他值)以下的损坏图像。 当然,也可以设置其他参数。 很多情况下,给你的图不一定是正常的图。 最好事先筛一下。 否则,之后的处理会很麻烦。

3 .并不是所有的数据都已经有标记信息。 如果要收集数据拿去做标记的话,正好公司也有马克人。 请勾选这些数据,尝试进行调整或补充标记框。 这样更有效率。 关于事前如何打框框,可以预测为先给模型训练小数据,训练再现率高的小模型,然后打框框,也可以用旧模型打框框; 但是,有一个不可思议的现象。 当标记人员进行标记时,相对于带有预标记框的数据,标记的质量反而变差了。 虽然速度加快了,但这是因为大多数标注人员不愿意调整。 这个时候,需要好好监督。 否则,后续模型的精度不会提高,这是数据问题。

4 .模型的指标有时不仅仅是辨别把戏。 模型向其他人服务时,相对于检查模型的最终输出点数,最终赋予使用者的框一般根据你取得点数的阈值设定,如果框设定得低一些,则检查模型的输出结果在实际场景中的使用效果如何 不同方式的场景设置不同,阈值有不同的效果,说白了模型效果的好坏很大程度上取决于场景; 这种情况在实际项目中很常见,但说白了,loss和accuracy都是片面脆弱的评价指标。 模型结构与评价的数据分布有很大关系,具体如何选择模型应该与应用场景有很强的关联。

5 .模型遇到badcase的时候,简单粗暴地增加模型的容量可能效果不好。这个badcase很有可能与场景有很强的关联,所以在这种情况下收集badcase是最好的。 使用你的模型的人可能会提供badcase,但是这个效率很低。 观察提供者心情的or紧急度可以直接打捞大量的模型,使用场景的query,使用当前的模型进行检查,收集适当类别的不可靠的case进行选择

6 .测试集很重要。 测试集通常不是从训练集中截取的,从训练集中截取的是验证集。 验证集一般用于判断该模型是否拟合过,以及是否经过训练而被误导过。 在验证集中试图判断模型的好坏时,经常无法表示模型的实际水平。 最好有测试装置。 另外,测试集是与模型采集组和不同训练模型时相比更接近实际水平的评价标准; 即使没有测试集,只要看看训练集的loss就大致可以确定。 一般来说,模型不容易过拟合,除非是在“演示”级别的场景中。 我们的训练集往往有很重的图像增强策略,每个epoch的图像分布可能都不同。 此时,也可以实际选择模型model_last。

7 .进一步强调,loss和准确率不是完全成正比的关系,loss波动正常,loss低不一定意味着模型的mAP高; 相反,如果loss变高,模型的精度不一定会变差,因为loss的设定不充分,部分上涨占主导地位,可能掩盖了另一部分正常下降也是正常的相关讨论: https://github.com /

8 .计算检验模型的mAP。 实际上,计算时不考虑目标框的点数阈值。 即,将所有点数大于0的检查框发送到计算图; 但是,请注意这里。 计算mAP有max_num (最大检测目标个数),根据任务的需要,为100、500、5000等。 在有此限制的情况下,此时框必须按分数排序,取前100、前500或前5000的框进行计算。 最后,如果需要将结果可视化并在图表中绘制边框,则此时可以将阈值卡片化。 例如,需要大于0.2的点数阈值的数值。 否则,最终绘制的图表会有很多框。 最后,别忘了NMS!

9、测试变换后的模型是否正确,一定要保证输入图像的一致; 这里的匹配意味着输入图像的数值必须一模一样,dif必须为0,一般我们输入的模型的图像范围为0-1,通道数通常是彩色即RGB。 但是,必须注意此颜色是否为假颜色。 (有时,为了节约资源用于传输,在传递灰度图进行实际推理时会变成彩色图。 对某个场景来说,伪彩色和真彩色的精度没有太大差别。 )输入大小也必须一致。 是否需要填充(填充变为0、127或255,这几个填充方式团队对结果有很大影响),是否需要对32的倍数进行补充,或者是否需要最大边、最小边限制,必须一致 对于类别,这样测试模型可以保证其正确性。

10 .关于模型,以后考虑在线化时。 在线化的方式多种多样。 可以通过pytorch+flask直接通过docker在线,也可以通过libtorch在线,还可以通过TensorRT在线,当然也可以通过自研框架在线… 等等。 如果该模型追求精度,并且要在在线的某个时间段运行,请尝试flask+docker的服务,而不是实时的。如果该模型的实时性很高,设计模型时需要考虑后续的在线化,请参阅 请尝试使用tensor rt + triton服务器。

布置方面1 .再次强调训练集、验证集、测试集在训练模式中的实际作用。 训练集相当于老师布置的作业,验证集相当于模拟考试题,测试集相当于考试题。 做完作业直接出考题被认为大概率考不好,但是做完作业后,做模拟考试就知道大概要考什么考试,重点在哪里,调整参数之后,最后真正考试的时候就可以考试了; 虽然可以将训练集的一部分分割成验证集,但不要从训练集中提取测试集。 测试集的” 未知“ 做爱; 虽然验证集不直接参与培训,但是它会根据验证集的性能调整模型的超级参数。 实际上,这里也是” “ 请勿将用于验证集合知识的测试集合设置为与验证集合相同。 ” 以各种形式“ 参加训练,否则就是信息泄露。 因为作为泛化误差的近似使用了测试装置,所以到最后为止不能泄露测试装置的信息。

2 .数据的好坏直接影响模型的好坏在数据量的初步阶段,模型的精度最初可以通过改变模型结构来提高,可以增加注意力、加入DCN、加强点backbone,或者通过点的其他巧妙结构来提高最终的精度。 但后期要提高模型泛化能力就需要增加训练数据。 为什么会这样呢? 因为此时你的badcase大部分训练都没有集中,所以模特没有看过badcase,所以一定学不好。 此时需要明确补充badcase; 如果badcase很难补充怎么办? 此时,图像生成很重要,如何生成badcase场景的训练集图,生成数据的质量好坏直接影响模型的最终效果,此外图像强调也非常重要。 是使图像强调后的数据分布尽可能接近测试集的分布。 简言之,它通过图像生成和图像增强两种技术模拟实际场景。

3 .当有两个数据集a和b时,a有类别a和b,而只有a的GT框的b也有类别a和b,但只有b的GT框。 显然不能直接拿来这个数据集使用(没有GT盒子的a和b在训练时被当作背景),但是你的模型训练可以同时检测a和b的盒子。 我该怎么办? 四种方式: 1、训练检测a和检测b各自的模型,然后分别用对方的数据集进行预测和标记,控制分数阈值,制作新的数据集后再训练模型; 2、使用蒸馏方式,同样分别训练检验a和检验b的模型,然后利用这两个模型的软件标签训练新模型; 3、尝试修改洛杉矶。 一般来说,我们的loss函数也反向传播负样本,即背景。 也有损失回报。 这里,如果当前图像中没有a类GT框,我们将关于a的损失保持为0,修正为不反向传播该类信道。 因为那样的话,没有a盒子就可以训练图像,模型不会把a识别为背景。 模特&lllass不管看不看,都不知道a是什么东西的东” 请想想最终训练后的模型是什么样的。 4、在模型的最后部分将机头分开,一个检查a,另一个检查b,此时模型的backbone将成为特征提取器。

4 .工作中有很多场景。 需要将数据筛选为旧模型中需要训练的新模型。 例如,在训练完毕的检测模型a中选择有a类的图训练成新模型时,为了实现这个过程需要构建小的服务。 当然,也可以打开上一个旧型号的python库代码,去找上一个demo.py和对应的参数。这显然很麻烦。 总结以前的模型随时使用小服务在内部使用是最好的。 别人可能也需要用你的模型来选择数据,所以小服务怎么构建呢? 直接使用flask+Pytorch就可以了,但是这个qps请求很大的时候就会假死。 但是,只是筛选数据吗? 适当降低qps,离线请求一个晚上就可以完成。

5 .目前比较好用的目标检测框架,还是经典的,用的人多,资源多,配置方便。 毕竟,我们训练模式的最终目的是在线啊; 单级有SSD、yolov2-v5系列、FCOS、CenterNet系列、Cornernet等单级系列,两级faster-rcnn已经实现多次,还有mask-rcnn 实际上要说使用什么,不仅仅要看速度和精度如何,是否对应动态大小,但是,跑步得分最好的不一定是你的数据就可以了。 请务必根据数据集的特征选择模型。 对于自己的数据集,效果可能又不一样。 这需要自己拉过来跑; 相关型号TensorRT部署资源: https://github.com/grimoire/mm检测到TensorRT和https://github.com/Wang-Xinyu

6 .再说一句,其实很多模型最终都在尝试导入。 第一个难点是这个模型是否已经有人做过了; 如果有人已经做了并且是开源的话,直接复制粘贴修改就可以了。 如果有洞,别人会踩你。 如果没有可供参考的开源代码,就需要自己来! 首先,这个型号的backbone上有特殊的op (比如dcn,比如senet,当然这两个已经被支持了),结构是否特殊(不仅仅是普通的卷积组合,还有各种各样的reshape,roll,, 我变换过最复杂的模型。 backbone有自定义op,需要自己实现。 另外,这个模型有相当多的后处理。 后处理的一部分参加训练。 也就是说,有学习过的参数。 但是,此后处理的某些操作无法转换为trt或其他框架。 (不支持某些操作。 )因此,将该模型分解为两部分,一部分用TensorRT实现,另一部分l实际上,大多数模型可以部署,但难度不同。 只要想,总有方法。

7 .变换后的模型为Pytorch->; onx或onnx->; 传感器流量或传感器流量- & GT; TFLITE,变换前和变换后的模型,参数是相同的结构,但是在相同的输入下输出不完全相同。 当然,输出精度卡到小数点后4位的话应该是一样的,但小数点后5、6、7位并不完全一样,转换本身也不会有损失。 例如,有一个检测模型a是使用Pytorch进行训练,然后转换为TensorRT的模型a `。 这两个人是相同的模型,而且转换后的TensorRT也是FP32精度。 输入随机数后,将比较这两个模型的输出,可以看出绝对误差和相对误差按1e-4的标准为0,但请带着这两个模型去检查,以维持所有的一致(输入、后处理等),最终生成的检测框为 分数低的)比如不到0.1和不到0.2 )有一些不同的地方,另外边缘的hardcase也不一致当然这种情况一般影响不大,但是需要留一颗心。

8 .模型的理论flops和实际模型的运行速度没有太大关系。 看具体运行的平台,不要以为flops低模型速度快。 许多开源检验库直接在Pytorch上运行进行比较。 都是GPU,但这实际上没有优化。 因为Pytorch是动态图表。 一般模型的引入与大小的优化有关,如算子的融合和计算图的优化等。 最简单的例子是CONV+BN的优化。 许多基于Pytorch的模型速度比较忽略了这一点。 要比较两个模型的速度,建议在实际部署的框架和平台上进行比较。 但是,如果该模型参数多,则该模型概率不会加快。 原因很简单,大部分参数是卷积内核参数、全连接参数,这些参数多自然意味着这些op操作多,自然会变慢。

9 .如果同一个TensorRT机型(或者是利用Pytorch或者其他GPU跑的机型)用同一个样卡跑,那么cuda、cudnn、驱动器等版本不同,或者显卡的硬件功耗墙设置。

10 .在对所引入的模型进行转换之后,通常需要测试该模型的速度和吞吐量的速度可以直接用for循环推理得到平均值,但在实际的吞吐量中模拟数据传输、模型运行和队列的时间; 一般来说,模型的吞吐量可以简单地以1000/xx计算。 xx是模型执行的毫秒。 但是,如果输入图像非常大,这是不行的。 需要考虑实际的图像传输时间、是否是本地的、是否超出了网络段等。

【编辑推荐】

    相关文章Related

    返回栏目>>

    河洛网首页

    Copyright © 2019 河洛网 版权所有 dahuimr@163.com