accelerator入门

一、目录

1 定义
2. DP、DPP的区别
3 实现
4. 测试比较

二、实现

  1. 定义
    accelerator 是由大名鼎鼎的huggingface发布的,专门适用于Pytorch的分布式训练框架,是torchrun 的封装。
    GitHub: https://github.com/huggingface/accelerate
    官网教程:https://huggingface.co/docs/accelerate/
  2. DP、DPP的区别
    DataParallel:数据并行。
    DistributedDataParallel:Distributed-data-parallel(简称DDP)顾名思义,分布式数据并行,是torch官方推荐的方式,相比于DP是单进程多线程模型,DDP使用了多进程的方式进行训练,能实现单机多卡、多机多卡训练。

注意的是,即使是单机多卡,DDP也比DP快很多,因为DDP从设计逻辑上杜绝了很多DP低效的缺点。在DDP中,再没有master GPU,每个GPU都在独立的进程中完成自身的任务。
3. 案例

  1. demo:https://zhuanlan.zhihu.com/p/544273093
 import torchimport torch.nn.functional as Ffrom datasets import load_dataset
+ from accelerate import Accelerator+ accelerator = Accelerator()
- device = 'cpu'
+ device = accelerator.devicemodel = torch.nn.Transformer().to(device)optimizer = torch.optim.Adam(model.parameters())dataset = load_dataset('my_dataset')data = torch.utils.data.DataLoader(dataset, shuffle=True)+ model, optimizer, data = accelerator.prepare(model, optimizer, data)model.train()for epoch in range(10):for source, targets in data:#source = source.to(device)#targets = targets.to(device)optimizer.zero_grad()output = model(source)loss = F.cross_entropy(output, targets)-         loss.backward()
+         accelerator.backward(loss)optimizer.step()

#运行: https://github.com/huggingface/accelerate/tree/main/examples 参考nlp_example.py
方式一:
通过accelerate config 设置gpu 多卡方法

>>accelerate config

在这里插入图片描述查看配置:
vim ~/.cache/huggingface/accelerate/default_config.yaml (后面配置时可以直接修改该文件)
在这里插入图片描述

>>accelerate config
>>accelerate launch xxxx.py

方式二:

 CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 xxx.py
  1. 实例:
