首先介绍一下度小满机器学习平台的背景、发展过程以及现状。
度小满是一家金融科技公司,公司内部的业务场景主要分为三个方面:
由于业务涉及的AI技术非常多样,给AI算法落地带来了很大的挑战。
AI算法落地存在一个不可能三角:很难同时实现算法开发的高效率、低成本和高质量。
面对这些AI落地的难题,我认为唯一的解决方案是使用机器学习平台。
下面从AI算法的生产流程来理解AI算法落地过程中遇到的具体困难。
AI算法落地主要分为数据管理、模型训练、算法优化及部署发布四个部分,其中模型训练和算法优化之间是一个反复迭代的过程。
在算法开发的每一个步骤里面,对参与该步骤的人员的技术要求的差异很大:
从各个步骤需要的技术栈可以看出,很难有一个或者两三个技术人员完全掌握所有的技术,并且每一个涉及人工的步骤,都是造成生产不稳定的生产瓶颈。而使用机器学习平台可以解决这两个问题。
我们的机器学习平台ATLAS贯穿AI生产的全流程,旨在替代AI算法落地过程中的人工参与,达到高效产出、给AI算法研发提能增效的目标。
ATLAS涉及以下四个平台:
这四个平台之间也是循环迭代的关系。下面分别介绍这几个平台的设计细节及运转过程。
数据与训练部分涵盖了标注平台、数据平台和训练平台。
标注平台主要为AI算法的训练提供标注数据,自从深度学习诞生以来,模型已经具有了很高的复杂度,AI算法效果的瓶颈从模型设计上转移到了数据质量和数量上,所以数据的高效生产是在AI算法落地中至关重要的环节。
ATLAS的数据标注平台主要有两方面的能力特性:多场景覆盖和智能标注。
数据平台主要实现大规模数据治理,在治理的过程中能够兼顾灵活性,动态地匹配样本。在保存了上亿用户的5000维度以上的特征的基础上,可以做到一个在线的实时查询。动态匹配样本可以满足不同场景的样本选择和数据的选择要求。
训练平台是一个很重要的设施,分为五个层:
我们的部署采用类Serverless的架构,之所以说它是类Serverless是因为它并不是完全的Serverless的服务。因为我们的服务面向的并不是广泛通用的应用场景,只面向模型的在线服务,所以不需要考虑更多的场景兼容。
在API接口这一层提供了模型会接触到的三个部分:
下面演示在ATLAS上的两个优化迭代的场景。
例如在一个OCR模型的落地过程中,旧模型部署之后会产生一些badcase,这些badcase和已有的标注数据融合之后成为新的数据集,再通过AutoML优化流水线优化旧模型产生新模型,新模型部署之后再循环往复。通过这样的循环可以让模型保持额外的1%的准确率的提升,由于OCR的模型精度很高,一般会在95%以上,所以1%也是很大的提升。
对于简单重复的优化流程使用全流程AutoML替代,对需要专家经验参与的场景使用AutoML作为辅助优化,并且使用全流程AutoML的结果作为Baseline,选择最优的模型部署上线。在我们公司内部有60%以上的场景通过这样的优化方式获得性能提升,提升效果从1%到5%不等。
下面介绍一下我们运用了哪些AutoML的技术,以及我们所做的改进。
首先介绍一下AutoML相比传统的专家建模有哪些优势。
AutoML的优势分为三个方面:
下面来介绍一下AutoML中常用的技术。
AutoML常用的技术包括三个方面:
在实际工作过程中,会根据不同的任务场景选择不同的技术,且这些技术可以联合使用。
下面几个部分分别介绍这三方面的技术。
首先是超参优化部分。实际上在我们的自动优化流水线当中,是将整个机器学习流水线作为自动优化的目标,而不仅仅是针对超参优化。包括自动化的特征工程、模型选择、模型训练和自动集成等,这样相比单独的超参优化,降低了过拟合的可能性。
除此之外,我们自己实现了一个AutoML的框架Genesis,来兼容主流的AI算法和AutoML工具,且对扩展友好,能够把平台中不同的能力模块相互正交,使得他们之间可以自由组合,实现更加灵活的自动优化流水线。
我们的系统中也使用了元学习方法,下面介绍一下元学习方法的必要性和应用的重点场景。
在积累了大量实验数据之后,我们发现数据集在元特征空间呈现明显的聚集性,所以我们假设在元特征空间分布接近的数据集的最优解也会接近。基于这个假设,我们使用历史任务的超参指导新任务的参数优化,发现超参搜索收敛速度会更快,且在有限的预算下,算法效果可以额外提升1%。
在大数据的应用场景中,有时会需要对已有数据集进行合并,例如将数据集A和数据集B合并产生新的数据集C,如果用数据集A和数据集B的超参作为数据集C的冷启动来指导数据集C的超参优化,一方面可以锁定搜索空间,另一方面可以达到最优的参数优化结果。
在实际开发过程中有时会需要对数据集进行采样,再对采样后的数据集进行超参优化,因为采样后的数据的元特征空间分布与原始数据是接近的,所以用原始数据集的超参去指导采样数据的超参优化,就可以提高优化效率。
最后是我们针对深度学习场景所做的自动优化。分为超参优化和对NAS的探索两个方面:
最后来讨论一下我们在机器学习平台建设过程中碰到的规模和效率的问题。
更多的模型参数意味着更好的模型表现是行业的共识。而深度学习存在如下的摩尔定律:
所以高速增长的计算需求与硬件性能之间的鸿沟必须通过优化来解决。
最常用的优化方法就是并行,包括数据并行、模型并行等。其中最常用的是数据并行的技术。
ATLAS平台的数据并行技术有以下特征:
还有一些模型不能只靠数据并行解决训练效率问题,还需要引入模型并行技术。
ATLAS的模型并行主要分为两个方面:
一些网络模型的全连接层参数规模非常大,如arcFace的分类规模高达几十、上百万甚至上千万,这样的一个全连接层不可能通过一张GPU卡覆盖。这时需要引入层内并行技术,不同节点计算同一张量的不同部分。
除了可以用张量描述的线性数据以外,我们做了一些图数据并行训练的探索。
对图数据来说,不管是采样还是其他操作都需要动态跨节点,而且图数据一般规模都很大,我们内部的图数据达到了百亿的规模,这样的图数据的计算很难在单机上完成。
图数据分布式计算的瓶颈在于映射表,传统的映射表的空间复杂度为O(n),如10亿个点10亿条边的图数据占内存160GB,形成分布式训练的规模天花板。我们提出了一个空间复杂度为O(1)的方法,通过重排节点和边的ID,只保留映射边界,达到图并行训练规模可任意扩展的效果。
同时我们也做了一些训练效率方面的优化。
我们还使用了反向传播重计算技术。对于一些参数非常多的模型,在正向传播的过程中,我们并不保存所有的层的计算结果,仅保留部分节点的checkpoint,在反向传播时空白参数节点从checkpoint开始重新计算。通过这种方式可以减少50%以上的内存资源,训练效率提高35%以上。
最后谈谈在机器学习平台的建设中的经验和思考。
我们总结了如下一些经验:
因为我们AI算法落地涉及到的,技术和内容是方方面面的,我不可能要求任意任一个环节上的同学都会了解整个全局,那我们一定要有一个平台能提供这些基础的能力来帮助大家去解决这些问题。
因为只有把自动化或者AutoML的应用做得好了,才能够更有效的去解放算法专家的生产力,让算法专家可以去做一些更深入的算法,或者能力的建设来提高机器学习的上限。
展望未来:
A1:开源的AutoML框架现在用的比较多的就是Optuna,还尝试过Auto-Sklearn和AutoWeka,然后给大家推荐一个网站是automl.org,因为其实现在做这个领域的人还是比较少的,这个网站是几个在AutoML领域的专家教授建的一个网站,上面有很多的AutoML的开源学习资料,大家都可以去参考。开源框架我们比较推荐的是我们用的Optuna去做调参,因为它的算法的来说的话就不是就这种最基础的贝叶斯优化,它是一个TPE的算法,比较适合参数量非常大的一些场景,贝叶斯优化还是更适合参数比较少的一些场景,不过我的建议是说大家可能针对不同的场景尝试一些不同的方法,因为就做更多尝试之后,大家可能会对什么场景适合什么方法更有经验。
A3:这可能是一个更具体的算法优化的问题,但在我们的优化流水线里面,我们是通过采样的方法来训练的,通过这样的方式让我们的任务能够见到数据集的更多的角度,或者说方面,然后再通过把这些采样之后训练得到的top模型集成起来,来让我们的模型有更强的泛化能力,这在我们的场景里面也是非常重要的一个方法。
A5:首先这个同学提到的虚拟化GPU,应该是指资源的分割和隔离吧。我们做机器学习平台的话,虚拟化GPU应该是一个必须的能力,就是说我们一定要把资源做到虚拟化,才能做更好的资源调度和分配。然后在这个基础之上的话,我们可能还会把我们的GPU的显存和它的计算资源去做分割,然后把不同大小的资源块去分给不同任务使用,但这一点实际上我们没有在训练里面去用,因为训练的任务通常会对计算的能力有更高的要求,不会是一个更小的资源消耗的应用场景,我们在推理的场景里面是会用到的。我们在实际应用过程当中发现虚拟化技术没有很好的开源免费的方案,有部分的云服务厂商会提供一些收费的方案,所以说我们自己在部署上使用的是分时复用的方案,就是把一些计算要求高的任务和一些计算要求低的任务去做混布,来做到分时的复用,在一定程度上能达到提高容量的效果。
A6:我们是可以接近一个线性的加速比的,就是我们自己测的话,比较好的时候大概可以达到一个80到90的程度。当然,如果节点数量非常多,可能还会需要做进一步的优化,现在可能大家发论文或者看到论文里面会提到说32个或者64个节点可以达到80、90的加速比,那可能是要有一些更专门的优化。但我们在机器学习平台里面的话,有可能会要针对更广泛的场景,在实际的场景里面,大多数的训练可能是4个GPU卡、8个GPU卡,最多16个GPU卡就能够满足要求。
A8:这个问题刚才提到过,就是像Optuna,Auto-Sklearn还有AutoWeka这些都是可以参考的。然后刚才有说到那个automl.org的这个网站,上面有很多资料,大家可以去学习一下。