Transformers 库笔记

说明

  • HuggingFace 推出的 NLP 工具库,能够自动下载数据集以及运行预定好的 pipeline 流程
    • 常见类型有:情感分析,标注,生成,填充,命名实体识别(NER),摘要,翻译,问答
  • 本质是因为模型的推出很快,如果每一个进行尝试就会很慢(如果用 colab 加上 transformers,就能很快使用新模型)
  • 使用 Auto* 类可以使模型操作和架构无关(后续可以切换模型)

pipeline

  • transformer 中的预定义流程,包含模型下载,数据处理,推理模型
    • 直接指定任务即可

tokenizer

  • AutoTokenizer
    • 通过配置载入分词器(一般是载入对应预训练模型的分词器)
    • 直接调用对象就能返回嵌入 ids(提供分词序列)
    • 参数
      • 可以设置填充(可以选择最长填充和模型最大序列长度填充)、截断(根据最大长度截断)、最大长度(一般模型 512、1024)
      • 选择返回张量类型(numpy、pytorch)
      • 默认开启了快速:使用批处理(在 Rust 底层上并行处理)

datasets

  • load_dataset
    • 第一个参数为类型,支持 csv、txt、json、pandas(pkl)
      • json 要指定 field 作为加载数组对象的键值
      • csv 要指定 delimiter 作为文件分割符
    • 使用 data_files= 根据名称加载文件
      • 可以传一个字典显示生命训练和测试文件
      • 可以直接加载 gz 文件,自动解压
      • 可以直接使用 url 文件
    • 使用 DownloadConfig(delete_extracted=True) 删除解压文件
  • load_from_disk:从磁盘加载保存的 Dataset(默认格式)
  • Dataset.map()
    • 可以设置一个数据处理函数如(分词器)
      • 问题是如何设置最大对齐,这里是单个或者小批量的数据给 tokenizer,并不能考虑到全局的最长填充
    • 可以设置小批量处理
    • 可以设置多进程处理数量
  • DataCollatorWithPadding:Dynamic Padding
    • 可以设置一个 tokenizer,做到划分 batch 的时候才填充
    • 会根据分词器生成一个填充函数
      • 获取分词器的填充 idx
      • batch 初始化时调用这个填充函数进行填充,这样能减少过多的冗余数据
    • 可以给 Pytorch 的 Dataset 参数 collate_fn 使用
  • 可以给列设置 FAISS 索引,后续快速查询相似文本

一般数据集由一个 DatasetDict 组成,包含训练、测试集合等;DatasetDict 中包含对应键值的 Dataset 对象

Dataset/DatasetDict

使用方法:

  • shuffle:打乱数据
  • select:给一个 list 取出数据
  • rename_column:重命名
  • unique:取集合,即
  • filter:可以根据条件(返回布尔值)进行过滤,也是批处理函数
    • 一般传进的函数用 lambda 表达式即可
  • map:批处理函数,返回一个字典,表示对某列值的修改
    • 输入可以获取到每一行的数据
    • 如果返回的字典出现原本不存在的列键值,那么会新增对应的列
    • 分批次:使用 batched=True 映射函数将获得一个批次列表做为值的字典,可以用更快的处理算法
      • 如列表推导式,计算的比普通 for 循环快,因为可并行
      • 速度不如自动分词器默认开启快速的快(那个是使用 Rust 底层)
      • 数量是可以用参数修改的
      • 分批次返回时,如果其中操作了分词使前后数量不一致需要进行处理
        • 删除列:remove_columns
        • 使前后长度相同:return_overflowing_tokens=True
    • 多进程:num_proc= 可以设置多进程数目,在多核环境下能够更快
    • 场景:
      • 批处理转码
      • 计算新的特征
  • sort:可以对某列或多列进行排序,默认从小到大
  • train_test_split:划分训练和测试集,操作 Dataset 对象
    • 一般对训练集合使用,划分出一部分在训练时进行评估验证
  • save_to_disk:保存数据集
    • 如果保存 json 和 csv 要操作 Dataset 对象 使用 to_xx 方法

数据结构转换(本质是修改 __getitem__() 方法的返回值):

  • 使用 set_format('pandas') 转换成 pandas
  • 使用 from_pandas 从 pandas 转换回来
  • 使用 drug_dataset.reset_format() 重置格式化

大数据集

