大数跨境
0
0

技术干货|如何处理 AI 视觉等领域的海量标注数据存储?

技术干货|如何处理 AI 视觉等领域的海量标注数据存储? Xtreme1
2023-02-17
1
导读:应用研发总监讲解 Xtreme1 团队如何应对海量标注对象存储挑战......


流浪地球 2》将拥有自主意识的“通用人工智能(AGI)”概念推向大众,ChatGPT 的出现也让人们对于“和机器对话”重新燃起了期望......

“在未来自动驾驶汽车将成为城市交通的主要形式,人们可以在车内休息或者进行其他活动,同时减少交通事故和排放。机器人将广泛应用于各个领域,如医疗、家庭服务、制造业等,减轻人力压力,提高生产效率。智能家居将成为标配,人们可以随时随地控制家庭设备,实现智能化管理。随着人工智能技术的不断进步,人类的生活将变得更加便利、舒适和高效。”

以上是人们对于智能世界充满美好的遐想。但从技术角度来看,从自动驾驶系统到机器人,都离不开人工智能模型的训练,而训练模型需要大量经过人工标注的数据,涉及到的数据包括:

  • 需要被标注的数据 Data(如点云、图片、语音、文本等)和 
  • 标注出来的对象 Object(Object,比如 2D 框、3D 框、多边形等)。

面对多种多样且数量庞大的 Data 与 Object,Xtreme1 团队是如何设计存储方案的呢?

标注对象以 JSON 格式存储,单个对象的信息大小从几百 Byte 到几百 KB。在点云分割场景下,由于需要保存分割区域里所有点的信息,因此信息会比较大,达到几百 KB。对于被标注的数据,因为都是文件,并且很大,使用对象存储是很自然的选择,而对于标注对象,传统的方式是使用数据库记录来存储,这样可以支持比较复杂的查询,但会面临以下挑战。


存储挑战


1000租户,每个租户 100 万Data,每个 Data 里标注出来 10 个 Object,那么总的 Object 数量就是 100 亿。按每个 Object 1KB 大小计算,则需要的存储空间为 10TB。这还只是一种标注来源产生的数据量,如果考虑到多标注来源,数据量还会再跟随翻倍。


读写挑战


如果说存储上的挑战还可以通过加节点和磁盘来解决,读写上的挑战就很难了,因为读写性能无法通过加节点来线性扩展。对于连续帧标注,每次在标注工具里打开就会同时加载几百个 Data 的几千个 Object,也就是会一次性从数据库读取几千条记录(数据量几 MB 到几百 MB),提交时也会面临同样的写入压力。如果说对于并发度不高的私有化部署场景,数据库还能勉强支撑,那么对于 SaaS,同时有成千上万的用户在操作,数据库方案就变得完全不可行。


解决方案


像标注结果这么大的数据量和读写量,即便是使用分布式关系型数据库,或者 NoSQL 数据库都难以抗住,或者说运维成本很高和难度极大。这些分布式数据库都是采用多副本,相应的存储空间还会扩大到原始的 3 倍和 2 倍。

要想扛住这么大的数据量和读写量,只有放弃数据库存储方式,改为使用文件来存储标注对象。每个 Data 的每个标注来源的标注结果存为一个文件,每次读取和提交标注结果都按这个粒度来整体操作,标注结果文件数量能够跟 Data 数量大致维持在一个数量级。对象存储作为一种能够支撑海量小文件存储的存储系统,就非常适合标注结果的存放,实现方案如下。

该方案下,浏览器直接从对象存储服务读写标注结果文件,极大降低了 API 服务和数据库的压力。在连续帧标注场景下,浏览器会同时并发下载和上传几百个文件,但浏览器的同源并发限制会拉长整体的下载和上传时间。由于对象存储服务不支持单个请求批量下载和上传多个文件,如果这里遇到了性能瓶颈,那么可以增加一个“批量请求代理服务”来支持批量下载和上传文件。

相比数据库存储方案,其优势如下:

1. 文件存储方案将随机的数据库读写转变为顺序的文件读写。按一个连续帧 300 个 Data,每个 Data 30 个 Object 计算,单次连续帧标注结果加载或提交,数据库存储方案需要随机读写 9000 个 Object,而文件存储方案只需要读写 300 个文件,这里的性能差异是巨大的;

2. 将标注结果从数据库里移除之后,其记录数和存储大小会降低 1~2 个数量级,成本会显著降低,同时也避免了影响其它业务数据读写;

3. 支持海量标注结果存储,如果使用公有云的对象存储服务(AWS S3、阿里云 OSS),那么近乎拥有无限的存储空间,成本也比数据库的 SSD 磁盘低,私有化场景可以使用开源的 MinIO 来无缝替换;

4. 浏览器直接从对象存储服务读写标注结果,大大降低了 API 服务的带宽需求,公有云对象存储服务的带宽更大,价格也更便宜;

任何方案都有利弊,文件存储方案的劣势在于无法支持以 Object 为粒度的标注结果查询,比如展示某个数据集下的 Object 列表并根据某些属性过滤。如果需要支持 Object 查询,那么可以使用 Elasticsearch 这样的专业搜索系统来实现,里面只存储需要被检索的字段,这样能大大降低数据量大小。


作者王家军
应用研发总监。曾任职深圳腾讯、上海盛大、成都数联铭品。目前主要研究方向:微服务架构,云原生,Kubernetes,DevOps。

如果大家对 Xtreme1 感兴趣,欢迎关注 GitHub Repo:
https://github.com/xtreme1-io/xtreme1/
如果您遇到了一些问题,欢迎在交流群讨论或者通过提 issue 的方式告诉我们,我们一定会帮到您。

官 网|xtreme1.io
文 档|docs.xtreme1.io
GitHub|github.com/xtreme1-io/xtreme1

往期回顾

功能介绍|机器学习中的“本体”到底是什么?

播客系列|Intel 云端对话 Xtreme1

技术干货|通过统一图像规格改进自动外参校准方法

点击底部“阅读原文”前往 Xtreme1 GitHub Repo!

【声明】内容源于网络
0
0
Xtreme1
Linux基金会下的全球首个开源多模态训练数据平台
内容 58
粉丝 0
Xtreme1 Linux基金会下的全球首个开源多模态训练数据平台
总阅读44
粉丝0
内容58