Trainer类
为什么这样比较好
Trainer是一个简单但功能完备的PyTorch训练和评估循环,针对🤗 Transformers进行了优化。
参数:
- model: [
PreTrainedModel
]或torch.nn.Module
类型,可选。用于训练、评估或预测的模型。如果未提供,则必须传入model_init
。 - args: [
TrainingArguments
]类型,可选。用于调整训练的参数。如果未提供,则默认为一个基本的[TrainingArguments
]实例,其中output_dir
设置为当前目录下的名为tmp_trainer的目录。 - data_collator:
DataCollator
类型,可选。用于从train_dataset
或eval_dataset
的元素列表中形成批次的函数。如果未提供tokenizer
,则默认为[default_data_collator
];否则,默认为[DataCollatorWithPadding
]的实例。 - train_dataset:
torch.utils.data.Dataset
或torch.utils.data.IterableDataset
类型,可选。用于训练的数据集。如果是[~datasets.Dataset
]类型,则会自动删除模型的forward()
方法不接受的列。 - eval_dataset: [
torch.utils.data.Dataset
]类型或字典类型,可选。用于评估的数据集。如果是[~datasets.Dataset
]类型,则会自动删除模型的forward()
方法不接受的列。如果是字典类型,则会对每个数据集进行评估,并在度量名称前添加字典键。 - tokenizer: [
PreTrainedTokenizerBase
]类型,可选。用于预处理数据的分词器。如果提供,将在批处理输入时自动对输入进行最大长度填充,并将其与模型一起保存,以便在重新运行中断的训练或重用微调模型时更容易。 - model_init:
Callable[[], PreTrainedModel]
类型,可选。用于实例化要使用的模型的函数。如果提供,每次调用[~Trainer.train
]都会从此函数给出的模型的新实例开始。
重要属性:
- model: 始终指向核心模型。如果使用transformers模型,它将是[
PreTrainedModel
]的子类。 - model_wrapped: 始终指向最外层的模型,如果有一个或多个其他模块包装了原始模型。这是应该用于前向传递的模型。例如,在
DeepSpeed
下,内部模型被包装在DeepSpeed
中,然后再次包装在torch.nn.DistributedDataParallel
中。如果内部模型没有被包装,则self.model_wrapped
与self.model
相同。 - is_model_parallel: 模型是否已切换到模型并行模式(与数据并行不同,这意味着一些模型层在不同的GPU上分割)。
- place_model_on_device: 是否自动将模型放置在设备上。如果使用模型并行或deepspeed,或者如果默认的
TrainingArguments.place_model_on_device
被覆盖为返回False
,则将其设置为False
。 - is_in_train: 模型当前是否正在运行
train
(例如,在train
期间调用evaluate
时)。
初始化部分
def init 初始化函数
data_collator 这个属性的作用
329行 设置了随机化的种子,这个种子在哪里发挥作用?种子在采样器中发挥作用
参数里有一个full_determinism(完全决定)什么是完全决定?
deepspeed是什么?Deepspeed是一个用于深度学习训练的优化工具和库。它旨在提高训练速度和效率,并减少对昂贵硬件资源的需求。Deepspeed通过使用模型并行化、梯度累积、动态精度缩放等技术,可以在大规模模型和分布式训练中提供显著的性能改进。args.deepspeed
是一个变量,它可能是用来指定是否启用Deepspeed的选项。通过检查args.deepspeed
的值,你可以确定是否使用Deepspeed来优化你的深度学习训练过程。
hp_name是干什么的
有一个memory_tracker 记忆跟踪?
什么是当前的log_level 级别?
MODEL_MAPPING_NAMES这个里面存储着什么
sharded_ddp是共享GPU设置,不能和deepspeed和fsdp一起用
backward_prefetch是干什么的?
forword_prefetch是干什么的?
limit_all_gathers是干什么的?
回调函数
def add_callback() 增加回调函数,不是很理解这里的回调函数
这段代码是一个类方法add_callback
的实现,它用于向当前的[~transformer.TrainerCallback
]列表中添加一个回调函数。
回调函数是一段可以在训练过程的特定点执行的代码,用于执行如保存模型检查点、调整学习率或简单地打印出进度信息等任务。代码524行 在这行特定的代码中,添加的回调函数是PrinterCallback
或DEFAULT_PROGRESS_CALLBACK
,具体取决于self.args.disable_tqdm
的值。
def pop_callback(self, callback): 弹出一个回调函数并返回
def remove_callback(self, callback): 移除一个回调函数
模型移动到设备
def _move_model_to_device(self, model, device):
这是一个名为_move_model_to_device
的方法的实现。这个方法的目的是将模型移动到指定的设备上。它接受两个参数:model
和device
。
在代码中,model = model.to(device)
这一行将模型移动到指定的设备上。to()
是一个PyTorch中的方法,用于将对象移动到指定的设备上。在这种情况下,model
对象被移动到device
设备上。
接下来的条件语句检查self.args.parallel_mode
是否等于ParallelMode.TPU
,并且model
对象是否具有名为tie_weights
的属性。如果条件成立,那么model.tie_weights()
将被调用。这个方法可能是在特定的情况下用于绑定模型权重的。
总的来说,这个方法的作用是将给定的模型移动到指定的设备上,并在特定情况下重新绑定模型的权重。
签名列
设置签名列,移除签名列?不太懂
def _set_signature_columns_if_needed(self):
inspect.signature(self.model.forward)
这行代码使用Python的内置inspect
模块来获取模型的forward
方法的签名。函数的签名是对函数参数的描述。总的来说,这个方法将_signature_columns
设置为模型的forward
方法的参数名称的列表,再加上"label"、"label_ids"和self.label_names
的元素,同时移除任何重复的元素。
def _remove_unused_columns 移除未使用的列
def _get_collator_with_removed_columns()
data_collator
是一个在PyTorch的数据加载过程中使用的概念,它是一个可调用的对象,用于将一批数据样本组合成一个批次的数据。
在PyTorch中,当你创建一个DataLoader
对象时,你可以传递一个data_collator
作为参数。DataLoader
会使用这个data_collator
来将从数据集中抽取的样本组合成一个批次的数据。
data_collator
通常需要处理两个主要任务:
- 将数据样本的形状对齐,例如,通过填充短的序列使得所有的序列长度相同。
- 将数据样本堆叠(stack)成一个批次的数据。
例如,在处理自然语言处理(NLP)任务时,data_collator
可能需要将不同长度的句子填充到相同的长度,然后将它们堆叠成一个批次的数据。总的来说,data_collator
是一个在PyTorch的数据加载过程中使用的工具,用于将一批数据样本组合成一个批次的数据。
训练数据采样 和 迭代器 评估迭代器 和采样器
def _get_train_sampler 不太理解采样
def get_train_dataloader 训练迭代器
def _get_eval_sampler
def get_eval_dataloader
get_test_dataloader
在PyTorch中,训练采样器(Sampler)和训练迭代器(Iterator)是两个不同的概念,它们在数据加载和处理过程中起着不同的作用。
- 训练采样器(Sampler):Sampler负责定义如何从数据集中抽取样本。例如,
RandomSampler
会在每个epoch开始时随机打乱数据集的顺序,SequentialSampler
则会按照数据集的原始顺序抽取样本。Sampler的主要作用是定义数据抽取的顺序,这对于训练模型来说非常重要,因为不同的抽样策略可能会导致模型的训练效果有所不同。 - 训练迭代器(Iterator):Iterator负责从数据集中实际抽取样本,并将它们组织成一个个的batch。在PyTorch中,这通常是通过
DataLoader
类来实现的。DataLoader
接受一个数据集和一个Sampler作为输入,然后生成一个迭代器,这个迭代器可以在训练循环中使用,用于按照Sampler定义的顺序抽取数据并组织成batch。
创建优化器和策略
def create_optimizer_and_scheduler
def create_optimizer
def get_optimizer_cls_and_kwargs
def create_scheduler
hp search 超参数搜索
def num_examples
def _hp_search_setup
def _report_to_hp_search
hp_search
可能是指超参数搜索(Hyperparameter Search),这是一种在机器学习中常用的技术,用于自动寻找模型的最优超参数。
超参数是在开始学习过程之前设置的参数,不能由训练过程学习。例如,学习率、批次大小、训练轮数、隐藏层的数量等都是超参数。超参数的选择可以极大地影响模型的性能。
超参数搜索的目标是找到一组超参数,使得在验证集上的性能最优。常见的超参数搜索方法包括网格搜索(Grid Search)、随机搜索(Random Search)和贝叶斯优化(Bayesian Optimization)等。
在某些机器学习库中,可能会提供hp_search
或类似的工具来帮助进行超参数搜索。
保存模型
def _tune_save_checkpoint
def call_model_init
不知道在干什么
def torch_jit_model_eval
"JIT" 是 "Just-In-Time" 编译的缩写,这是一种在运行时动态将代码编译为机器代码的技术,以提高代码的执行效率。这种技术在许多编程语言和系统中都有应用,包括 Java、.NET 和 Python 的某些实现。
在 PyTorch 中,JIT 通过 TorchScript 提供。TorchScript 是 PyTorch 的一个子集,它可以将 PyTorch 程序转换为一个中间表示(Intermediate Representation,IR),然后对这个 IR 进行优化,并最终将其编译为机器代码。这使得 PyTorch 模型可以在没有 Python 解释器的环境中运行,例如在非 Python 环境或在移动设备上。
torch.jit
是 PyTorch 的一个模块,提供了将 PyTorch 模型转换为 TorchScript 的工具。例如,torch.jit.trace
函数可以通过运行模型一次并记录其操作来生成一个 TorchScript 模型,torch.jit.script
函数则可以将模型直接转换为 TorchScript,这对于包含控制流(如 if 和 for)的模型来说非常有用。
def ipex_optimize_model
PEX是为了在Intel硬件(如Intel Xeon CPU)上优化PyTorch性能而开发的。它可以提供自动混合精度训练(Automatic Mixed Precision,AMP)、通道最后的内存格式(Channel Last memory format)、JIT编译等功能,以提高PyTorch在Intel硬件上的运行效率。
def _wrap_model 这里是包装模型
这部分代码是一个Python类中的一个方法,名为_wrap_model
。它的作用是对给定的模型进行包装和配置,以便在训练或推理过程中使用。
具体来说,这个方法执行以下操作:
- 检查是否需要使用Torch的编译功能,如果需要,则使用指定的后端和模式对模型进行编译。
- 检查是否需要使用Intel Extension for PyTorch (IPEX),如果需要,则对模型进行优化,选择数据类型为torch.bfloat16或torch.float32。
- 检查是否启用了SageMaker的多进程训练模式,如果是,则根据指定的参数创建一个分布式模型。
- 检查是否启用了DeepSpeed训练模式,如果是,则返回已经初始化的DeepSpeed模型。
- 检查模型是否已经被包装过,如果是,则直接返回模型。
- 检查是否需要使用Apex库进行混合精度训练(仅适用于torch < 1.6版本),如果是,则使用Apex库对模型和优化器进行初始化。
- 检查是否需要进行多GPU训练,如果是,则使用nn.DataParallel对模型进行包装。
- 检查是否需要在评估模式下使用Torch的即时编译模式,如果是,则对模型进行即时编译。
- 检查是否需要进行分布式训练,如果是,则根据指定的参数使用ShardedDDP或FullyShardedDDP对模型进行包装。
- 检查是否需要使用PyTorch FSDP(Fully Sharded Data Parallel)进行分布式训练,如果是,则使用FSDP对模型进行包装。
- 检查是否启用了SageMaker的分布式训练模式,如果是,则使用nn.parallel.DistributedDataParallel对模型进行包装。
- 检查是否在本地使用多GPU训练,如果是,则使用nn.parallel.DistributedDataParallel对模型进行包装。
- 返回经过包装和配置后的模型。
这个方法的目的是根据给定的训练模式和配置对模型进行适当的包装和优化,以便在训练或推理过程中获得更好的性能和效果。
def train
初始化训练循环
def _inner_training_loop
def _get_output_dir()
def _load_from_checkpoint
def _load_best_model
def _issue_warnings_after_load
def _maybe_log_save_evaluate
def _load_rng_state
def _save_checkpoint
def _load_optimizer_and_scheduler
def hyperparameter_search
def log
def _prepare_input
def _prepare_inputs
def compute_loss_context_manager
def autocast_smart_context_manager
def training_step
def compute_loss
def is_local_process_zero
def is_world_process_zero(self)
def save_model
def _save_tpu
def _save
def store_flos
def _sorted_checkpoints
def _rotate_checkpoints
def evaluate
def predict
def evaluation_loop
def _nested_gather
def _pad_across_processes
def prediction_step
def floating_point_ops
def init_git_repo
def create_model_card
def _push_from_checkpoint
def _push_from_checkpoint
def GLUJ