FloydHub 初体验

FloydHub 初体验

写在前面

在深度学习大热的当下,很多公司都推出了有关深度学习的一系列服务。大家相对熟悉的可能是 Amazon 的 AWS (Amazon Web Service),在 AWS 上我们可以创建例程,然后用 Amazon 提供的云计算服务器跑我们自己的深度学习算法。
但是,在使用 AWS 训练过几次自己的模型之后就发现…… AWS 真的挺贵的(吃土少年的日常)。同时,如果我们创建了例程,跑完了程序,但是忘记关闭那个例程,那我们的钱就悄无声息的灰飞湮灭了(别问我怎么知道的……)。
当然,AWS 提供的服务不止于为深度学习训练模型提供计算能力,但是最近就有一家公司瞄准了深度学习算力需求这一片市场,也就是我们马上要介绍的 FloydHub。


FloydHub 简介

先放上一幅他们官网 (FloydHub - Deep Learning Platform - Cloud GPU) 截图以示敬意。

FloydHub 作为一个专注于深度学习的云计算平台可以说还是比较良心的。至少从他们的宗旨来看,大概就是让我们专心搞我们的科研,其他的不管是环境配置啊、部署问题啊、硬件啊、版本控制啊之类的,就一律不用操心啦!

我们先来看一下他们提供的服务怎么样。

  • 环境

看起来他们支持的环境确实还是很多的,TF啊、Keras啊、PyTorch啊、theano啊(听说不再更新了?)都有,基本可以保证大部分群众的需求了,感觉还是很良心的。

  • 硬件

硬件上支持 CPU 和 GPU 两种配置。我们更关心的 GPU 使用的是 K80,和 AWS 使用的硬件貌似是一样的,但是看起来价格要便宜不少。既然这样,我们就再看看价格。

  • 价格

FloydHub 给我们提供了以上三大类总共五种套餐可以选择(官网传送门),作为一个吃土少年我只关心最便宜的套餐。免费套餐给我们提供单线程算力,每个月有 20 个小时免费使用他们的 CPU 进行运算,云存储空间为 10GB。看起来只有付费才可以使用他们的多线程服务和 GPU 进行运算。

不过我看到下面有写 Start Free Trial,难道可以免费体验听说只要是第一次使用 FloydHub ,我们就可以有 100 个小时的免费使用时间。所以他们真的这么好么?我决定亲自体验一下。


开始使用

1) 注册

首先,我们要先在官网注册。注册过程很简单:

所以大家尽情的去他们的官网 SIGN UP FOR FREE 吧!

2) 安装 Floyd CLI

Floyd CLI 是基于 Python 的命令行工具,能够让我们通过终端访问 FloydHub 。我们需要用 pip 来安装这个工具,如果没有 pip 的话可以看一下这个链接。通过一句简单的命令行就可以成功安装啦:

$ pip install -U floyd-cli

如果有其他需求,可以参见安装官方文档

安装完之后可以通过 --help 的方式获取帮助。

$ floyd --help
Usage: floyd [OPTIONS] COMMAND [ARGS]...

  Floyd CLI interacts with Floyd server and executes your commands. More
  help is available under each command listed below.

...

3) 登录

登录的方法也很简单,在命令行中执行以下操作:

$ floyd login
Authentication token page will now open in your browser. Continue? [Y/n]: y
Please copy and paste the authentication token.
This is an invisible field. Paste token and press ENTER:

然后,会自动打开一个网页链接,显示出你的登录令牌 (Authentication Token):

把登录令牌粘贴到终端之后就登录成功了!

Login Successful

同样,贴出登录命令官方文档以便大家查阅。

4) 创建项目

这里所说的项目 (project) 其实和 GitHub 里面的 Repository 比较像,我们在创建新项目时只需要给出一个项目名称就可以创建一个新的项目了。

类似 GitHub,我们也可以在这个项目下加一个 README 文件,只要创建一个 .md 为扩展名的文件就可以了。详见创建项目官方文档


实验

