BayesGear 算力容器

介绍 BayesGear 算力容器的使用方式

最后更新于

容器的执行模型

算力容器作为一个计算单元,可以执行各种各样的计算工作,包括数据预处理,机器学习模型的训练,利用已有模型对未标注数据进行推断等。算力容器通过选择算力类型指定算力容器的计算能力以及绑定的硬件(CPU / GPU)。然后通过设置容器中所采用的镜像指定容器的运行时环境,即代码所需要运行的依赖类库更多(默认依赖信息参见运行时环境)。

容器本身只提供计算资源,通过绑定数据集输出来加载数据并将结果保存下来用于其他用途。

容器的创建

容器目前支持两种方式:Python 脚本执行和 Jupyter 编辑器。其中 Python 脚本执行需首先提供要执行的代码,容器的执行的工作目录为 /output

容器的每次运行都是独立的执行环境,每次执行记录在 OpenBayes 中被称为「执行」。而每次「执行」在被关闭后其工作目录 /output 下的内容将被保存下来,可以通过页面的「输出」选项卡查看。

Jupyter

Jupyter 是一个基于 web 的交互式运行环境,首先支持的编程语言是 Python 目前已经成为了大量数据科学家的默认工作环境。通过 Jupyter 访问算力容器就可以像在其他环境一样使用 bayesgear 下的算力资源了。

Jupyter 支持两种环境 Notebook 以及 Lab 这里我们默认支持了 Lab。如果你还不知道如何使用 Jupyter Lab 可以参见其 文档 或相关的中文翻译资料。这里不我们不会穷尽使用 Jupyter Lab 的一些内容,而是强调几个 openbayes 下 Jupyter Lab 的几个关键特性。

基本界面

在单次执行的页面点击「打开 Jupyter 编辑器」进入如下的界面:

其中右侧的侧边栏展示了当前执行的一些基本信息,包括系统指标、执行的基本信息(算力类型、运行环境、运行时间)以及设置界面。其中通过系统指标可以了解到当前执行是否在有效的利用系统所提供的计算资源。在执行打开后也会默认弹出 openbayes-intro.ipynb 文件包含了 openbayes Jupyter Lab 的一些基本介绍。

执行长时间训练

机器学习尤其是深度学习的训练任务通常会需要比较长的运行时间,但是作为一个交互式的编程环境,Jupyter Lab 并不非常适合这种场景。在 Jupyter Lab 下运行长时间的任务会有如下两个问题:

  1. 长时间任务在运行时一旦网络出现波动会导致其运行的日志打印中断,导致无法查看到目前训练的进度
  2. 长时间任务在 jupyter 中执行时即使任务执行完毕了或者由于某些原因报错了,jupyter 不会立即关闭,但是计费还在继续导致计算资源的浪费

因此如果需要执行长时间的训练任务,建议查看task 与 jupyter 结合部分采用 task 执行长时间任务。不过这里依然提供两个对应的解决方案:

使用 Log Console 找到丢失的日志

这里通过一个简单的代码片段模拟一个长时间运行的任务:

import time

for i in range(100000):
    print(i)
    time.sleep(1)

将该段代码在一个 .ipynb 文件中执行看到如下的日志信息:

这个代码块会一直更新日志,但是如果我们刷新页面后再回来会发现日志不再更新了。这个时候在该代码块中右键点击「Show Log Console」打开当前的 Log Console 界面。

然后选择 Debug 级别的日志就可以看到之前的日志进度了:

Jupyter 的自动关闭

由于 Jupyter 在开启之后就开始计费了,为了减少因为忘记关闭而带来的计算资源的浪费。OpenBayes 默认为容器里添加了 Jupyter 超时自动关闭的设置。

在 OpenBayes 中,Jupyter 没有任何页面操作并且 CPU 使用率一直为 0 被视为空闲。在「容器」的「设置」选项卡可以看到「JupyterLab 限制自动关闭设置」。

Jupyter kernel 的重启

每次在 Jupyter Lab 中打开一个 .ipynb 文件后系统会对应的创建一个名为 kernel 的后台负责执行在页面提交的代码。如果发现自己的 .ipynb 文件执行命令出现了问题,最简单的处理方法就是重启对用的 kernel

继续执行

通常来说,同一个「容器」下的多次执行在业务上会存在着很大的共性。为了方便用户可以在执行历史的基础上创建新的「执行」,目前 OpenBayes 提供了「继续执行」的选项。

