当前位置: 首页 > 科技观察

模特也可以在线授课?!一文看懂服务型蒸馏训练计划

时间:2023-03-18 13:31:03 科技观察

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。今年以来,受疫情影响,为减少人员聚集,减少病毒传播的可能,各大中小学均开启了线上教学。在线课程已成为一种众所周知的学习方式。但是你知道吗,在深度学习领域,模型训练也可以采取在线课程的形式。不要太震惊,这真的存在!这是LFAI基金会EDL项目推出的基于飞桨深度学习平台的面向服务的蒸馏训练项目!什么是蒸馏训练?说到蒸馏训练,就不得不提到知识蒸馏。现在深度学习模型越来越大,网络层越来越深。在很多场景下,模型越大,层数越多,模型的效果越好。但受限于推理速度和显存资源的要求,大模型通常不能直接部署,需要对模型进行压缩。当前主流的压缩方法包括裁剪、量化和知识蒸馏。其中,知识蒸馏的概念是Hinton等人提出的一项黑科技。在2015年发表的《Distilling the Knowledge in a Neural Network》论文中。它是一种非常经典的模型压缩技术,将知识从一个复杂模型(Teacher)迁移到另一个。在轻量级模型(Student)上实现模型压缩的方式。其实所谓的知识迁移可以理解为一个训练过程,就是用Teacher模型去训练Student模型。这种训练方法就是蒸馏训练。训练好Student模型后,就可以使用Student模型进行实际部署了。如下图所示,训练步骤可以分为两步:TrainaTeachermodel。训练Student模型,即利用Teacher模型的知识来训练Student模型。△知识蒸馏架构图所谓Teacher模型的知识,就是指Teacher模型的推理结果,我们称之为软标签。这个软标签将作为学生网络的训练目标。Student的推理结果需要尽可能接近Teacher的推理结果。与软标签对应的是硬标签,也就是真实训练数据的标签。与硬标签相比,软标签包含的信息更多。比如在做区分驴和马的分类任务时,softlabel不仅会像hardlabel一样给出马的索引值为1,其余类别的索引值为0,还会提供一个概率值对于驴子(比如0.3或者0.4),这样做的好处是软标签包含了不同类别之间的相似度信息。显然,用softlabel训练的模型比单独用hardlabel训练的模型要学习更多的知识,所以更好。知识蒸馏训练的目标函数可以通过distillationloss(对应teachersoftlabel)和studentloss(对应labeledhardlabel)来加权。公式如下,其中p代表Student模型的推理结果,q为teacher的推理结果,y为硬标签。什么是服务蒸馏培训?说完了升华培训,进入正题,看看我们的服务型升华培训是怎么回事吧!蒸馏训练可以分为以下三种方式:离线蒸馏训练离线蒸馏训练的方式非常类似于老师(Teacher)将讲课内容录制成视频,交给学生(Student)进行自学。学习,然后学生根据课程视频自学。所以离线蒸馏训练就是先使用Teacher模型进行推理并将结果保存在磁盘中,然后Student模型使用保存在磁盘中的样本和Teacher模型的推理结果作为数据集进行训练。在这种训练模式下,Student模型的训练与常规训练一致,方法简单。但这种训练方式一般需要数据增强,占用磁盘空间巨大,应用环境受到一定限制。△OfflineDistillationTrainingConventionalDistillationTrainingConventionaldistillationtraining常规蒸馏训练是指将Teacher模型和Student模型放到同一个网络中,固定Teacher模型参数只做正向传播,Student模型做正常反向传播训练。这也是目前主流的蒸馏训练方式。这与现实生活中常规的教学方法非常相似。老师和学生在同一个教室。老师讲,学生听。但是这种训练方式不仅对Teacher模型本身需要很大的空间,而且由于Teacher和Student是1对1的绑定关系,Student模型的训练完全依赖于Teacher模型,而Student模型要等Teacher模型输出一批推理结果才能训练,而teacher模型要等Student训练完一批再开始下一批的推理,有一定影响关于整体训练速度。Service-typedistillationtrainingService-typedistillationtraining是一种基于EDL(ElasticDeepLearning,弹性深度学习框架)的训练方案。EDL是LFAI孵化的重要项目之一,LFAI是Linux基金会(LF)下负责人工智能和大数据深度学习的基金会。如今,在云计算资源蓬勃发展的情况下,利用弹性资源进行深度学习模型训练和推理将成为普遍现象,于是EDL项目应运而生。EDL项目可以让深度学习模型在云端的训练和推理变得更简单、更高效。服务型蒸馏训练计划是EDL项目联合百度飞桨开源深度学习平台推出的全新训练计划,可以说是出自名门!与传统的蒸馏训练相比,服务式蒸馏训练将Teacher模型和Student模型解耦。Teacher模型部署为在线推理服务,Student模型作为客户端通过Internet实时向Teacher模型发送样本,获取推理结果进行训练,这就像给模型上在线课程。那么网课能给用户带来哪些好处呢?我们往下看!△服务蒸馏训练服务蒸馏训练的价值与传统的蒸馏训练模式相比,服务蒸馏训练可以为用户带来以下好处:节省显存资源。由于Student模型和Teacher模型的解耦,服务型蒸馏训练可以使用异构资源,即将Student模型和Teacher模型部署到不同的设备上。原本受限于显存大小,难以部署在单张GPU卡上的蒸馏网络,可以通过这种方式部署在不同的卡上。提高训练速度。由于显存资源的节省,Student模型可以用更大的batchsize进行训练;同时,由于Student模型和Teacher模型是异构pipeline,Student模型不需要等到Teacher模型推理完再进行训练。结合以上两个原因,可以大大提高训练速度。提高培训资源利用率。在实际应用中,我们可以将Teacher模型部署到在线弹性估计卡集群中,利用在线估计卡空闲时的计算资源,提高蒸馏任务中Teacher模型端的吞吐量。同时,由于Teacher模型可以灵活调度,不用担心高峰期在线实例被抢占导致任务失败。相当于把老师对训练卡的资源需求转移到了在线GPU卡上。在v100等线下训练资源有限的情况下,使用在线卡加速训练,节省宝贵的训练资源。另外,在离线集群上,结合调度策略,也可以将Teacher模型部署到集群的碎片化资源,或者k40等利用率低的资源上,充分利用空闲和碎片化的资源集群。提高培训效率。用户可以根据Teacher和Student的吞吐量表现,灵活设置Teacher与Student的比例,即多个老师可以教多个学生,而不是只维持1:1的辅导模式,最大限度地提高训练的产出。为了验证服务型蒸馏训练的效果,我们采用普通训练、常规蒸馏训练和服务型蒸馏训练几种不同的方法在ImageNet数据集上训练ResNet50_vd模型。在准确率方面,可以看出,与普通训练相比,蒸馏训练将ResNet50_vd模型的准确率提升了近2%。而服务蒸馏训练和常规蒸馏训练在准确性上是不相上下的。当然,这个模型的蒸馏精度远不止于此。更多提高知识蒸馏准确率的技巧,请参考以下地址:https://paddleclas.readthedocs.io/zh_CN/latest/advanced_tutorials/distillation/index.html在速度上,相比普通训练,常规蒸馏训练占用了Teacher模型很大一部分的计算能力,因此在相同的训练资源下,训练速度仅为普通训练的35.9%。服务式蒸馏培训使用额外的在线P4弹性资源,将教师对培训卡的资源需求转移到弹性卡上。因此,与普通训练相比,仍然保持了82.8%的训练效率,速度与常规蒸馏训练相同。2.3倍。如果继续增加Teacher资源,理论上EDL服务型蒸馏训练的速度可以和普通训练持平。当然,如果增加资源,常规的蒸馏训练可以继续加速,但这会占用更多宝贵的v100训练资源。既然服务蒸馏培训这么厉害,它是怎么做到的呢?我们来看看它的具体实现。服务式蒸馏训练实现方案从具体实现来看,服务式蒸馏训练之所以称为服务,是因为它部署了Teacher模型作为服务端,Student模型作为客户端。如下图所示,该方案可以描述为将Teacher模型部署为在线容错弹性服务,而在Student模型侧,使用DistillReader来封装Student模型与Teacher模型之间的通信访问教师服务。下面介绍一下什么是DistillReader和容错弹性服务?△服务型蒸馏训练架构图DistillReaderDistillReader用于代表Student模型与Teacher模型进行通信,从而生成Student模型训练的数据读取器。如下图所示,Student模型将训练样本和标签发送给trainingreader,DistillReader从trainingreader读取训练样本发送给Teacher模型,得到推理结果。推理结果与原始训练reader中的数据封装在一起,将包含推理结果的新reader返回给Student模型,这样TEACHER模型的推理和STUDENT模型的训练就可以在pipeline中并行.△DistillReader功能示意图容错弹性服务容错弹性服务的实现架构如下图所示。首先,我们通过PaddleServing将多个Teacher模型部署为服务,并将服务注册到Redis数据库中;Student模型作为客户端从服务发现时查询需要的Teacher服务;服务发现从Redis数据库查询,按照一定的负载均衡策略返回客户端需要的Teachers列表;每当Teacher发生变化时,客户端可以实时获取最新的Teacher列表,并连接到Teacher上进行蒸馏训练,不用担心因为连接回收的Teacher资源导致任务失败。△弹性伸缩服务架构图如下图所示。本图为服务式蒸馏训练操作流程图。图中可以看到STUDENT模型向TEACHER模型发送样本并得到推理结果,而TEACHER模型服务端可以随意增减。弹性调节。△服务蒸馏培训流程图了解实施方案后,如何使用服务蒸馏培训?下面通过一个操作实例给大家做一个简单的介绍。服务蒸馏训练实践我们通过训练图像分类模型来演示如何使用服务蒸馏训练。由于只是演示,这里我们使用单机环境,也就是说服务端和客户端部署在同一台服务器上,服务端的IP地址为127.0.0.1。如果部署在不同的设备上,只需修改代码中的IP地址即可。准备环境,请执行以下命令拉取镜像。镜像为CUDA9.0环境,其中我们预装了EDL、Paddle核心框架、PaddeServing等相关依赖。dockerpullhub.baidubce.com/paddle-edl/paddle_edl:latest-cuda9.0-cudnn7nvidia-dockerrun-namepaddle_edlhub.baidubce.com/paddle-edl/paddle_edl:latest-cuda9.0-cudnn7/bin/bash启动Teacher模型请执行以下命令在1号GPU卡上启动Teacher服务,其中Teacher模型为图像分类模型ResNeXt101_32x16d_wsl,该服务的端口号为9898,启动内存优化功能。cdexample/distill/resnetwget--no-check-certificatehttps://paddle-edl.bj.bcebos.com/distill_teacher_model/ResNeXt101_32x16d_wsl_model.tar.gztar-zxfResNeXt101_32x16d_wsl_model.tar.gzpython-mpaddle_serving_server_gpu.serve\--modelResNeXt101_32x16d_wsl_model\--mem_optimTrue\--port9898\--gpu_ids1启动Student模型训练,执行以下命令在GPU卡0上启动Student模型,要启动的学生模型为ResNet50_vd。python-mpaddle.distributed.launch--selected_gpus0\./train_with_fleet.py\--model=ResNet50_vd\--data_dir=./ImageNet\--use_distill_service=True\--distill_teachers=127.0.0.1:9898其中train_with_fleet.py它是用于开始训练的脚本。用户需要添加与蒸馏训练相关的代码。如果用户想知道如何修改脚本,可以参考以下地址。https://github.com/elasticdeeplearning/edl/blob/develop/example/distill/README.md