1、引言
在上一篇中,我们聊到了《AI测试技能卷起来!目标检测算法测试流程与方法总结》,反响还不错。但是,也有测试同学给我留言:“能不能讲一讲模型工程的测试流程和方法”。这当然没问题了, 因为在整个工程中,算法模型只是其中的一个环节,我们模型测试完成后,需要部署到系统中,这样才能让模型真正的应用于业务中。
为了更好的让你们理解模型在系统中的流程,我以我的工作为例(当然,处于职业操守,部分内容进行脱敏),以流程图的形式给大家展示。
通过上图,大家可以了解到模型的整体架构。
这里说两点:
1)数据流:即数据解析,保证数据的质量;
2)特征库:即数据处理,提取数据特征进行模型训练。
说到架构,其实模型服务工程的测试和传统测试也有很多相似之处,如:单元测试、集成测试、系统测试、A/B测试等,当然,差异的也有,否则,就没必要说模型工程服务测试了。
至于差异点有哪些,别着急,我们进入今天的这篇《模型服务工程测试》。在这里,你会学习到:
·模型工程服务测试涉及到的测试流程与方法;
·模型工程服务测试与传统测试的异同点;
2、单元测试
关于白盒测试,针对大部分的测试同学来说,多多少少都有了解。
为了让不太了解的测试同学也加深印象,我也唠叨一句:白色测试也叫结构测试或逻辑驱动测试,通过审核代码逻辑设计,按照代码流程测试内部结构,确保代码中的每个分支都能按照预期工作,并返回正确结果。
在这里(单元测试),模型工程服务测试与传统软件测试基本相同,也需要对代码的内容结构进行测试,主要包含测试点如下:
1)项目规范检查:在项目中,项目规范检查范围包含:项目架构设计、数据库设计、接口设计、开发规范(代码缩进、注释、变量命名规范、请求方式等),测试同学需要按照技术规范,验证项目(项目代码、接口文档、数据库设计等)是否符合规范。
2)静态代码检查:根据业务需求、架构设计等对代码进行检查,提前发现一些隐藏的BUG,如配置错误、设计缺陷、无用代码及分支等。
3)代码逻辑覆盖检查:在代码检查时要覆盖到每个分支节点,确保代码分支没有风险。
4)算法高效性分析:由于模型工程服务涉及到大量的数学计算,对性能的要求比传统软件的要求更高,所以,对模型工程来说,需要关注每个算法的高效性,如:缓存、循环优化等。
5)服务异常处理:对每个节点能触发到的异常进行相应处理,如:断言,抛出异常,返回错误信息,日志记录等,这也就对代码的理解能力要求的更高。
3、集成测试
集成测试,在软件测试中必不可少的一个环节,这说的集成测试,更趋近于灰盒测试,而并非有些企业所说的 “集成测试”,因为有些企业把联调测试也称呼为集成测试。
所以,在这里,我也要强调一下。
关于联调测试,是在系统测试之后,进行的是整个系统的测试,因为一些大企业一个系统会涉及到多个测试项目组,所以,在部署UAT/灰度环境前,需要进行联调测试,保证整个系统的流是通的,尤其是开发一个新业务,涉及到整个业务系统。
言归正传, 在集成测试阶段,模型工程服务测试与传统测试基本相同,但是,也有一些差异,具体如下:
· 接口工程测试:使用接口测试工具,不限于postman、Apifox、SoapUI等,或编写接口测试脚本进行测试,验证实际请求结果与预期是否符合。
· 接口diff测试:在不同版本或环境下,对比相同接口的返回结果,换句话说,接口diff测试也是对功能接口测试的补充。
· 数据校验:在数据校验环境,模型工程服务测试与传统测试就有区别了,上面我对数据流和特征库进行了解析,这也是模型工程服务测试中数据校验的重点,这也是既要保证他们之间的调用的正确性和稳定性,同时也要保证数据的质与量。
4、系统测试
系统测试,也就是俗称的业务测试、功能测试,即:黑盒测试。这个环节不再需要过多的关注代码逻辑,而更侧重于业务功能的实现,性能和稳定性的表现等方面。
1)业务功能实现:业务的实现对需求最终表现。在传统测试中,主要体现在用户界面的操作过程,而模型工程服务中,主要模型对外输出结果,如:目标检测模型,主要是对图片/视频中目标人物/物体的识别准确率的体现。
2)性能表现:说到性能,传统测试考察的维度如:响应时间、并发用户数、吞吐量、吞吐率、资源占用等情况(如果对传统性能测试不太了解,在51Testing中有专门的性能测试学习课堂哦),但是,模型工程服务测试中,由于涉及到特征计算、特征入模等过程,所以整个流程相对来说就稍长一些,而且涉及到的时间也不相同(差异也较大)。如:我企的目标检测模型:模型对图片的识别只需要0.3s~0.5s,但是识别后上传到系统(存储到数据库),时间大约要1s~1.5s中。
3)稳定性表现:稳定性测试在大企业中都要且必要的一个测试环节,尤其是新上线一个服务,必须要进行稳定性测试,常见如:蓝绿部署、滚动发布等。这在模型工程服务中依然适用。
·蓝绿部署:新上线一个服务后,不对旧版本服务进行操作,而是在另一个相同环境进行部署,然后启动新版本服务后,先切流量,待稳定后再停掉旧版本服务。
· 滚动发布:先在额外一台机器上部署新版本服务,然后停掉一台老版本服务,并在该机器上部署新版本服务,以此类推,直达所有机器上全都部署了新版本。
5、A/B测试
关于A/B测试,我想,不管是测试同学,还是开发同学,多多少少都有些了解。
可能有些企的业务局限性,导致有些测试同学没有参与过或者很少参与过A/B测试。
为了能让大家对A/B测试有一些了解,以及我们模型工程在A/B测试中应用。
A/B测试(A/B Testing),又称为分割测试或对比测试,是一种统计学上的假设检验方法,用于在两个或多个版本之间比较哪个版本更优秀,以达到优化网站、应用、电子邮件或其他数字产品的目的。通过同时向不同的用户群组展示略有不同的版本(A版本和B版本),并收集和分析这些用户的行为数据(如点击率、转化率、停留时间等),来确定哪个版本更能吸引用户、提高用户体验或增加业务目标(如销售额、注册量等)的完成率。
为了更好的便于理解,我这里画一个流程图:
结合上面这个图,是不是就更好理解A/B测试的流程了。
那么,上面的A/B测试,是否能应用于模型工程服务测试呢?
答案当然是可以的。
因为模型训练完成后,需要嵌入到系统中才能应用。
所以,如果以系统为载体,A/B测试流程与传统测试是差不多的。
但是, 也有差异点,如:由于模型在部署后,随着时间的推移,其性能是逐渐衰减的。
为了保证模型服务的稳定性,就需要进行频繁的版本迭代(这里的版本迭代非业务需求变更和版本缺陷导致)。而此时,A/B测试的必要性就体现出来了。
若当前服务使用的是A模型,当根据需求要进行版本迭代,此时模型B会在离线环境训练,然后部署到线上环境,进行A/B测试。
这里说一下: 在模型B部署到生产环境后,都会进行逐步引流,如:
北京市场→华北市场→全国市场;
当然,至于企业是否需要进行A/B测试,还需要根据实际情况来进行。
只有选择最适合企业的方式,才是最有效的方式。
6、总结
在这篇,我详细介绍了模型服务工程测试流程的方法,并探讨了其与传统测试的差异。
模型服务工程测试包含的测试环节,如:单元测试、集成测试、系统测试和A/B测试。
而与传统测试相比,模型工程服务测试流程在以下几个方面有所不同:
1)数据依赖性: 更加依赖数据和数据处理过程,测试过程中需要大量模拟和真实数据。
2)算法验证: 需要验证和比较不同算法、模型的效果和性能。
3)动态调整: 更加注重动态测试和持续改进,例如通过A/B测试等在线评估方法进行优化。
最后,再唠叨一句:
随之AI的深入各个领域,作为一名测试技人,不仅需要具备传统测试技能, 对模型测试也需要具备一定的能力,这也是当前对测试人的挑战。
只要不断的学习,我相信,每个人都会掌握模型测试的技能。
作者:Carl_奕然