huggingface 的trainer训练框架优势
背景
Huggingface Transformers 是基于一个开源基于 transformer 模型结构提供的预训练语言库,它支持 Pytorch,Tensorflow2.0,并且支持两个框架的相互转换。框架支持了最新的各种NLP预训练语言模型,使用者可以很快速的进行模型的调用,并且支持模型further pretraining 和 下游任务fine-tuning。
Transformers 库写了了一个transformers.Trainer API,它是一个简单但功能完整的 PyTorch 训练和评估循环,针对 Transformers 进行了优化,有很多的训练选项和内置功能,同时也支持多GPU/TPU分布式训练和混合精度。即Trainer API是一个封装好的训练器(Transformers库内置的小框架,如果是Tensorflow,则是TFTrainer)
一、 开源生态环境
- 基于huggingface transformers实现,可以快速稳定调用几乎全部开源模型使用。
- 开源生态良好,企业级维护,网上示例和各种不同需求代码demo多。
- 官方tutorial 全面。
- 支持huggingface 各种好用工具库:datasets, evaluate, peft,accelerate等
二、训练阶段
-
内置训练循环
-
支持模型不同训练阶段的加载和保存
(模型参数,学习率,优化器,scheduler等)自动保存加载,保证训练中断后继续稳定训练。
-
log打印,训练阶段log自动打印。
-
支持各种optmizer,schedular 参数化配置。
-
支持各种提高模型能力的trick 如warmup,grad_clip ,grad_accumulate 等。
-
TrainingArguments ,DataArguments,ModelArgument
训练过程,数据相关,模型相关的各种常用参数存在
-
支持使用datasets 类 map操作,进行数据集高效预处理
-
支持使用Accelerate库进行分布式训练
- 🤗 Accelerate 还可以使
DataLoaders
更高效。这是通过自定义采样器实现的,它可以在训练期间自动将部分批次发送到不同的设备,从而允许每个设备只需要储存数据的一部分,而不是一次将数据复制四份存入内存,具体取决于配置。因此,内存总量中只有原始数据集的一个完整副本。该数据集会拆分后分配到各个训练节点上,从而允许在单个实例上训练更大的数据集,而不会使内存爆炸。 - 自动识别不同节点卡数量和类型,不需要model,数据to(rank), cuda(),to(device)等操作。
- 🤗 Accelerate 还可以使
-
支持混合精度训练,包括torch.cuda.amp (torch>1.6) 和 apex (torch<=1.6)
-
支持使用deepspeed 使用
trainer使用deepspeed 仅使用–deepspeed config 即可,同时config文件中设置为auto,即可使用trainer中默认的参数,简化了参数配置。
支持使用zero1,zero2,zero3,zero-inifinity
-
支持peft 库使用
- lora 等(Prefix Tuning, P-Tuning, IA3) 仅训练部分参数的加速训练框架。
- prepare_model_for_int8_training,支持使用int8 量化进行训练,节省大量内存。
- qlora 将lora 参数量化为NF4 进行进一步节省内存。
三、验证阶段
-
内置验证循环
-
验证解耦合
仅需自行实现compute_metrics ,并且支持huggingface的evaluate库 的各种基本任务的验证工具(p, r, f1,rouge等各种评估指标)
-
支持使用accelerate库进行分布式验证
四、推理阶段
- 支持使用 bitsandbytes 库 进行量化操作
- int8量化推理,几乎不会损失任何精度
- Int4 推理
- 支持decoder 的各种解码实现
- top-k
- top-p
- beam-search 等
参考
- PEFT
- Accelerate
- text-generation-inference
- transformers
- FasterTransformer
- peft
- qlora
- LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale
huggingface 的trainer训练框架优势
背景
Huggingface Transformers 是基于一个开源基于 transformer 模型结构提供的预训练语言库,它支持 Pytorch,Tensorflow2.0,并且支持两个框架的相互转换。框架支持了最新的各种NLP预训练语言模型,使用者可以很快速的进行模型的调用,并且支持模型further pretraining 和 下游任务fine-tuning。
Transformers 库写了了一个transformers.Trainer API,它是一个简单但功能完整的 PyTorch 训练和评估循环,针对 Transformers 进行了优化,有很多的训练选项和内置功能,同时也支持多GPU/TPU分布式训练和混合精度。即Trainer API是一个封装好的训练器(Transformers库内置的小框架,如果是Tensorflow,则是TFTrainer)
一、 开源生态环境
- 基于huggingface transformers实现,可以快速稳定调用几乎全部开源模型使用。
- 开源生态良好,企业级维护,网上示例和各种不同需求代码demo多。
- 官方tutorial 全面。
- 支持huggingface 各种好用工具库:datasets, evaluate, peft,accelerate等
二、训练阶段
-
内置训练循环
-
支持模型不同训练阶段的加载和保存
(模型参数,学习率,优化器,scheduler等)自动保存加载,保证训练中断后继续稳定训练。
-
log打印,训练阶段log自动打印。
-
支持各种optmizer,schedular 参数化配置。
-
支持各种提高模型能力的trick 如warmup,grad_clip ,grad_accumulate 等。
-
TrainingArguments ,DataArguments,ModelArgument
训练过程,数据相关,模型相关的各种常用参数存在
-
支持使用datasets 类 map操作,进行数据集高效预处理
-
支持使用Accelerate库进行分布式训练
- 🤗 Accelerate 还可以使
DataLoaders
更高效。这是通过自定义采样器实现的,它可以在训练期间自动将部分批次发送到不同的设备,从而允许每个设备只需要储存数据的一部分,而不是一次将数据复制四份存入内存,具体取决于配置。因此,内存总量中只有原始数据集的一个完整副本。该数据集会拆分后分配到各个训练节点上,从而允许在单个实例上训练更大的数据集,而不会使内存爆炸。 - 自动识别不同节点卡数量和类型,不需要model,数据to(rank), cuda(),to(device)等操作。
- 🤗 Accelerate 还可以使
-
支持混合精度训练,包括torch.cuda.amp (torch>1.6) 和 apex (torch<=1.6)
-
支持使用deepspeed 使用
trainer使用deepspeed 仅使用–deepspeed config 即可,同时config文件中设置为auto,即可使用trainer中默认的参数,简化了参数配置。
支持使用zero1,zero2,zero3,zero-inifinity
-
支持peft 库使用
- lora 等(Prefix Tuning, P-Tuning, IA3) 仅训练部分参数的加速训练框架。
- prepare_model_for_int8_training,支持使用int8 量化进行训练,节省大量内存。
- qlora 将lora 参数量化为NF4 进行进一步节省内存。
三、验证阶段
-
内置验证循环
-
验证解耦合
仅需自行实现compute_metrics ,并且支持huggingface的evaluate库 的各种基本任务的验证工具(p, r, f1,rouge等各种评估指标)
-
支持使用accelerate库进行分布式验证
四、推理阶段
- 支持使用 bitsandbytes 库 进行量化操作
- int8量化推理,几乎不会损失任何精度
- Int4 推理
- 支持decoder 的各种解码实现
- top-k
- top-p
- beam-search 等
参考
- PEFT
- Accelerate
- text-generation-inference
- transformers
- FasterTransformer
- peft
- qlora
- LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale