transformers模型加载与seed随机状态

Transformers的模型加载会改变seed的随机状态

这里使用了一个自己写的库进行测试:py-seeds(直接pip就可以安装,目前是0.0.2版本)

import py_seeds
from transformers import AutoModel


def state_str(state_dict):
    random_state = str(state_dict["random"])
    numpy_state = str(state_dict["numpy"][0]) + str(state_dict["numpy"][1].tolist())
    torch_state = str(state_dict["torch"].numpy().tolist())
    torch_cuda_state = "".join([str(i.numpy().tolist()) for i in state_dict["torch_cuda"]])
    return random_state + numpy_state + torch_state + torch_cuda_state


# not load model
state = py_seeds.get_seed_state()
now_state = py_seeds.get_seed_state()
print(state_str(state) == state_str(now_state))
# True: no change to the random state

# load model
model = AutoModel.from_pretrained('roberta-base')
now_state = py_seeds.get_seed_state()
print(state_str(state) == state_str(now_state))
# False: the loading of transformers model would change the random state

# set state after loading
py_seeds.set_seed_state(state)
now_state = py_seeds.get_seed_state()
print(state_str(state) == state_str(now_state))
# True: must set state after loading to keep the random state same
True
False
True

使用了一种很简易的方式进行状态间对比:把所有表示状态的变量都转换为list再转换为str,并拼接,判断两个状态代表的字符串是否相同(不可以用hash)

总结

transformers的模型的from_pretrained将会改变随机状态,如果需要确保随机状态一致,最好在加载完后重新设定一遍随机状态(适用于训练过程中的断点恢复,避免训练出错后恢复随机状态不一致)
(tokenizer的from_pretrained并不会影响随机状态)

笔者语

真的是一个很小的点,本来以为只有在训练的过程才涉及到随机状态的改变,没有想到一个加载的过程也会影响,试了好久才发现,希望能给大家避避坑吧~
可能考虑在下一个版本的py-seeds里更新成更方便判断是否相同的功能~

