HyperAIHyperAI

用 bayes 管理容器

bayes 命令行下有「工作目录」的概念,它对应着 HyperAI 容器中的「输出」目录。通过命令行工具创建容器时需要首先把一个本地目录当作「工作目录」并与 HyperAI 的「容器」建立映射关系,具体操作如下:

  1. 切换到需要执行的代码所在的目录 cd ~/openbayes-mnist-example
  2. 初始化一个新的容器 bayes gear init mnist-example 此时当前目录已经和 mnist-example 这个容器创建了映射关系,创建的「执行」都会出现在该容器下面

:::note 使用 bayes gear ls 命令,可以查看你的所有容器 :::

bayes gear init 命令可以使用已存在的容器名称或容器 ID 对当前目录进行容器初始化,若使用一个不存在的容器名称进行初始化,会创建一个新的容器。

准备工作完成之后,我们将来介绍一下几种接入方式的使用

通过命令行参数创建「Python 脚本执行」

通过命令 bayes gear run task -h 可以看到大量的样例提示如何创建一个「Python 脚本执行」。

我们这里先创建一个比较简单的版本:

$ bayes gear run task --env=pytorch-2.0 -- python main.py

当前正在组织 org1 上进行操作...
task_command 信息为: python main.py
正在上传源代码...
正在准备上传源代码...
正在获取上传授权...
开始扫描文件,请稍候...
共发现 9 个文件,总计 13.3 kB,开始上传...
上传进度: 100% (9/9): 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 13.3k/13.3k [00:00<00:00, 44.0kB/s]

✅ 源代码上传成功! 已上传 9 个文件
正在向服务器请求创建容器...
容器创建成功
打开网页 https://app.hyper.ai/console/org1/jobs/fpyx2l77wtvh 可查看容器的详细信息

其中 -- 之后为执行的具体的命令,如果有 && 这样的符号,需要用引号进行保护 bayes gear run task -- 'echo 123 && python main.py'

可以看到 bayes 将当前目录的文件上传并创建了一个「python 脚本」任务。

然后,我们尝试通过命令行参数,创建一个复杂一点的版本:

  bayes gear run task \
      --resource cpu \
      --env pytorch-2.0 \
      --data openbayes/eBIQp4yPMtU/1:/input0 \
      --data openbayes/sTggKplxyT6/1:/input1 \
      --data openbayes/bbNaMvDNqO9/1:/input2 \
      --data username/jobs/3s55ypc33ptl/output:/output \
      --message "task message" \
      --open \
      --follow \
      -- sleep 60

介绍一下几个可用的参数:

  • -e--env 选择镜像,可供选择的镜像可以通过命令 bayes gear env 查询
  • -r--resource 选择算力,可供选择的算力可以通过命令 bayes gear resource 查询
  • -d--data 绑定数据,可供绑定的数据集可以通过命令 bayes gear bindings 查询
  • -m--message 执行描述,可留空
  • -o--open 将会在容器开始运行后,在浏览器打开相应的 web 界面
  • -f--follow 跟踪运行容器的状态

:::info 需要注意的是 --data openbayes/eBIQp4yPMtU/1:/input0 中, openbayes 是公有数据集的专用名,如果你想使用你自己的数据集,需要将 openbayes 替换为你的用户名eBIQp4yPMtU 是数据集 ID,1 是数据集的版本号;:/input0,是将数据集绑定到 input0 中。 :::

通过 openbayes.yaml 创建「Python 脚本执行」

另外,在通过 bayes gear init 将当前目录和容器绑定后目录下会出现文件 openbayes.yaml 内部初始化内容如下:

openbayes.yaml
## 有关「 HyperAI 配置文件」的最新说明,请查阅 https://hyper.ai/docs/cli/config-file/

## data_bindings
#  指绑定的数据,支持「容器输出」以及「数据集」,最多同时绑定三个
#
#  一个完整的 data_bindings 样例如下:
#
#    data_bindings:
#      - data: openbayes/mnist/1
#        path: /input0
#        type: ro
#      - data: openbayes/jobs/jfaqJeLMcPM/output
#        path: /output
#        type: rw
#
#  亦可将 data_bindings 替换成 bindings, 简写成如下样例:
#
#    bindings:
#      - openbayes/mnist/1:/input0
#      - openbayes/mnist/1:/input1:rw
#      - openbayes/jobs/jfaqJeLMcPM/output:/output
#
data_bindings: []

