You need to enable JavaScript to run this app.
导航
版本管理
最近更新时间:2025.04.22 20:03:14首次发布时间:2025.04.22 20:03:14
我的收藏
有用
有用
无用
无用

场景描述

在模型训练的过程中,需要会经常调整数据的内容来优化模型的性能,例如在CV领域对图片的不同的裁剪。
一次数据处理就会产生一个数据版本,此外由于数据变换不一定导致性能提升,因此历史的版本也会保留着。
此外,模型训练会经常回溯模型效果,需要数据处理步骤保留着全部的数据版本。

当前方案

Image
当前方案,一般采用复制数据集来记录不同变更的记录,例如在上面的例子中:

  1. 首先会将预处理好的训练数据放入到数据集1中,然后基于数据集1开始训练,并训练模型。
  2. 当模型不太理想的时候,会修正一些数据集1中的数据,并写成数据集2,并在数据集2上训练模型2。
  3. 对比模型1和模型2的效果,当模型2的效果比较差的话,就会淘汰数据集2和模型2。然后依然在数据集1上重试别的方式修正数据,再次训练模型3。
  4. 对比结果后,发现模型3效果比较好的话,会保留数据集3。为了保留数据操作记录,也会保留数据集1的数据。

Lance方案

Image
Lance是数据湖架构,采用版本方式管理数据:

  1. 数据导入后,就是Lance初始版本,用该版本训练模型
  2. 经过一定变更后,形成版本2,如果训练效果不理想的话,可以直接将Lance的版本回滚到版本1上。
  3. 然后再在版本1上做数据变更,形成版本3。
  4. Lance会一直保留所有版本,不仅包含版本1和版本3,也包含版本2.

方案对比

维度

当前方案

Lance方案

数据管理

按照不同文件路径和名字管理

通过版本管理

数据存储

最后存储3份全量数据

只有一份数据

数据操作

读取写入全量数据

只需要处理更改的数据

数据回退

人肉记忆

通过版本回退能力管理

代码样例

df = pd.DataFrame({"a": [10]})
tbl = pa.Table.from_pandas(df)
## 创建第一个版本
dataset = lance.write_dataset(tbl, "/tmp/test.lance")

## 创建第二个版本
dataset = lance.write_dataset(parquet, "/tmp/test.lance", mode="append")

## 列举数据集的所有版本
dataset.versions()


## 读取第一个版本
ds = lance.dataset('/tmp/test.lance', version=1).to_table().to_pandas()

## 读取第二个版本
ds = lance.dataset('/tmp/test.lance', version=2).to_table().to_pandas()

## 版本2的ds,切换回到版本1
ds = ds.checkout_version(1)

## ds版本回退到版本1,实际上就是创建一个版本3,但内容实际上就是版本1
ds.restore()