<think>好的,我需要回答用户关于Hugging Face的Trainer的问题。首先,用户之前已经询问过使用PyTorch、PEFT库进行QLoRA微调并结合Transformers Trainer的内容,现在他们想更详细地了解Trainer本身。 首先,我要确定用户的需求。他们可能希望了解Trainer的基本概念、功能、优势以及如何使用。可能需要包括代码示例,但用户之前已经接触过相关代码,所以需要简明扼要。 接下来,我需要回顾Transformers库中的Trainer类。Trainer是Hugging Face提供的一个高级API,用于简化和标准化训练流程,支持分布式训练、混合精度、日志记录等。它封装了训练循环的细节,让用户专注于模型和数据。 然后,我需要组织信息结构。可能分为几个部分:核心功能、优势、使用步骤、代码示例、参数配置、适用场景和注意事项。需要确保逻辑清晰,逐步引导用户理解。 还要注意用户之前的回答中提到的QLoRA和PEFT,所以在适用场景中可以提到这些库的结合使用,比如如何用Trainer来配合参数高效微调方法。 需要检查是否有遗漏的关键点,例如Trainer支持的优化器、回调函数、评估指标等。此外,用户可能关心如何自定义训练过程,比如自定义损失函数或评估步骤,这也需要提及。 另外,用户可能想知道Trainer自定义训练循环的区别,以及何时使用Trainer更合适。可能需要强调其便捷性和节省时间的特点,尤其是在标准训练任务中。 最后,确保语言简洁明了,避免技术术语过多,但又要准确。可能需要使用示例代码来说明如何初始化Trainer、配置训练参数等。同时,注意格式要求,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能公式较少,主要关注代码和文字描述。 总结:需要全面介绍Trainer,突出其功能、优势和使用方法,结合之前的QLoRA微调案例,提供实际应用的示例,帮助用户理解如何在实际项目中应用Trainer。</think>以下是对 **Hugging Face Transformers 的 `Trainer` 类** 的详细解析,帮助理解其设计目标、核心功能应用场景: --- ### 一、什么是 Trainer? `Trainer` 是 Hugging Face Transformers 库提供的一个**高级训练抽象类**,旨在简化深度学习模型(尤其是 NLP 模型)的训练、评估推理流程。它通过封装训练循环(Training Loop)的底层细节(如梯度计算、优化器更新、分布式训练等),让开发者只需关注核心逻辑(模型、数据、超参数)。 --- ### 二、核心功能 #### 1. **自动化训练流程** - 自动执行以下操作: ```python for epoch in epochs: model.train() for batch in dataloader: inputs, labels = batch outputs = model(inputs) # 前向传播 loss = loss_fn(outputs, labels) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 参数更新 optimizer.zero_grad() # 梯度清零 ``` - 开发者只需定义 `模型`、`数据集`、`训练参数`,无需手动编写循环。 #### 2. **内置高效优化** - 支持混合精度训练(`fp16`/`bf16`)、梯度累积(`gradient_accumulation_steps`)。 - 分布式训练(多 GPU/TPU)无需额外代码。 - 自动优化显存(如梯度检查点 `gradient_checkpointing=True`)。 #### 3. **灵活扩展性** - 通过回调(`Callbacks`)自定义行为(如早停、日志上传)。 - 支持自定义损失函数、评估指标、优化器。 #### 4. **日志检查点** - 自动记录训练指标(损失、准确率等)到 TensorBoard 或 WandB。 - 定期保存模型检查点(`save_steps` 或 `save_strategy`)。 --- ### 三、关键代码结构 #### 1. 基础使用示例 ```python from transformers import Trainer, TrainingArguments # 定义训练参数 training_args = TrainingArguments( output_dir="./results", # 输出目录 per_device_train_batch_size=8, num_train_epochs=3, learning_rate=5e-5, evaluation_strategy="epoch", # 每个 epoch 评估一次 save_strategy="epoch", # 每个 epoch 保存模型 fp16=True, # 混合精度训练 ) # 初始化 Trainer trainer = Trainer( model=model, # 模型实例 args=training_args, # 训练参数 train_dataset=train_dataset, # 训练集 eval_dataset=val_dataset, # 验证集(可选) compute_metrics=compute_metrics # 自定义评估函数(可选) ) # 启动训练 trainer.train() ``` #### 2. 自定义评估函数 ```python from sklearn.metrics import accuracy_score def compute_metrics(eval_pred): logits, labels = eval_pred predictions = np.argmax(logits, axis=-1) return {"accuracy": accuracy_score(labels, predictions)} ``` --- ### 四、 PEFT(如 QLoRA)的集成 当使用 **PEFT 库**(如 LoRA、QLoRA)进行参数高效微调时,`Trainer` 可直接适配: ```python from peft import LoraConfig, get_peft_model # 添加 LoRA 适配器 lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"] ) model = get_peft_model(model, lora_config) # 正常使用 Trainer trainer = Trainer(model=model, ...) trainer.train() ``` --- ### 五、适用场景 1. **快速原型开发** - 适用于标准任务(文本分类、生成、问答等),减少重复代码。 2. **资源受限环境** - 通过混合精度、梯度累积优化显存,适配单卡或多卡训练。 3. **大规模模型微调** - 结合 PEFT(QLoRA)高效微调百亿参数模型。 4. **实验复现** - 通过固定随机种子(`seed=42`)确保结果可复现。 --- ### 六、局限性 - **高度定制化需求**:若需修改训练循环底层逻辑(如对抗训练、特殊采样策略),可能需要继承 `Trainer` 并重写方法,或直接使用自定义循环。 - **非标准任务**:对于多模态输入、复杂损失组合等场景,需额外适配数据预处理或模型输出。 --- ### 七、替代方案 - **自定义训练循环**:直接使用 PyTorch 的 `torch.utils.data.DataLoader` + 手动循环,灵活性最高。 - **第三方框架**:如 PyTorch Lightning、FastAI(提供类似抽象,但生态 Transformers 集成度较低)。 --- 通过 `Trainer`,开发者可以快速实现模型训练标准化,将注意力集中在模型设计数据分析上,而非底层工程细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值