hugging face transformers 库使用手册(一):库理解和评价

最近学了 hugging face transformers 库,学成归来,把笔记整理一下,互勉。
首先贴 api 文档地址:hugging face transformers 库 api 文档
有兴趣详细了解的可以去仔细看看

准备把这个写成一个小系列。不想搞太复杂,“太长不看”。但是也不想缺内容,不然用的时候抓瞎。

所以先贴一个整体印象上来,对这个库的架构、怎么用有个初步的大致了解。然后再开一篇文介绍精调到底怎么操作。最后再把关键的 api 文档里的东西摘出来讲一讲。

这篇就是对这个库的大体印象。

文章目录

  • 个人对 transformers 库的感想
  • 对 transformers 框架设计的理解

个人对 transformers 库的感想

transformers 是一个集成了很多大型预训练模型的库,比如CLIP之类的,可以直接调用这些模型、自动下载预训练数据,提供非常简洁的 api 跑 inference 过程。同时提供 fine-tune 模型的方法,可以加载该库提供的大模型,然后用数据集精调。

transformers 提供图片和文本的处理,是多模态福音,感恩的心

transformers 库最大的优势是,它提供了很多大型预训练模型,用它来跑别人的大模型很便利。

同时,因为要提供很多种模型,所以肯定会提供一个框架。于是你也可以在这个框架上写自己的模型,用这个库提供的框架来从头训练自己的模型。(以及把自己的模型、数据集传到 hub 上让大家都能用)

但是阅读了 transformers 库的 api 文档之后,我觉得这个库作为框架来说,不如 mmcv 清晰(也可能是刚开始用不熟悉这个设计思路)。如果不是想用这个库提供的预训练模型,没必要用这个库的框架。

但是如果想在别人的模型上继续做的话,用它还是很香的。

对 transformers 框架设计的理解

对于一个深度学习框架来说,需要的核心功能只有 3 个:

  • 训练模型
  • 指标计算,评价模型效果
  • 单个数据送进去做 inference

transformers 库的解决方案如下:

  • 训练模型:核心是 Trainer 类,把模型、训练参数、训练数据集、测试数据集、评价指标传进去,获得 trainer 实例,然后调用实例的 train() 方法,开始训练
  • 指标计算,评价模型效果:核心是 evaluate 包,用 evaluate.load 获得 metric 对象之后,调用该对象的 compute() 方法,可以计算指标得分。这个方法传进去的参数是 ground truth 和 predicted results,所以要先把 predicted results 跑出来才能评价结果。在训练过程中,你把 metric 传给 trainer 会自己跑 test 过程;如果是模型已经训练好了然后测试,那跑预测结果可以用 inference 一样的代码(也就是 pipeline 过程)
  • 单个数据送进去做 inference:核心是 Pipeline 类,获取 pipeline 对象,然后把数据传给该对象,就会返回预测结果。一个 pipeline 会包含 preprocess, forward, postprocess 三个完整的过程

虽然是 3 个过程,但这 3 个过程中有交叉的地方;在结构设计上,也有相似的地方。这样用起来会让调包的我们感受到和谐的美感。

分析上述 3 个过程,可以抽象出如下类:

  • PretrainedConfig
    • 模型有关的参数都放在这里
  • PretrainedModel
    • 所有模型的基类,init 传进去一个 PretrainedConfig 对象,实现 forward() 方法
  • BaseImageProcessor
    • 所有图片处理的基类,实现 preprocess() 方法,返回 BatchFeature 对象
    • BatchFeature 对象实际上是一个字典,里面有 2 个元素:data 和 tensor_type。tensor_type 是因为要适应多个深度学习神经网络框架,比如 pytorch 和 tensorflow。而 data 也是一个字典,关键字是 “pixel_values”,是经过数据增光等一系列预训练处理之后的 tensor
  • Dataset
    • Dataset 不如 pytorch 原生的 dataset 好懂(原生的就是继承然后实现 __len____getitem__
    • 提供了两种方法写自己的 Dataset,一种是比较复杂的写一份代码,按照模板写。另一种是直接用 ImageFolder,然后按照一定的格式组织你的数据集,就可以直接用 load_dataset() 方法,把数据集地址传进去就能用,美滋滋。
  • EvaluationModule 或者说 Metric
    • 同样通过 evaluate.load() 方法获得 metric 实例,然后调用实例的 compute() 或者 add() 方法,把预测结果和真值传进去,就可以算出来得分
    • 在训练阶段,用 load 获得实例之后,传给 Trainer,就会在训练过程中自动计算
    • 如果要计算自己的 metric,那么就写一个类继承 Metric 然后实现 3 个方法 _compute _download_and_prepare _info(self)
  • TrainingArguments
    • 训练有关的参数都在这里(区分模型有关的参数)
    • 这个类的 init 方法有 97 个可以初始化的参数,相当可怕。但实际上实例化的时候只传一个参数进去:output_dir (str) 训练结果放在哪里
    • 然后再通过 set_dataloader set_evaluate 等等方法,把别的参数传进去
  • Trainer
    • 实例化一个 Trainer 对象,然后调用这个对象的 train() 方法开始训练
    • 实例化传进去的参数最重要的就是:模型、训练参数、训练数据集、测试数据集、评价指标
  • Pipeline
    • 这个类就是为了 inference 阶段服务的
    • 获取 pipeline 对象,然后把输入数据传进去,就会返回预测结果
    • 获取 pipeline 对象的时候传任务对应的字符串,或者模型对应的字符串进去就可以了
    • 如果想用自己的模型做一个专属的 pipeline,那么继承 Pipeline 并实现 _sanitize_parameters preprocess _forward postprocess

我们需要掌握库的使用方法也就 2 个方面:

  • 如何调用提供的模型测试 / 精调?
  • 如何拓展自己的模型,然后训练并测试?

后面会介绍具体的模板代码怎么写,模板代码+继承类,两板斧基本可以满足训练和测试的需求了。

你可能感兴趣的:(HuggingFace,transformers,库使用手册,python,pytorch,深度学习)