大模型半监督学习-图像分类产线使用文档
产线简介
大模型半监督学习-图像分类产线是飞桨特色的图像分类训练产线,通过大小模型联合训练的方式,使用少量有标签数据和大量无标签数据提升模型的精度,大幅度减少人工迭代模型的成本、标注数据的成本。下图展示了该产线在公开数据集 ImageNet-1k 10% 有标注数据的指标情况。使用该产线训练后,在 ImageNet-1k 10% 有标签数据 +90% 无标签数据上,大模型(CLIP_vit_large_patch14_224)相比直接训练,精度高 1.2 个百分点(84.2%->85.4%),刷新了该数据集的 SOTA。小模型(ResNet50)相比直接训练,精度高了 26 个百分点以上(54%->80.3%)。
你可以通过 在线体验应用,单图测试不同模型方案的效果。
效果展示
熊 | 狗 | 猫 | 吉他 |
---|---|---|---|
消防车 | 山地车 | 熊猫 | 跑车 |
如果你有一批数据,并且想要在自有数据上训练模型,可以前往 模型产线,创建 大模型半监督学习-图像分类 产线,并参考以下内容进行模型选型和训练部署。
训练方式介绍
本产线支持3种训练方式:同时训练大模型与小模型、单独训练大模型、单独训练小模型,大小模型 benchmark 如下:
大模型列表 | Top1 Acc(%) | GPU 推理耗时(ms) | CPU 推理耗时(ms) | 模型存储大小(M) |
---|---|---|---|---|
CLIP_vit_large_patch14_224 | 88.06 | - | - | 1157 |
PP-HGNetV2_B6 | 86.30 | 10.46 | 240.18 | 288 |
CLIP_vit_base_patch16_224 | 85.39 | 12.03 | 234.85 | 331 |
SwinTransformer_base_patch4_window7_224 | 83.37 | 12.35 | - | 342 |
小模型列表 | Top1 Acc(%) | GPU 推理耗时(ms) | CPU 推理耗时(ms) | 模型存储大小(M) |
---|---|---|---|---|
PP-HGNetV2_B4 | 83.57 | 2.45 | 38.10 | 76 |
PP-HGNet_small | 81.51 | 4.24 | 108.21 | 94 |
PP-HGNetV2_B0 | 77.77 | 0.68 | 6.41 | 23 |
ResNet50 | 76.50 | 3.12 | 50.90 | 98 |
PP-LCNet_x1_0 | 71.32 | 1.01 | 3.39 | 7 |
MobileNetV3_small_x1_0 | 68.24 | 1.09 | 3.65 | 12 |
注:以上精度指标为 ImageNet-1k 验证集 Top1 Acc,这里为了让大家挑选模型,仅展示了在全量数据集训练的精度结果。GPU 推理耗时基于 NVIDIA Tesla T4 机器,精度类型为 FP32, CPU 推理速度基于 Intel(R) Xeon(R) Gold 5117 CPU @ 2.00GHz,线程数为 8,精度类型为 FP32。
同时训练大模型与小模型
推荐的训练方式,在一条产线内同时完成大模型和小模型的训练,并选择评估满意的模型权重做部署。大模型的训练是一个半监督学习过程,训练过程被分为了不同的阶段,耗时一般较长。在大模型训练结束后,会默认选中评估结果最佳的大模型权重,并使用大模型为无标注数据生成的伪标签以及标注数据来训练小模型,小模型的训练耗时一般较短。训练结束后,你会同时得到大模型和小模型的训练结果,并在评估后选择一个满意的模型权重,部署为一个服务 API 或离线 SDK,用于实际使用场景中。
单独训练大模型
在大模型半监督学习中,核心思想是通过大模型来指导小模型的训练,但是客观来说,大模型自学习也会有一定的精度提升,可以作为单独的模型方案做部署。因此,当需求场景对精度要求高,而对推理速度不敏感时,可以选择单独训练大模型的方式,用大模型的权重做部署。在此训练方式中,你无需选择小模型,训练结束后只会得到大模型的训练结果,在评估后选择一个满意的模型权重,部署为一个服务 API 或离线 SDK,用于实际使用场景中。
单独训练小模型
如果在之前的产线中,已经完成了大模型的训练,并且评估得到了精度满意的大模型权重,你可以选择「标记模型权重」,并在本产线中载入之前标记过的大模型权重,单独训练小模型。在此训练方式中,训练结束后只会得到小模型的训练结果,在评估后选择一个满意的模型权重,部署为一个服务 API 或离线 SDK,用于实际使用场景中。
数据准备
ClsLMSSLDataset
大模型半监督学习-图像分类要求的数据集格式。
数据集目录结构
请按照如下格式准备数据,以确保产线可以正确读取数据集,进行模型训练。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 图像的保存目录,目录名称可以改变,但要注意与train.txt、val.txt的内容对应
├── label.txt # 标注id和类别名称的对应关系,文件名称不可改变。每行给出类别id和类别名称,内容举例:30 康乃馨
├── train.txt # 训练集标注文件,文件名称不可改变。每行给出图像路径和图像类别id,使用空格分隔,内容举例:images/image_06765.jpg 0
├── train_unlabeled.txt # 无标注训练集文件,文件名称不可改变。每行给出图像路径,内容举例:images/image_06766.jpg
└── val.txt # 验证集标注文件,文件名称不可改变。每行给出图像路径和图像类别id,使用空格分隔,内容举例:images/image_06767.jpg 10
与图像分类要求数据集格式 ClsDataset 相比,在 dataset_dir 目录下增加无标注数据 train_unlabeled.txt,要求把所有无标注的图像名称按行整理,你可以参考:示例数据集 和 图像分类数据准备。
标注格式要求
图像分类数据要求标注出数据集中每张图像的类别,产线要求的 ImageNet 数据格式采用 类别id
表示物体类别。在 train.txt
与 val.txt
中每行给出图像路径和图像类别id,使用空格分隔。label.txt
中为 类别id
与 类别名称
的对应关系,每行给出类别id和类别名称,使用空格分隔。
完成校验的数据集会保存在个人数据集中,支持用户跨产线导入数据集。
此外,本产线支持引入无标签数据,除已完成标注的数据外,你可以在 images 目录下增加未标注数据,并将图像路径保存在 train_unlabeled.txt 中,这些数据会以无监督的方式参与模型训练,获得精度更高的模型。
参数准备
正确设置训练参数对于模型训练至关重要,本产线支持两种参数设置方式:修改表单和修改配置文件,常见训练参数推荐使用表单修改,可展开高级设置修改更多参数,对飞桨套件参数较熟悉的用户可以通过表单修改全部训练参数。训练大模型和小模型的基础配置和高级配置参数如下:
基础配置
- 轮次(Epochs): 模型对训练数据的重复学习次数,一般来说,轮次越大,模型训练时间越长,模型精度越高,但是如果设置特别大,可能会导致模型过拟合。如果对轮次没有特别的要求,可以使用默认值进行训练。
- 批大小(Batch Size): 由于训练数据量一般较大,模型每轮次的训练是分批读取数据的,批大小是每一批数据的数据量,和显存直接相关,批大小越大模型训练的速度越快,显存占用越高。为确保训练不会因为显存溢出而终止,我们将 V100 32G 单卡可以运行的最大值作为批大小的可设置最大值。
- 类别数量(Class Num): 数据集中检测结果的类别数,由于类别数量和数据集直接相关,我们无法填充默认值,请根据数据校验的结果进行填写,类别数量需要准确,否则可能引起训练失败。
- 学习率(Learning Rate): 模型训练过程中梯度调整的步长,通常与批大小成正比例关系,学习率设置过大可能会导致模型训练不收敛,设置过小可能会导致模型收敛速度过慢。在不同的数据集上学习率可能不同,对结果影响较大,需要不断调试。
高级配置
- 断点训练权重: 在模型训练过程中发生人为或意外终止的情况时,加载训练中断之前保存的断点权重路径,完成继续训练,避免算力资源浪费。
- 预训练权重: 基于已经在大数据集上训练好的模型权重进行微调训练,可提高模型训练开始前的初始经验,提高训练效率。
- 热启动步数(WarmUp Epochs): 在训练初始阶段以较小学习率缓慢增加到设置学习率的批次数量,该值的设置可以避免模型在初始阶段以较大学习率迭代模型最终破坏预训练权重,一定程度上提升模型的精度。
- log 打印间隔(Log Interval) / step: 训练日志中打印日志信息的批次数量间隔。
- 评估、保存间隔(Eval Interval) / epoch: 训练过程中对验证集进行评估以及保存权重的轮数间隔。
特别地,当你单独训练小模型时,需要设置大模型权重,该模型权重为了让大模型教导小模型训练,获得高精度的小模型。
提交训练
训练套餐包括:V100 32G 1卡 3算力点/小时、V100 32G 1卡 30A币/小时、V100 32G 4卡 120A币/小时、V100 32G 8卡 240A币/小时,支持用户选择算力点或 A 币支付 GPU 使用花费。你可以根据自己的需求和平台 GPU 占用情况选择合适的训练套餐。
为鼓励更多用户体验模型产线新功能,每个账户赠送 3 张限时免费卡,前三次使用 V100 32G 1卡 30A币/小时训练套餐免费,之后将按对应训练时长计费,此外,训练过程中主动停止或因配置信息有误导致的训练失败,限免卡不返还。
产线详情页
提交训练后,页面会刷新为产线详情页,展示用户设置的全部训练配置信息,包括:产线模板、微调模型、训练参数配置、数据集、输出路径、资源选择和任务状态。当 GPU 集群可以执行训练任务时,任务状态显示为运行中,日志详情实时打印当前训练 log;当 GPU 集群暂无资源执行训练任务时,任务状态显示为排队中,此时可选择取消排队,返回配置中状态,如使用限免卡,限免卡会原路返还。
产线评估
产线状态为完成态(含运行成功、已停止、运行失败)时,产线内通常有结果产出,支持用户对产出的模型权重进行评估。训练中使用验证集评估的结果被提前保存,以表单的形式展示在评估页面,方便用户查看和标记模型权重。
注:大模型半监督学习的特点是引入用户的无标签数据集进行训练,因此不提供官方模型权重,不支持直接部署,需训练后评估模型权重。
标记模型权重
每条产线产出的模型权重通常不止一个,为方便用户查找和管理,你可以在这里对满意的模型权重做个标记,并为它取一个昵称(例如:数据集A评估最佳)。标记过的模型权重支持跨产线导入,也就是说,你可以在其他产线的同模型名选择权重(如模型部署、断点训练)的下拉菜单中,找到在本产线标记过的权重。当然,权重也可以取消标记,以减少选择成本。
创建评估任务
除了在验证集上评估模型权重外,如果你还有一批新的测试数据,可以选择自定义测试集的方式,上传测试数据并进行评估。请注意数据集的格式要求与训练数据集相同,但此处不会进行数据校验,如果数据格式存在问题,可能会引发评估任务失败。
历史评估任务的设置信息与日志会完整保留,可以通过历史记录查看详细情况。
产线部署
本产线支持两种部署方式:在线服务化部署和导出离线部署包。你可以根据自己的实际需求选择合适的部署方式,使用你满意的模型方案。
在线服务化部署
服务化部署指的是将模型方案部署为一个云端可调用 API,服务成功运行后,你可以使用自己的访问令牌鉴权后调用 API。此外,在线体验的应用中也可以找到这个 API 进行小样本可视化测试哦。
注:这种方式适用于数据不敏感且无部署机器的用户使用,API 为用户私有,仅能通过用户个人的访问令牌鉴权后调用。
导出离线部署包
如果你有离线部署的需求,产线也支持用户导出离线部署包。与在线服务化部署不同的是,你需要选择本地运行环境,产线会依据运行环境的不同导出相应的部署包,支持用户下载后本地运行。
此外,特色产线的离线部署包需付费使用,请在产线内购买部署包序列号,本地激活后使用。购买注意事项及商务对接,可点击 立即咨询。