最近学了 hugging face transformers 库,学成归来,把笔记整理一下,互勉。
首先贴 api 文档地址:hugging face transformers 库 api 文档
有兴趣详细了解的可以去仔细看看
准备把这个写成一个小系列。不想搞太复杂,“太长不看”。但是也不想缺内容,不然用的时候抓瞎。
所以先贴一个整体印象上来,对这个库的架构、怎么用有个初步的大致了解。然后再开一篇文介绍精调到底怎么操作。最后再把关键的 api 文档里的东西摘出来讲一讲。
这篇就是对这个库的大体印象。
transformers 是一个集成了很多大型预训练模型的库,比如CLIP之类的,可以直接调用这些模型、自动下载预训练数据,提供非常简洁的 api 跑 inference 过程。同时提供 fine-tune 模型的方法,可以加载该库提供的大模型,然后用数据集精调。
transformers 提供图片和文本的处理,是多模态福音,感恩的心
transformers 库最大的优势是,它提供了很多大型预训练模型,用它来跑别人的大模型很便利。
同时,因为要提供很多种模型,所以肯定会提供一个框架。于是你也可以在这个框架上写自己的模型,用这个库提供的框架来从头训练自己的模型。(以及把自己的模型、数据集传到 hub 上让大家都能用)
但是阅读了 transformers 库的 api 文档之后,我觉得这个库作为框架来说,不如 mmcv 清晰(也可能是刚开始用不熟悉这个设计思路)。如果不是想用这个库提供的预训练模型,没必要用这个库的框架。
但是如果想在别人的模型上继续做的话,用它还是很香的。
对于一个深度学习框架来说,需要的核心功能只有 3 个:
transformers 库的解决方案如下:
train()
方法,开始训练evaluate.load
获得 metric 对象之后,调用该对象的 compute()
方法,可以计算指标得分。这个方法传进去的参数是 ground truth 和 predicted results,所以要先把 predicted results 跑出来才能评价结果。在训练过程中,你把 metric 传给 trainer 会自己跑 test 过程;如果是模型已经训练好了然后测试,那跑预测结果可以用 inference 一样的代码(也就是 pipeline 过程)虽然是 3 个过程,但这 3 个过程中有交叉的地方;在结构设计上,也有相似的地方。这样用起来会让调包的我们感受到和谐的美感。
分析上述 3 个过程,可以抽象出如下类:
PretrainedConfig
PretrainedModel
PretrainedConfig
对象,实现 forward()
方法BaseImageProcessor
preprocess()
方法,返回 BatchFeature
对象BatchFeature
对象实际上是一个字典,里面有 2 个元素:data 和 tensor_type。tensor_type 是因为要适应多个深度学习神经网络框架,比如 pytorch 和 tensorflow。而 data 也是一个字典,关键字是 “pixel_values”,是经过数据增光等一系列预训练处理之后的 tensorDataset
__len__
和 __getitem__
)load_dataset()
方法,把数据集地址传进去就能用,美滋滋。EvaluationModule
或者说 Metric
evaluate.load()
方法获得 metric 实例,然后调用实例的 compute()
或者 add()
方法,把预测结果和真值传进去,就可以算出来得分Metric
然后实现 3 个方法 _compute
_download_and_prepare
_info(self)
TrainingArguments
output_dir (str)
训练结果放在哪里set_dataloader
set_evaluate
等等方法,把别的参数传进去Trainer
train()
方法开始训练Pipeline
Pipeline
并实现 _sanitize_parameters
preprocess
_forward
postprocess
我们需要掌握库的使用方法也就 2 个方面:
后面会介绍具体的模板代码怎么写,模板代码+继承类,两板斧基本可以满足训练和测试的需求了。