1. 官网注册
- 打开FloydHub官网,注册。
- 绑定信用卡,可免费获得2h的GPU和20h的CPU资源以及10G内存。
2. 安装 Floyd CLI
Floyd CLI 是基于 Python 的命令行工具,能够让我们通过终端访问 FloydHub 。
- 安装Floyd CLI的官方文档给出以下两种安装方式:
conda install -y -c conda-forge -c floydhub floyd-cli
pip install -U floyd-cli
。
- 安装完之后可以通过 –help 的方式获取帮助:
3. 登录
登录命令官方文档给出两种登录方式:
- 使用用户名和密码登录:
floyd login
- 使用身份验证令牌:
floyd login --token
4. 创建项目
一个项目(Project)是运行的作业(jobs)及其日志(logs)和结果(results)的集合。
在www.floydhub.com/projects 点击“New Project”按钮,即进入创建项目页面。
进入新创建的项目下,有以下5个选项:
类似 GitHub,也可以在这个项目下加一个 README 文件,只要创建一个 .md 为扩展名的文件就可以了。详见创建项目官方文档
5. 编辑项目
- 5.0是一个实例,介绍如何在FloydHub执行一个完整的项目
- 之后的小节是一些细节,基本是翻译的教程,可作查阅使用。
5.0 Get a Quick Start
详细教程参考GetStart,以及FloydHub 初体验也是很好的教程,下面作简述。
运行项目的两种方式
- workspace:可以创建jupyter、Console、Terminal从头开始编写代码,也可以从GitHub上克隆(详见worspace小节)
- Floyd CLI:
- Anaconda Prompt终端进入本地项目地址,然后创建项目:可在本地编写好代码,也可从GitHub下载代码到本地。
- 本地初始化FloydHub项目:
floyd init <name_of_project>
,该命令将在Floyd CLI用于跟踪作业并与floydhub.com同步的目录中创建一些文件。 - 执行代码
floyd run [OPTIONS] [COMMAND]
来执行一个job(详见job小节)。
5.1 Workspaces:Build models with Workspaces
工作区是为深度学习和机器学习而构建的用于开发和运行代码的交互式环境(Jupyter Lab),可以运行Jupyternotebooks、Python脚本等等。在重新启动时,工作区中的所有文件和数据将保留,可以将它看作是云上机器。
- 创建和运行jupyter notebook;
- 在GPU和cpu驱动的机器之间切换
- 将数据集附加到工作区
- 终端访问运行脚本
- 在你需要的时候开始和停止
Basic
创建一个workspace
要创建新的工作区,只需单击项目页面中的create workspace按钮:
选择需要的环境和想使用的机器:
创建成功:
关闭一个workspace
如果想要停止此工作区,单击Shutdown按钮,当前目录(/floyd/home)中的所有文件和目录将被保存。
注意事项:
- 在关闭工作空间之前保存所有的笔记本和文件,所有运行的笔记本和脚本将在关机期间停止。
- 工作区运行的整个期间都需付费,如果不使用工作空间,请确保关闭它;如果运行时不足,可以购买升级来启动工作空间。
恢复一个workspace
单击project页面中的resume按钮,可以恢复对已停止工作区的工作,这将使工作区恢复到以前的状态。
workspace界面
Code
工作区位于目录/floyd/home,只有存储在此目录中的代码和数据文件将在重新启动时保留。
从本地计算机上传代码
- 可以使用文件查看器面板(左侧)中的upload按钮从本地计算机上上传代码和其他文件。
- 确保将代码上传到/floyd/home目录中。
从GitHub下载代码
如果代码在Github(或任何在线存储库)上,还可以使用git clone命令克隆存储库。
方式一:使用Terminal
方式二:使用Jupyter Notebook cell
使用Terminal
可以在工作区中打开Bash终端(控制台)来运行代码、调试或检查文件。要打开一个新的终端,单击文件查看器面板(左边)中的+
按钮,然后单击终端图标。
- Windows用户
- 复制:选中文本,
Shift+RightClick
- 粘贴:
Ctrl+Shift+V
- 复制:选中文本,
- 如果您的终端由于不活动而冻结,请右键单击并选择Refresh terminal
Data
从网络上下载
如果数据在网络上可用,还可以使用终端将其直接下载到工作区中。
# Ensure you're in your workspace directory
cd /floyd/home
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
附加FloydHub数据集
FloydHub提供了一种管理大型数据集的简单方法,可以实现跨项目使用这些数据集,不是在每次启动工作空间时下载数据,而是将数据作为FloydHub数据集上传。可以使用右侧面板将FloydHub数据集附加到工作空间,需要指定数据集的名称和要将其附加到的目录,数据挂载完成后,就可以开始在代码中使用这些文件了。一旦附加了数据集,即使停止并恢复工作空间,它也将是可用的,目前没有选项可删除已挂载的数据集。下图为附加MNIST数据集。
查看附加数据集:
所有FloydHub数据集都附在/floyd/input
下面,可以使用文件查看器面板查看附加的数据集,单击Home图标并选择data dirctory。
也可以使用终端查看:
ls /floyd/input
Setting
闲置超时检测
工作区有一个空闲检测机制在后台运行,如果工作空间发现工作空间中没有jupyter运行,它将启动一个计时器,并在计时器启动时关闭工作空间。可以在工作空间中配置或禁用此超时持续时间,这样做的目的是确保您不会意外地离开一个正在运行的工作区,从而浪费了GPU/CPU时长。如果您计划在terminal内运行长时间运行的命令或训练,请记住在设置中禁用空闲超时设置。
配置文件生成器
如果你对共享和复制你的工作空间感兴趣,你可以使用配置文件生成器,这个特性将自动生成一个floyd配置文件来重现当前的工作区会话设置,这和运行在FloydHub按钮一起将使您的项目更容易分享。
在CPU与GPU之间转换
5.2 Jobs:Train models with command jobs
命令作业在FloydHub的云计算机上运行,以训练您的模型。
- 启动长时间运行的培训脚本
- 选择合适的机器和框架
- 查看实时日志和度量
- 将数据集附加到作业
- 管理您的实验与完全重现性
Run a job
运行job是FloydHub工作流中的核心操作。一项 job 将代码和数据集放在一起,发送到配置了正确环境的深度学习服务器,并实际启动必要的代码来完成数据科学。floyd run
命令可以分解为两个主要部分:[OPTIONS]
和[COMMAND]
:
floyd run [OPTIONS] [COMMAND]
[OPTIONS]
Instance Type: --cpu
or --gpu
or --cpu2
or --gpu2
运行作业的FloydHub实例的类,把它看作是硬件的选择而不是软件的选择。(使用floyd run命令的environment(—env
)选项声明软件环境。)
- 默认的实例标志是
--cpu
- 如果传递多个实例标志,优先顺序为:
--gpu
,--cpu
,--gpu2
,--cpu2
Dataset(s): --data
<name_of_datasource>:<mount_point_on_server>
- 最多可以指定五个数据源(以前作业的数据集或输出)挂载到将运行作业的服务器上。
- Mount Data to a Job
Mode: --mode
<mode_name>
FloydHub作业目前可以在以下两种模式下运行:
--mode job
(DEFAULT)
可以将这种模式视为“常规模式”。在这种模式下运行作业时,代码被发送到FloydHub深度学习服务器,floyd run的 [COMMAND]部分被执行。--mode serve
此模式用于通过API端点为机器学习模型提供服务。
Environment: --env
<environment_name>
- 使用
--env
指定要在哪个环境(深度学习框架)中运行作业。 - FloydHub提供了预装了许多不同深度学习框架,可以在Environment找到所有可用环境的列表。
- 最佳实践是将环境的整个名称(包括版本号)传递给
--env
,例如:
floyd run --env tensorflow-1.3 "python train.py"
Message: --message
or -m
- 指定描述作业的消息,类似于描述git提交的提交消息。
- 工作信息将显示在floydhub.com上的不同位置,在查看您想要迭代的过去的工作时非常有用。
$ floyd run -m "lorem ipsum" "echo 'hello world'"
Creating project run. Total upload size: 195.0B
Syncing code ...
[================================] 1254/1254 - 00:00:00
JOB NAME
--------------------------------
mckay/projects/message-project/1
To view logs enter:
floyd logs mckay/projects/message-project/1
Maximum Runtime: --max-runtime
or -r
- 设置作业的最大运行时持续时间(以秒为单位)。
- 如果一个正在运行的作业超过了它的最大运行时,FloydHub将停止该作业并保存生成的任何输出,直到此时为止。
- 当前,一旦在作业开始时设置了此持续时间,就没有更改它的选项。
Follow: --follow
or -f
- 在不启动
floyd logs
命令的情况下立即显示正在运行的作业的日志。
[COMMAND]
- 作业开始时将在服务器上执行的命令。它将在保存代码的服务器的目录中运行。
- 任何有效的bash命令都可以在
floyd run
的[command]
部分中工作。
floyd run "pwd"
floyd run "ls"
floyd run "python -v"
floyd run "echo 'Hello, world!'"
# 启动一个Python脚本
floyd run "python train.py"
# 使用&&连接
floyd run "bash my_setup_script.sh && python train.py"
--mode serve
不接受[COMMAND]
。你不用传递一个[COMMAND]
就可以开始你的工作,就像下面这样:
floyd run --env pytorch-0.2 --mode serve --data mckay/datasets/mnist/1:mount
5.3 Model API:Create APIs from your models
Model API将经过训练的模型作为REST HTTP API交付,这样您就可以轻松地将经过训练的模型与应用程序、网站或服务集成在一起。
- 将经过训练的模型部署为REST API
- 通过添加更多实例来扩展
- 监控模型的实时API指标
- 用多个API对模型进行A/B测试
5.4 数据集
创建和上传数据集
新建数据集
访问www.floydhub.com/datasets ,点击“New Dataset”按钮创建新的数据集。
- Owner:此数据集所属的用户名称空间。如果您是团队的一员,请选择团队的名称。
- Visibility:表示谁可以看到您的数据集。如果您将其设置为Public,任何人都可以看到您的数据集和数据版本。如果您正在从事一个开源项目,这是一个分享和贡献给FloydHub社区的好方法。如果您的数据是私有的,请选择私有。这将确保只有您和您的团队能够访问这个数据集。
上传数据集
在 web dashboard创建了数据集之后,在终端进入包含你的数据集的目录,使用floyd data
命令上传数据:
$ floyd data init imagenet-2017
Dataset "imagenet-2017" initialized in current directory
...
$ floyd data upload
Compressing data...
下面是另一个例子,Alice是wonderland的成员,在她的团队名称空间上传数据集:
$ floyd data init wonderland/imagenet-2017
Dataset "imagenet-2017" initialized in current directory
...
$ floyd data upload
Compressing data...
恢复数据集上传
数据集上传是可恢复的。如果你的网络连接在上传过程中中断了,可以选择稍后恢复。
如果你的上传在完成之前已经停止,请使用--resume
或--r
标记继续上传:
$ floyd data upload --resume
Uploading compressed data. Total upload size: 74.0MiB
[= ] 4194304/77626756 - 00:00:00
如果没有指定--resume
,但是上传没有完成,系统会提示是否要继续上一个上传:
$ floyd data upload
An unfinished upload exists. Would you like to resume it? [y/N]: N
Compressing data...
数据集更新
如果对数据集进行了更改,使用以下步骤在此上传数据集:
cd
到数据集目录- 执行
floyd data init <dataset_name>
准备上传 - 执行
floyd data upload
您的数据集将为您进行版本控制,因此如果您愿意,您仍然可以引用旧的数据集。数据集将以序号命名,如下所示:
- alice/datasets/foo/1
- alice/datasets/foo/2
- alice/datasets/foo/3
- ……
因此在作业中使用数据集时,请确保引用作业所需的数据集版本。
理解数据集上传过程
当将数据上传到FloydHub时,Floyd CLI会对您的数据进行压缩打包,然后通过互联网将其安全地传输到FloydHub的服务器上。一旦您的数据集被上传,FloyHub就会为您解压和解压缩数据集。如果您有一个大数据集,那么在FloydHub的服务器上解压数据可能需要一段时间。可以使用floyd数据状态与您的数据集的名称检查您的上传状态,如下所示:
$ floyd data status alice/datasets/mnist/1
DATA NAME CREATED STATUS DISK USAGE
--------------------------- ------------- -------- ------------
alice/datasets/mnist/1 3 minutes ago valid 82.96 MB
valid
意味着您的数据集已经完成解压缩,可以使用了。
从网络上直接下载大型数据集到FloydHub
通常,从本地机器上上传数据集到FloydHub是不实用的,例如,您的上传速度可能太慢,或者您只是不想从网络下载一个大型数据集来再次上传它。如果您的数据已经在网络上可用,那么可以使用工作区直接在FloydHub上创建数据集,尽管可以从作业创建数据集,但使用workspace是从网络下载并在创建新数据集之前对其进行调整,是一种更简单的选择。
步骤1:从Floydhub上运行的工作区中打开终端并下载数据
可以在任何正在运行的工作区中在FloydHub上创建一个终端会话。进入终端后,可以将数据下载到FloydHub实例。下面是一个下载CSV的示例,其中包含关于美国国会成员的详细信息
$ mkdir congress
$ cd congress/
$ wget https://theunitedstates.io/congress-legislators/legislators-current.csv
处理数据:例如,如果下载的文件是tar文件,可以在这里解压缩它;或者您可以下载多个文件并在这里组织它们;或者您可以在此工作区中打开一个Jupyter笔记本,并进一步转换数据。
Untar the files to the current dir
$ tar xvzf train-images-idx3-ubyte.gz
Remove the tar file
$ rm -rf train-images-idx3-ubyte.gz
步骤2:在FloydHub Dashboard上创建一个新的数据集
在Floydhub上的新数据集页面,创建您的新数据集。
继续我们的国会成员示例,定义新的数据集的名称为:my-congress-members
步骤3:使用floyd-cli将数据添加到这个新数据集
回到工作区的终端会话,使用floyd-cli将当前目录的文件添加到这个新的数据集。
floyd data init my-congress-members
floyd data upload
这样就完成了,如果操作成功,可以你的工作空间的终端看到:
root@floydhub:/floyd/home/congress# floyd data upload
Compressing data...
Making create request to server...
Initializing upload...
Uploading compressed data. Total upload size: 59.0KiB
[================================] 60411/60411 - 00:00:00
Removing compressed data...
Upload finished.
Waiting for server to unpack data.
You can exit at any time and come back to check the status with:
floyd data upload -r
Waiting for unpack....
NAME
----------------------------------------
alice/datasets/my-congress-members/1
保存job输出为数据集
有了这个特性,用户将能够将模型文件、从网络下载的数据或处理过的数据集作为FloydHub数据集直接从作业输出中保存。
步骤1:Run a CLI Job
初始化项目文件夹,然后启动作业:
$ floyd init alice/data-download
Project "data-download" initialized in current directory
$ floyd run 'wget https://theunitedstates.io/congress-legislators/legislators-current.csv'
Creating project run. Total upload size: 9.2KiB
Syncing code ...
[================================] 12218/12218 - 00:00:01
JOB NAME
-----------------------------
alice/projects/data-download/1
URL to job: https://www.floydhub.com/alice/projects/data-download/1
To view logs enter:
floyd logs alice/projects/data-download/1
步骤2:在浏览器中打开作业
在浏览器中打开作业并单击文件视图。
步骤3:点击创建数据集按钮
这将打开一个模态,它将询问作业输出是否将定义新的数据集,或者是否将成为新的数据集版本。
注:使用floyd data add
命令也可以达到同样的效果。
floyd data output [OPTIONS] ID
[OPTIONS]:
--url
,-u
:只打印URL。数据目录可以在浏览器中查看。NAME
orID
:数据的名称或ID。
返回:输出命令提供访问数据集的url。默认情况下,该命令将在默认浏览器中打开数据url。
$ floyd data output mckay/datasets/mnist/1
Opening output directory in your browser ...
将数据挂载到Job
数据科学家经常在创建深度学习模型的过程中调整代码,然而几乎不经常改变底层数据。每当您在FloydHub上运行一个作业时,您的代码的副本就会被上传到FloydHub,并在FloydHub的一个强大的深度学习服务器上运行。因为您的数据不会在不同作业之间发生变化,所以将数据与代码一起保存并在每个作业中上载数据是没有意义的。相反,我们只上传一次数据集,然后将其附加或“挂载”到每个作业,这在每个作业上都节省了大量的时间。除此之外,将数据与代码分离允许您更容易地与其他人协作。任何访问数据集的用户都可以使用数据集,因此团队和社区可以使用相同的底层数据一起解决问题。
在文件系统中,术语“mount”意味着将一个文件系统或文件夹附加到另一个文件系统。例如,当您将闪存驱动器(一个迷你文件系统)插入计算机时,它的文件系统将被挂载到计算机的主文件系统,以便您可以检索、删除或保存数据到闪存驱动器。一旦闪存盘安装到计算机的文件系统,其他程序就可以访问它,就像它是计算机文件系统的本机部分一样。FloydHub上处理数据集的方式也是相同的挂载模式。
当使用floyd run
命令运行一个作业时,您的代码将被发送到FloydHub,并在一个可以运行作业的强大的深度学习服务器上运行。如果希望代码能够在作业期间访问数据集,则需要将数据集挂载到作业运行的服务器(就像需要将闪存驱动器插入计算机以访问其文件一样)。将数据集挂载到一个任务很容易:只需将--data
传递给floyd run
cli命令。要在floyd run中正确使用--data
标志,需要指定两件事:
- 要挂载的数据集的名称。(注意:此命令可以缩短数据集和输出名称)
- “挂载点”:在作业期间代码可以访问数据的文件夹的名称。你可以给这个文件夹(挂载点)任何你想要的名字。
- 数据集总是挂载在目录
/floyd/input
,这意味着如果您指定foo作为挂载点,您的数据将挂载在/floyd/input/foo
。 - 不支持嵌套挂载点。这意味着像my_data/foo或/home/me/data这样的挂载点将无法工作。如果您需要在嵌套目录中提供数据,请查看挂载的符号链接数据指南。
- 数据集总是挂载在目录
这两项用:
隔开,没有空格。
floyd run --data <data_set_name>:<mount_point> …(rest of run command)
挂载另一个job的输出
您可以通过将一个作业的输出挂载为新作业的输入来链接jobs,这允许您迭代过去作业的输出。通过作业的名称引用作业的输出,例如:alice/projects/quick-start/1
指作业alice/projects/quick-start/1
的输出。在floyd run
命令中使用--data
,将过去的输出挂载到作业,就像挂载数据集一样。例如:
$ floyd run \
--data alice/projects/quick-start/1:/model
'python eval.py'
这将使alice/projects/quick-start/1
的输出可在/model
处用于新作业。
注意:您需要能够访问作业才能装载其输出。
挂载多个数据源
您可以使用floyd run命令中的--data
将至多五个数据源(数据集和/或作业输出)附加到一个作业,确保每个挂载点是惟一的。
$ floyd run \
--data udacity/datasets/mnist/1:digits \
--data udacity/datasets/celeba/1:celeb \
--data udacity/datasets/celeba/2:celeb \
"python script.py"
在这种情况下,上述数据集将分别挂载在/digits和/celeb。
删除数据集
- 单击web dashboard上数据集的Settings选项卡上的Delete dataset按钮。注意,此删除操作将删除其所有单独版本的数据,这是无法恢复的,因此在继续之前,请绝对确定您要删除数据集。
- 您可以通过单击web dashboard上数据页的Settings选项卡上的delete data按钮来删除数据集的特定版本。
- 从CLI删除上传的数据源:您还可以使用
floyd data delete
命令从CLI中删除已上传的数据源。
$ floyd data delete alice/datasets/quick-start/1
Delete Data: alice/quick-start/1? [y/N]: y
Data alice/datasets/quick-start/1: Deleted
5.5 输出
保存输出
所有保存在工作目录/floyd/home
中的文件将在作业或工作区完成后保留。
- 对于作业,可在Files选项卡下看到;
- 对于工作区,可打开工作区页面来查看文件。
当前工作目录
/floyd/home/
是CLI作业和工作空间的唯一持久目录,它被设置为作业和工作区的默认工作目录。
作业或工作空间完成时保存在该目录中的任何内容都将被保留,并可以在以后访问和重用。用户保存的最常见的东西是模型检查点,但是在作业或工作区会话结束时,任何最终出现在工作目录及其子目录中的内容都将被保存。
Example 1
该作业打印字符串“Hello, world!”,并将其保存到一个名为Hello .txt的文件中。因为hello.txt位于当前的工作目录中,它将被保存并在作业完成后可用:
$ floyd init my_awesome_hello_world_project
$ floyd run 'echo "Hello, world!" > hello.txt'
Creating project run. Total upload size: 691.0B
Syncing code ...
因为hello.txt是在当前工作目录中创建的,所以它将被保留以供将来引用和使用。
如果你想在工作空间里实现这个,步骤如下:
- 创建并启动一个新的工作区,
- 打开终端
- 运行
echo“Hello, world!” > hello.txt
- 停止工作空间,然后你可以从工作区页面查看hello.txt文件。
Example 2
在本例中,我们将使用Python在当前工作目录下的一个文件夹中保存一个文件。
把这段代码放到一个名为save_example.py的文件中:
import os
# Create the directory if not exists
if not os.path.exists('mydirectory'):
os.makedirs('mydirectory')
# Create the file inside the directory
with open('mydirectory/myfile.txt', 'a') as f:
f.write('Please save me!\n')
然后在FloydHub上运行执行:
$ floyd init save_example_2
$ floyd run "python save_example.py"
Creating project run. Total upload size: 267.0B
Syncing code ...
成功!我们现在可以像以前一样从Files选项卡查看输出,并在新创建的子目录中导航、下载它,甚至在以后的作业中再次使用它。
Example 3
下面是保存模型检查点的Tensorflow示例。将数据写入(保存)models目录(当前工作目录中的一个文件夹),以后就可以使用它了,即未来的作业可以使用这个模型检查点作为起点。考虑这部分代码,注意对saver.save(sess,'models/model.ckpt')
的调用:
import tensorflow as tf
...
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(init)
...
save_path = saver.save(sess, 'models/model.ckpt')
print("Model saved in file: %s" % save_path)
...
下载保存的输出
From floydhub.com
-
在floydhub.com上的jobs页面,你可以通过在"Files"选项下的“Browse”和“Download”的图标浏览和下载作业的输出:
-
你可以通过浏览你想下载的文件,然后点击“打开的文件”选项卡右上角的“下载”图标来下载单个文件。
From the CLI
要从CLI打开浏览窗口,使用floyd data clone
命令并将作业输出的路径传递给它:
$ floyd clone alice/projects/download-output/1/
Opening output directory in your browser ...
输出的路径是<your_username>/projects/<project_name>/<run_number>/
。
在新的Job中使用之前的输出
Using Previous Output in a New Job
即在Data中讲过的挂载另一个job的输出。