很多人在科研项目中以为机器学习、人工智能就仅仅是模型训练,带有一台性能比较好、带 GPU / TPU 的机器进行模型训练就可以了。如果这么认为,那么只能说明该观点尚处于预研阶段或实验室阶段。在真实的生产环境中,模型训练只是机器学习流程中很小的一个模块,而大部分工作是模型训练之外的工作,如:平台的搭建和配置、数据收集、数据检查、数据转换、模型分析、监控、日志收集和分析、服务发布和更新、迁移训练等。从另外一个方面说,只有当你的科研项目足够充分的考虑到模型在现实环境中的各方面部署需求时,你科研结果 —— 也就是训练出来的模型才具有实际价值,科研成果才有被转换的真正意义上的可行性。
工业 AI,尤其是缺陷检测这块都是硬骨头。虽然场景非常简单,虽然数据都是源源不断,虽然算法都是非常纯粹。主要是其需求太分散了,不是不能做,而是值不值得去做。因为你要面临以下问题:
- 说不清道不明、模棱两可的需求标准,某些难以量化的标准。
- 频繁的变更需求标准,难以做到只靠调后处理参数就快速响应。
- 频繁更换型号的场景,留给你训练的时间不多。甚至无法提供良好的训练环境。
- 立体的产品,各种吃光照,吃视角的缺陷,极其微弱的缺陷。
- 难以保证的样本一致性问题。
- 准确率能不能到 100%?
- 有没有人工做的更快?
- 有没有人工费用更便宜?
- 需要配合繁复的硬件设备,尤其是运动设备。如何才能保证整套设备的稳定性?
- 后期维护成本问题?由于涉及的环节太多,需要『全才』才能搞定。
AI 从无到有,依然经过以下几个环节:
需求阶段
包括场景分析,问题定义,可行性分析。很多任务都是从该阶段直接进入收尾。这个是好事,一定不要盲目自信和盲目乐观。所谓一叶障目不见泰山,只看到算法容易实现就忽略以上的问题,最后只能惨淡收场。最怕投入太多沉没成本之后,想收场却不甘心。
什么是需求,什么是真正需求,什么是隐藏等待发掘的真正需求。很多时候,和客户一起聊需求的时候,他们给不出明确的需求。最简单直接的办法就是,深入参观他们的生产现场。和工人融到一起,学会他们的判断标准。为他们发掘需求,尤其是下面几点必须提前明确清楚:
- 什么是绝对不能容忍的错误,一旦出现就是质量事故。我们要知道算法的下限在哪里。
- 涉不涉及更换型号,能否提供符合模型训练的场景要求,比如至少得有 GPU 吧,或者可以上网进行云端训练。
- 对时间上的要求,很多替换人工工位都要要求比人更快。我们要知道系统的物理极限,例如运动设备。
- 对于算法难以界定的灰色地带,接不接受人工二次复检。对于不能成功运行的个例,我们要有备份。
其他都比较直白,对于第二点说明一下。大家想必都知道,我们做算法复现的时候,推理部分比训练部分要容易好几个等级。同理,上线部署的时候,如果涉及用户自己训练,那么难度就上来了。要把标注、数据处理、训练参数、测试评估等都打包在一起,还要实现全自动化。甚至会遇到诸如用户电脑不能上网以及没有 GPU,没有错,即便是你提训练必须条件,他也不一定会给你配到。以上这几点,一定要仔细论证,全局论证,反复论证。论证不是内卷,不是效率不高,不是执行力不高。没有详细论证而匆匆上马的项目,一般后期有无数个坑在等着你。
打光阶段
包括光学设计,成像分析,当然还包括不是那么 AI 的结构设计等。俗话说:七分靠打光,三分靠调参。打光非常重要,因为后续算法只能为图片负责。一般会用明显和明确来进行可行性分析,明显,就是来自光学。最直观的判断就是,人肉眼能否通过图片进行精准判断。如果存在模棱两可的部分,那么它也将成为算法模棱两可的地方。
数据阶段
包括数据采集,数据标注,数据处理。数据的重要性不言而喻,正所谓:七分靠数据,三分靠技巧。数据到位了,一切都好说。数据的重要性,想必是任何一个从业人员都深有体会的。我们要数据,要有效的数据。没有数据的场景,抱歉请用传统方法。要记住,模型泛化,没那么重要,当然模型也没有那么强的泛化能力。它之所以能够识别,那是因为它见过。将模型理解成一个存储器,而不是泛化器。之前的你,需要建立数据库来存储数据用以测试时的比对,现在的你,模型就是你的数据库。
数据标注就会涉及标准的定义,很多时候很难拿到清晰的标准。或者说无法量化为清晰的标准。往往会存在灰色地带,这就要提前有一个清晰的认识。对于灰色地带的处理,或者说客户的容忍,要提前想好策略。这里比较困难的是,灰色地带可能很难量化出来,我们只是知道这个样本是灰色地带,不知道到底有多灰。
另外,比较重要的是尽快建立稳定的、有代表性的数据集合,尤其是测试集,这点非常重要。可以帮助非常敏捷进行后续的基线实验。如果你不知道你对什么样的最终结果负责,那么你将永无止境的做下去。
算法设计阶段
包括任务定义,任务拆分,模型选择。尤其是任务拆分,你不肯定把所有的大象都装到一个冰箱里面,你也不可能把所有的鸡蛋放到一个篮子里面。
杜绝唯模型论 & SOTA 论。我们需要的是在特定场景下解决特定的问题。这里涉及学院派思维转变,学院派的高手为 imageNet 和 COCO 等数据集负责,而我为我自己的场景和自己数据集负责。SOTA 看中的是模型的上限,而实际的场景,看中的是模型的下限。
杜绝唯 AI 论。不管传统方法还是 AI 方法,能有效的就是好算法。如果传统方法没有明显的缺陷,那么请选择传统方案。或者你可以这么认为,当前看似高大上的 AI 并不是真正的 AI,或许 30 年后一天,你会说:先用传统方法 YOLO V28 来试一下吧!
训练评估阶段
包括模型调参,模型训练,指标评估。所谓的“炼丹”。前几步做好了,一般不会有太大问题,如果有,请向前追溯。这里要说一句,“提前优化是万恶之源“。在保证精度的时候,再去考虑速度,再去做优化。当然你靠 58 个模型联合起来获取的精度不在该讨论范围。
部署阶段
这个阶段坑比较多,基本上都是技术方面。也是所谓的“脏活”。包括模型优化,跨平台前向推理,模型加密。终于到部署阶段了,也看到了落地的曙光。关于深度学习人工智能落地,已经有有很多的解决方案,不论是电脑端、手机端还是嵌入式端,将已经训练好的神经网络权重在各个平台跑起来,应用起来才是最实在的。不过依然存在这么多工作需要做:
- 跨平台:可跑目标硬件上,包括各类 CPU / GPU / TPU / FPGA 等等。
- 高效能:速度快、占用内存少等。
- 精度没有丢失:经过一通量化、剪枝、蒸馏、图优化等操作后,终于满足时间要求了,却突然发现部署测试精度掉了一半。
- 加密需求:保护模型数据与结构。
- 闭环生态:当然你不能一劳永逸,怎么在应用中收集样本,更新系统。你需要作成实用、好用的闭环工具链。
运维阶段
包括运行监控,模型更新等。你以为可以所以口气了,并没有。能不能经受海量产能和时间的考验,请瑟瑟发抖地注视着吧!运维的核心就是保证业务安全稳定运行。上面提到,AI 泛化能力还是比较欠缺的,所以很可能会在实际运行的过程中遇到无效的情况。当然最最直接的办法就是持续不断扩充数据。当然要保证你的模型有足够的算力支撑,如果没有,那么就是算法设计环节没有做好。收集数据利用上面部署阶段所说的闭环生态工具链来持续完成这个事情。至此,你的 AI 项目已经落地。
原作者:皮特潘