部署
启动一个代理
您可以在任何机器上启动一个代理:无论是在本地和/或云实例上。当启动一个代理时,您将其分配给一个或多个队列服务。通过将任务排入代理所服务的队列来利用机器,代理将拉取并执行这些任务。
ClearML Agent 是平台无关的。当使用 ClearML Agent 跨平台执行实验时,在启动代理之前设置特定平台的环境变量。
例如,要在ARM设备上运行代理,请在启动代理之前设置核心类型环境变量:
export OPENBLAS_CORETYPE=ARMV8
clearml-agent daemon --queue <queue_name>
执行一个代理
要执行一个代理,监听一个队列,运行:
clearml-agent daemon --queue <queue_name>
在后台执行
要在后台执行代理,请运行:
clearml-agent daemon --queue <execution_queue_to_pull_from> --detached
停止代理
要停止在后台运行的代理,请运行:
clearml-agent daemon <arguments> --stop
分配资源
要指定与代理关联的GPU,请添加--gpus
标志。
确保包含--docker
标志,因为通过代理的GPU管理仅在Docker模式中受支持。
在同一台机器上执行多个代理(通常为不同的代理分配GPU),运行:
clearml-agent daemon --gpus 0 --queue default --docker
clearml-agent daemon --gpus 1 --queue default --docker
要分配多个GPU,请提供分配的GPU列表
clearml-agent daemon --gpus 0,1 --queue dual_gpu --docker
队列优先级
单个代理可以监听多个队列。优先级由它们的顺序设置。
clearml-agent daemon --queue high_q low_q
这确保了代理首先尝试从high_q
队列中拉取任务,只有在它为空时,代理才会尝试从low_q
队列中拉取。
为了确保代理从所有队列中平等地拉取任务,请添加--order-fairness
标志。
clearml-agent daemon --queue group_a group_b --order-fairness
它将确保代理从group_a
队列中拉取,然后从group_b
中拉取,然后再回到group_a
,等等。这确保了group_a
或group_b
不会相互剥夺资源。
SSH 访问
默认情况下,ClearML Agent 将主机的 ~/.ssh
映射到容器的 /root/.ssh
目录(可配置,请参阅 clearml.conf)。
如果你想使用现有的认证套接字与ssh-agent,你可以通过以下方式验证你的主机ssh-agent是否正常工作:
echo $SSH_AUTH_SOCK
你应该看到一个临时文件的路径,类似于这样:
/tmp/ssh-<random>/agent.<random>
然后在Docker模式下运行你的clearml-agent
,它将自动检测SSH_AUTH_SOCK
环境变量,并将套接字挂载到它启动的任何容器中。
你也可以在执行代理时显式设置SSH_AUTH_SOCK
环境变量。下面的命令将以Docker模式执行一个代理,并将其分配给服务队列。代理将有权访问环境变量中提供的SSH套接字。
SSH_AUTH_SOCK=<file_socket> clearml-agent daemon --gpus <your config> --queue <your queue name> --docker
Kubernetes
代理可以部署在裸金属上或作为Docker在Kubernetes集群中。ClearML代理为Kubernetes添加了缺失的调度能力,允许从代码中进行更灵活的自动化,并提供对ClearML代理所有功能的访问。
ClearML Agent 通过其 Kubernetes-Glue 部署到 Kubernetes 集群上,该工具将 ClearML 作业直接映射到 K8s 作业:
- 使用ClearML Agent Helm Chart来启动一个作为控制器的代理pod。或者(不太推荐)在K8S CPU节点上运行k8s glue script
- ClearML K8S 粘合层从 ClearML 任务执行队列中拉取任务,并准备一个 K8s 任务(基于提供的 yaml 模板)
- 在每个作业pod内部,
clearml-agent
将安装ClearML任务的环境,并运行和监控实验过程
ClearML 企业版计划支持 K8S 服务多个 ClearML 队列,并为每个队列提供 pod 模板,用于描述每个 pod 使用的资源。
例如,以下配置了用于example_queue_1
和example_queue_2
的资源:
agentk8sglue:
queues:
example_queue_1:
templateOverrides:
nodeSelector:
nvidia.com/gpu.product: A100-SXM4-40GB-MIG-1g.5gb
resources:
limits:
nvidia.com/gpu: 1
example_queue_2:
templateOverrides:
nodeSelector:
nvidia.com/gpu.product: A100-SXM4-40GB
resources:
limits:
nvidia.com/gpu: 2
Slurm
Slurm Glue 可在 ClearML 企业计划下使用。
代理可以部署在裸金属上或部署在使用Slurm管理的Linux集群中的Singularity
容器内。
ClearML Agent Slurm Glue 将作业映射到 Slurm 批处理脚本:将 ClearML 队列与批处理脚本模板关联,然后当任务被推入队列时,它将根据附加到队列的 sbatch 模板规范转换为并作为 sbatch
作业执行。
-
在可以运行
sbatch
/squeue
等的机器上安装Slurm Glue。pip3 install -U --extra-index-url https://*****@*****.allegro.ai/repository/clearml_agent_slurm/simple clearml-agent-slurm
-
创建一个批处理模板。确保将
SBATCH
变量设置为您想要附加到队列的资源。 下面的脚本设置了一个代理以裸机运行,为每个作业创建一个虚拟环境。例如:#!/bin/bash
# available template variables (default value separator ":")
# ${CLEARML_QUEUE_NAME}
# ${CLEARML_QUEUE_ID}
# ${CLEARML_WORKER_ID}.
# complex template variables (default value separator ":")
# ${CLEARML_TASK.id}
# ${CLEARML_TASK.name}
# ${CLEARML_TASK.project.id}
# ${CLEARML_TASK.hyperparams.properties.user_key.value}
# example
#SBATCH --job-name=clearml_task_${CLEARML_TASK.id} # Job name DO NOT CHANGE
#SBATCH --ntasks=1 # Run on a single CPU
# #SBATCH --mem=1mb # Job memory request
# #SBATCH --time=00:05:00 # Time limit hrs:min:sec
#SBATCH --output=task-${CLEARML_TASK.id}-%j.log
#SBATCH --partition debug
#SBATCH --cpus-per-task=1
#SBATCH --priority=5
#SBATCH --nodes=${CLEARML_TASK.hyperparams.properties.num_nodes.value:1}
${CLEARML_PRE_SETUP}
echo whoami $(whoami)
${CLEARML_AGENT_EXECUTE}
${CLEARML_POST_SETUP}注意:如果您在使用支持Singularity容器的Slurm,请将批处理模板中的
${CLEARML_AGENT_EXECUTE}
替换为singularity exec ${CLEARML_AGENT_EXECUTE}
。有关其他必需的设置,请参阅Slurm with Singularity。tip您可以通过ClearML Web UI覆盖Slurm作业模板的默认值。模板中的以下命令将
nodes
值设置为ClearML任务的num_nodes
用户属性:#SBATCH --nodes=${CLEARML_TASK.hyperparams.properties.num_nodes.value:1}
此用户属性可以在UI中修改,在任务的配置 > 用户属性部分,当任务执行时,将使用修改后的新值。
-
启动ClearML Agent Slurm Glue并将Slurm配置分配给ClearML队列。例如,以下代码将
default
队列与slurm.example.template
脚本关联,因此推送到此队列的任何作业将使用该脚本设置的资源。clearml-agent-slurm --template-files slurm.example.template --queue default
您还可以传递多个模板和队列。例如:
clearml-agent-slurm --template-files slurm.template1 slurm.template2 --queue queue1 queue2
Slurm 与 Singularity
如果您正在运行支持 Singularity 容器的 Slurm,请设置以下内容:
-
确保您的
sbatch
模板包含:singularity exec ${CLEARML_AGENT_EXECUTE}
可以添加额外的奇点参数,例如:
singularity exec --uts ${CLEARML_AGENT_EXECUTE}`
-
在您的clearml.conf文件中设置默认使用的Singularity容器:
agent.default_docker.image="shub://repo/hello-world"
或者
agent.default_docker.image="docker://ubuntu"
-
在命令行中添加
--singularity-mode
,例如:clearml-agent-slurm --singularity-mode --template-files slurm.example_singularity.template --queue default
Google Colab
ClearML 代理可以在 Google Colab 实例上运行。这有助于用户利用 Google Colab 提供的计算资源,并在其上发送实验进行执行。
查看本教程,了解如何在Google Colab上运行ClearML代理!
显式任务执行
ClearML 代理也可以直接执行特定任务,而无需监听队列。
执行任务无需排队
使用clearml-agent
工作器执行任务,无需队列。
clearml-agent execute --id <task-id>
克隆任务并执行克隆的任务
克隆指定的任务并使用clearml-agent
工作器在没有队列的情况下执行克隆的任务。
clearml-agent execute --id <task-id> --clone
在Docker内部执行任务
使用clearml-agent
工作器在没有队列的情况下通过Docker容器执行任务。
clearml-agent execute --id <task-id> --docker
调试
在前台模式下运行clearml-agent
守护进程,将所有输出发送到控制台。
clearml-agent daemon --queue default --foreground