烟台建设用地规划查询网站,wordpress 调用备案号,青岛的互联网公司,推销产品的万能句子诸神缄默不语-个人CSDN博文目录
本文属于huggingface.transformers全部文档学习笔记博文的一部分。 全文链接#xff1a;huggingface transformers包 文档学习笔记#xff08;持续更新ing…#xff09;
本部分网址#xff1a;https://huggingface.co/docs/transformers/m…诸神缄默不语-个人CSDN博文目录
本文属于huggingface.transformers全部文档学习笔记博文的一部分。 全文链接huggingface transformers包 文档学习笔记持续更新ing…
本部分网址https://huggingface.co/docs/transformers/main/en/accelerate 本文介绍如何使用huggingface.accelerate官方文档https://huggingface.co/docs/accelerate/index进行分布式训练。
此外还参考了accelerate的安装文档https://huggingface.co/docs/accelerate/basic_tutorials/install
一个本文代码可用的Python环境Python 3.9.7, PyTorch 2.0.1, transformers 4.31.0, accelerate 0.22.0
parallelism能让我们实现在硬件条件受限时训练更大的模型训练速度能加快几个数量级。 文章目录 1. 安装与配置2. 在代码中使用 1. 安装与配置
安装pip install accelerate
配置accelerate config 然后它会给出一些问题通过上下键更换选项用Enter确定
选错了也没啥关系反正能改
用accelerate env命令可以查看配置环境。
2. 在代码中使用
用accelerate之前的脚本具体讲解可见我之前写的博文用huggingface.transformers.AutoModelForSequenceClassification在文本分类任务上微调预训练模型 用的是原生PyTorch那一版因为Trainer会自动使用分布式训练。metric部分改成新版并用全部数据来训练
from tqdm.auto import tqdmimport torch
from torch.utils.data import DataLoader
from torch.optim import AdamWimport datasets,evaluate
from transformers import AutoTokenizer,AutoModelForSequenceClassification,get_schedulerdatasetdatasets.load_from_disk(download/yelp_full_review_disk)tokenizerAutoTokenizer.from_pretrained(/data/pretrained_models/bert-base-cased)def tokenize_function(examples):return tokenizer(examples[text], paddingmax_length,truncationTrue,max_length512)tokenized_datasetsdataset.map(tokenize_function, batchedTrue)#Postprocess dataset
tokenized_datasetstokenized_datasets.remove_columns([text])
#删除模型不用的text列tokenized_datasetstokenized_datasets.rename_column(label, labels)
#改名label列为labels因为AutoModelForSequenceClassification的入参键名为label
#我不知道为什么dataset直接叫label就可以啦……tokenized_datasets.set_format(torch) #将值转换为torch.Tensor对象small_train_datasettokenized_datasets[train].shuffle(seed42)
small_eval_datasettokenized_datasets[test].shuffle(seed42)train_dataloaderDataLoader(small_train_dataset,shuffleTrue,batch_size32)
eval_dataloaderDataLoader(small_eval_dataset,batch_size64)modelAutoModelForSequenceClassification.from_pretrained(/data/pretrained_models/bert-base-cased,num_labels5)optimizerAdamW(model.parameters(),lr5e-5)num_epochs3
num_training_stepsnum_epochs*len(train_dataloader)
lr_schedulerget_scheduler(namelinear,optimizeroptimizer,num_warmup_steps0,num_training_stepsnum_training_steps)devicetorch.device(cuda:1) if torch.cuda.is_available() else torch.device(cpu)
model.to(device)progress_bar tqdm(range(num_training_steps))model.train()
for epoch in range(num_epochs):for batch in train_dataloader:batch{k:v.to(device) for k,v in batch.items()}outputsmodel(**batch)lossoutputs.lossloss.backward()optimizer.step()lr_scheduler.step()optimizer.zero_grad()progress_bar.update(1)metricevaluate.load(accuracy)
model.eval()
for batch in eval_dataloader:batch{k:v.to(device) for k,v in batch.items()}with torch.no_grad():outputsmodel(**batch)logitsoutputs.logitspredictionstorch.argmax(logits, dim-1)metric.add_batch(predictionspredictions, referencesbatch[labels])print(metric.compute())懒得跑完了总之预计要跑11个小时来着非常慢。
添加如下代码
from accelerate import Acceleratoraccelerator Accelerator()#去掉将模型和数据集放到指定卡上的代码#在建立好数据集、模型和优化器之后
train_dataloader, eval_dataloader, model, optimizer accelerator.prepare(train_dataloader, eval_dataloader, model, optimizer
)#训练阶段将loss.backward()替换成
accelerator.backward(loss)添加后的代码我用全部数据集出来预计训练时间是4小时3张卡但我懒得跑这么久了我就还是用1000条跑跑把整个流程跑完意思一下 用accelerate launch Python脚本路径运行 验证部分的情况见代码后面
from tqdm.auto import tqdmimport torch
from torch.utils.data import DataLoader
from torch.optim import AdamWimport datasets
from transformers import AutoTokenizer,AutoModelForSequenceClassification,get_schedulerfrom accelerate import Acceleratoraccelerator Accelerator()datasetdatasets.load_from_disk(download/yelp_full_review_disk)tokenizerAutoTokenizer.from_pretrained(/data/pretrained_models/bert-base-cased)def tokenize_function(examples):return tokenizer(examples[text], paddingmax_length,truncationTrue,max_length512)tokenized_datasetsdataset.map(tokenize_function, batchedTrue)#Postprocess dataset
tokenized_datasetstokenized_datasets.remove_columns([text])
#删除模型不用的text列tokenized_datasetstokenized_datasets.rename_column(label, labels)
#改名label列为labels因为AutoModelForSequenceClassification的入参键名为label
#我不知道为什么dataset直接叫label就可以啦……tokenized_datasets.set_format(torch) #将值转换为torch.Tensor对象small_train_datasettokenized_datasets[train].shuffle(seed42).select(range(1000))
small_eval_datasettokenized_datasets[test].shuffle(seed42).select(range(1000))train_dataloaderDataLoader(small_train_dataset,shuffleTrue,batch_size32)
eval_dataloaderDataLoader(small_eval_dataset,batch_size64)modelAutoModelForSequenceClassification.from_pretrained(/data/pretrained_models/bert-base-cased,num_labels5)optimizerAdamW(model.parameters(),lr5e-5)train_dataloader, eval_dataloader, model, optimizer accelerator.prepare(train_dataloader, eval_dataloader, model, optimizer
)num_epochs3
num_training_stepsnum_epochs*len(train_dataloader)
lr_schedulerget_scheduler(namelinear,optimizeroptimizer,num_warmup_steps0,num_training_stepsnum_training_steps)progress_bar tqdm(range(num_training_steps))model.train()
for epoch in range(num_epochs):for batch in train_dataloader:outputsmodel(**batch)lossoutputs.lossaccelerator.backward(loss)optimizer.step()lr_scheduler.step()optimizer.zero_grad()progress_bar.update(1)验证部分是这样的直接用原来的验证部分就也能跑但是因为脚本会被运行2遍所以验证部分也会运行2遍。 所以我原则上建议用accelerate的话就光训练验证的部分还是单卡实现。 如果还是想在训练过程中看一下验证效果可以正常验证也可以将验证部分限定在if accelerator.is_main_process:里这样就只有主进程通常是第一个GPU会执行验证代码而其他GPU不会这样就只会打印一次指标了。