Google Colab 训练很慢原因——驱动器读取数据集慢(已解决)

人工智能34

前言

最近在使用Google Colab 训练模型,分配的是 Tesla P100-PCIE-16G 显卡;这个显卡也不是很弱啊,但在训练模型时,发现很慢。比我本地的两张1080ti显卡(合起来也是16G)慢几倍了,感到非常困惑,后来看了很多文章,发现了是 谷歌网盘 驱动器读取数据集慢 导致的。。。。。。

关于之前使用Google Colab(错误示范)

首先,代码和数据集也被下载到Google磁盘;认为下载并处理数据集后,下次可以直接训练,而不必重新下载数据集和重新处理数据。

[En]

First of all, the code and datasets are also downloaded to the Google disk; thinking that after downloading and processing the dataset, you can train directly next time without having to re-download the dataset and reprocess the data.

然后是挂载谷歌网盘;Google Colab中进入谷歌网盘的代码目录。

最后进行训练模型。

后来发现从谷歌网盘驱动器读取文件是非常慢的,训练过程处理需要GPU的计算,还需读取训练集的数据;如果读取数据速度很慢,GPU再怎么强,也体现出不优势了。比如:GPU处理一张图片可能只需0.001ms,但读取一张图片却要1.0ms。

解决思路

既然我们知道了是数据集放到了谷歌网盘,从谷歌网盘读取过来时很慢,导致训练时间增大;那可以不把数据集放到谷歌网盘,直接放到 Colab 中存储,这样能有效解决读取数据集慢的问题了。

或者把数据集放到了谷歌网盘,然后使用某种内存映射文件(如 hdf5 或 lmdb)来解决此问题。这样 I\O 操作要快得多。

思路1——直接把数据集放到Colab 中存储

打开Colab 后,默认来到 /content 目录下,这是Colab中存储目录;我们可以在/content 目录下创建文件夹,来存放数据集。

比如/content 目录下创建datasets文件夹,然后用ls 查看创建好的目录。

!mkdir datasets
!ls

训练Kitti数据集,训练集:5981张;验证集:1500张;测试:7518张。

Google Colab 训练很慢原因——驱动器读取数据集慢(已解决)

训练一轮大约3分钟,还是挺快的了。对比之前把数据集放到谷歌网盘,然后直接读取的方式,训练时间需要24分钟左右。

这种方法的缺点:每次需要重新下载数据集,处理数据;造成重复操作效率降低。(不过在Colab 下载数据集也是很快的,通常有40M/s;有时慢的10M/s)

思路2——hdf5方式内存映射文件

这是把谷歌网盘中的数据集通过hdf5方式进行内存映射,然后训练时加载hdf5文件,从而减少读取数据时间,提高训练速度。

HDF5 优点:它的层次结构(类似于文件夹/文件)、与每个项目一起存储的可选的任意元数据;以及它的灵活性(例如压缩);另一个优点是数据集可以是固定大小的 _或_灵活的尺寸。因此,可以轻松地将数据附加到大型数据集,而无需创建全新的副本。

有关 hdf5 格式的速度增益参考:python - Is there an analysis speed or memory usage advantage to using HDF5 for large array storage (instead of flat binary files)? - Stack Overflow

详细操作参考这篇文章:https://medium.com/@oribarel/getting-the-most-out-of-your-google-colab-2b0585f82403

案例步骤:

1、挂载谷歌网盘

from google.colab import drive
drive.mount('/content/drive')

运行后上面的代码片段后,须要点击链接,在你的谷歌网盘帐户来验证你Colab:登录后得到一串"码",复制粘贴到运行处。

2、更新数据

挂载谷歌网盘后,Colab将 不会遇到对网盘目录的任何更改(编辑代码、添加文件等)。这是由于 Colab 缓存机制造成的。为了克服这个问题,应该在使用新文件之前清除缓存,命令如下:

!google-drive-ocamlfuse -cc

3、hdf5方式映射数据集

Python 提供了 h5py 和 lmdb 库来处理这些文件格式。h5py 可以轻松地以 NumPy 数组的形式存储和操作现有数据,我们使用hdf5内存映射文件格式。

此代码创建一个新的 .h5 文件,其中包含用于训练、开发和测试数据集的占位符。

import h5py
from PIL import Image

