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的长度)。

【深度学习-数据加载优化-训练速度提升一倍】相关推荐

  1. vue php 加载速度,Vue加载优化,速度提高一倍。

    前言 之前做的一个Vue项目,流程大概是这这样的:从公众号进入,由外系统获取用户的openid等信息,然后再跳转到项目首页进行加载初始化操作. 业务最近反应进入首页很慢,于是大致排查了下,由于外系统需 ...

  2. vue中gif加载一次_Vue加载优化,速度提高一倍。

    本文首发于个人公众号[Java技术大杂烩],欢迎关注. 前言 之前做的一个Vue项目,流程大概这这样的:从公众号进入,由外系统获取用户的openid等信息,然后再跳转到项目首页进行加载初始化操作. 业 ...

  3. 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 ...

  4. 阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :量子位 AI博士笔记系列推 ...

  5. alexnet训练多久收敛_如何将深度学习训练速度提升一百倍?PAISoar 来了

    阿里妹导读:得力于数据规模增长.神经网络结构的演进和计算能力的增强,深度学习的图像处理.语音识别等领域取得了飞速发展.随着训练数据规模和模型复杂度的不断增大,如何充分利用分布式集群的计算资源加快训练速 ...

  6. 如何将深度学习训练速度提升一百倍?PAISoar 来了

    阿里妹导读:得力于数据规模增长.神经网络结构的演进和计算能力的增强,深度学习的图像处理.语音识别等领域取得了飞速发展.随着训练数据规模和模型复杂度的不断增大,如何充分利用分布式集群的计算资源加快训练速 ...

  7. PFENet数据加载、训练、pascal5i不同的5类验证测试、添加训练曲线函数

    论文地址:https://arxiv.org/abs/2008.01449 作者代码:https://github.com/dvlab-research/PFENet 一.数据加载dataset (先 ...

  8. 谷歌提出“数据回波”榨干GPU空闲时间,训练速度提升3倍多

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:量子位 AI博士笔记系列推荐 周志华<机器学习>手推 ...

  9. 为了不让GPU等CPU,谷歌提出“数据回波”榨干GPU空闲时间,训练速度提升3倍多...

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 因为通用计算芯片不能满足神经网络运算需求,越来越多的人转而使用GPU和TPU这类专用硬件加速器,加快神经网络训练的速度. 但是,用了更快的 ...

最新文章

  1. Exchange server 2010 beta安装部署流程
  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和static
  3. html表格按钮相对位置不变,表格中如何使td或div相对定位在某一行上面
  4. 亚马逊云服务(AWS)中国与毕马威中国建立战略合作伙伴关系
  5. android studio 新建工程慢,关于AndroidStudio新建与编译项目速度慢解决办法
  6. 软件评测师--第12小时 兼容性测试
  7. 使用instsrv.exe和srvany.exe创建windows服务
  8. 微信JS-SDK说明文档
  9. Springboot 前后端交互 Long类型传输 前端获取数据受限
  10. linux在root安装软件,避免使用root安装软件
  11. EasyExcel导出自定义下拉数据集的Excel模板文件
  12. DeleteMapping GetMapping PutMapping
  13. 2020年9月份华为杯研究生数学建模C题
  14. python 字典的学习
  15. Ambari自定义stack
  16. 电子科技大学信息与通信工程学院858考研上岸经验分享(一)
  17. Android 代码混淆 包名被混淆 主工程二次混淆 一站解决你的混淆
  18. 临床辅助系统CDSS程序
  19. 【chrome】模拟微信浏览器
  20. vcd包Kappa()函数一致性及置信区间

热门文章

  1. 学习PHP中的iconv扩展相关函数
  2. 每日一词——@FUnctionalInterface
  3. 即食水产消费品公司“不等食品”获千万元级A轮融资,险峰长青领投
  4. 基于ESP32的蓝牙鼠标键盘(二)BleMouse.h函数解析
  5. tda4vm如何SPL方式加载MCU域的核?
  6. 【postgres】源码结构
  7. 数据结构C语言之停车场管理
  8. GitHub开源:支持100多种语言的OCR文字识别
  9. 巧妙设置QQ密码 气死嚣张木马(转)
  10. python 成语接龙-连接数据库