内存映射:

  • 底层是 Apache Arrow 数据格式,做了内存映射,可以在进程间共享;所以能加载比内存大的数据集

流式加载:

  • 使用 streaming=True 加载数据,动态下载和访问元素,可以处理电脑无法装下的数据集
    • 使用迭代器访问

创建数据集

  • 可以用爬虫爬取数据集,然后使用 pandas 进行存储,最后转成 Dataset 或保存成其他文件
  • 最后可以通过 push_to_hub 上传到 huggingface
  • 需要创建模型卡片便于索引,如数据集对应的任务类型标签(使用说明文件的源信息进行描述)

Training

  • TrainingArguments 用于训练和评估
  • Trainer
    • 输入
      • 模型结构
      • 模型参数
      • 分词后的数据集
      • data_collator
      • tokenizer
      • evaluation_strategy
        • 可以设置 steps 或 epoch 进行评估
      • compute_metrics
        • 可以设置一个评估函数
        • 可以根据 evaluate 的来进行评估
        • 输入是一个 logits, labels 的元组
      • fp16 = True
        • 混合精度训练
    • trainer.predict
      • 可以进行预测操作
    • 重写
      • compute_loss
        • 可以根据输入参数和模型计算并返回 loss
  • AdamW
    • 优化器
  • get_scheduler
    • 根据优化器选择学习率规划
      • 可以设置规划方式
      • 预热

evaluate

  • evaluate.load
    • 加载评估数据集

tqdm

  • 可以直接通过 epoch 和 DataLoader 长度计算最大次数
  • 后续 progress_bar.update(1) 即可

accelerate

  • Accelerator
    • accelerator.prepare
      • 训练函数中先初始化一个 Accelerator
      • 需要一个训练、验证集(Dataloader)、模型结构和优化器
        • 会生成修改过的相同变量(可加速多 gpu 计算)
      • 后续不使用 loss.backward(),换成 accelerator.backward(loss)
  • 使用 Trainer 则不需要 以上三行代码可以直接进行并行计算
  • 参考|github

命令行运行:

  • accelerate config
  • accelerate launch train.py

notebook 上分布式训练:

1
2
3
from accelerate import notebook_launcher

notebook_launcher(training_function)

huggingface_hub

  • 使用 notebook_login 函数进行登陆
  • 在 TrainingArguments 添加 push_to_hub=True 参数
    • 然后使用 <trainer/tokenizer/argument/model>.push_to_hub() 会把模型推送到 hub 中
      • 参数 organization= 标记组织
      • 上传可以指定令牌 use_auth_token=

相关函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
## User management
login,
logout,
whoami,

## Repository creation and management
create_repo,
delete_repo,
update_repo_visibility,

## And some methods to retrieve/change information about the content
list_models,
list_datasets,
list_metrics,
list_repo_files,
upload_file,
delete_file,

  • Repository:可以进行模型仓库的 git 操作

模型卡片

  • 创建模型仓库需要编写的说明规范
    • 模型描述
    • 预期用途和限制
    • 如何使用
    • 局限性和偏见
    • 训练数据
    • 训练程序
    • 评价结果
  • Head 不同于 attention 的 head,这边的 head 指的是下游任务的输出层,它将模型的 contextual embedding 转化为特定任务的预测值,包含如下的不同的 head:
  • Pretraining Head
    • Casual Language Modeling(普通自回归的语言模型):GPT, GPT-2,CTRL
    • Masked Language Modeling(掩码语言模型):BERT, RoBERTa
    • Permuted Language Modeling(乱序重排语言模型):XLNet
  • Fine-tuning Head
    • Language Modeling:语言模型训练,预测下一个词。主要用于文本生成
    • Sequence Classification:文本分类任务,情感分析任务
    • Question Answering:机器阅读理解任务,QA
    • Token Classification:token 级别的分类,主要用于命名实体识别(NER)任务,句法解析 Tagging 任务
    • Multiple Choice:多选任务,主要是文本选择任务
    • Masked LM:掩码预测,随机 mask 一个 token,预测该 token 是什么词,用于预训练
    • Conditional Generation:条件生成任务,主要用于翻译以及摘要任务。

model

  • 建议使用 Auto*
  • transformers 中的 model 类可以直接 用带 ForXXX 后缀的显示生成某种任务的 Head 的模型。

并行计算说明

  • 参考
    • pytorch.dist
    • Accelerator
    • Trainer