0. 前言
- 相关资料
- B站视频(字幕是自动生成的,但也差不多够用)
- 为什么要关注数据?有一个投票,大部分算法工程师最主要的精力都花在数据上。
- 主要内容包括:Sources/Labeling/Storage/Versioning/Processing
1. Sources
- 如何寻找训练数据源?
- 现在大部分深度学习任务都依赖于大量标注数据。
- 当然,也有特例,如RL/GANs/半监督学习,但一般这类技术在工业界的应用都不多。
- 数据来源有以下这些:
- 公开数据集:因为大家都能用,所以模型训练出来没有竞争力,但作为项目开始阶段数据可以。
- 一般会花钱或花时间标注数据。
- Data flyingwheel:应用上线之后的持续数据采集(业务手段让用户帮忙标注)、标注以及模型优化。
- 半监督学习
- 数据增强
- 模拟生成数据(在机器人、自动驾驶领域很常见)
2. Labeling
- 用户界面(感觉就是标注工具基本功能)
- 一般都包括bbox、分割、关键点、三维立方体
- 一般支持复杂的分类结果
- 对标注者进行培训是非常重要的,可以确保标注质量
- 谁来标注
- 自己雇人(兼职):费用高、找人难、需要人员管理,但质量高、安全、速度快(人员固定后)
- 众包(如Mechanical Turk):便宜、容易找更多人,但不安全、需要大量质检工作
- 找数据标注公司。寻找公司的时候需要注意:
- 需要自己标注一些数据作为 gold standard。
- 多联系几家公司,看看同一类数据的标注样例。
- 确保双方对标注标准有统一的认识。
- 完全外包比较贵,有写公司提供标注工具(而不包括人力)
- 建议:
- 钱够就找外包
- 如果钱不够,至少要用一些现有软件标注
- 相比重要,自己找兼职做标注更好
3. Storage
- 如何保存数据?主要内容包括:文件系统、对象存储、数据库、
Data Laker
- 文件系统(filesystem):存储系统的基础
- 基本存储单位是文件,文本或二进制,不进行版本控制,可以轻易覆盖。
- 基本形式比如普通硬盘。
- 可构建网络文件系统(局域网内多态机器之间存储数据)
- 可构建分布式文件系统,即HDFS
- 需要注意访问模式,速度快,但不能并行
- 对象存储(object storage)
- 文件系统基础上的API,主要包括增删查操作。
- 基本存储单位是对象(Object),一般是二进制文件,如图像、音频、视频等
- 进行版本控制,可能进行冗余存储
- 可以并行读取,但速度不太快
- 常见的有AWS的S3,以及本地的Ceph
- 数据库(database):快速、可扩展、建检索、持久化存储结构化数据
- Mental Model 就是所有数据通过快速置换(内存与硬盘位置互换)都保存在RAM中,但确保所有信息、日志都在本地硬盘有备份。
- 基本数据单位是行(row),有独立的ID,数据按列归纳。
- 不用来存储二进制数据,数据经常会重复提取
- 建议使用 Postgres
- 建议会SQL
- “Data Laker”:数据湖,这个概念以前没了解过,猜测就是什么都存进去,然后根据需要拿出来。
- 文件系统(filesystem):存储系统的基础
- 每类存储方式对应存储什么类型的数据
- 二进制数据(图像、音频、压缩文本)以对象形式保存
- 元数据(Metadata)保存在数据库中
- 如果需要一些别的不能存在数据库的特征,就用数据湖
- 训练时数据要么存在本地,要么存在NFS中
- 进一步学习推荐资料:这本书
4. Versioning
- 如果对自建数据集进行版本控制
- Level 0:直接存在文件系统中,不进行版本控制。
- 非常不推荐。
- 由于数据没版本控制,所以模型也没有版本控制。
- 无法复现历史模型精度。
- Level 1:每次训练都都保存一个数据库副本
- 非常不推荐。
- 可对模型进行版本控制。
- Level 2:通过 assets 和 code 同时对数据进行版本控制
- 推荐使用的方式
- 大数据保存在文件系统中
- 训练数据通过JSON或类似的方式进行存储,即只存储标签、样本位置、用户行为等
- JSON可能很大,但可通过git进行版本控制。
- 可实现lazy功能,即等要用了再生成数据。
- git signiture就是我们数据库的版本,更多信息可保存在git message中
- Level 3:专业数据版本控制工具
- 如果了解这些工具,建议使用;如果不了解工具,那就不使用。
- 常见的包括 DVC,Pachyderm,Dolt等
5. Processing
- 数据预处理生成训练数据。
- 为什么有这样的需求
- 有些场景,需要每天晚上都训练一个新模型,以照片流行度预测的。
- 对每张照片,训练数据包括元数据(上传时间、标题、拍摄地点等)
- 运行分类器。
- 有些需要从logs中读取相关信息。
- 任务依赖,有些任务存在相互依赖关系。
- 可使用分布式管理方式。
- Airflflow:训练调度框架,可在多条机器上运行。
- 尽量简洁。举了一个有意思的例子
- 对于一个TB级的文件,需要查看文本文件的训练结果
- Hadoop需要26分钟,而如果用linux命令行,则只需要18秒或70秒