Big Data
大数据是指规模太大、变化太快或类型太多,以至于单台机器的工具无法处理的数据。本文介绍 3V、MapReduce 和 Spark,以及支撑现代 AI 的数据集。
大数据指数据的规模、到达速率或格式种类超出单台机器和传统数据库工具的存储与处理能力,因此需要将数据分散到多个集群机器上并行处理。META Group 的分析师 Doug Laney 于 2001 年将这一挑战概括为 3V:Volume(数据量)、Velocity(数据到达并需要处理的速度)和 Variety(结构化表格、日志、文本、图像、音频和视频等数据类型的多样性)。后来的定义又加入 Veracity(数据的可信度)和 Value(数据的价值)。对于机器学习,大数据既是原材料,也是工程难题:模型会随着训练数据增加而改进,而收集、清理和提供这些数据的流水线也耗费了构建模型过程中的大量工作。
AI 与计算机视觉中的大数据#
深度学习的发展与单个磁盘无法容纳的大型数据集同步推进。ImageNet于 2009 年推出,后来扩展到超过 1,400 万张带标签的图像;其 1,000 类挑战赛中的 128 万张训练图像用于训练 AlexNet,这是一种赢得 2012 年竞赛的卷积神经网络。Meta 于 2023 年随 Segment Anything Model 一同发布的 SA-1B 数据集包含 1,100 万张图像和 11 亿个分割掩码;Meta 还使用超过 15 万亿个文本词元预训练了 Llama 3。缩放定律说明了这类数据集为何能带来收益:随着数据、参数和计算量共同增长,损失会以可预测的方式下降。
在计算机视觉中,数据量来自大量摄像头和传感器。自动驾驶汽车每行驶一小时都会记录摄像头、雷达和激光雷达数据流;工厂和商店也会增加数千路持续运行的视频流。对于交通或生产线视频的实时推理等需要随数据到达即时获得结果的场景,数据速度至关重要。数据类型的多样性则包括图像和视频,以及标注、传感器元数据和日志。只有标签准确,更多数据才有帮助,因此大型视觉数据集需要依靠数据清理、去重和主动学习来挑选值得标注的新图像。
大数据的存储与处理方式#
大数据系统通过横向扩展,将数据和计算任务分布到许多普通机器上,而不是依赖一台更大的服务器。Google 于 2004 年发表的 MapReduce 论文介绍了这一模式;开源项目 Apache Hadoop 让它得到了广泛应用:先将输入拆分成多个分片,再让存储这些分片的机器并行运行映射函数,最后将部分结果归约为一个答案。Apache Spark于 2009 年在 UC Berkeley 启动,会将中间结果保存在内存中,因此模型训练等迭代任务比基于磁盘的 MapReduce 快得多。原始文件通常存放在云对象存储中,并按数据湖的方式组织;Apache Parquet 等列式格式可让查询仅读取所需列;Apache Kafka 等流处理平台则负责传输高速到达的事件。
下面的示例使用 Python 标准库,对图像标签的三个分片执行映射和归约步骤:
from collections import Counter
from multiprocessing import Pool
# 三个图像标签分片;集群将每个分片存储在不同的机器上
shards = [
["car", "person", "car", "bus"],
["person", "person", "bicycle"],
["car", "person", "dog", "car"],
]
def count_labels(shard):
"""Map step: count the labels in one shard."""
return Counter(shard)
if __name__ == "__main__":
with Pool(processes=3) as pool:
partial_counts = pool.map(count_labels, shards) # 每个分片对应一个工作进程
# 归约步骤:将部分计数合并为总数
totals = sum(partial_counts, Counter())
print(totals.most_common())每个分片都在独立进程中进行计数,归约步骤再将部分计数合并到 [('car', 4), ('person', 4), ('bus', 1), ('bicycle', 1), ('dog', 1)] 中。Spark 和 Hadoop 会在数千台机器上执行相同的两个步骤,并将映射代码发送到存有各个分片的机器上。
使用大数据训练模型#
训练过程会分批读取大数据。数据加载器会通过多个工作进程,从本地磁盘或对象存储中一次解码几十到几百张图像,因此整个数据集无需全部载入内存;分布式训练还会将每个批次拆分到多个 GPU 上。对于目标检测,Google 的 Open Images V7 检测集需要下载 561 GB,包含 601 个类别、174 万张训练图像,远超大多数机器的 RAM 容量。使用 cache="ram" 将数据集缓存到内存时,Ultralytics YOLO 训练会根据 30 张随机图像估算解码后的数据大小,只有在可用 RAM 至少能容纳该估算值两倍的情况下才进行缓存;对于更大的数据集,每个 epoch 都会从磁盘读取并解码数据。
大数据与相关术语的区别#
- 数据挖掘:在任意规模的数据中寻找模式、异常和关联,通常会在大数据平台上运行。
- 数据分析:通过查询、汇总和可视化数据来支持决策;大数据分析是其中需要分布式引擎的部分。
- 以数据为中心的 AI:通过提升数据的质量和覆盖范围来改进模型;当数据集大到无法人工检查时,这一点尤为重要。










