内容简述
日常使用大模型久了,就难免会想着去了解一下模型内部的运行原理。本文就通过微调小的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
加载模型和训练数据
配置微调超参数
训练和评估
段落小结
到这一步,基本上除了可能会遇到环境问题造成的一些困扰,只要按上面的两篇参考文章的步骤执行下去,不太会有什么问题
04 导出成onnx
确定小程序支持的onnx信息
小程序并不支持所有的onnx模型,算子支持列表。但是看算子,对现阶段的我来说,也是有点超纲了。好在小程序有提供一个示例模型。可以用一个简单的onnx info 脚本来看一下这个模型的操作集版本
导出成指定操作集onnx
模型的输入输出
输入和输出,会影响最后在调用时的初始化,入参和取值
还有一个很重要的工具
onnx-modifier 看上面一段的输入(pixel_values),可以看到,输入shap是动态轴,可以通过这个工具改成静态轴[1,3,224,224]。当然也可以在初始化推理session时指定
当时找到这个工具是为了把动态轴改成静态轴,后来发现createInferenceSession可以传动态轴信息
然而导出的onnx模型直接使用还是会报错,但是用这个工具加载一下onnx模型,直接导出,就可以正常使用了。能用就先凑和用吧
05 写一个小程序
完整的模型加载和推理的代码,可以参考官方的示例
这里就简单加一下差异的点,也就是上一节说过要注意的模型的输入和输出,以及动态轴
06 线上体验
由于模型的训练数据还是有限 1w张图120个狗品种,每个label的训练数据不到100个,准确度可想而知
昨晚上连夜提交了代码审核,万幸第一版顺利审核通过并上线了
目前备案还在流程中,日用户不可超过50人
认证流程还没提,更不可能被搜索到
因为模型使用了公司的CDN,不白嫖是我的底线,所以页面中加了公司的业务广告
不能保证在所有的手机上都能跑,我看社区里也有类似的反馈
目前已知,有概率在加载推理模型的时候,页面会白屏
07 完结
不撒花,欢迎体验