对 FlyodHub 有了初步的了解之后,我打算做两个实验,一个是直接运行 python 代码,第二个是运行 jupyter notebook 文件。为了简单起见,我们就用 MNIST 的数据来做数字分类这个任务吧。

  • 实验一

每个人一开始都会有一个自己的叫做 quick-start 的项目,我们可以用这个项目来做第一个实验。FloydHub 官方提供了一个用于大家体验 FloydHub 的 Repository,所以我们先 clone 以下。

$ git clone https://github.com/floydhub/quick-start.git
Cloning into 'quick-start'...
...
$ cd quick-start
$ ls
eval.py  LICENSE  mnist_cnn.ipynb  README.md  train_and_eval.py  train.py

在这个实验里,我们要用到 train.py 来训练 CNN 进行数字分类。

首先,我们要在这个文件所在的路径初始化我们的项目:

$ floyd init quick-start
Project "quick-start" initialized in the current directory

初始化之后,我们就要开始考虑怎么搞到数据了。我们实验中所要用到的数据 MNIST 存储在这个地方,这里我们可以了解以下 FloydHub 的数据集特征。

数据是 FloydHub 的一个针对深度学习比较人性的设计。在 FloydHub 上,官方提供了很多常用数据集给我们使用,同时我们还可以上传自己的数据集和别人共享(上传数据集的方法可以查看数据集上传官方文档)。如果我们想搞一些数据自己玩的话,还可以在 Explore 页面下搜索类似 data 等字段,就可以找到很多有意思的资源了。

现在有了数据有了模型,我们就可以开始训练了!

尝试一下下面的代码:

$ floyd run \
--gpu \
--data mckay/datasets/mnist/1:/mnist \
--env tensorflow-1.3 \
"python train.py"

然后…… 我就得到了这样的结果……

Error: You do not have enough credits to run this job. Please upgrade your plan or buy a powerup to continue running jobs

所以,传说中 100 个小时的免费试用什么的都是骗人的…… ([2017.11.05 更新] 感谢 @暖豆 评论区提醒,现在注册会提供两个小时的免费GPU服务!)

既然这样,吃土少年只能给大家做基于 CPU 的实验演示了。(如果以后有钱了再来补上 GPU 的体验)

$ floyd run \
--data mckay/datasets/mnist/1:/mnist \
--env tensorflow-1.3 \
"python train.py"

Creating project run. Total upload size: 30.8KiB
Syncing code ...
[================================] 33261/33261 - 00:00:02

JOB NAME
----------------------
alice/projects/mnisteric_yaoj/projects/quick-start/2

To view logs enter:
   floyd logs eric_yaoj/projects/quick-start/2

这样一来我们就通过免费的 CPU 运行了第一个项目。

在这个 floyd run 的背后,有一系列进程在运行:

  • 将我们的代码同步到 FloydHub 的服务器
  • 在云端为我们提供一个 CPU 例程 (如果我们用了 --gpu 则会为我们提供 GPU )
  • 在云端配置深度学习环境,安装 TensorFlow 1.3 (因为我们设置了 --env tensorflow-1.3)
  • 在环境中运行命令行 python train.py
  • 存储输出日志并生成输出数据
  • 一旦命令终止执行,自动终结 CPU 例程

让我们再仔细看一看我们刚才的命令行:

$ floyd run \
--gpu \
--data mckay/datasets/mnist/1:/mnist \
--env tensorflow-1.3 \
"python train.py"
  • --gpu

这句命令声明了我们将要使用 GPU 作为计算机硬件,如果去掉这行,就像我后来做的,那么就默认使用 CPU 作为计算机硬件。

  • --data mckay/datasets/mnist/1:/mnist

这一行声明了我们要用什么样的数据集进行计算。--data 后面的这部分我们可以利用中间的冒号 : 拆分为两部分

  1. mckay/datasets/mnist/1
  2. /mnist

第一部分声明了我们要用到的数据集的名称:floydhub.com/mckay/data,点开这个链接之后,我们会发现:

