且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在 GPU 深度学习云服务里,使用自己的数据集?

更新时间:2021-10-11 08:12:24

如何在 GPU 深度学习云服务里,使用自己的数据集?

本文为你介绍,如何在 GPU 深度学习云服务里,上传和使用自己的数据集。

疑问

如何用云端 GPU 为你的 Python 深度学习加速?》一文里,我为你介绍了深度学习环境服务 FloydHub 。

文章发布后,有读者在后台提出来两个问题:

  1. 我没有外币信用卡,免费时长用完后,无法续费。请问有没有类似的国内服务?
  2. 我想使用自己的数据集进行训练,该怎么做?

第一个问题,有读者替我解答了。

如何在 GPU 深度学习云服务里,使用自己的数据集?

我看了一下,这里的 Russell Cloud ,确实是一款跟 FloydHub 类似的 GPU 深度学习云服务。

如何在 GPU 深度学习云服务里,使用自己的数据集?

可是感谢之后,我才发现原来他是 Russell Cloud 的开发人员。

于是这几天,使用中一遇到问题,我就直接找他答疑了。

因为有这种绿色通道,响应一直非常迅速。用户体验很好。

这款国内服务的优势,有以下几点:

首先是可以支付宝与微信付款,无需 Visa 或者 Mastercard 信用卡,很方便;

如何在 GPU 深度学习云服务里,使用自己的数据集?

其次是 Russell Cloud 基于阿里云,访问速度比较快,而且连接稳定。在上传下载较大规模数据的时候,优势比较明显。与之相比,FloydHub 上传500MB左右数据的时候,发生了两次中断。

第三是文档全部用中文撰写,答疑也用中文进行。对英语不好的同学,更友好。

第四是开发团队做了微创新。例如可以在微信小程序里面随时查看运行结果,以及查询剩余时长信息。

如何在 GPU 深度学习云服务里,使用自己的数据集?

解决了第一个问题后,我用 Russell Cloud 为你演示,如何上传你自己的数据集,并且进行深度学习训练。

注册

使用之前,请你先到 Russell Cloud 上注册一个免费账号。

如何在 GPU 深度学习云服务里,使用自己的数据集?

因为都是中文界面,具体步骤我就不赘述了。

注册成功后,你就拥有了1个小时的免费 GPU 使用时长。

如果你用我的邀请链接注册,可以多获得4个小时免费 GPU 使用时间。

如何在 GPU 深度学习云服务里,使用自己的数据集?

我手里只有这5个可用的邀请链接。你如果需要,可以直接输入。

看谁手快吧。

注册之后,进入控制台,你可以看到自己的相关信息。

如何在 GPU 深度学习云服务里,使用自己的数据集?

其中有个 Token 栏目,是你的登录信息。下面我给你讲讲怎么用。

你需要下载命令行工具,方法是进入终端,执行:

pip install -U russell-cli

然后你需要登录:

russell login

这时候根据提示,把刚才的 Token 输入进去,登录就完成了。

与 FloydHub 不同,大多数情况下 Russell Cloud 的身份与项目验证,用的都是这种 Token 的方式。

如果你对终端命令行操作还不是很熟悉,欢迎参考我的《如何安装Python运行环境Anaconda?(视频教程)》,里面有终端基本功能详细执行步骤的视频讲解。

环境

下文用到的数据和执行脚本,我都已经放到了这个 gitlab 链接

如何在 GPU 深度学习云服务里,使用自己的数据集?

你可以直接点击这里下载压缩包,之后解压。

解压后的目录里,包含两个子文件夹。

如何在 GPU 深度学习云服务里,使用自己的数据集?

cats_dogs_small_vgg16 包含我们的运行脚本。只有一个文件。

如何在 GPU 深度学习云服务里,使用自己的数据集?

它的使用方法,我们后面会介绍。

先说说,你最关心的数据集上传问题。

数据

解压后目录中的另一个文件夹,cats_and_dogs_small,就包含了我们要使用和上传的数据集。

如何在 GPU 深度学习云服务里,使用自己的数据集?

如上图所示,图像数据被分成了3类。

这也是 Keras 默认使用的图像数据分类标准规范。

打开训练集合 train ,下面包含两个目录,分别是“猫”和“狗”。

如何在 GPU 深度学习云服务里,使用自己的数据集?

当你使用 Keras 的图片处理工具时,拥有这样的目录结构,你就可以直接调用 ImageDataGenerator 下的flow_from_directory 功能,把目录里的图片数据,直接转化成为模型可以利用的张量(tensor)。

打开 testvalidation 目录,你会看到的目录结构和 train 相同。

如何在 GPU 深度学习云服务里,使用自己的数据集?

请你先在 Russell Cloud 上建立自己的第一个数据集。

主页上,点击“控制台”按钮。

在“数据集”栏目中选择“创建数据集”。

如何在 GPU 深度学习云服务里,使用自己的数据集?

如上图,填写数据集名称为“cats_and_dogs_small”。

如何在 GPU 深度学习云服务里,使用自己的数据集?

这里会出现数据集的 ID ,我们需要用它,将云端的数据集,跟本地目录连接起来。

回到终端下面,利用 cd 命令进入到解压后文件夹的 cats_and_dogs_small 目录下,执行:

russell data init --id 你的数据集ID
russell data upload

请把上面“你的数据集ID”替换成你真正的数据集ID。

执行这两条命令,数据就被上传到了 Russell Cloud。

上传成功后,回到 Russell Cloud 的数据集页面,你可以看到“版本”标签页下面,出现了1个新生成的版本。

如何在 GPU 深度学习云服务里,使用自己的数据集?