fileName = 'data.h5'
numOfSamples = 10000
with h5py.File(fileName, "w") as out:
  out.create_dataset("X_train",(numOfSamples,256,256,3),dtype='u1')
  out.create_dataset("Y_train",(numOfSamples,1,1),dtype='u1')
  out.create_dataset("X_dev",(numOfSamples,256,256,3),dtype='u1')
  out.create_dataset("Y_dev",(numOfSamples,1,1),dtype='u1')
  out.create_dataset("X_test",(numOfSamples,256,256,3),dtype='u1')
  out.create_dataset("Y_test",(numOfSamples,1,1),dtype='u1')

要将我们的数据加载到这些"关键字"中,以 Python 字典样式访问"关键字"。在这里,我们将训练图像加载到 X_train"关键字",训练标签加载到Y _train"关键字"等等。

out.create_dataset("X_train",(numOfSamples,256,256,3),dtype='u1') 这行代码是将训练图像加载到 X_train"关键字",图片宽高分别是256x256,3通道RGB。

with h5py.File(fileName, "a") as out:
   img = Image.open("X_train_1.jpg")      # X_train_1.jpg is 256 x 256 RGB image
   out['X_train'] = numpy.asarray(img)

使用 PyTorch,编写自己的 .h5 Dataset供 PyTorch 使用 DataLoader

import torch
import numpy as np
import torch.optim as optim
import torch.utils.data
import torchvision.datasets as dset
import torchvision.transforms as transforms
import torchvision.utils as vutils
from PIL import Image
import h5py

class dataset_h5(torch.utils.data.Dataset):
    def __init__(self, in_file, transform=None):
        super(dataset_h5, self).__init__()

        self.file = h5py.File(in_file, 'r')
        self.transform = transform

    def __getitem__(self, index):
        x = self.file['X_train'][index, ...]
        y = self.file['Y_train'][index, ...]

        # Preprocessing each image
        if self.transform is not None:
            x = self.transform(x)

        return (x, y), index

    def __len__(self):
        return self.file['X_train'].shape[0]

下面是调用 dataset_h5( ) 函数,然后加载数据集。

dataset = dataset_h5("PATH_TO_YOUR_.h5_FILE",transform=transform)
dataloader = torch.utils.data.DataLoader(
        dataset, batch_size=8,
        drop_last=True, shuffle=bshuffle, num_workers=1)

本文只供大家参考与学习,谢谢。

Original: https://blog.csdn.net/qq_41204464/article/details/121734447
Author: 一颗小树x
Title: Google Colab 训练很慢原因——驱动器读取数据集慢(已解决)

Original: https://blog.csdn.net/qq_41204464/article/details/121734447
Author: 一颗小树x
Title: Google Colab 训练很慢原因——驱动器读取数据集慢(已解决)

相关文章
吴恩达的机器学习,属实牛逼 人工智能

吴恩达的机器学习,属实牛逼

吴恩达属实牛逼 大家好哇,新同学都叫我张北海,老同学都叫我老胡,其实是一个人,只是我特别喜欢章北海这个《三体》中的人物,张是错别字。 最近在coursera上重温了吴恩达升级版的《机器学习》课程,当时...
人工智能重新定义管理 人工智能

人工智能重新定义管理

转载请注明:来自csdn以及备注作者,本文原创 孙子兵法中有一句话:知彼知己,胜乃不殆,知天知地,胜乃不穷。这或许是最早提出的内外部环境分析的思想。最近几年,我们面临着创新创业的大环境,"互联网+"、...
yolov5+deepsort跟踪学习笔记 人工智能

yolov5+deepsort跟踪学习笔记

前段时间因为项目需要,需要使用yolo+deepsort来进行目标跟踪,此博客作为学习笔记与大家共勉,欢迎大家批评指正。接下来,将从整体流程以及各个小模块来进行介绍。 整体流程图 本文主要讲解deep...
机器学习实战:用SVD压缩图像 人工智能

机器学习实战:用SVD压缩图像

前文我们了解了奇异值分解(SVD)的原理,今天就实战一下,用矩阵的奇异值分解对图片进行压缩. Learn by doing 我做了一个在线的图像压缩应用,大家可以感受一下。 https://huggi...
Zalenium使用 人工智能

Zalenium使用

zalenium是一种以容器方式来动态创建和管理本地Selenium Grid的扩展。它使用docker-selenium在本地运行基于Firefox和Chrome的测试。 1、安装Docker En...