红框中的这个文件名,就是我们需要的数据集的名称。

第二部分声明了在云端服务器上我们将数据存储的地址,在这里就是 \mnist。

这两部分中间,我们用 : 间隔开。

最终组合起来就成功声明了我们运算时要用的数据集。这里只对最基本的数据集使用方法进行了介绍,更多有关使用数据的信息可以参见数据集调用官方文档

  • --env tensorflow-1.3

这部分声明了我们将要在服务器上安装 TensorFlow 1.3 来为我们的代码配置环境。更多有关环境配置的信息可以参见环境配置官方文档

  • "python train.py"

这部分声明了在服务器上要运行的命令行,从而运行我们的代码。更多有关命令行的信息可以参见命令行官方文档


我们的程序在 FloydHub 上运行的时候,我们可以查看当前线程的工作状态:

$ floyd status
JOB NAME             CREATED        STATUS    DURATION(s)  INSTANCE    DESCRIPTION
-------------------  ---------      --------  -----------  ---------   -----------
alice/quick-start:1  just now       running            15  gpu

同时,我们还可以查看线程日志来实时查看程序运行情况:

$ floyd logs -t alice/quick-start/1
...
2017-07-12 16:00:07,446 INFO - Starting attempt 1 at 2017-07-12 16:00:07.436349
2017-07-12 16:00:09,088 INFO - Starting container...
2017-07-12 16:00:09,297 INFO -
...
##############################################################################
2017-07-12 16:00:09,297 INFO - Run Output:
2017-07-12 16:01:46,154 INFO - Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
2017-07-12 16:01:46,158 INFO - Iter 1280, Minibatch Loss= 39855.289062, Training Accuracy= 0.17969
2017-07-12 16:01:46,159 INFO - Iter 2560, Minibatch Loss= 14964.132812, Training Accuracy= 0.42969
...
##############################################################################
...

当然,我们也可以通过网页(floydhub.com/<username>/projects/quick-start/<job_number>)来实时监控:

在训练完我们的模型之后,我们当然希望能够把训练好的模型储存起来以便下一次使用。这部分代码在 train.py 中的第 108 行实现了:

builder = tf.saved_model.builder.SavedModelBuilder("/output/cnn_model")

习惯性上我们把模型存储在了 /output 地址下,以便以后使用。更多有关存储结果的细节可以参考存储结果官方文档

为了实践一下,我们现在可以用 eval.py 来衡量一下我们的模型。方法很简单,只要在刚才命令行的基础上加一行:

--data alice/projects/quick-start/1/output:/model

这里我们设置 /model 为我们读取数据的地址是因为在 eval.py 中,我们将要从这个地址调取我们储存好的模型文件。

$ floyd run \
--gpu \
--env tensorflow-1.3 \
--data mckay/datasets/mnist/1:/mnist \
--data ericyaoj/projects/quick-start/2/output:/model \
"python eval.py"

Creating project run. Total upload size: 26.3KiB
Syncing code ...
[================================] 28620/28620 - 00:00:01

JOB NAME
---------------------------
ericyaoj/projects/quick-start/5

To view logs enter:
   floyd logs ericyaoj/projects/quick-start/5

全部运行之后,我们就可以得到类似这样的结果,在例程日志中,我们可以看到我们刚刚训练的模型的准确度:

2017-10-01 03:22:21,871 INFO - Pulling Docker image: floydhub/tensorflow:1.3.0-py3_aws.12
2017-10-01 03:22:23,099 INFO - Starting container...
2017-10-01 03:22:23,591 INFO - 
################################################################################
2017-10-01 03:22:23,592 INFO - Run Output:
2017-10-01 03:22:54,529 INFO - Extracting /mnist/train-images-idx3-ubyte.gz
2017-10-01 03:22:54,820 INFO - Extracting /mnist/train-labels-idx1-ubyte.gz
2017-10-01 03:22:54,883 INFO - Extracting /mnist/t10k-images-idx3-ubyte.gz
2017-10-01 03:22:54,951 INFO - Extracting /mnist/t10k-labels-idx1-ubyte.gz
2017-10-01 03:22:57,295 INFO - Testing Accuracy: 0.984375
2017-10-01 03:22:57,563 INFO - 
################################################################################
...

