全流程:Fine-Tuning 一个ViT图片分类模型,并发布成小程序

190 阅读4分钟

内容简述

日常使用大模型久了,就难免会想着去了解一下模型内部的运行原理。本文就通过微调小的ViT模型,输出一个具备特定任务功能的小模型,并假定以可以运行在微信小程序里为任务目标

本来是想识别猫猫的,但是猫猫的数据集没找到....

实现步骤

环境相关的准备工作不在内容范围

  • 挑选模型(体积要小)
  • 选择训练数据(数据收集整理比较难)
  • 微调模型(耗时)
  • 导出成小程序支持的模型格式(有点坑)
  • 整一个简单的UI页面(小程序上线流程前置审核好繁琐)

01 挑选模型

Hugging Face中,找到自己特定的模型任务,然后搜索“base”,就会出现当前任务下的各种基础模型

搜索基础模型

看模型大小的话,可以点击模型信息的小卡片,以我最后挑选的facebook/deit-tiny-patch16-224 为例。这个模型里名字没有base,我是看它的一个base兄弟模型信息的时候发现的

模型大小信息查看

02 选择训练数据

相比于自己去搜集整理训练数据,直接用别人整理好的总是方便很多。但反过来说,如果真的要做特定功能的模型,但是又没有现成的训练数据,这起步还是挺难的 最后使用的是dog_breed_classification_kaggle 这个数据集,训练和测试数据加起来总计2w条左右,我很难想象人肉完成这个工作量

狗狗分类训练数据概览

03 微调模型

这部分主要是一些代码的示例,更细节的可以去参考另外两篇文章Fine-Tune ViT for Image Classification with 🤗 Transformers 以及 Fine-Tuning ViT on Custom Datasets for Image Classification

加载模型和训练数据

加载训练数据和模型

配置微调超参数

微调超参数

训练和评估

image.png

段落小结

到这一步,基本上除了可能会遇到环境问题造成的一些困扰,只要按上面的两篇参考文章的步骤执行下去,不太会有什么问题

04 导出成onnx

确定小程序支持的onnx信息

小程序并不支持所有的onnx模型,算子支持列表。但是看算子,对现阶段的我来说,也是有点超纲了。好在小程序有提供一个示例模型。可以用一个简单的onnx info 脚本来看一下这个模型的操作集版本

image.png

导出成指定操作集onnx

image.png

模型的输入输出

输入和输出,会影响最后在调用时的初始化,入参和取值 查看onnx模型的输入输出

输入输出示例

还有一个很重要的工具

onnx-modifier 看上面一段的输入(pixel_values),可以看到,输入shap是动态轴,可以通过这个工具改成静态轴[1,3,224,224]。当然也可以在初始化推理session时指定

当时找到这个工具是为了把动态轴改成静态轴,后来发现createInferenceSession可以传动态轴信息

然而导出的onnx模型直接使用还是会报错,但是用这个工具加载一下onnx模型,直接导出,就可以正常使用了。能用就先凑和用吧

05 写一个小程序

完整的模型加载和推理的代码,可以参考官方的示例

这里就简单加一下差异的点,也就是上一节说过要注意的模型的输入和输出,以及动态轴

模型推理的结果

输入动态轴

06 线上体验

由于模型的训练数据还是有限 1w张图120个狗品种,每个label的训练数据不到100个,准确度可想而知

昨晚上连夜提交了代码审核,万幸第一版顺利审核通过并上线了

目前备案还在流程中,日用户不可超过50人

认证流程还没提,更不可能被搜索到

因为模型使用了公司的CDN,不白嫖是我的底线,所以页面中加了公司的业务广告

不能保证在所有的手机上都能跑,我看社区里也有类似的反馈

目前已知,有概率在加载推理模型的时候,页面会白屏

ce8607c3-7020-41ee-bd16-de2dc042b32e.jpg

07 完结

不撒花,欢迎体验

fed80aa25ce70e6cddc980ca87e5437.png