斯纳克集线器
hub的Python项目详细描述
简介
大多数情况下,数据科学家/ml研究人员致力于数据管理和预处理,而不是建模。深度学习通常需要处理大型数据集。这些数据集可以增长到太字节甚至是太字节大小。很难管理数据、版本控制和跟踪。下载数据并与训练或推理代码链接是非常耗时的。没有一种简单的方法可以访问其中的一块并可能可视化。在云端将大型数据集存储为单个类似numpy的数组进行版本控制,并从任何机器上按比例访问数据集,难道不更方便吗?
< Buff行情>集线器阵列:可扩展的类似numpy的阵列存储在云上,可通过Internet访问,就像它们是本地numpy阵列一样。
让我们看看它是如何工作的:
pip3 install hub
在云上远程创建一个大数组,其中一些部分缓存在本地。你可以从任何地方读/写,就好像它是一个本地数组一样!
>importhub>bigarray=hub.array((10000000000,512,512,3),name="test/bigarray:v0")
当前工作流的问题
通过与深度学习公司和研究人员合作的经验,我们意识到目前在深度学习数据管理中存在一些与工作流相关的问题。
数据区域性。如果您有本地GPU服务器,但将数据存储在安全的远程数据中心或云端,则需要提前计划将特定数据集下载到GPU框中,因为这需要时间。如果存在多个预处理管道,则在整个团队中共享来自一个GPU盒的预处理数据集也很慢而且容易出错。
本地文件夹结构的代码依赖性。人们使用文件夹结构来存储图像或视频。因此,数据输入管道必须考虑到原始文件夹结构,这会造成数据集文件夹结构不必要且容易出错的代码依赖。
管理预处理管道。如果您想运行一些预处理,最好将预处理的图像保存为本地缓存以供培训。但是,当有多个预处理管道且数据集非常大时,通常很难在本地管理和版本控制预处理的图像。
可视化。很难在服务器上可视化原始数据或预处理数据集。
读取一小部分数据。另一种流行的方法是以hdf5/tfrecords格式存储并上传到云存储桶,但仍然需要管理许多hdf5/tfrecords文件块。如果要读取一小部分数据,则不清楚需要加载哪个tfrecord/hdf5块。为一小块数据加载整个文件也是低效的。
跨团队同步。如果多个用户修改数据,则需要执行数据版本控制和同步协议。
RAM管理。每当您想创建一个numpy数组时,您都会担心numpy数组是否符合本地ram/磁盘限制。
< > >- 实际数组是在云存储桶(对象并部分缓存在本地环境中。阵列大小可以轻松扩展到1PB。
- 当您读取/写入阵列时,软件包会通过Internet自动同步从本地存储桶到云存储桶的更改。 < > >
- 数据管理:使用版本控制存储大型数据集
- 协作:多个数据科学家同步处理同一数据
- 分发:同时从多台计算机访问
- 机器学习:与numpy、dask、pytorch或tensorflow的本地集成。
- 缩放:根据需要创建任意大的数组
- 可视化:将数据可视化,不会有问题
- 航空图像:卫星和无人机图像
- 医学图像:体积图像,如MRI或X射线
- 自动驾驶汽车:雷达、3D激光雷达、点云、语义分割、视频对象
- 零售:自助结账数据集
- 媒体:图像、视频、音频存储
具有集线器阵列的工作流
只需在代码中声明一个具有名称空间的数组,就可以了。"数据存储在哪里以及如何存储?完全脱离了数据科学家或机器学习工程师。您可以创建一个高达PB级的numpy数组,而无需担心该数组是否适合RAM或本地磁盘。内部工作如下:
我们正在开发简单的身份验证系统、数据管理、高级数据缓存和获取以及版本控制。
>importhub>importnumpyasnp# Create a large array that you can read/write from anywhere.>bigarray=hub.array((100000,512,512,3),name="test/bigarray:v0")# Writing to one slice of the array. Automatically syncs to cloud.>image=np.random.random((512,512,3))>bigarray[0,:,:,:]=image# Lazy-Load an existing array from cloud without really downloading the entries>imagenet=hub.load(name='imagenet')>imagenet.shape(1034908,469,387,3)# Download the entries from cloud to local on demand.>imagenet[0,:,:,:].mean()
用法
步骤1。安装
pip3 install hub
第2步。延迟加载公共数据集,以高达50MB/s的速度获取单个图像并绘制
>importhub>imagenet=hub.load(name='imagenet')>imagenet.shape(1034908,469,387,3)>importmatplotlib.pyplotasplt>plt.imshow(imagenet[0])
第3步。计算完整数据集任何块的平均值和标准偏差
>imagenet[0:10,100:200,100:200].mean()0.132>imagenet[0:10,100:200,100:200].std()0.005
步骤4。创建自己的阵列并从另一台计算机访问它
# Create on one machine>importnumpyasnp>mnist=hub.array((50000,28,28,1),name="name/random_name:v1")>mnist[0,:,:,:]=np.random.random((1,28,28,1))# Access it from another machine>mnist=hub.load(name='name/random_name:v1')>print(mnist[0])
功能
基准
有关完整的再现性,请参考代码
下载并行性
下表显示,在启用多线程和多处理的情况下,单机上的集线器(aws p3.2xlarge)可以达到875 MB/s的下载速度。选择块大小对于达到最大速度起着作用。下面的图表显示了使用不同数量的线程和进程的权衡。
培训深度学习用例
确认
感谢:这项技术的灵感来源于我们在普林斯顿大学的Seunglab的经历,并感谢William Silversmith@Seunglab和他出色的项目云卷