公司网站上线的通知,建立一个个人介绍的网站,合肥百度快速排名优化,wordpress设置文件2023 年 11 月#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元#xff08;数据集和数据加载器#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…
2023 年 11 月Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元数据集和数据加载器的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理顺序数据访问模式的可迭代样式数据集。在上一篇文章中我介绍了适用于 Pytorch 的 S3 连接器并详细描述了它打算解决的问题。我还介绍了过去即将弃用的库以支持 S3 连接器。具体而言请勿使用适用于 PyTorch 的 Amazon S3 插件和基于 CPP 的 S3 IO DataPipe。最后我介绍了地图样式的数据集。我不会在这里回顾所有这些介绍性信息所以如果你还没有读过我之前的文章请尽早查看。在这篇文章中我将重点介绍可迭代样式的数据集。此连接器的文档仅显示了从 Amazon S3 加载数据的示例 – 在这里我将向您展示如何对 MinIO 使用它。适用于 PyTorch 的 S3 连接器还包括一个检查点接口用于将检查点直接保存和加载到 S3 存储桶中而无需先保存到本地存储。如果您还没有准备好采用正式的 MLOps 工具而只需要一种简单的方法来保存模型那么这是一个非常好的选择。我将在以后的文章中介绍此功能。
手动构建 Iterable Style 数据集
可迭代样式的数据集是通过实现一个类来创建的该类覆盖了 PyTorch 的 IterableDataset 基类中的 iter 方法。与地图样式数据集不同没有 len 方法也没有 getitem 方法。如果使用 Python 的 len 函数查询可交互数据集则会收到错误因为 len 方法不存在。
在训练循环期间调用可迭代样式的数据集时您可以返回多个样本。具体来说您将返回一个迭代器对象数据加载器将迭代该对象以创建所需的批处理。让我们构建一个非常简单的自定义可迭代样式数据集以更好地了解它们的工作原理。下面的代码显示了如何覆盖 iter 方法。完整的代码下载可以在这里找到。
class MyIterableDataset(IterableDataset):def __init__(self, start: int, end: int, transpose):self.start startself.end endself.transpose transposedef __iter__(self):worker_info torch.utils.data.get_worker_info()if worker_info is None: # single-process data loading, return the full iteratoriter_start self.startiter_end self.endworker_id -1else: # in a worker processworker_id worker_info.id# split workloadper_worker int(math.ceil((self.end - self.start) / float(worker_info.num_workers)))iter_start self.start worker_id * per_workeriter_end min(iter_start per_worker, self.end)samples []for sample in range(iter_start, iter_end):samples.append(sample)return map(self.transpose, samples)def my_transpose(x):return torch.tensor(x)
请注意您必须自己跟踪分片。当您创建具有多个具有此数据集的工作程序的数据加载程序时您需要确保确定每个工作程序要处理的数据份额每个分片。这是使用 worker_info 对象和一些简单的数学运算来完成的。我们可以创建这个数据集并使用下面的代码循环它这类似于训练循环。
batch_size 2
ds MyIterableDataset3(start0, end10, transposemy_transpose)
dl DataLoader(ds, batch_sizebatch_size, num_workers2)for sample in dl:print(sample)
输出将为
tensor([0, 1])
tensor([5, 6])
tensor([2, 3])
tensor([7, 8])
tensor([4])
tensor([9])
现在我们已经了解了可迭代数据集让我们使用 S3 连接器的可迭代数据集。但在执行此操作之前让我们看看如何让 S3 连接器连接到 MinIO。
将 S3 连接器连接到 MinIO
将 S3 连接器连接到 MinIO 就像设置环境变量一样简单。之后一切都会顺利进行。诀窍是以正确的方式设置正确的环境变量。本文的代码下载使用 .env 文件来设置环境变量如下所示。此文件还显示了我用于使用 MinIO Python SDK 直接连接到 MinIO 的环境变量。请注意AWS_ENDPOINT_URL 需要 protocol而 MinIO 变量不需要。此外你可能会注意到 AWS_REGION 变量的一些奇怪行为。从技术上讲访问 MinIO 时不需要它但如果为此变量选择错误的值则 S3 连接器中的内部检查可能会失败。如果您收到这些错误之一请仔细阅读该消息并指定它请求的值。
AWS_ACCESS_KEY_IDadmin
AWS_ENDPOINT_URLhttp://172.31.128.1:9000
AWS_REGIONus-east-1
AWS_SECRET_ACCESS_KEYpassword
MINIO_ENDPOINT172.31.128.1:9000
MINIO_ACCESS_KEYadmin
MINIO_SECRET_KEYpassword
MINIO_SECUREfalse
使用 S3 连接器创建可迭代样式的数据集
要使用 S3 连接器创建可迭代样式的数据集您无需像以前那样编写和创建类。S3IterableDataset.from_prefix 函数将为您完成所有工作。此函数假定您已设置环境变量以连接到 S3 对象存储如上一节所述。它还要求可以通过 S3 前缀找到您的对象。下面是一个演示如何使用此函数的代码段。
from s3torchconnector import S3IterableDataseturi fs3://{bucket_name}/{split}
aws_region os.environ[AWS_REGION]
dataset S3IterableDataset.from_prefix(uri, regionaws_region, enable_shardingTrue,transformS3IterTransform(transform))
loader DataLoader(dataset, batch_sizebatch_size, num_workersnum_workers)
return loader, (time.perf_counter()-start_time)
请注意URI 是 S3 路径。在路径 mnist/train 下可以递归找到的每个对象都应该是属于训练集的对象。如果要使用数据加载器中的多个工作程序num_workers 参数请务必在数据集上设置 enable_sharding 参数。上述函数还需要一个 transform 来将对象转换为张量并确定标签。这是通过如下所示的可调用类的实例完成的。
from s3torchconnector import S3Readerclass S3IterTransform:def __init__(self, transform):self.transform transformdef __call__(self, object: S3Reader) - torch.Tensor:content object.read()image_pil Image.open(BytesIO(content))image_tensor self.transform(image_pil)label int(object.key.split(/)[1])return (image_tensor, label)
这就是使用 S3 Connector for PyTorch 创建地图样式数据集所需要做的全部工作。
结论
适用于 PyTorch 的 S3 连接器易于使用工程师在使用时编写的数据访问代码更少。在本文中我展示了如何将其配置为使用环境变量连接到 MinIO。配置完成后三行代码创建了一个可迭代的数据集对象该对象使用简单的可调用类进行转换。
后续步骤
如果您的网络是训练管道中最薄弱的环节请考虑创建包含多个样本的对象您甚至可以对其进行 tar 或 zip 处理。遗憾的是S3 连接器无法对地图样式或可迭代样式的数据集执行此操作。在以后的博文中我将展示如何使用自定义构建的可迭代样式数据集来完成此操作。