OpenBayes 会为我们做如下事情:

  1. 绑定上一次「执行」已经绑定的数据集到相同的位置
  2. 如果上一次「执行」是一个「Python脚本任务」,那么同样绑定相同的代码
  3. 绑定上一次「执行」的「输出」到 /output 目录

注意,在 OpenBayes 中可以将一个 BayesGear 的输出绑定到一个新的容器上,实现 “管道” 的效果。这里我们就是将之前的一个 “模型训练” 的「输出」作为了一个 “模型推断” 任务的输入。然而这种使用方式是将上一次执行的「输出」全部拷贝到新的容器里,这会导致所使用的存储翻倍。因此如果不需要对上一次的输出进行写操作,建议将其绑定到「input0-2」目录中,这将把数据以只读的方式链接到新的容器中,不会产生额外的数据用量。

除了在执行页面上使用「继续执行」外,还可以在「执行记录」页面操作。

在选择继续执行后修改代码的场景

「继续执行」意在方便用户在代码不变的基础上继续上一次的训练,如果在「继续执行」场景下更新了代码需要特别注意。

在点击「继续执行」后如果在这里尝试上传新的代码可能会与当前绑定的「上一次执行的输出」中的代码冲突。例如在上一次执行中,我们已经上传了一个名为 main.py 的文件,这个文件已经被保存到了上一次执行的「输出」里面了。如果再次上传了一个修改了的同样名为 main.py 的文件,那么 openbayes 会忽略这次修改,保留已有的文件

因此,如果当您使用了「继续执行」并且发现出现了执行代码与您的预期不一致的情况,可能是因为上传的代码内容被上一次容器绑定的输出覆盖了。如果不想出现这种情况,可以修改默认绑定的「上一次执行的输出」的绑定目录。

如何加速「继续执行」

将大量的文件绑定到了 /output,在启动阶段拷贝大量的数据到 /output 耗费时间,尤其是大量的小文件的拷贝可能会非常的耗时。如果对相应的数据没有写的需求,建议直接绑定到 /intput0-2 以避免拷贝的过程,在拷贝文件时执行会展示状态「同步数据」,并显示相应的同步速度,通常来说文件个数越多同步的速度越慢。

设定通知

目前 OpenBayes 提供了两种发送通知的渠道:邮件通知以及短信通知。邮件通知被默认勾选且无法关闭,用户可以依据自己的喜好去设置短信通知。

Task 与 JupyterLab 两种模式结合使用

Jupyter 编辑器模式适合即时的文件执行和修改,但是其对计算资源的使用效率不高,在用户编辑和调试的过程中其资源经常是浪费的;Python 脚本上传方式在容器开始运行后会立即执行 Python 代码,对计算资源的利用效率高,但是其修改起来非常麻烦,每次更新代码都需要重新上传。

因此建议可以在低算力模式下(CPU 算力)首先创建 JupyterLab 编辑器,在其中保证代码可以正常执行后关闭资源并将其 “输出” 下载。然后再创建一个 Python 脚本执行模式的 GPU 算力容器上传下载的代码,执行脚本。

目前 Jupyter Lab 已经内置了 openbayes 命令行工具 可以非常方便的在 Jupyter 环境通过命令行工具创建 task。

将 .ipynb 文件转换为 .py 文件

选择「File」-「Export Notebook As…」-「Export Notebook to Executable Script」就可以将当前的 ipynb 文件以 py 格式下载到本地。再将其拖动到 Jupyter Lab 左侧的文件目录中即可将该文件再次上传到容器中:

可以看到 ipynb 的代码片段都被串联起来保存在 .py 文件中了。

通过 Jupyter Lab 内置的命令行工具创建 task

创建 Python 脚本 章节。

容器的终止

容器在执行的任何过程都可以被终止,但是 注意 容器终止可能会导致部分输出结果没有同步成功,请在容器的「输出」标签页确认其当前数据的完整性后再终止容器。

容器的删除

容器在执行完毕之后会自动释放所占有的算力资源,然而通常来说,容器执行完毕后都会有一些输出结果保存下来以备他用。输出会占用用户的存储资源。如果认为整个「容器」的数据都不再需要了,可以在「容器」的「设置」选项卡中删除整个容器,容器删除后将会释放整个容器所占有的用户存储资源。

注意 这项操作非常危险,可能会导致重要数据无法恢复,请谨慎行事。