## resource
#  指使用什么算力容器,通过命令 bayes gear resource 可以看到支持的算力类型
#
resource: 'rtx-4090'

## env
#  指使用什么运行时环境,通过命令 bayes gear env 可以查看支持的运行时环境
#
env: 'pytorch-2.6-2204'

## command
#  只有在创建「脚本执行」时需要,指任务执行时的入口命令
#
command: ''

## node
#  指定运行节点数量
#
node: 1

## parameters
#  支持 key / value 形式的参数,该参数会在容器执行时生成 openbayes_params.json 并补充在 command 参数后面
#  样例如下:
#
#    parameters:
#      input: /input0
#      epochs: 5
#
#    在执行时会生成一个内容为 {"input": "/input0", "epochs": 5} 的 openbayes_params.json,
#    并且会在执行命令后面追加 `--input=/input0 --epochs=5`
#
parameters: {}

## 有关「 HyperAI 自动调参」的最新说明,请查阅 https://hyper.ai/docs/hypertuning/
#
#  一个完整的 hyper_tuning 样例如下:
#    hyper_tuning:
#      max_job_count: 3
#      hyperparameter_metric: precision
#      goal: MINIMIZE
#      algorithm: Bayesian
#      parameter_specs:
#      - name: regularization
#        type: DOUBLE
#        min_value: 0.001
#        max_value: 10.0
#        scale_type: UNIT_LOG_SCALE
#      - name: latent_factors
#        type: INTEGER
#        min_value: 5
#        max_value: 50
#        scale_type: UNIT_LINEAR_SCALE
#      - name: unobs_weight
#        type: DOUBLE
#        min_value: 0.001
#        max_value: 5.0
#        scale_type: UNIT_LOG_SCALE
#      - name: feature_wt_factor
#        type: DOUBLE
#        min_value: 1
#        max_value: 200
#        scale_type: UNIT_LOG_SCALE
#      - name: level
#        type: DISCRETE
#        discrete_values: [1, 2, 3, 4]
#      - name: category
#        type: CATEGORICAL
#        categorical_values: ["A", "B", "C"]
#
hyper_tuning:
  ## max_job_count
  #  一次自动调参的尝试次数,最多支持 100 次
  #
  max_job_count: 0

  ## parallel_count
  #  并行的尝试个数受限于用户的单个资源类型的最大并行个数,通常是 1 或者 2
  #
  parallel_count: '1'

  ## hyperparameter_metric
  #  目标变量
  #  有关目标变量的上报,请查阅 https://hyper.ai/docs/hypertuning/#2-上报目标变量
  hyperparameter_metric: ''

  ## goal
  #  最优解的方向 ( MAXIMIZE 或 MINIMIZE )
  #
  goal: ''

  ## algorithm
  #  采用的算法,支持的算法如下:
  #  Grid      对于只有 DISCRETE 以及 CATEGORICAL 类型参数的场景可以通过 GridSearch 遍历所有参数的组合
  #  Random    针对 INTEGER 以及 DOUBLE 类型,依据其所支持的分布类型,在 min_value 和 max_value 之间随机选择数值,对于 DISCRETE 和 CATEGORICAL 类型,其行为和 Grid 方式类似
  #  Bayesian  每次生成参数时考虑之前的「参数」-「目标变量」的结果,通过更新后的分布函数提供参数以期望获取更好的结果,其算法可以参考该文章
  #
  algorithm: ''

  ## parameter_specs
  #  输入参数的规约
  #  参数规约的定义请查阅:https://hyper.ai/docs/hypertuning/#参数规约的定义
  #
  parameter_specs: []

  ## side_metrics
  #  其他参考指标
  #
  side_metrics: []

其中 hyper_tuning 部分暂不介绍,但可以看到其他参数与 bayes gear run task 中使用的参数是一致的,通过在 openbayes.yaml 配置参数可以避免重复在使用 bayes gear run task 时重复输入参数。例如提供如下参数:

data_bindings:
  - data: openbayes/mnist/1 # 数据集的完整路径
    path: /input0 # 挂载到容器中的路径
    type: ro # 可选:ro(只读)或 rw(可读写)
resource: rtx-4090
env: pytorch-2.0
command: 'python train.py -i /input0 -o ./model -e 2 -m model.h5 -l ./tf_dir'

:::info 需要注意的是 openbayes/mnist/1 中,openbayes 是公有数据集的专用名,如果你想使用你自己的数据集,需要将 openbayes 替换为你的用户名mnist 是数据集的名字,1 是数据集的版本号。 :::

