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作为文件分割符
- json 要指定
- 使用
data_files=根据名称加载文件- 可以传一个字典显示生命训练和测试文件
- 可以直接加载 gz 文件,自动解压
- 可以直接使用 url 文件
- 使用
DownloadConfig(delete_extracted=True)删除解压文件
- 第一个参数为类型,支持 csv、txt、json、pandas(pkl)
- 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方法
- 如果保存 json 和 csv 要操作 Dataset 对象 使用
数据结构转换(本质是修改 __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
- compute_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)
- accelerator.prepare
- 使用 Trainer 则不需要 以上三行代码可以直接进行并行计算
- 参考|github
命令行运行:
- accelerate config
accelerate launch train.py
notebook 上分布式训练:
|
|
huggingface_hub
- 使用 notebook_login 函数进行登陆
- 在 TrainingArguments 添加
push_to_hub=True参数- 然后使用
<trainer/tokenizer/argument/model>.push_to_hub()会把模型推送到 hub 中- 参数
organization=标记组织 - 上传可以指定令牌
use_auth_token=
- 参数
- 然后使用
相关函数:
|
|
类
- Repository:可以进行模型仓库的 git 操作
模型卡片
- 创建模型仓库需要编写的说明规范
- 模型描述
- 预期用途和限制
- 如何使用
- 局限性和偏见
- 训练数据
- 训练程序
- 评价结果
Head
- 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