“桃花一簇无开主,可爱深红爱浅红。node
黄四娘家花满蹊,千朵万朵压枝低。python
留连戏蝶时时舞,自在娇莺偏偏啼。”git
春天来了,通过一个冬天的“窖藏”,按耐不住的小伙伴纷纷行动了起来,踏一踏满园的春色,赶一趟娇艳的花丛。web
这时候带着小盆友的父母却有一个共同的烦恼,由于小盆友最爱问一个问题:“爸爸妈妈,这是什么花?”此时不要慌,拿出你的手机,打开手机百度“扫一扫”,就会看到一个“识花”的功能,一拍便可识别花的种类。算法
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
再一次感慨科技带来的便利的同时,你是否思考过这一神奇“魔法”背后的技术。天然界中花的种类多达45万种,存在的生物种类更是有近亿种之多。你是否想过,如何利用近年来火到爆棚的人工智能技术实现物种的分类和识别?这背后涉大规模图像分类技术。json
图像分类技术日趋成熟,ResNet网络在ImageNet数据集上的top5准确率已超过96%。然而,如何高效地完成百万类别甚至是更大规模的分类任务,则是一个极具挑战性的课题。服务器
先从多分类神经网络的实现角度分析,其最后一层一般是由全链接层和Softmax构成的组合层,全链接层输出结点数挂钩分类任务的类别数,因此对应的参数量随分类类别数的增加而线性增加。所以,当类别数很是大时,神经网络训练过程占用的显存空间也会很大,甚至是超出单张GPU卡的显存容量,致使神经网络模型没法训练。网络
以新闻推荐系统为例,假设要对百万类细分类别的新闻条目进行分类,那么仅存储全链接层参数就须要约2GB的显存空间(这里假设神经网络最后一层隐层的输出结点的维度为512,并假设以32比特浮点数表示数据)。再考虑神经网络训练过程当中生成的数量庞多的中间变量,那么训练过程当中须要的存储总量每每会超出单张GPU卡的显存容量。架构
该如何解决这个问题呢?经常使用的作法是“拆分”。考虑到全链接层的线性可分性,能够将全链接层参数切分到多张GPU卡,采用模型并行方案,减小每张GPU卡的参数存储量。框架
如下图为例,全链接层参数按行切分到不一样的GPU卡上。每次训练迭代过程当中,各张GPU卡分别以各自的训练数据计算隐层的输出特征(feature),并经过集合通讯操做AllGather获得汇聚后的特征。接着,各张GPU卡以汇聚后的特征和部分全链接层参数计算部分logit值(partial logit),并基于此计算神经网络的损失值。
这个方案能够有效解决全链接层参数量随分类类别数线性增加致使的显存空间不足的问题。然而,为了实现这一方案,开发者须要基于现有的深度学习平台设计和实现上例描述的全部操做,包括全链接层参数的切分和集合通讯等,动辄须要数百行实现代码,大大增长了开发者的负担。
另外模型训练完成后,如何基于预训练模型便捷的部署预测服务并快速上线,也是开发者广泛关注的问题。
如今,开发者的福音来了,飞桨近期开源了基于核心框架构建的大规模分类库(PLSC: PaddlePaddle Large Scale Classification),为用户提供了大规模分类任务从训练到部署的全流程解决方案。只需数行代码,便可实现千万类别分类的神经网络。而且,经过PLSC库提供的serving功能用户能够快速部署模型,提供一站式服务。
简单易用,五行代码实现千万类别分类神经网络
飞桨大规模分类库PLSC(如下简称PLSC)封装了大规模分类神经网络实现,提供简洁易用的高层API,用户经过五行代码便可实现千万类别分类神经网络。
(1) 安装飞桨
能够参考官网下载并安装飞桨。
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
(2) 安装PLSC
执行下面的命令安装PLSC。
pip install plsc
复制代码
(3) 准备模型训练配置代码,保存为train.py文件。
使用PLSC组建分类神经网络主要包括下面三个步骤:
1. 从plsc包导入Entry类,Entry类封装PLSC全部API的接口类;
2. 实例化Entry类的对象;
3. 调用Entry类的train方法,开始训练过程。
默认状况下,该训练脚本使用的loss值计算方法为'dist_arcface',即将全链接层参数切分到多张GPU卡的模型并行方案,须要使用两张或以上的GPU卡。
from plsc import Entry if __name__ == "main": ins = Entry() ins.set_class_num(1000000) #设置分类类别数 ins.train() 复制代码
(4) 启动训练任务
可使用下面的命令行启动训练任务,其中selected_gpus参数用于指定训练中使用的GPU卡。
python -m paddle.distributed.launch \
--selected_gpus=0,1,2,3,4,5,6,7 \
train.py
复制代码
PLSC库在多个数据集上能够取得SOTA的训练精度,下表列出PLSC库分别使用MS1M-ArcFace和CASIA数据集做为训练数据,在不一样验证数据集上取得的精度。
备注:上述模型训练使用的loss_type为'dist_arcface'。更多关于ArcFace的内容请参考
ArcFace:Additive Angular Margin Loss for Deep Face Recognition
https://arxiv.org/abs/1801.07698
PLSC支持多机分布式训练。一方面,经过多机分布式训练能够将全链接层参数切分到更多的GPU卡,从而支持千万类别分类,而且飞桨大规模分类库理论上支持的分类类别数随着使用的GPU卡数的增长而增长。例如,单机8张V100 GPU配置下支持的最大分类类别数相比不使用PLSC扩大2.52倍。
另外一方面,使用多机分布式训练能够有效提高训练速度。
经过下面几行命令便可启动多机分布式训练。其中,cluster_node_ips参数用于指定全部训练节点的ip地址列表,node_ip参数用于指定当前训练节点的ip地址。
python -m paddle.distributed.launch \ --cluster_node_ips="127.0.0.1,127.0.0.2" \ --node_ip="127.0.0.1" \ --selected_gpus=0,1,2,3,4,5,6,7 \ train.py 复制代码
下图给出使用不一样数量的节点时的训练速度(吞吐)。实验中使用的训练数据集为MS1M-ArcFace,分类类别数为85742,每一个节点配备8张NVIDIA V100 GPUs,backbone模型为ResNet50。如图所示,使用飞桨大规模分类库能够取得近似线性的加速比。
用户完成分类神经网络训练后,一般要基于获得的预训练模型部署预测服务。经过飞桨大规模分类库提供的serving功能可实现快速部署。
飞桨大规模分类库提供支持预测服务部署的serving端和client端。serving端基于飞桨服务器端部署库Paddle Serving开发,使用serving端功能能够基于预训练模型快速部署预测服务。client端则提供了和serving端的交互功能,用户经过client端提交查询请求并获取预测结果。只需三步便可完成部署。
(1) 安装serving端和client端。
pip install plsc-serving ujson
复制代码
(2) 经过下面的脚本部署serving端:
from plsc_serving.run import PLSCServerfs = PLSCServer()# 设定使用的模型路径fs.with_model(model_path = '/XXX/XXX')# gpu_index指定使用的gpu,port指定使用的端口fs.run(gpu_index = 0, port = 8010) 复制代码
(3) 经过下面的脚本使用client端功能:
from face_service import FaceService with open('./data/00000000.jpg', 'rb') as f: image = f.read() fc = FaceService() # 添加server端链接 fc.connect('127.0.0.1:8010') #调用server端预测 result = fc.encode([image]) print(result[0]) fc.close() 复制代码
单机8张Nvidia Tesla v100 GPU配置下,混合精度比常规单精度训练速度提高42%。
使用混合精度训练能够提高训练的速度,同时减小训练使用的显存开销。开启混合精度训练方法以下:
from plsc import Entry def main(): ins = Entry() ins.set_mixed_precision(True) ins.train()if __name__ == "__main__":main() 复制代码
在单机8张Nvidia Tesla v100 GPU配置下,对比resnet50模型单精度训练和混合精度训练的效果,混合精度训练速度可提高42%:
关于混合精度训练的内容请参考:
https://arxiv.org/abs/1710.03740
实际业务中,一种常见的数据存储格式是将图像数据编码为base64格式,训练数据文件的每一行存储一张base64格式编码的图像数据和该图像的标签,并一般以制表符('\t')分隔图像数据和图像标签。
神经网络训练过程当中,一般须要对训练数据作全局shuffle。此外,须要切分训练数据,确保每张GPU卡使用相同数量的训练数据。对Base64格式的数据作全局shuffle的开销较大,若在训练过程当中执行全局shuffle,会严重影响训练速度。
飞桨大规模分类库内置Base64格式数据预处理工具,能够对训练数据作全局shuffle,并将训练数据均分到多个数据文件,确保数据文件的数量和训练中使用的GPU卡数相同,且每一个数据文档包含相同数量的训练数据。训练效率显著提高。
咱们有时须要基于预训练模型作fine-tuning这种场景下,fine-tuning阶段的训练GPU卡数和预训练阶段使用的GPU卡数可能不一样,尤为是当预训练和fine-tuning是分别由不一样的组织执行时。考虑全链接层参数是根据使用的GPU卡数切分的这一情形,当fine-tuning阶段和预训练阶段使用不一样的GPU卡数时,在加载模型参数前,用户须要重构模型参数,以适应fine-tuning阶段的GPU卡数。为了简化用户操做,飞桨大规模分类库提供了自动化的模型参数重构功能。当fine-tuning阶段使用的GPU卡数和预训练阶段不一样时,飞桨大规模分类库在加载预训练模型参数时会自动根据fine-tuning阶段使用的GPU卡数重构预训练模型参数,以适应fine-tuning阶段的GPU卡数。
面对疫情,百度近期攻克了戴口罩人脸识别技术难关,快速上线了AI口罩检测方案,并在地铁、园区、厂区等场所上线,高效保障防疫工做。
百度AI口罩检测方案采用百度最新的PyramidBox-lite检测算法,加入超过10万张口罩人脸训练数据。为了解决数百万ID数据训练问题,采用飞桨大规模分类库PLSC实现了快速训练。在准确率不变的状况下,召回率提高30%,佩戴口罩的人脸检测准确率超过99%。
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
>> 访问 PaddlePaddle 官网,了解更多相关内容。