深度学习-数据加载优化-训练速度提升一倍(代码片段)

yealxxy yealxxy     2023-02-03     609

关键词:

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)

    # 构建 feature
    features = convet_text_feature(examples)

    # 构建 dataset、dataloader、sampler
    train_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)

    # pad
    length = [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 pad
    length = [len(ids) for ids in features]
    max_length = max(length)
    print(max_length)
    return features
    
def 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_noise

    def _add_noise_to_value(self, value: int):
        noise_value = value * self.padding_noise
        noise = random.uniform(-noise_value, noise_value)
        return value + noise

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

数据并行:提升训练吞吐的高效方法|深度学习分布式训练专题

数据并行是大规模深度学习训练中非常成熟和常用的并行模式。本文将介绍数据并行的原理和主流实现方案,使用数据并行加速训练过程中需要注意的问题,以及如何优化数据并行进一步提高训练速度。希望能帮助用户... 查看详情

深度学习基于卷积神经网络的天气识别训练(代码片段)

活动地址:CSDN21天学习挑战赛目录前言了解weather_photos数据集下载weather_photos数据集采用CPU训练还是GPU训练区别使用CPU训练使用GPU训练导入数据查看数据量预处理加载数据集打印各类型显示部分图片配置数据集(加快速度)建立C... 查看详情

深度学习基础知识-21加快深度学习模型训练速度的方法(代码片段)

在深度学习任务中,虽然可以通过堆叠参数、设计更复杂的结构来提高模型的表征能力,但这也会导致模型的计算量增加,训练时间延长,大大降低模型的产出效率。这篇文章根据博主的经验简单介绍一些加快模... 查看详情

深度学习基于卷积神经网络的验证码识别(代码片段)

活动地址:CSDN21天学习挑战赛目录前言了解captcha数据集下载weather_photos数据集采用CPU训练还是GPU训练区别使用CPU训练使用GPU训练支持中文导入数据查看数据量显示部分图片预处理手动设置标签灰度化处理平均值法加权平均法c... 查看详情

dl:深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码(代码片段)

DL:深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码目录深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码defsc... 查看详情

(1.8)深度学习实战——深度学习模型训练痛点及解决方法(代码片段)

...I领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的。选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤定义算法公式,也就是神经网络的前... 查看详情

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

...分离架构大行其道。在此背景下,用户在云上训练大规模深度学习模型引发的数据缓存需求日益旺盛。为此,阿里云容器服务团 查看详情

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

...分离架构大行其道。在此背景下,用户在云上训练大规模深度学习模型引发的数据缓存需求日益旺盛。为此,阿里云容器服务团 查看详情

基于nvidiagpus的深度学习训练新优化

基于NVIDIAGPUs的深度学习训练新优化NewOptimizationsToAccelerateDeepLearningTrainingonNVIDIAGPUs不同行业采用人工智能的速度取决于最大化数据科学家的生产力。NVIDIA每月都会发布优化的NGC容器,为深度学习框架和库提高性能,帮助科学家最... 查看详情

深度学习matlab图像分类,手把手教程系列(代码片段)

...的数据unzip('MerchData.zip');二、选择预训练网络打开深度网络设计器deepNetworkDesigner演示:通过从深度网络设计器首页中选择一个预训练的GoogLeNet网络来加载它。如果您需 查看详情

tensorflow中使用batchnormalization(代码片段)

在深度学习中为了提高训练速度,经常会使用一些正正则化方法,如L2、dropout,后来SergeyIoffe等人提出BatchNormalization方法,可以防止数据分布的变化,影响神经网络需要重新学习分布带来的影响,会降低学习速率,训练时间等问... 查看详情

优化调参提升gpu和cpu的利用率(代码片段)

...支持!         本博客是记录作者部署优化本地深度学习项目的经验。在深度学习项目中,我们最常见的提速方式是使用GPU,但是GPU使用了后可能会发现GPU利用率和CPU利用率很低,这很可能是我们项目中batchsi... 查看详情

pytorch训练中dataset多线程加载数据,而不是在dataloader(代码片段)

背景与需求现在做深度学习的越来越多人都有用PyTorch,他容易上手,而且API相对TF友好的不要太多。今天就给大家带来最近PyTorch训练的一些小小的心得。大家做机器学习、深度学习都恨不得机器卡越多越好,这样可... 查看详情

「深度学习一遍过」必修6:利用迁移学习快速提升模型性能(代码片段)

本专栏用于记录关于深度学习的笔记,不光方便自己复习与查阅,同时也希望能给您解决一些关于深度学习的相关问题,并提供一些微不足道的人工神经网络模型设计思路。专栏地址:「深度学习一遍过」必修篇... 查看详情

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

...分离架构大行其道。在此背景下,用户在云上训练大规模深度学习模型引发的数据缓存需求日益旺盛。为此,阿里云容器服务团队与Alluxio开源社区和南京大学顾荣老师等人通力合作寻找相关解决方案,当前已经提供K8s上运行模... 查看详情

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

...分离架构大行其道。在此背景下,用户在云上训练大规模深度学习模型引发的数据缓存需求日益旺盛。为此,阿里云容器服务团队与Alluxio开源社区和南京大学顾荣老师等人通力合作寻找相关解决方案,当前已经提供K8s上运行模... 查看详情

深度学习神经网络数字识别案例(代码片段)

目录1数据加载2数据处理3模型构建4模型编译5模型训练6模型测试7模型保存8总结1数据加载案例的实现流程:使用手写数字的MNIST数据集如上图所示,该数据集包含60,000个用于训练的样本和10,000个用于测试的样本,图像... 查看详情

优化pytorchdataloader提升数据加载速度

参考技术A因为pytorch数据加载速度太慢,影响训练速度,实训快速加载数据方式,提前获取要加载的数据,整体速度能快1/6.操作步骤如下所示:1、激活自己的torch虚拟环境:sourceactivatetorch2、安装prefetch_generator包pipinstallprefetch_gener... 查看详情