直接输入 bayes gear run task 命令即可执行一个在 pytorch-2.0 环境下,算力资源为 rtx-4090,绑定数据集 openbayes/mnist/1/input0,入口命令为 python train.py -i /input0 -o ./model -e 2 -m model.h5 -l ./tf_dir 的任务了。

:::note 更多有关配置文件如何编写的内容,见 HyperAI 配置文件 :::

创建「Jupyter 工作空间」

与「Python 脚本」的创建类似,通过命令行创建 Jupyter 默认会把当前目录下的文件上传到容器的「输出」中。

  1. git clone https://github.com/practicalAI/practicalAI 下载 practicalAI 项目
  2. cd practicalAI && bayes gear init practicalAI 初始化容器
  3. bayes gear run workspace 创建 Jupyter
$ bayes gear run workspace -o -f

当前正在组织 org1 上进行操作...
正在向服务器请求创建容器...
容器创建成功
打开网页 https://app.hyper.ai/console/org1/jobs/52yaekv8nf91 可查看容器的详细信息
已成功打开浏览器.

容器运行中

:::note 「Jupyter 工作空间」的创建和与「Python 脚本」的创建类似,可以通过命令行参数创建,也可以通过 openbayes.yaml 文件创建。 :::

容器继续执行

  • 使用 bayes gear status 命令,查看当前容器下的所有执行
  • 使用 bayes gear restart 命令,传入已完成执行的 ID,可以以相同的参数再次运行该次执行。
$ bayes gear restart 52yaekv8nf91 -o -f

当前正在组织 org1 上进行操作...
容器继续执行...
打开网页 https://app.hyper.ai/console/org1/jobs/52yaekv8nf91 可查看容器 practicalAI 的详细信息
已成功打开浏览器.
⠸ CREATED

亦可以通过参数覆盖,修改部分参数,再次运行该次执行。

:::note restart 命令的选项与 run 命令的选项一致 :::

$ bayes gear restart 52yaekv8nf91 \
      --resource cpu \
      --env pytorch-2.0 \
      --data openbayes/eBIQp4yPMtU/1:/input0 \
      --data openbayes/sTggKplxyT6/1:/input1 \
      --data openbayes/bbNaMvDNqO9/1:/input2 \
      --data username/jobs/3s55ypc33ptl/output:/output \
      --message "task message" \
      --open \
      --follow

当前正在组织 org1 上进行操作...
容器继续执行...
打开网页 https://app.hyper.ai/console/org1/jobs/52yaekv8nf91 可查看容器 practicalAI 的详细信息
已成功打开浏览器.

容器运行中

:::info 需要注意的是 --data openbayes/eBIQp4yPMtU/1:/input0 中,openbayes 是公有数据集的专用名,如果你想使用你自己的数据集,需要将 openbayes 替换为你的用户名eBIQp4yPMtU 是数据集 ID,1 是数据集的版本号;:/input0,是将数据集绑定到 input0 中。 :::

关闭容器执行

使用 bayes gear stop 命令,传入运行中的容器执行 ID,可以关闭容器的该次执行。

$ bayes gear stop 52yaekv8nf91 -o -f

当前正在组织 org1 上进行操作...
同步数据并关闭容器
打开网页 https://app.hyper.ai/console/username/jobs/52yaekv8nf91 可查看容器 practicalAI 的详细信息
已成功打开浏览器.

容器已关闭

介绍一下几个可用的参数:

  • -o--open 将会在容器开始关闭后,在浏览器打开相应的 web 界面
  • -f--follow 会一直跟踪容器的状态,直到容器完全关闭

用命令行工具下载容器输出内容

1. 直接通过执行 ID 下载容器输出内容

使用 bayes gear download 命令,传入容器执行 ID,可以下载该容器的当前输出内容。

$ bayes gear download 5mx0ki1s5ej8 --target ~/Downloads/data-download-location -u

当前正在组织 org1 上进行操作...
正在下载中,请稍候
下载完成,文件保存在 ~/Downloads/data-download-location/cli-29.output.zip

正在解压中,请稍候
解压成功: 文件已解压到 ~/Downloads/data-download-location
已删除源文件:  ~/Downloads/data-download-location/cli-29.output.zip

介绍一下几个可用的参数:

  • -f--from 指定下载的子路径,不填则下载整个输出
  • -t--target 本地存在位置,不填则使用当前路径
  • -u--unarchive 是否自动解压压缩包并删除源文件,不填则默认保留压缩包,不进行自动解压