注意上图右侧,有一个“复制”按钮,点击它,复制数据集该版本的 Token 。

一定要注意,是从这里复制信息,而不是数据集首页的 ID 那里。

之前因为搞错了这个事儿,浪费了我很长时间。

运行

要执行你自己的深度学习代码,你需要在 Russell Cloud 上面,新建一个项目。

如何在 GPU 深度学习云服务里,使用自己的数据集?

你得给项目起个名称。

可以直接叫做 cats_dog_small_vgg16

其他项保持默认即可,点击“创建项目”。

出现下面这个页面,就证明项目新建成功。

如何在 GPU 深度学习云服务里,使用自己的数据集?

同样,你需要把本地的代码文件夹,和刚刚新建的项目连接起来。

方法是这样的:

复制上图页面的 ID 信息。

回到终端下,利用 cd 命令进入到解压后文件夹的 cats_dogs_small_vgg16 目录下,执行:

russell init --id 你刚才复制的ID

这样,你在本地的修改,就可以被 Russell Cloud 记录,并且更新任务运行配置了。

执行下面这条命令,你就可以利用 Russell Cloud 远端的 GPU ,运行卷积神经网络训练脚本了。

russell run "python cats_dogs_small_vgg16_augmentation_freeze_russell.py" --gpu --data 92e239eca8e649928610d95d54bb3602:cats_and_dogs_small --env tensorflow-1.4

解释一下这条命令中的参数:

  • run 后面的引号包括部分,是实际执行的命令;
  • gpu 是告诉 Russell Cloud,你选择 GPU 运行环境,而不是 CPU;
  • data 后面的数字串(冒号之前),是你刚刚生成的数据集版本的对应标识;冒号后面,是你给这个数据集挂载目录起的名字。假设这里挂载目录名字叫“potato”,那么在代码里面,你的数据集位置就是“/input/potato”;
  • env 是集成深度学习库环境名称。我们这里指定的是 Tensorflow 1.4。更多选项,可以参考文档说明
如何在 GPU 深度学习云服务里,使用自己的数据集?

输入上述命令后, Russell Cloud 就会把你的项目代码同步到云端,然后根据你指定的参数执行代码。

你在本地,是看不到执行结果的。

你需要到网页上,查看“任务”下“运行日志”,在系统提供的模拟终端下,查看运行输出结果。

如何在 GPU 深度学习云服务里,使用自己的数据集?

为了把好不容易深度学习获得的结果保存下来,你需要用如下语句保存模型:

saved_model = output_dir / 'cats_and_dogs_small_finetune.h5'
model.save(saved_model)

history.history 对象里,包含了训练过程中的一些评估数据,例如准确率(acc)和损失值(loss),也需要保存。

这里你可以采用 pickle 来完成:

import pickle
with open(Path(output_dir, 'data.pickle'), 'wb') as f:
    pickle.dump(history.history, f)

细心的你,一定发现了上述代码中,出现了一个 output_dir, 它的真实路径是 output/

它是 Russell Cloud 为我们提供的默认输出路径。存在这里面的数据,在运行结束后,也会在云端存储空间中保存下来。

你可以在“任务记录”的“输出”项目下看到保存的数据。它们已被保存成为一个压缩包。

如何在 GPU 深度学习云服务里,使用自己的数据集?

下载下来并解压后,你就可以享受云端 GPU 的劳动果实了。

你可以用 history 保存的内容绘图,或者进一步载入训练好的模型,对新的数据做分类。

如何在 GPU 深度学习云服务里,使用自己的数据集?

改进

在实际使用Russell Cloud中,你可能会遇到一些问题。

我这里把自己遇到的问题列出来,以免你踩进我踩过的坑。

首先,深度学习环境版本更新不够及时。

本文写作时 Tensorflow 稳定版本已经是 1.8 版,而 Russell Cloud 最高支持的版本依然只有 1.6。文档里面的最高版本,更是还停留在 1.4。默认的 Keras,居然用的还是 Python 3.5 + Tensorflow 1.1。

注意千万别直接用这个默认的 Keras ,否则 Python 3.6 后版本出现的一些优秀特性无法使用。例如你将 PosixPath 路径(而非字符串)作为文件地址参数,传入到一些函数中时,会报错。那不是你代码的错,是运行环境过于老旧。

其次,屏幕输出内容过多的时候(例如我跑了 100 个 epoch, 每个显示 100 条训练进度),“运行日志”网页上模拟终端往下拉,就容易出现不响应的情况。变通的方法,是直接下载 log 文件,阅读和分析。

第三,Keras 和 Tensorflow 的许多代码库(例如使用预训练模型),都会自动调用下载功能,从 github 下载数据。但是,因为国内的服务器到 github 之间连接不够稳定,因此不时会出现无法下载,导致程序超时,异常退出。

上述问题,我都已经反馈给开发者团队。对方已表示,会尽快加以解决。

如果你看到这篇文章时,上面这些坑都不存在了,那就再好不过了。

小结

本文为你推荐了一款国内 GPU 深度学习云服务 Russell Cloud 。如果你更喜欢读中文文档,没有外币信用卡,或是访问 FloydHub 和 Google Colab 不是很顺畅,都可以尝试一下。

通过一个实际的深度学习模型训练过程,我为你展示了如何把自己的数据集上传到云环境,并且在训练过程中挂载和调用它。

你可以利用平台赠送的 GPU 时间,跑一两个自己的深度学习任务,并对比一下与本地 CPU 运行的差别。

喜欢请点赞。还可以微信关注和置顶我的公众号“玉树芝兰”(nkwangshuyi)

如果你对数据科学感兴趣,不妨阅读我的系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。