import timeimport torch
from accelerate import Accelerator
from datasets import load_dataset
from datasets import load_metric
from torch.optim import AdamW
from torch.utils.data import DataLoader
from tqdm.auto import tqdm
from transformers import AutoModelForTokenClassification
from transformers import AutoTokenizer
from transformers import DataCollatorForTokenClassification
from transformers import get_scheduler
accelerator = Accelerator()
import os
os.environ["TOKENIZERS_PARALLELISM"] = "true"
import datasets
#raw_datasets = load_dataset("conll2003")
#raw_datasets.save_to_disk("conll2003")
raw_datasets=datasets.load_from_disk("conll2003")print(raw_datasets)
device = "cuda:0" if torch.cuda.is_available() else "cpu"ner_feature = raw_datasets["train"].features["ner_tags"]
label_names = ner_feature.feature.names
id2label = {str(i): label for i, label in enumerate(label_names)}
label2id = {v: k for k, v in id2label.items()}def align_labels_with_tokens(labels, word_ids):new_labels = []current_word = Nonefor word_id in word_ids:if word_id != current_word:# Start of a new word!current_word = word_idlabel = -100 if word_id is None else labels[word_id]new_labels.append(label)elif word_id is None:# Special tokennew_labels.append(-100)else:# Same word as previous tokenlabel = labels[word_id]# If the label is B-XXX we change it to I-XXXif label % 2 == 1:label += 1new_labels.append(label)return new_labelsdef tokenize_and_align_labels(examples):tokenized_inputs = tokenizer(examples["tokens"], truncation=True, is_split_into_words=True)all_labels = examples["ner_tags"]new_labels = []for i, labels in enumerate(all_labels):word_ids = tokenized_inputs.word_ids(i)new_labels.append(align_labels_with_tokens(labels, word_ids))tokenized_inputs["labels"] = new_labelsreturn tokenized_inputsdef postprocess(predictions, labels):predictions = predictions.detach().cpu().clone().numpy()labels = labels.detach().cpu().clone().numpy()# Remove ignored index (special tokens) and convert to labelstrue_labels = [[label_names[l] for l in label if l != -100] for label in labels]true_predictions = [[label_names[p] for (p, l) in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels)]return true_labels, true_predictions# tokenize
model_checkpoint = "/home/bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
tokenized_datasets = raw_datasets.map(tokenize_and_align_labels,batched=True,remove_columns=raw_datasets["train"].column_names,
)# model
model_checkpoint = "/home/bert-base-uncased"
model = AutoModelForTokenClassification.from_pretrained(model_checkpoint,id2label=id2label,label2id=label2id,
)
# model.to(device)# dataloader
data_collator = DataCollatorForTokenClassification(tokenizer=tokenizer)
train_dataloader = DataLoader(tokenized_datasets["train"],shuffle=True,collate_fn=data_collator,batch_size=32,num_workers=8
)
eval_dataloader = DataLoader(tokenized_datasets["validation"], collate_fn=data_collator, batch_size=128
)# metric
metric = load_metric("seqeval")# optimizer
optimizer = AdamW(model.parameters(), lr=2e-5)model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(model, optimizer, train_dataloader,eval_dataloader)# lr_scheduler
num_train_epochs = 3
num_update_steps_per_epoch = len(train_dataloader)
num_training_steps = num_train_epochs * num_update_steps_per_epoch
lr_scheduler = get_scheduler("linear",optimizer=optimizer,num_warmup_steps=0,num_training_steps=num_training_steps,
)t1 = time.time()progress_bar = tqdm(range(num_training_steps))
print("Begin training")
for epoch in range(num_train_epochs):# Trainingmodel.train()for batch in train_dataloader:# batch = {key: batch[key].to(device) for key in batch}outputs = model(**batch)loss = outputs.loss# loss.backward()accelerator.backward(loss)optimizer.step()lr_scheduler.step()optimizer.zero_grad()progress_bar.update(1)# Evaluationmodel.eval()for batch in eval_dataloader:# batch = {key: batch[key].to(device) for key in batch}with torch.no_grad():outputs = model(**batch)predictions = outputs.logits.argmax(dim=-1)labels = batch["labels"]# Necessary to pad predictions and labels for being gatheredpredictions = accelerator.pad_across_processes(predictions, dim=1, pad_index=-100)labels = accelerator.pad_across_processes(labels, dim=1, pad_index=-100)predictions_gathered = accelerator.gather(predictions)labels_gathered = accelerator.gather(labels)true_predictions, true_labels = postprocess(predictions, labels)metric.add_batch(predictions=true_predictions, references=true_labels)results = metric.compute()print(f"epoch {epoch}:",{key: results[f"overall_{key}"]for key in ["precision", "recall", "f1", "accuracy"]},)# Save and uploadaccelerator.wait_for_everyone()unwrapped_model = accelerator.unwrap_model(model)if accelerator.is_main_process:torch.save(unwrapped_model.state_dict, "./output/accelerate.pt")t2 = time.time()
print(f"训练时间为{t2 - t1}秒")
运行:CUDA_VISIBLE_DEVICES=0 torchrun --nproc_per_node=1 test.py用时:1hCUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node=2 test.py  用时:4h 为什么变慢了?原因:UserWarning: Can't initialize NVML  warnings.warn("Can't initialize NVML")解决: nvidia-smi  报错,  重启docker ,保证nvidia-smi 可以用。
  1. 测试比较
    原生单gpu 训练,训练集500条, 用时20s
    accelorator 训练, 单gpu, 训练集500条, 用时17s
    accelorator 训练 2个gpu 训练集500条, 用时11s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8、卷积Convolutions (CNN)

Today we finish off our study of collaborative filtering by looking closely at embeddings—a critical building block of many deep learning algorithms. Then we’ll dive into convolutional neural networks (CNNs) and see how they really work. We’ve used plen…

kaggle叶子分类比赛(易理解)

说实话网上很多关于叶子分类比赛的代码能取得的成绩都很好,但对于我这个业余人员太专业了,而且很多文章都有自己的想法,这让我这个仿写沐神代码的小菜鸡甚是头痛。 但好在我还是完成了,虽然结果并不是很好,但是如果跟着沐神走的同…

AI编码时代到来?实现编程梦想的利器—Baidu Comate测评

文章目录 Comate智能编码是什么?Comate支持的环境 Comate应用安装实际操作对话式生成代码生成代码注释智能单测项目测试调优功能 总结 Comate智能编码是什么? 在如今这个拥抱AI的时代,市面上已经产出了很多Ai代码助手,如果你还没…

【LeetCode算法】28. 找出字符串中第一个匹配项的下标

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、题目二、思路三、解决方案四、JAVA截取字符串的常用方法4.1 通过subString()截取字符串* 一、题目 给你两个字符串 haystack 和 needle ,请你在…

鸿蒙OpenHarmony南向:【Hi3516标准系统入门(IDE方式)】

Hi3516标准系统入门(IDE方式) 注意: 从3.2版本起,标准系统不再针对Hi3516DV300进行适配验证,建议您使用RK3568进行标准系统的设备开发。 如您仍然需要使用Hi3516DV300进行标准系统相关开发操作,则可能会出现…

CST电磁仿真查看模型的截面结构和生成Spice模型【入门教程】

通过Logfile查看仿真统计 一次性了解仿真统计! Post-Processing > Manage Results > Logfile 利用CPU Threads、Mesh Cells、Time Steps以及Total Solver Time等Logfile,可以一目了然地了解仿真统计。 (1)点击Post-Processing选项卡…