类似这样,我们可以循环往复的运行我们的深度学习代码啦!

我们所有的线程运行都会记录在我们的 Dashboard 中:

他们的成功与否、使用的硬件、环境配置、运行时间等等信息都会列在这里。

  • 实验二

相信大部分同学在用 jupyter notebook 跑自己的深度学习代码,那么我们再来尝试一下在 FloydHub 上面做第二个实验,跑我们的 notebook。

和刚才类似,我们新建立一个项目,名字就叫 mnist-pytorch吧:

同样是 MNIST 数据,但这次我们用 pytorch 来实现。示例代码可以从 FloydHub 提供的 Repository 下载:

$ git clone https://github.com/floydhub/quick-start-pytorch.git
Cloning into 'quick-start-pytorch'...
$ cd quick-start-pytorch
$ ls
README.md mnist.ipynb

这次试验我们要用到的是 mnist.ipynb .

类似上一次我们的操作,先在对应的文件路径中初始化:

$ floyd init mnist-pytorch
Project "mnist-pytorch" initialized in the current directory

然后我们在 run 命令行中要使用 --mode jupyter 来声明我们想要使用 notebook 来运行。

$ floyd run --mode jupyter --gpu --env pytorch-0.2
Creating project run. Total upload size: 21.9KiB
Syncing code ...
[================================] 23333/23333 - 00:00:00
NAME
--------------------
saip/projects/mnist-pytorch/3

Setting up your instance and waiting for Jupyter notebook to become available ..............

Path to jupyter notebook: https://www.floydhub.com/notebooks/pCoPyzZtYeo6mE9PpSWsmY

和上一次实验相比,这一次初始化的时间更长(有可能是因为我在欧洲,所以没有本地服务器的问题?)。但在这段时间里,Floyd 在后台为我们:

  • 将本地代码同步到 FloydHub 的服务器上
  • 在云端为我们提供一个 CPU 例程 (这里我用了 --gpu 假装是富人)
  • 在云端配置深度学习环境,安装 PyTorch(因为我们设置了 --env pytorch)
  • 在云端开启一个 Jupyter 服务器,在我们的浏览器中打开 url 地址

我们可以像平常一样,在 Jupyter Notebook 里进行操作和计算。

类似的,通过 status 命令,我们可以查看当前线程运行状态(假装 GPU 大佬):

$ floyd status ericyaoj/mnist-pytorch/projects/1
JOB NAME                CREATED         STATUS      DURATION(s)  INSTANCE    DESCRIPTION
----------------------  --------------  --------  -------------  ----------  -------------
ericyaoj/mnist-pytorch/projects/1    16 minutes ago  running               0  gpu

同样,我们可以在网页上查看运行状态:

最后要说的就是如何关掉这个例程,也就是怎么省钱了:

首先,点击红圈里的 Cancel :

然后点击 Confirm :

到此为止,我们就成功的关掉了我们的线程。


实验总结

到了这里,我们就基本通过两个实验一步步示范了如何使用 FloydHub 来进行深度学习模型的训练了。

如果想要查看我们账户的使用情况,也就是我们还有多长时间的 CPU 和 GPU 资源可以使用,可以在 Usage 网页 查看:


小结

FloydHub 总体来说,更加面向深度学习领域的用户,用户体验还是很不错的!但是本人作为一个小白,希望能在日后的学习过程中有更多的体会。希望这篇文章能够对大家有所帮助,也欢迎大家一起交流学习!


参考资料

[1] FloydHub - Core Concept

[2] FloydHub - Getting Started Tutorial

[3] FloydHub - Getting Started Tutorial - Jupyter Notebook

[4] FloydHub - Commands

[5] FloydHub - Environments

[6] FloydHub - Mounting Data

编辑于 2017-11-05