【深度学习-数据加载优化-训练速度提升一倍】
1,介绍
数据加载
深度学习的训练,简单的说就是将数据切分成batch,丢入模型中,并计算loss训练。其中比较重要的一环是数据打batch部分(数据加载部分)。训练时间优化:
深度学习训练往往需要大量的数据,训练过程也比较慢,常见的提升训练速度的方法包括:数据加载优化、模型计算优化、fp16半精度训练、加大batch、多卡训练等方法。这篇文章主要介绍从数据加载的思路提升训练速度。结论:
数据加载优化后,可以提升1倍以上的训练速度。
2,数据加载流程
- 数据加载一般分为四步:
- 从文本中读取数据,并处理成想要的格式。(比如分类任务,就需要输入+label的格式)
- 将读取的输入,转换成模型的输入feature。(nlp中一般是把文本切分成token)
- 创建:dataset、dataloader、sampler。(数据的采样方式,打batch的方式)
- 遍历训练数据,并训练
- 数据优化在第二步、已经第三步中。具体如下
examples, label_list = get_data(data_dir=file_dir)# 构建 featurefeatures = convet_text_feature(examples)# 构建 dataset、dataloader、samplertrain_dataset = ClassifyDataset(features, examples)train_sampler = SequentialSampler(train_dataset)train_dataloader = DataLoader(train_dataset,sampler=train_sampler,batch_size=4, collate_fn=torch.Tensor)# 获取训练数据for step, batch in enumerate(train_dataloader):print(batch.shape)
3, 简单版本
(完整代码:https://github.com/xxyliuyang/yl_nlp/blob/main/data_load_opt/simple.py)
- 数据转换成feature步骤:将文本切词并转换成token id;之后,一次性将所有数据padding成最大长度。
def convet_text_feature(examples):tokenizer = AutoTokenizer.from_pretrained(tokenize_model)features = []for example in examples['train']:ids = tokenizer.convert_tokens_to_ids(tokenizer.tokenize(example.text_a, add_special_tokens=True))features.append(ids)# padlength = [len(ids) for ids in features]max_length = max(length)for i, feature in enumerate(features):features[i] = feature + [tokenizer.pad_token_id for _ in range(max_length-len(feature))]print(max_length)return features
- 数据打batch: 随机的方法每次定时去取固定大小的数据即可
4, 高级版本
(完整代码:https://github.com/xxyliuyang/yl_nlp/blob/main/data_load_opt/advance.py)
可能已经发现问题了:
- 问题一:转换成feature过程中一次性padding成最长,那么每次送入模型过程中,padding部分的计算就是多余的计算,大大增加的计算量。
- 优化过程:在转换成feature部分,不进行padding,送入模型之前动态的padding
def convet_text_feature(examples):features = []for example in examples['train']:ids = tokenizer.convert_tokens_to_ids(tokenizer.tokenize(example.text_a, add_special_tokens=True))features.append(ids)# no padlength = [len(ids) for ids in features]max_length = max(length)print(max_length)return featuresdef batch_list_to_batch_tensors(batch): # 动态padding 函数batch_tensors = []max_len = max([len(x) for x in batch])for feature in batch:feature = feature + [tokenizer.pad_token_id for _ in range(max_len-len(feature))]batch_tensors.append(feature)return torch.tensor(batch_tensors, dtype=torch.long)
- 问题二:如果是随机构建batch,那么输入长度是不确定的,假设一个batch,最小的文本长度是10,最大的文本长度是100,那么10长度的输入也要padding成100,同样无形中增加了过多的padding无效计算。
- 优化过程:通过sampler优化,将相同长度的数据放到一个batch里面,减少padding的长度。
class BucketSampler(Sampler):def __init__(self, data_source, padding_noise=0.1):super().__init__(data_source)self.lengths = [len(x) for x in data_source.features]self.padding_noise = padding_noisedef _add_noise_to_value(self, value: int):noise_value = value * self.padding_noisenoise = random.uniform(-noise_value, noise_value)return value + noisedef __iter__(self):noisy_lengths = [self._add_noise_to_value(l) for l in self.lengths]indice_lengths = [(idx, length) for idx, length in enumerate(noisy_lengths)]indice_lengths.sort(key=lambda x: x[1])return iter([indice_length[0] for indice_length in indice_lengths])def __len__(self):return len(self.lengths)
总结:
数据加载优化:
- 先打batch,然后动态的padding(减少整体数据的padding长度)。
- 将相同长度的数据放到一个batch里面(减少单个batch里面padding的长度)。
【深度学习-数据加载优化-训练速度提升一倍】相关推荐
- vue php 加载速度,Vue加载优化,速度提高一倍。
前言 之前做的一个Vue项目,流程大概是这这样的:从公众号进入,由外系统获取用户的openid等信息,然后再跳转到项目首页进行加载初始化操作. 业务最近反应进入首页很慢,于是大致排查了下,由于外系统需 ...
- vue中gif加载一次_Vue加载优化,速度提高一倍。
本文首发于个人公众号[Java技术大杂烩],欢迎关注. 前言 之前做的一个Vue项目,流程大概这这样的:从公众号进入,由外系统获取用户的openid等信息,然后再跳转到项目首页进行加载初始化操作. 业 ...
- NVIDIA GEFORCE 2080 / 2080 SUPER / 2080 Ti + CUDA Toolkit 8.0 深度学习模型加载速度慢
NVIDIA GEFORCE 2080 / 2080 SUPER / 2080 Ti + CUDA Toolkit 8.0 深度学习模型加载速度慢 (卡顿) GEFORCE RTX 2080 / GE ...
- 阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟 报道 | 公众号 CVLianMeng 转载于 :量子位 AI博士笔记系列推 ...
- alexnet训练多久收敛_如何将深度学习训练速度提升一百倍?PAISoar 来了
阿里妹导读:得力于数据规模增长.神经网络结构的演进和计算能力的增强,深度学习的图像处理.语音识别等领域取得了飞速发展.随着训练数据规模和模型复杂度的不断增大,如何充分利用分布式集群的计算资源加快训练速 ...
- 如何将深度学习训练速度提升一百倍?PAISoar 来了
阿里妹导读:得力于数据规模增长.神经网络结构的演进和计算能力的增强,深度学习的图像处理.语音识别等领域取得了飞速发展.随着训练数据规模和模型复杂度的不断增大,如何充分利用分布式集群的计算资源加快训练速 ...
- PFENet数据加载、训练、pascal5i不同的5类验证测试、添加训练曲线函数
论文地址:https://arxiv.org/abs/2008.01449 作者代码:https://github.com/dvlab-research/PFENet 一.数据加载dataset (先 ...
- 谷歌提出“数据回波”榨干GPU空闲时间,训练速度提升3倍多
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:量子位 AI博士笔记系列推荐 周志华<机器学习>手推 ...
- 为了不让GPU等CPU,谷歌提出“数据回波”榨干GPU空闲时间,训练速度提升3倍多...
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 因为通用计算芯片不能满足神经网络运算需求,越来越多的人转而使用GPU和TPU这类专用硬件加速器,加快神经网络训练的速度. 但是,用了更快的 ...
最新文章
- Exchange server 2010 beta安装部署流程
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和static
- html表格按钮相对位置不变,表格中如何使td或div相对定位在某一行上面
- 亚马逊云服务(AWS)中国与毕马威中国建立战略合作伙伴关系
- android studio 新建工程慢,关于AndroidStudio新建与编译项目速度慢解决办法
- 软件评测师--第12小时 兼容性测试
- 使用instsrv.exe和srvany.exe创建windows服务
- 微信JS-SDK说明文档
- Springboot 前后端交互 Long类型传输 前端获取数据受限
- linux在root安装软件,避免使用root安装软件
- EasyExcel导出自定义下拉数据集的Excel模板文件
- DeleteMapping GetMapping PutMapping
- 2020年9月份华为杯研究生数学建模C题
- python 字典的学习
- Ambari自定义stack
- 电子科技大学信息与通信工程学院858考研上岸经验分享(一)
- Android 代码混淆 包名被混淆 主工程二次混淆 一站解决你的混淆
- 临床辅助系统CDSS程序
- 【chrome】模拟微信浏览器
- vcd包Kappa()函数一致性及置信区间