PPT如何录制视频?看这里,让你轻松上手!

在现代社会,演示文稿(ppt)已成为我们工作、学习和生活中不可或缺的一部分。无论是商务报告、教育培训还是产品展示,ppt都能以其直观、生动的形式有效地传达信息。可是你知道ppt如何录制视频吗?本文将为您介绍两种ppt录…

pycharm code行太长显示波浪线取消

实际操作如下:个人比较合适的位置为160,180时有点多 效果:

《视觉十四讲》例程运行记录(3)——运行ch6的例程中Ceres和g2o库的安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、安装Ceres1. 安装依赖2. 编译安装 二、安装g2o1. 安装依赖项2. 编译安装3. 可能出现的报错(1) 报错一 一、安装Ceres 1. 安装依赖 终端输入: sud…

计算有效声压

计算有效声压 clear all; %%----------------------------------------------读取文件------------------------------------------ % 从wav文件读入语音数据,该语音采样率16k,故信号最高频率8k。 [x,fs]audioread(C2_3_y.wav); % 取x的一个通道 xx(:,1)…

Google准备好了吗?OpenAI发布ChatGPT驱动搜索引擎|TodayAI

在科技界波澜壮阔的发展中,OpenAI正式宣布其最新突破——一个全新的基于ChatGPT技术的搜索引擎,旨在直接挑战谷歌在搜索领域的统治地位。这一创新将可能彻底改变用户上网搜索的方式。 据悉,这款AI驱动的搜索引擎利用了ChatGPT的强大功能&…

免费SSL证书?轻松申请攻略来了!

在当今的互联网时代,网络安全已经成为一个不容忽视的重要课题。随着在线交流和交易活动的增加,保护网站和用户信息的重要性日益突显。SSL证书,即安全套接字层证书,它为互联网通信提供了加密服务,确保数据的安全性和完整…

淘宝扭蛋机小程序开发:转动幸运,开启无限惊喜

一、探索未知,开启全新扭蛋体验 淘宝扭蛋机小程序,为您带来一场前所未有的扭蛋盛宴。在这个充满神秘与乐趣的平台上,每一次点击都将引领您走进未知的宝藏世界,每一次旋转都可能揭示出意想不到的惊喜。 二、海量商品,…

Kubernetes 教程:在 Containerd 容器中使用 GPU

原文链接:Kubernetes 教程:在 Containerd 容器中使用 GPU 云原生实验室本文介绍了如何在使用 Containerd 作为运行时的 Kubernetes 集群中使用 GPU 资源。https://fuckcloudnative.io/posts/add-nvidia-gpu-support-to-k8s-with-containerd/ 前两天闹得沸沸扬扬的事件不知道…

3D 交互展示该怎么做?

在博维数孪(Bowell)平台制作3D交互展示的流程相对简单,主要分为以下几个步骤: 1、准备3D模型:首先,你需要有一个3D模型。如果你有3D建模的经验,可以使用3ds Max或Blender等软件自行创建。如果没…

护眼台灯十大品牌哪个好?热销榜护眼灯十大品牌推荐

护眼台灯十大品牌哪个好?在这篇文章中,我将向大家介绍十大护眼台灯品牌,其中包括书客、松下、飞利浦等知名品牌。我精心挑选这些品牌,旨在为大家提供明智的选择参考。这些品牌的护眼台灯拥有的功能比较多,提供的光线也…

揭秘软胶囊品质的秘密武器:西奥机电CHT-01软胶囊弹性硬度测试仪

揭秘软胶囊品质的秘密武器:西奥机电CHT-01软胶囊弹性硬度测试仪 在医药行业中,软胶囊作为一种常见的药品剂型,因其独特的封装方式和便利性而受到广泛青睐。然而,软胶囊的质量问题也一直是制药企业关注的焦点。为了确保软胶囊的质量…

国际数字影像产业园专场招聘会暨四川城市职业学院双选会成功举办

为了进一步强化校企合作,链接企业与高素质人才,促进毕业生实现高质量就业,2024年5月7日,“成就梦想 职通未来”国际数字影像产业园专场招聘会暨四川城市职业学院2024届毕业生校园双选会成功举行。 当天,国际数字影像产…

全国首创!成都代表:国际数字影像产业园运营中

国际数字影像产业园,这座充满活力和创意的产业园区,以其独特的“数字影像文创”新型发展模式,正逐渐成为成都文创产业的标杆。它不仅仅是一个简单的成都文创产业园区,更是一个将数字影像、文化演艺、会展节庆、数字产业、艺术培训…

适用于 iPhone 的最佳数据恢复应用程序

意外删除了重要iPhone文件,或尝试从损坏的手机访问文件?我们收集了适用于 iPhone 的最佳数据恢复应用程序,这可能会扭转局面。 iPhone 数据恢复应用程序是一种您希望永远不需要的工具,但如果您需要的话,您一定会很高兴…