:::note 使用 -u--unarchive 参数,要求 -t--target 所选择的文件夹为空文件夹 :::

2. 创建「Python 脚本执行」,并等待容器执行完成后下载输出内容

组合使用 bayes gear run taskbayes gear download 命令,将会等待「Python 脚本执行」完成后下载输出内容。

$ bayes gear run task -f && bayes gear download -t /Users/username/test-data-download -u

当前正在组织 org1 上进行操作...
command 信息为: sleep 1
正在上传源代码...
正在准备上传源代码...
正在获取上传授权...
开始扫描文件,请稍候...
共发现 10 个文件,总计 4.4 MB,开始上传...
上传进度: 100% (10/10): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4.43M/4.43M [00:05<00:00, 809kB/s]

✅ 源代码上传成功! 已上传 10 个文件
正在向服务器请求创建容器...
容器创建成功
打开网页 https://app.hyper.ai/console/org1/jobs/onl6jcbkgahd 可查看容器的详细信息

容器运行中
当前正在组织 org1 上进行操作...
正在下载中,请稍候
下载完成,文件保存在 /Users/username/test-data-download/test-cli.output.zip

正在解压中,请稍候
解压成功: 文件已解压到 /Users/username/test-data-download
已删除源文件: /Users/username/test-data-download/test-cli.output.zip

用命令行工具打开容器 web 界面

通过以下命令我们可以直接从命令行打开 web 界面:

$ bayes gear open 6q848lathbdp

当前正在组织 org1 上进行操作...
正在打开任务 https://app.hyper.ai/console/org1/jobs/6q848lathbdp
正在跳转到浏览器...
已成功打开浏览器.

亦可以通过容器的名称打开

$ bayes gear open practicalAI

当前正在组织 org1 上进行操作...
正在打开容器 https://app.hyper.ai/console/org1/containers/6q848lathbdp
正在跳转到浏览器...
已成功打开浏览器.

或者,在容器执行命令最后加入 -o 参数,命令行工具将会在上传或合并完成后立即打开相应的 web 界面:

$ bayes gear run workspace -o -f

当前正在组织 org1 上进行操作...
正在向服务器请求创建容器...
容器创建成功
打开网页 https://app.hyper.ai/console/org1/jobs/52yaekv8nf91 可查看容器的详细信息
已成功打开浏览器.

容器运行中

:::note bayes gearrun restart stop 命令均可在命令的最后加入 -o 选项,命令行将会在容器到达目标状态后,在浏览器打开相应的 web 界面 :::

用命令行工具跟踪容器日志及容器状态

1. 日志跟踪

通过命令 bayes gear logs 可以查看运行中的容器日志,加入 -f--follow 参数会持续跟踪容器的日志打印

$ bayes gear logs 1ekrvwi6uyac -f

[I 14:41:01.149 LabApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 14:41:01.433 LabApp] All authentication is disabled.  Anyone who can connect to this server will be able to run code.
[I 14:41:01.749 LabApp] JupyterLab extension loaded from /usr/local/lib/python3.6/site-packages/jupyterlab
[I 14:41:01.750 LabApp] JupyterLab application directory is /usr/local/share/jupyter/lab
[I 14:41:01.758 LabApp] Serving notebooks from local directory: /openbayes
[I 14:41:01.758 LabApp] Jupyter Notebook 6.1.4 is running at:
[I 14:41:01.758 LabApp] http://username-1ekrvwi6uyac-main:8888/jobs/username/jobs/1ekrvwi6uyac/
[I 14:41:01.758 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
...
...
...

2. 状态跟踪

bayes gear 的子命令 run restart stop 都支持加入 -f--follow 参数跟踪容器状态。

:::caution 状态跟踪只对「Python 脚本」 及「 Jupyter工作空间」任务生效,对「自动调参」任务无效。 :::

其中, run restart 命令:

  • 对于 「Python 脚本」 任务,会跟踪到整个任务启动完成
  • 对于 「Jupyter 工作空间」任务,会跟踪到 Jupyter 工作空间启动完成
  • 对于 「 自动调参」任务,--follow 参数不生效

stop 命令:

  • 对于 「Python 脚本」 任务,会跟踪任务直到容器完全关闭
  • 对于 「Jupyter 工作空间」任务,会跟踪任务直到容器完全关闭
  • 对于 「 自动调参」任务,--follow 参数不生效