数据管理平台:存储架构、版本管理与检索回放

数据管理平台,说白了就是自动驾驶团队的「数据仓库」。我见过不少团队,算法模型做得不错,但数据管理一塌糊涂。结果呢?想复现一个实验结果,找数据找了三天。嗯,今天我们就聊聊怎么把数据管明白。

数据存储架构:分层设计是关键

我个人习惯把数据存储分成三层。为什么是三层?因为每一层解决不同的问题。

层级 存储介质 典型容量 访问频率
热数据层 SSD / NVMe 10-50 TB 每日读写
温数据层 HDD 阵列 100-500 TB 每周几次
冷数据层 磁带 / 对象存储 PB 级 每月甚至更少

热数据层放的是最近采集的、正在标注的、正在训练的数据。我建议用分布式文件系统,比如 Lustre 或 GPFS。温数据层放的是历史版本数据,用 HDFS 或 Ceph 就够。冷数据层嘛,放那些归档的、几个月前的数据,AWS S3 或阿里云 OSS 都行。

我的经验:千万别把所有数据都塞到热数据层。成本扛不住。我曾经有个项目,团队图省事,把所有数据都放 SSD 上,结果一个月存储费用比 GPU 还贵。

版本管理:数据也要有「Git」

代码有 Git,数据也得有版本管理。你想想看,模型训练到一半,发现数据有问题,想回退到上周的版本。如果没有版本管理,你怎么办?

我推荐用 DVC(Data Version Control)。它本质上是在 Git 仓库里记录数据的元信息和哈希值,真正的数据存在远程存储上。

# 初始化 DVC
dvc init

# 添加数据目录
dvc add data/raw_2024_03_15

# 关联远程存储
dvc remote add -d myremote s3://my-bucket/dvc-store

# 推送数据
dvc push

# 切换到历史版本
git checkout v1.0
dvc checkout

这里有个坑要注意。DVC 只管理你显式添加的文件或目录。如果你在代码里动态生成中间文件,DVC 是管不到的。我曾经踩过这个坑,训练脚本生成了预处理后的缓存文件,结果版本回退时缓存没跟着变,模型训练结果对不上。

避坑指南:数据版本管理一定要和代码版本管理联动。每次数据变更,都要在 Git 里打 tag。我习惯用「数据版本_代码版本」的命名方式,比如 data_v2_code_v3.1。

数据检索:别让工程师找数据找到崩溃

数据量大了以后,检索就成了大问题。我见过最夸张的情况,一个团队有 500 TB 数据,找某个特定场景的数据,全靠人工翻目录。你说效率能高吗?

我建议搭建一个元数据搜索引擎。核心思路是:

  • 自动提取元数据:采集时间、地点、天气、光照、交通流量等
  • 建立索引:用 Elasticsearch 做全文检索
  • 支持组合查询:比如「2024年3月 + 雨天 + 夜间 + 有行人横穿」

元数据怎么来?大部分可以从数据采集日志里解析。比如我们的采集车每 10 秒记录一次 GPS、车速、雨量传感器数据。把这些信息关联到每一帧图像或点云上,就形成了元数据。

# 元数据示例(JSON 格式)
{
  "frame_id": "20240315_143200_001",
  "timestamp": 1710484320,
  "location": {
    "lat": 31.2304,
    "lng": 121.4737
  },
  "weather": "rainy",
  "light_condition": "night",
  "traffic_density": "medium",
  "has_pedestrian": true,
  "has_vehicle": true
}
核心要点:检索系统好不好用,就看元数据够不够丰富。我建议至少采集 20 个以上的元数据字段。字段越多,检索越精准。

数据回放:可视化验证的利器

数据回放,说白了就是把采集的数据「重演」一遍。为什么要做这个?因为你要验证标注质量、检查传感器同步、调试感知算法。

我参与过的一个项目,回放系统支持三种模式:

  1. 单帧模式:逐帧查看,适合检查标注细节
  2. 连续回放:按原始时间轴播放,适合看整体场景
  3. 同步对比:同时显示多个传感器的数据,适合检查时间同步

回放系统的技术栈,我推荐用 Web 技术。前端用 Three.js 或 Deck.gl 做 3D 渲染,后端用 WebSocket 推数据。为什么不用桌面应用?因为 Web 部署方便,团队里每个人打开浏览器就能用。

// 回放控制的核心逻辑(伪代码)
class ReplayController {
  constructor() {
    this.currentFrame = 0;
    this.isPlaying = false;
    this.speed = 1.0; // 回放速度倍率
  }

  play() {
    this.isPlaying = true;
    while (this.currentFrame < totalFrames) {
      const data = loadFrame(this.currentFrame);
      renderFrame(data);
      this.currentFrame++;
      sleep(33 / this.speed); // 30 FPS
    }
  }

  seekTo(frameIndex) {
    this.currentFrame = frameIndex;
    const data = loadFrame(frameIndex);
    renderFrame(data);
  }
}
小技巧:回放时一定要显示时间戳和帧率。我遇到过数据采集时传感器掉帧的情况,如果没有时间戳显示,你根本发现不了。

知识体系总览

下面这张图,是我对数据管理平台核心逻辑的总结。你看一眼就能明白整体架构。

数据管理平台核心架构 数据采集层 传感器数据(相机、激光雷达、毫米波雷达、GPS/IMU) 数据存储层 热数据层(SSD) 温数据层(HDD) 冷数据层(对象存储) 数据管理层 版本管理(DVC) 元数据索引(ES) 数据检索 回放系统 数据应用层 模型训练、标注平台、仿真测试、场景挖掘

从这张图你能看到,数据从采集到应用,中间经过了存储和管理两个关键环节。每一层都有它存在的意义。少了任何一层,整个平台都会出问题。

最后说一句:数据管理平台不是一蹴而就的。我建议从小规模开始,先管好 10 TB 数据,再逐步扩展到 100 TB、1 PB。一开始就追求大而全,反而容易翻车。

可可精品资料库