GPU 算力池管理工具 Determined AI 使用教程,适用于实验室、企业的服务器 GPU 管理。
官方文档:Determined AI 。
1. 概念
1.1 什么是Determined?
Determined AI 是一个全功能的深度学习平台,兼容 PyTorch 和 TensorFlow。它主要负责以下几个方面:
分布式训练:Determined AI 可以将训练工作负载分布在多个 GPU(可能在多台计算机上)上,而无需更改代码。无论是在一台计算机上利用2个 GPU 还是在多台计算机上利用16个 GPU,都只需更改配置即可。
超参数调优:Determined AI 提供了自动超参数搜索功能,可以帮助你找到最优的模型参数。
资源管理:Determined AI 可以有效地管理和调度计算资源,以降低云 GPU 的成本。
实验跟踪:Determined AI 可以跟踪和记录实验的过程,方便你分析结果和复现实验。
Determined AI 的主要组件之一是命令行接口(CLI),它提供了一种高效的方式来管理和控制系统的各个方面。例如,你可以使用 CLI 来创建、列出和管理实验,以及访问重要的实验指标和日志。CLI 还可以帮助你管理作业队列,监控正在进行的任务的进度,甚至根据需要优先处理或取消作业。
此外,Determined AI 还支持自由形式的任务,如命令和 Shell。命令和 Shell 使开发人员可以在不必编写符合试验 API 的代码的情况下,使用 Determined 集群和其 GPU。
1.2 Determined集群中的Master和Agent分别表示什么意思?
在 Determined 集群中,Master 和 Agent 有特定的角色和功能。
Master:Master 是 Determined 集群的核心,它负责管理和调度所有的任务。Master 接收来自用户(通过网页、CLI 等方式)的请求,并将这些请求发送到 Agent 进行处理。Master 的行为可以通过设置配置变量来控制,这可以通过使用配置文件、环境变量或命令行选项来完成。
Agent:Agent 是执行任务的节点,它们在 Master 的调度下运行任务。每个 Agent 都有一个唯一的 ID(默认为当前机器的主机名),并且在一个集群中必须是唯一的。Agent 节点通常是配备 GPU 的服务器,用于运行计算密集型的深度学习任务。
总的来说,Master 负责管理和调度任务,而 Agent 负责执行这些任务。
2. 部署与配置
2.1 在本地部署
在部署 Master 与 Agent 节点的服务器上需要先安装好 Docker,安装教程(Ubuntu 系统下):Install Docker Engine on Ubuntu 。
安装 nvidia-container-toolkit
(Master 和存储节点不需要 GPU,也无需安装 Nvidia 相关的内容),否则部署使用 GPU 的集群会出现报错 Internal Server Error ("could not select device driver "nvidia" with capabilities: [[gpu utility]]")
:
1 2 3 4 5 6 7 8 9 10 11 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y --no-install-recommends nvidia-container-toolkit sudo service docker restart
安装 Determined 库并在本地启动集群,对于本地开发或小型集群(例如 GPU 工作站),您可能希望同时安装 Master 和 Agent 位于同一节点上,因此可以使用 cluster-up
:
1 2 3 4 5 6 7 pip install determined # 可能会有某些包之间存在版本冲突需要解决 # If your machine has GPUs: det deploy local cluster-up # If your machine does not have GPUs: det deploy local cluster-up --no-gpu
如果 det
命令识别不到可能是没有配置环境变量:
1 2 3 4 5 sudo vim /etc/environment 在 PATH='xxx' 后面添加 ':/home/<用户名>/.local/bin' 即: 'xxx:/home/<用户名>/.local/bin' source /etc/environment # 应用更新
要停止 Determined 集群,请在当前运行 Determined 集群的计算机上,运行:
1 det deploy local cluster-down
在许多情况下,Determined 集群将由多个节点组成。在这种情况下,您将需要分别启动 Master 和 Agents。启动和停止独立 Master:
1 2 det deploy local master-up # 启动 det deploy local master-down # 停止
若要在计算机上部署独立的 Agent,请运行以下命令之一,<master_hostname>
为 Master 的主机名:
1 2 3 4 5 6 7 8 # If the machine has GPUs: det deploy local agent-up <master_hostname> # If the machine doesn't have GPUs: det deploy local agent-up --no-gpu <master_hostname> # Stop Agent det deploy local agent-down
与用户相关的指令:
1 2 det user list # 列出所有的用户,包括他们的用户名、管理员状态、活动状态等 det user get <username> # 显示某用户的详细信息,包括他们是否已经登录
访问 http://localhost:8080/
,用户名为 determined
,密码留空,即可登录。
2.2 配置参考
查看当前 Master 配置信息:
我们可以自定义 Master 的配置,在需要部署 Master 的服务器上创建 Master 配置文件 master-config.yaml
,具体配置教程见:Master Configuration Reference ,参考内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 __internal: audit_logging_enabled: false external_sessions: jwt_key: '' login_uri: '' logout_uri: '' proxied_servers: null cache: cache_dir: /var/cache/determined checkpoint_storage: host_path: /home/ubuntu/.local/share/determined propagation: null save_experiment_best: 0 save_trial_best: 1 save_trial_latest: 1 storage_path: null type: shared_fs cluster_name: '' config_file: '' db: host: determined-db migrations: file:///usr/share/determined/master/static/migrations name: determined password: '********' port: '5432' ssl_mode: disable ssl_root_cert: '' user: postgres enable_cors: false feature_switches: []integrations: pachyderm: address: '' launch_error: true log: color: true level: info logging: type: default notebook_timeout: null observability: enable_prometheus: false port: 8080 reserved_ports: null resource_manager: client_ca: '' default_aux_resource_pool: default default_compute_resource_pool: defaut no_default_resource_pools: false require_authentication: false scheduler: allow_heterogeneous_fits: false fitting_policy: best type: fair_share type: agent resource_pools: - agent_reattach_enabled: false agent_reconnect_wait: 25s description: '' kubernetes_namespace: '' max_aux_containers_per_agent: 100 pool_name: default provider: null task_container_defaults: null - agent_reattach_enabled: false agent_reconnect_wait: 25s description: '' kubernetes_namespace: '' max_aux_containers_per_agent: 100 pool_name: RTX3090 provider: null task_container_defaults: null root: /usr/share/determined/master security: authz: _strict_ntsc_enabled: false fallback: basic rbac_ui_enabled: null strict_job_queue_control: false type: basic workspace_creator_assign_role: enabled: true role_id: 2 default_task: gid: 0 group: root id: 0 uid: 0 user: root user_id: 0 ssh: rsa_key_size: 1024 tls: cert: '' key: '' task_container_defaults: add_capabilities: null bind_mounts: null cpu_pod_spec: null devices: null drop_capabilities: null gpu_pod_spec: null kubernetes: null log_policies: null network_mode: bridge pbs: {} shm_size_bytes: 4294967296 slurm: {} work_dir: null telemetry: cluster_id: '' enabled: true otel_enabled: false otel_endpoint: localhost:4317 segment_master_key: '********' segment_webui_key: '********' tensorboard_timeout: 300 webhooks: base_url: '' signing_key: fc9942f4d575
然后即可使用配置文件启动集群:
1 det deploy local cluster-up --master-config-path ./master-config.yaml
在需要部署 Agent 的服务器上创建 Agent 配置文件 agent-config.yaml
,具体配置教程见:Agent Configuration Reference ,参考内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 master_host: <ip_of_your_master_node> master_port: 8080 agent_id: RTX3090_0 resource_pool: RTX3090 http_proxy: <ip_of_proxy> https_proxy: <ip_of_proxy>
这里主要配置3个内容:
Master 节点主机名和端口号,用于识别 Master 节点。
agent_id
和 resource_pool
,分别对应本机 ID 和资源池,根据显卡型号命名即可,注意资源池需要已在 Master 配置文件中定义过。
科学上网代理。
完成后,所有 Agent 节点使用如下命令启动(最后的 0.29.0
为 Determined AI 的版本号,根据自己安装的版本修改即可):
1 docker run --gpus all -v /var/run/docker.sock:/var/run/docker.sock -v "$PWD"/agent-config.yaml:/etc/determined/agent.yaml determinedai/determined-agent:0.29.0
2.3 命令行、Notebook、Shell的使用方法
Determined 主要有两种使用方式:Web 和 CLI。其中 Web 可以直接通过 <Master节点IP>:8080
进行访问,但是不推荐使用 Web 方式,因为网页端创建任务无法自定义存储路径和加载的 Docker 镜像,灵活度十分受限。因此接下来详细介绍 CLI 的用法。
首先在终端机安装好 Determined,然后在环境变量中配置 Master 节点 IP:
1 2 3 4 5 6 vim ~/.bashrc # 添加以下内容,保存并退出 export DET_MASTER=<Master节点的IP> source ~/.bashrc
接下来可以使用 Determined CLI 创建任务,首先在终端机需要登录,在 Admin 用户(用户名为 admin
,密码留空)中可以管理其他用户,假设已经给终端机创建好账号即可登录:
然后写一个开启任务的 Yaml 配置文件,这里给出一个参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 description: test_task resources: resource_pool: RTX3090 slots: 1 bind_mounts: - host_path: /home/ubuntu/ container_path: /run/determined/workdir/asanosaki/ environment: image: determinedai/environments:cuda-11.8-pytorch-2.0-gpu-0.29.1 environment_variables: - http_proxy=<ip_of_proxy> - https_proxy=<ip_of_proxy>
Determined 官方给出了很多个版本的 CUDA 和框架的组合,可以自行选择所需要的镜像,Determined AI Docker 镜像列表:Docker Hub DeterminedAI 。
完成后,可以选择开启 Jupyter Notebook 或者终端,这取决于使用者的习惯:
1 2 3 4 5 6 7 8 # Notebook det notebook start --config-file config.yaml # CMD det cmd run --config-file config.yaml # Shell det shell start --config-file config.yaml
对应的停止任务指令如下:
1 2 3 4 5 6 7 8 # Notebook det notebook kill <ID> # CMD det cmd kill <ID> # Shell det shell kill <ID>
任务的 <ID>
可通过 det task list
查看所有任务信息获得,写前8位即可。
2.4 创建实验
先下载官方的项目示例代码:mnist_pytorch.tgz 。
将其解压到当前目录:
1 2 tar zxvf mnist_pytorch.tgz -C ./ cd mnist_pytorch
可以看到该目录下有单卡运行实验以及多卡并行运行实验的实验配置文件 const.yaml
和 distributed.yaml
,此处给出 distributed.yaml
配置参考内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 name: mnist_pytorch_distributed hyperparameters: learning_rate: 1.0 n_filters1: 32 n_filters2: 64 dropout1: 0.25 dropout2: 0.5 searcher: name: single metric: validation_loss max_length: epochs: 1 smaller_is_better: true entrypoint: python3 -m determined.launch.torch_distributed python3 train.py description: test_task resources: resource_pool: RTX3090 slots_per_trial: 2 bind_mounts: - host_path: /home/ubuntu/ container_path: /run/determined/workdir/asanosaki/ environment: image: determinedai/environments:cuda-11.8-pytorch-2.0-gpu-0.29.1 environment_variables: - http_proxy=<ip_of_proxy> - https_proxy=<ip_of_proxy>
接下来即可通过配置文件创建任务(最后一个 .
表示上传当前目录中的所有文件,作为模型的上下文目录。Determined 将模型上下文目录内容复制到试验容器工作目录):
1 det experiment create distributed.yaml .
2.5 通过VSCode SSH连接
首先确保 VSCode 已经安装 Remote - SSH
扩展,当用户开启了 Shell 后,可以在终端机上执行以下命令获取 Shell 的 SSH 登录命令:
1 det shell show_ssh_command <SHELL UUID>
复制 SSH 命令,在 VS Code 的 Remote Explorer
页面下即可添加连接。