模型也可以上网课?!一文看懂服务型蒸馏训练方案
在精度上,可以看出相比于普通训练,蒸馏训练提升了ResNet50_vd模型近2%的精度。而服务型蒸馏训练和常规蒸馏训练在精度上持平。当然该模型的蒸馏精度远不止于此,关于知识蒸馏更多提升精度的技巧请参考如下地址: https://paddleclas.readthedocs.io/zh_CN/latest/advanced_tutorials/distillation/index.html 在速度上,相比于普通训练,常规蒸馏训练由于Teacher模型占用了很大一部分算力,所以在相同训练资源的情况下,训练速度仅为普通训练的35.9%。而服务型蒸馏训练由于使用了额外的在线P4弹性资源,将Teacher对训练卡的资源需求转移到了弹性卡上,所以相比于普通训练,仍保持有82.8%的训练效率,速度为常规蒸馏训练2.3倍。 如果继续增加Teacher资源,理论上EDL服务型蒸馏训练的速度是可以和普通训练速度持平的。当然常规蒸馏训练如果加大资源,也是可以继续加速的,不过这样就占用了更多宝贵的v100训练资源了。 服务型蒸馏训练既然那么厉害,那它是怎么做到的呢?咱们来看看它的具体实现。 服务型蒸馏训练的实现方案 从具体实现的角度看,服务型蒸馏训练之所以被称为服务,就是因为它将Teacher模型部署成了服务端,而Student模型成了客户端。如下图所示,该方案可以描述为将Teacher模型被部署为在线可容错弹性服务,而在Student模型一侧则通过DistillReader来封装Student模型与Teacher模型之间的通信,访问Teacher服务。下面咱们分别介绍下DistillReader和可容错弹性服务都是啥? △ 服务型蒸馏训练架构图 DistillReader DistillReader用来代表Student模型向Teacher模型进行通信,从而产生可供Student模型训练的数据reader。如下图所示,Student模型将训练样本和标签传入训练reader,DistillReader从训练reader中读取训练样本发送给Teacher模型,然后获取推理结果。推理结果和原训练reader中的数据封装在一起,返回一个包含推理结果的新reader给Student模型,这样TEACHER模型的推理和STUDENT模型的训练就可以流水行并行起来了。 △ DistillReader功能示意图 可容错弹性服务 可容错弹性服务的实现架构如下图所示,首先我们通过Paddle Serving将多个Teacher模型部署成服务,并注册服务到Redis数据库中;Student模型则作为客户端从服务发现中查询所需的Teacher服务;服务发现从Redis数据库查询并按某种负载均衡策略返回客户端所需的Teacher列表;每当Teacher变化时,客户端就可以实时拿到最新Teacher列表,连接Teacher进行蒸馏训练,不用担心发生由于连接到被收回的Teacher资源而导致任务失败的请况。 △ 弹性伸缩服务架构图 如下图所示,该图是服务型蒸馏训练运行的流程图,图中可以看到STUDENT模型给TEACHER模型发送样本并获取推理结果,而TEACHER模型服务侧则可以随意增删,弹性调整。 △ 服务型蒸馏训练流程图 在了解了实现方案后,那么怎么使用服务蒸馏训练呢?下面我们通过一个操作示例为大家简单介绍一下。 服务型蒸馏训练实践 我们通过训练图像分类模型来给大家演示下如何使用服务型蒸馏训练。由于仅是演示,这里我们使用的是单机环境,也就是说服务端和客户端部署在了同一个服务器上,服务端的IP地址是127.0.0.1。如果部署在不同设备上,修改下代码中的IP地址即可。 环境准备 请执行如下命令拉取镜像,镜像为CUDA9.0的环境,在里面我们预装了EDL、飞桨核心框架和Padde Serving等相关依赖。 docker pull hub.baidubce.com/paddle-edl/paddle_edl:latest-cuda9.0-cudnn7 nvidia-docker run -name paddle_edl hub.baidubce.com/paddle-edl/paddle_edl:latest-cuda9.0-cudnn7 /bin/bash 启动Teacher模型 请执行如下命令在1号GPU卡启动Teacher服务,其中Teacher模型为图像分类模型ResNeXt101_32x16d_wsl,服务的端口号为9898,并启动了内存优化功能。 cd example/distill/resnet wget --no-check-certificate https://paddle-edl.bj.bcebos.com/distill_teacher_model/ResNeXt101_32x16d_wsl_model.tar.gz tar -zxf ResNeXt101_32x16d_wsl_model.tar.gz python -m paddle_serving_server_gpu.serve --model ResNeXt101_32x16d_wsl_model --mem_optim True --port 9898 --gpu_ids 1 启动Student模型训练 请执行如下命令在0号GPU卡启动Student模型,启动的student模型为ResNet50_vd,。 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |