赞
踩
Determined是一个开源深度学习训练平台,主要有以下几点优势:
(1)可以利用高级超参数优化自动查找高质量模型。
(2)分布式训练架构先进,在不更改模型代码的情况下能更快地训练模型。
(3)通过抢占式实例和智能调度,从GPU中获取更多价值并降低云GPU成本。
(4)利用开箱即用的实验跟踪来跟踪和重现,跟踪代码版本、指标、检查点和超参数。
Determined集群节点由一个Master和多个Agent构成,其中Master作为Client访问入口,通过网页、CLI等方式发起请求,将请求发送到agents进行调度,此外还需要有独立的存储位置用以存储模型和数据,如图2.1基于AWS的Determined AI架构。
(1)软件:已确定的代理和主节点必须配置Ubuntu 20.04或更高版本、CentOS 7或 macOS10.13或更高版本;agent节点必须安装Docker;要使用GPU运行作业,必须在每个已确定的agent上安装 Nvidia 驱动程序,其版本应为450.80及以上;Nvidia驱动程序可以作为CUDA的一部分进行安装,但不需要CUDA toolkit部分。
(2)硬件:master节点应至少配置4个Intel Broadwell或更高版本的CPU内核、8GB RAM和200GB可用磁盘空间,不需要配置GPU;agent节点应至少配置2个Intel Broadwell或更高版本的CPU内核、4GB RAM 和 50GB 的可用磁盘空间,以及3.7或更高版本计算能力的Nvidia GPU。
(1)安装Docker:Docker是几个系统组件的依赖项,agent节点必须安装 Docker才能运行容器化的工作负载,安装时agent节点机器需要20.10及以上版本的Docker。
(2)安装nvidia-container-toolkit:用于Docker容器内diaoyongGPU。
(3)配置Docker代理:创建配置文件目录和配置文件,添加HTTO_PROXY的环境变量后重启Docker,方便后续镜像拉取顺利。
(4)安装Determined:直接使用pip命令完成Determined安装。
(1)配置Determined Master:首先将所有节点连接到同一局域网,并按照上面的安装教程为所有机器安装依赖环境(Master和存储节点不需要安装nvidia相关的内容),然后启动Master节点即可,master节点的环境变量配置如代码片段2.1所示。
代码片段2.1:命令行参数配置master环境变量
docker run \
--name determined-master \
-p 8080:8080 \
-e DET_DB_HOST=<PostgreSQL hostname or IP> \
-e DET_DB_NAME=determined \
-e DET_DB_PORT=5432 \
-e DET_DB_USER=postgres \
-e DET_DB_PASSWORD=<DB password> \
determinedai/determined-master:VERSION
当然,也可以将环境配置写入到配置文件中直接使用配置文件,如代码片段2.2所示。
代码片段2.2:配置文件方法配置master环境变量
docker run \
-v "$PWD"/master.yaml:/etc/determined/master.yaml \
determinedai/determined-master:VERSION
(2)配置Determined agent:与master的情况一样,agent的配置可以使用配置文件、环境变量或命令行参数,使用命令行配置agent节点的操作如代码片段2.3所示。
代码片段2.3:命令行参数配置agent环境变量
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
--name determined-agent \
-e DET_MASTER_HOST=<Determined master hostname or IP> \
-e DET_MASTER_PORT=8080 \
determinedai/determined-agent:VERSION
(3)配置GPU节点:配置GPU节点时需要将不同型号的显卡进行分组,主要配置master节点、agent_id和label、科学上网代理3个内容,其yaml配置如下:
代码片段2.4:GPU的yaml配置文件
# The hostname or IP address of the Determined master.
master_host: ip_of_your_master_node
# The port of the Determined master.
master_port: 8080
# The ID of this agent; defaults to the hostname of the current machine. Agent IDs must be unique
# within a cluster.
agent_id: rtx3090_0
# The label of this agent. Agents with labels may only run workloads with the
# corresponding label.
label: rtx3090
# The GPUs that should be exposed as slots by the agent. A comma-separated list of GPUs,each specified by a 0-based index, UUID, PCI bus ID, or board serial number.
http_proxy: ip_of_proxy
https_proxy: ip_of_proxy
数据在机器学习模型开发中起着至关重要的作用,Determined支持多种访问数据的方法:嵌入至训练代码、分布式系统存储、对象存储,下面分别介绍这三种数据加载方式。
(1)嵌入至训练代码:顾名思义,将训练数据打包到源码中进行上传,而Determined上传过程中文件要求不大于96M,所以这种方法仅仅适用于小数据集。
(2)分布式系统存储:首先,应该确定每个agent上的同一挂载点挂载文件系统;其次,需要确保每个Docker容器都可以访问文件系统。以下示例假定已确定的群集配置了在每个代理上挂载的分布式文件系统,要访问此文件系统上的数据,需要使用实验配置文件,如代码片段2.5所示。
代码片段2.5:文件系统配置文件
bind_mounts:
- host_path: /mnt/data
container_path: /mnt/data
read_only: true
然后,可以在模型代码中定义访问目录中的数据,如代码片段2.6所示。
代码片段2.6:模型访问分布式系统中的数据
def build_training_data_loader(self):
return make_data_loader(data_path="/mnt/data/training", ...)
def build_validation_data_loader(self):
return make_data_loader(data_path="/mnt/data/validation", ...)
(3)对象存储:对象存储是将数据作为键值对的集合进行存储管理,在云服务环境中应用广泛,如Amazon的Simple storage Service(S3)he Google Cloud Storage(GCS)。代码片段2.7演示了从S3下载数据的示例:S3的bucket name在实验配置文件中指定,其余变量定义从S3下载的数据存储在何处。
代码片段2.7:从对象存储中下载方式加载数据
import boto3
import os
def download_data_from_s3(self):
s3_bucket = self.context.get_data_config()["bucket"]
download_directory = f"/tmp/data-rank{self.context.distributed.get_rank()}"
data_file = "data.csv"
s3 = boto3.client("s3")
os.makedirs(download_directory, exist_ok=True)
filepath = os.path.join(download_directory, data_file)
if not os.path.exists(filepath):
s3.download_file(s3_bucket, data_file, filepath)
return download_directory
除了从对象存储中下载,还可以从对象存储流式传输数据,流式传输的方式避免了在试用启动期间下载整个数据集,从而允许训练任务更快地启动,并且如果容器不需要访问整个数据集,则流式传输可能会导致下载的数据减少;如果数据集非常大,则流式处理可以避免将整个数据集存储在磁盘上的需要;此外,流式处理可以允许模型训练和数据下载并行进行,从而提高性能。
流式传输数据需要自定义或对象,具体取决于使用的是深度学习框架(Pytorch、TF)。类似加载本地数据集,这些类需要一个传递索引并返回关联的数据批次或记录的方法,也就是需要实现__getitem__()方法。代码片段2.8演示了一个从 Amazon S3 流式传输数据的自定义类,在该方法中,用户根据提供的S3 bucket和密钥获取数据。
代码片段2.8:从对象存储流式传输方式加载数据
import boto3
class ObjectStorageSequence(tf.keras.utils.Sequence):
def __init__(self):
self.s3_client = boto3.client("s3")
def __getitem__(self, idx):
bucket, key = get_s3_loc_for_batch(idx)
blob_data = self.s3_client.get_object(Bucket=bucket, Key=key)["Body"].read()
return data_to_batch(blob_data)
Determined同样使用yaml文件配置实验操作,利用CLI创建实验并通过配置文件进行实验过程的参数传递。例如:
det experiment create config-file.yaml model-directory
配置文件中有几个重要的字段,含义如下:
(1)Entrypoint:模型定义试用类规范或Python启动器脚本,是模型处理入口点,其内容可以是任意脚本和带脚本的预配置启动模块,如:
entrypoint: ./hello.sh或entrypoint: python3 -m (LAUNCH_MODULE) train.py
(2)Hyperparameters:定义实验的超参数空间。超参数空间由字典定义,字典中的每个键都是超参数的名称;关联的值定义超参数的范围。
(3)Environment:定义用于执行此试验的工作负荷的容器环境的属性,主要使用image指定执行工作负荷时要使用的Docker映像。
(4)Validation Policy:验证策略,使用min_validation_period指定为每个试验运行验证的最小频率,使用perform_initial_validation指定Determined在每次试验开始训练之前执行初始验证。
(5)Checkpoint Policy:检查点策略,主要用于训练期间定期记录训练结果及进度,允许从错误中恢复实验执行,使用min_checkpoint_period指定为每个试验运行检查点操作的最小频率,使用checkpoint_policy控制Determined如何在验证操作后执行检查点。
此外,在配置文件中还有几个描述性可选的字段,如name表示实验名称、description表示实验描述、labels表示标签名称(字符串)的列表、data表示有关实验如何访问和加载训练数据的信息、workspace表示创建实验的现有工作空间的名称。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。