启用通知¶
可对 Driverless AI 进行配置,使其在实验开始和结束时触发用户定义的脚本。此功能可用于向 Slack 等服务发送通知或使计算机关机。
config.toml 文件公开了以下变量:
listeners_experiment_start
: 记录了将在实验开始时执行的脚本绝对位置。listeners_experiment_done
: 记录了将在实验成功完成时执行的脚本绝对位置。
Driverless AI 接受使用任何可执行文件作为脚本。(例如,可在 Bash 或 Python 中执行的脚本。)仅有两个要求:
所指定的脚本能够执行。(即,此文件具有可执行文件标志。)
此脚本应能接受命令行参数。
脚本接口¶
Driverless AI 在执行脚本时会将以下参数作为脚本命令行传递:
应用程序 ID:正在运行的 Driverless AI 实例的唯一标识符。
用户 ID:正在运行实验的用户标识。
实验 ID:实验的唯一标识符。
实验路径:实验结果的存储位置。
示例¶
以下示例展示如何在完成所有已启动的实验后使用通知脚本来关闭正在运行 Driverless AI 的 EC2 计算机。此示例展示了如何在 Docker 容器中以及在本机安装中使用通知脚本。通知脚本旨在创建一个简单的计数器(即,目录中文件的数量),以对正在运行的实验数进行计数。如果计数器的值为 0,则执行指定操作。
在此示例中,我们使用 AWS 命令行实用程序来关闭实际计算机;但是,相同的功能还可通过以下方式实现:执行 sudo poweroff
(如果实际用户已配置无密码 sudo 功能)或 poweroff
(如果脚本 poweroff
设置了 setuid
位和可执行位。更多信息,请访问 https://unix.stackexchange.com/questions/85663/poweroff-or-reboot-as-normal-user。)
On_start
脚本¶
此脚本可增加运行中实验的计数器。
#!/usr/bin/env bash app_id="${1}" experiment_id="${3}" tmp_dir="${TMPDIR:-/tmp}/${app_id}" exp_file="${tmp_dir}/${experiment_id}" mkdir -p "${tmp_dir}" touch "${exp_file}"
On_done
脚本¶
此脚本可减少计数器并在计数器的值为 0 时关闭计算机。
#!/usr/bin/env bash app_id="${1}" experiment_id="${3}" tmp_dir="${TMPDIR:-/tmp}/${app_id}" exp_file="${tmp_dir}/${experiment_id}" if [ -f "${exp_file}" ]; then rm -f "${exp_file}" fi running_experiments=$(ls -1 "${tmp_dir}" | wc -l) if [ "${running_experiments}" -gt 0 ]; then echo "There is still ${running_experiments} running experiments!" else echo "No experiments running! Machine is going to shutdown!" # Use instance meta-data API to get instance ID and then use AWS CLI to shutdown the machine # This expects, that AWS CLI is properly configured and has capability to shutdown instances enabled. aws ec2 stop-instances --instance-ids $(curl http://169.254.169.254/latest/meta-data/instance-id) fi
将 config.toml 文件从 Docker 映像中复制到本地文件系统。(对于非 GPU 的环境,可将
nvidia-docker run
更改为docker run
. )
# In your Driverless AI folder (for exmaple, dai_1.5.1), # make config and scripts directories mkdir config mkdir scripts # Copy the config.toml file to the new config directory. nvidia-docker run \ --pid=host \ --rm \ -u `id -u`:`id -g` \ -v `pwd`/config:/config \ --entrypoint bash \ h2oai/dai-centos7-x86_64:1.10.1-cuda11.2.2.xx -c "cp /etc/dai/config.toml /config"
在 config.toml 文件中编辑 通知脚本 部分,然后保存更改。请注意,在此示例中,此脚本保存在 dai_VERSION/scripts 文件夹中。
# Notification scripts # - the variable points to a location of script which is executed at given event in experiment lifecycle # - the script should have executable flag enabled # - use of absolute path is suggested # The on experiment start notification script location listeners_experiment_start = "dai_VERSION/scripts/on_start.sh" # The on experiment finished notification script location listeners_experiment_done = "dai_VERSION/scripts/on_done.sh"
使用 DRIVERLESS_AI_CONFIG_FILE 环境变量启动 Driverles AI。请确保这可指向已编辑的 config.toml 文件位置,从而使软件能找到配置文件。(对于非 GPU 的环境,可将
nvidia-docker run
更改为docker run
. )
nvidia-docker run \ --pid=host \ --rm \ -u `id -u`:`id -g` \ -e DRIVERLESS_AI_CONFIG_FILE="/config/config.toml" \ -v `pwd`/config:/config \ -v `pwd`/data:/data \ -v `pwd`/log:/log \ -v `pwd`/license:/license \ -v `pwd`/tmp:/tmp \ -v `pwd`/scripts:/scripts \ h2oai/dai-centos7-x86_64:1.10.1-cuda11.2.2.xx
导出 Driverless AI config.toml 文件或将其添加至 ~/.bashrc。例如:
# DEB and RPM export DRIVERLESS_AI_CONFIG_FILE="/etc/dai/config.toml" # TAR SH export DRIVERLESS_AI_CONFIG_FILE="/path/to/your/unpacked/dai/directory/config.toml"
在 config.toml 文件中编辑 通知脚本 部分,以指向新脚本。完成后,保存更改。
# Notification scripts # - the variable points to a location of script which is executed at given event in experiment lifecycle # - the script should have executable flag enabled # - use of absolute path is suggested # The on experiment start notification script location listeners_experiment_start = "/opt/h2oai/dai/scripts/on_start.sh" # The on experiment finished notification script location listeners_experiment_done = "/opt/h2oai/dai/scripts/on_done.sh"
启动 Driverless AI。请注意,用于启动 Driverless AI 的命令将因安装类型而异。
# Deb or RPM with systemd (preferred for Deb and RPM): # Start Driverless AI. sudo systemctl start dai # Deb or RPM without systemd: # Start Driverless AI. sudo -H -u dai /opt/h2oai/dai/run-dai.sh # Tar.sh # Start Driverless AI ./run-dai.sh