大模型数据存储方案调研

背景和需求

在训练大模型时,通常需要使用大量的数据来训练模型。这些数据通常以CSV或JSON等文件格式存储。

需求描述:

为了解决数据版本管理的难题,需要开发一个数据管理系统,该系统能够支持以下功能:

1.数据上传与下载:用户可以通过系统将数据上传到系统中,并能够从系统中下载数据。

2.数据格式支持:系统应该支持CSV和JSON等常见的数据格式,以确保用户可以方便地上传和下载数据。

3.数据版本管理:系统应该能够跟踪数据的版本,并记录数据的修改历史。每次数据更新后,系统应该自动记录并保存新版本的数据,并能够让用户方便地查看和比较不同版本的数据。

4.数据权限管理:系统应该能够为每个用户分配不同的数据权限。例如,某些用户可能只能查看数据,而其他用户可能能够修改和删除数据。

5.数据备份与恢复:系统应该能够定期备份数据,并能够在需要时快速恢复数据。此外,系统应该能够提供数据恢复历史记录,以便用户可以查看以前备份的数据版本。

6.数据安全性:系统应该采取适当的安全措施来保护数据的安全性和隐私性,例如加密和身份验证等。

7.用户交互性:系统应该提供友好的用户界面或者简单的脚本,使用户可以方便地上传、下载、查看和比较不同版本的数据。

业界方案

2.1版本控制工具对比

组件名称 优点 缺点 参考
Git LFS 1.与Git集成紧密,易于使用和学习。2.开源免费。3.支持多种云存储服务,如GitHub,GitLab,Bitbucket等。4.可以通过指定文件大小或文件类型来选择哪些文件需要使用LFS管理。 1.LFS存储需要额外的云存储空间和带宽,可能会增加成本。2.对于大型二进制文件,速度较慢,可能会影响开发效率。3.不支持文件锁定,可能造成冲突。 https://docs.atrust.sangfor.com/pages/viewpage.action?pageId=177161067#id-01-skm-multi%E6%89%93%E5%8C%85%E6%94%B9%E8%BF%9Bgitlfs%E6%94%AF%E6%8C%81-%E6%96%B9%E6%A1%88%E9%80%89%E6%8B%A9(内网)
DVC 1.兼容 Git对存储没有限制 2.低冲突分支 3.与语言和框架无关 4.支持HDFS、Hive 和 Apache Spark 4.不受 Git 托管限制。5.DVC 优化了大文件的存储和传输。 在大型项目中,数据管道可能变得非常复杂,这可能使得使用 DVC 变得困难。虽然 DVC 与 Git 集成得非常好,但是与其他数据科学和机器学习工具的集成可能不那么顺畅。 快速入门DVC(三):数据与模型版本管理 - 掘金Version Data and Code - DagsHub Docspython - Installation DVC on MinIO storage - Stack Overflow
pachyderm 1.Pachyderm 提供了对数据的版本管理功能,使您能够跟踪数据的变化历史。2.Pachyderm 通过记录每个数据版本的元数据和变化历史,确保数据处理管道的可重现性。3.Pachyderm 具备分布式处理的能力,可以处理大规模的数据集和复杂的处理管道。 它使用容器和分布式计算框架(如 Kubernetes)来实现高性能的数据处理和存储。 配置繁琐,组件太新了。Pachyderm 的配置和管理可能需要一些额外的工作。 需要设置和管理数据管道、存储和计算资源等。 在单服务器创建服务的话,连接会超时。借用sealosK8s环境,有很多依赖要配置很多信息,pod无法启动。
ArtiVC 1.一个方便的命令行工具,用于在云存储上进行数据版本控制。2.快照数据并在版本之间切换数据。3.ArtiVC支持三个主要的云提供商(AWS S3,Google Cloud Storage,Azure Blob Storage)和使用SSH的远程文件系统。 avc 在能力上部分git 的命令支持并不是很多,但是从简单上来说还是很方便的不需要外部依赖,lakefs 是一个不错的基于git 的数据管理能力,而且社区也比较活跃。目前avc 似乎更偏向于fix 了,新功能比较少了,avc 代码量并不大。 GitHub - InfuseAI/ArtiVC: A version control system to manage large files.Rclone找到了一个方法需要依赖rclone:GitHub - rongfengliang/minio_rclone_artivc_learning: minio_rclone_artivc_learning
Git Annex 1.Git Annex 允许在不下载整个大文件的情况下获取其元数据。2.可以选择只在需要时获取大文件。 1.Git Annex 的命令和工作流程与标准的 Git 工作流程不同。2.跨平台支持有限:虽然 Git Annex 支持多种操作系统,但在某些系统上的表现可能不如其他工具。 与git工作流不太一样,不推荐
Lake FS lakeFS 提供对数据湖的版本控制,并使用类似 Git 的语义来创建和访问这些版本。它与格式无关。1.适用于众多数据工具和平台。通过写入时复制机制最大限度地减少数据重复。2.在任何规模的数据湖中都能保持高性能。包括可配置的垃圾回收功能。3.在生产中得到了证明,并拥有一个活跃的社区。 命令行操作的话需要lakectl,要是想要提交和合并分支的话,需要用脚本来 后期维护成本不确定
Mercurial Largefiles Extension 1.Mercurial 是一个分布式版本控制系统,与 Git 类似。Largefiles Extension 是 Mercurial 的一个扩展,用于处理大文件。2.Largefiles Extension 的命令和工作流程与标准的 Mercurial 工作流程一致。 1.需要 Mercurial:这是一个 Mercurial 的扩展,如果项目使用 Git,可能不合适。2.跨平台支持有限:虽然 Mercurial 支持多种操作系统,但在某些系统上的表现可能不如其他工具。 与git不兼容,不推荐
Perforce Helix Core 1.支持大规模文件管理,具有高度可扩展性和可定制性。2.支持文件级别的锁定和权限控制。3.支持多种操作系统,包括Windows,Linux和MacOS等。 1.需要学习新的工具和命令。2.价格较高,需要购买许可证。3.对于小型项目,可能会过于复杂。 不开源,不推荐。
SVN LFS 1.与Subversion集成紧密,易于使用和学习。2.开源免费。3.支持多种云存储服务,如GitHub,GitLab,Bitbucket等。4.可以通过指定文件大小或文件类型来选择哪些文件需要使用LFS管理。 1.对于大型二进制文件,速度较慢,可能会影响开发效率。2.不支持文件锁定,可能造成冲突。 和其他组件集成有版本冲突问题,不推荐。
Plastic SCM 1.可视化的界面,易于使用和学习。2.分布式架构,支持多种工作流程。3.支持文件锁定和权限控制。 1.价格较高,需要购买许可证。2.在大型团队或大型项目中,可能会出现性能问题3.不如Git或Subversion流行,缺乏相关社区和支持。 不开源,不推荐。

2.2挂载存储调研

特性 ceph minio
开发语言 C go
一致性 强一致性 强一致性
用户 可拓展云原生数据库 可拓展云原生数据库
存储方式 块对象文件 对象存储
活跃度
github star数 12.2k 40.1k
管理工具 命令行和原生DashBoard 命令行和操作界面
操作界面 提供可视化界面面 提供可视化界面
数据恢复 Recove和backfill是Ceph数据修复中最重要的两个部分。 使用纠删码、Checksum来防止错误和静默数据污染,数据恢复性好,即使丢失1/2的磁盘也能恢复数据。
官网 Ceph.io — Home MinIO | 高性能, Kubernetes 原生对象存储
学习成本
版本管理 支持 支持
组件兼容 S3兼容API,并与所有现代数据框架(如Spark,Hive,AWS Athena,DuckDB和Presto)无缝协作。 支持Veeak、SPark大数据处理组件、Hive数据仓库工具、AWS CLI底层存储服务,Nginx负载均衡组件等。
社区链接 Ceph.io — Community MinIO 博客
读写权限 nginx使用Nginx反向代理minio,提供文件公共访问-腾讯云开发者社区-腾讯云

方案选型结论

1.开发者角色(做数据修改、更新、提交):dvc+minIO做版本管理,类git方式后台操作(补充dvc刚才说的项目创建和提交流程)。

2.标注员角色(观察数据):lakeFS激活分支,lakectel+rclone同步迁移minIO->lakeFS分支,前端通过激活的分支观测数据。

测试

4.1Lakefs

docker部署lakefs,使用默认存储。

内网测试链接:http://10.109.97.231:8000/repositories/quickstart/objects

access_key_id: AKIAJL66XTCWW6O6IRNQ

secret_access_key: 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

1
2
3
4
5
6
7
docker run --name lakefs --pull always \

-p 8000:8000 \

treeverse/lakefs:latest \

run --local-settings

docker部署lakefs,使用minio作为底层存储,需要dremio组件。

  1. 构建dremio的dockerfile。
1
2
3
4
5
6
7
8
9
10
11
FROM DREMIO/DREMIO-OSS:20.1.0

USER ROOT

COPY DREMIO-ENV /OPT/DREMIO/CONF/DREMIO-ENV

COPY JPROFILER\_LINUX\_12\_0\_4.DEB /OPT/JPROFILER\_LINUX\_12\_0\_4.DEB

RUN DPKG -I /OPT/JPROFILER\_LINUX\_12\_0\_4.DEB

USER DREMIO

2.创建docker-copose.yaml文件,进行编排。

1
2
3
4
5
6
7
8
9
docker run --name lakefs --pull always \

-p 8000:8000 \

treeverse/lakefs:latest \

run --local-settings

lakefs搭配minio的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
1.docker-compose.yaml

VERSION: '3'

SERVICES:

LAKEFS:

IMAGE: DALONGRONG/LAKEFS:DEV-2022-02-09

PORTS:

- "8000:8000"

DEPENDS\_ON:

- "POSTGRES"

ENVIRONMENT:

- LAKEFS\_AUTH\_ENCRYPT\_SECRET\_KEY=${LAKEFS\_AUTH\_ENCRYPT\_SECRET\_KEY:-SOME RANDOM SECRET STRING}

- LAKEFS\_DATABASE\_CONNECTION\_STRING=${LAKEFS\_DATABASE\_CONNECTION\_STRING:-POSTGRES://LAKEFS:LAKEFS@POSTGRES/POSTGRES?SSLMODE=DISABLE}

- LAKEFS\_BLOCKSTORE\_TYPE=${LAKEFS\_BLOCKSTORE\_TYPE:-S3}

- LAKEFS\_BLOCKSTORE\_LOCAL\_PATH=${LAKEFS\_BLOCKSTORE\_LOCAL\_PATH:-/HOME/LAKEFS}

- LAKEFS\_GATEWAYS\_S3\_DOMAIN\_NAME=${LAKEFS\_GATEWAYS\_S3\_DOMAIN\_NAME:-S3.LOCAL.LAKEFS.IO:8000}

- LAKEFS\_BLOCKSTORE\_S3\_CREDENTIALS\_ACCESS\_KEY\_ID=${AWS\_ACCESS\_KEY\_ID:-MINIO}

- LAKEFS\_BLOCKSTORE\_S3\_CREDENTIALS\_ACCESS\_SECRET\_KEY=${AWS\_SECRET\_ACCESS\_KEY:-MINIO123}

- LAKEFS\_LOGGING\_LEVEL=${LAKEFS\_LOGGING\_LEVEL:-INFO}

- LAKEFS\_STATS\_ENABLED

- LAKEFS\_BLOCKSTORE\_S3\_ENDPOINT=HTTP://S3:9000

- LAKEFS\_BLOCKSTORE\_S3\_FORCE\_PATH\_STYLE=TRUE

- LAKEFS\_COMMITTED\_LOCAL\_CACHE\_DIR=${LAKEFS\_COMMITTED\_LOCAL\_CACHE\_DIR:-/HOME/LAKEFS/.LOCAL\_TIER}

ENTRYPOINT:

[

"/APP/WAIT-FOR",

"POSTGRES:5432",

"--",

"/APP/LAKEFS",

"RUN"

]

POSTGRES:

IMAGE: "POSTGRES:${PG\_VERSION:-11}"

COMMAND: "-C LOG\_MIN\_MESSAGES=FATAL"

PORTS:

- "5432:5432"

ENVIRONMENT:

POSTGRES\_USER: LAKEFS

POSTGRES\_PASSWORD: LAKEFS

LOGGING:

DRIVER: NONE

DREMIO:

BUILD: ./

PORTS:

- "9047:9047"

- "31010:31010"

S3:

IMAGE: MINIO/MINIO

ENVIRONMENT:

- "MINIO\_ACCESS\_KEY=MINIO"

- "MINIO\_SECRET\_KEY=MINIO123"

COMMAND: SERVER /DATA --CONSOLE-ADDRESS ":9001"

PORTS:

- "9000:9000"

- "9001:9001"

4.2dagsHub+dvc

创建仓库之后需要,git的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
git clone https://dagshub.com/wsyyyyyyyy/data-storage-test.git

cd data-storage-test

echo "# data-storage-test" \>\> README.md

git add README.md

git commit -m "first commit"

git branch -M main

git push -u origin main

配置数据存储有四个选项,选择DVC存储。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mkdir data

echo "## Data will be uploaded to this folder" \>\> data/readme.md

dvc add data/.

dvc remote add origin https://dagshub.com/wsyyyyyyyy/data-storage-test.dvc

dvc remote modify origin --local auth basic

dvc remote modify origin --local user wsyyyyyyyy

dvc remote modify origin --local password b86f657e4d58b7944411812e2f1b9f59ee562935

git add .

git commit -m "Added dvc"

git push

dvc push -r origin

注意DagsHub 不支持 DVC 3.0 及其新的哈希机制。请使用 DVC 2.x

4.3minio+dvc

minio部署

docker创建一个节点的minio

1
2
3
4
5
6
7
mkdir minio

cd minio

mkdir data

mkdir config

需要为minio开放两个端口,一个9000端口,一个静态端口,此处为9999

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker run --name minio \

-p 9000:9000 \

-p 9999:9999 \

-d --restart=always \

-e "MINIO\_ROOT\_USER=admin" \

-e "MINIO\_ROOT\_PASSWORD=admin123" \

-v /home/minio/data:/data \

-v /home/minio/config:/root/.minio \

minio/minio server /data \

--console-address '0.0.0.0:9999'

访问MinIO Console即可访问 admin/admin123

创建的存储桶的名称为using-dvc-for-version-management-of-data-storage

创建访问密钥访问密钥:2HSkCcNeJB4xeuNCRf3R

密钥:4a0GdZ69RUatfNGXxoamKTzVNoJ5TL8tnLKWpnYy

{“url”:”http://47.93.38.210:9999/api/v1/service-account-credentials","accessKey":"2HSkCcNeJB4xeuNCRf3R","secretKey":"4a0GdZ69RUatfNGXxoamKTzVNoJ5TL8tnLKWpnYy","api":"s3v4","path":"auto"}

底层协议应该是一样的,所以可以直接调用API来进行访问

参考 python - 在 MinIO 存储上安装 DVC - IT工具网

python - Installation DVC on MinIO storage - Stack Overflow

在 本地安装 DVC,通过DVC来进行数据管理

DVC集成minio

首先需要安装dvc的脚本

1
pip install "dvc[s3]"

设置申请的权限配置

1.设置默认远程(将”bucket名称”更改为你的minio backet)

1
2
3
4
5
6
7
setup default remote (change "bucket-name" to your minio backet name)
dvc remote add -d minio s3://bucket-name -f
add information about storage url (where "https://minio.mysite.com" your url)
dvc remote modify minio endpointurl https://minio.mysite.com
add info about login and password
dvc remote modify minio access\_key\_id my\_login
dvc remote modify minio secret\_access\_key my\_password

DVC文件操作

拉取文件

1
dvc pull -r \<old\_remote\_name\> --all-commits --all-tags --all-branches

提交文件

1
dvc push -r \<new\_remote\_name\> --all-commits --all-tags --all-branches

dvc有个问题,就是即使和git联动了,也没法在git上面透视数据,因为实际数据是存在dvc的远端存储的,git只是元数据,dagshub能很好的解决这个问题,dagshub storage可以存dvc的数据内容,所以在dagshub上面就可以直接透视数据了,可以三条路线依次去探索:

1.dvc除了用dagshub透视以外有没有别的解决方案可视化dvc数据内容,最好像dagshub一样,一个类git的页面管理和可视数据

2.dagshub号称开源,但是我没找到开源部署的方法,可以找找dagshub的部署方案

3.寻找dagshub的开源替代品,目前来看lakeFS只是复刻了版本管理的能力,和dagshub比还是差远了

4.4minio+avc+rclone

启动minio,docker-compose的配置,之前安装了可以不安装了,但是要看清是不是 Version=3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3'

services:

minio:

image: minio/minio

ports:

- 9000:9000

- 19001:19001

volumes:

- ./data:/data/

environment:

MINIO\_ACCESS\_KEY: minio

MINIO\_SECRET\_KEY: minio123

command: server --console-address :19001 --quiet /data

1.首先安装rclone

方法一:在线安装(有权限)

sudo -v ; curl https://rclone.org/install.sh | sudo bash

方法二:离线安装(内网)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ mkdir ~/Temp

$ cd ~/Temp/

$ curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip

$ unzip rclone-current-linux-amd64.zip

$ cd rclone-\*-linux-amd64

$ mkdir ~/bin

$ cp rclone ~/bin/

$ export PATH=$PATH:~/bin

$ echo 'export PATH=$PATH:~/bin' \>\> ~/.bashrc # Optional, only if you want to add it to

your path at every login

2.配置rlcone,s3 环境准备好了之后就是进行rclone 的配置,通过配置一个minio s3 的就可以了,参考上边的配置,~/.config/rclone/rclone.conf 可以直接拷贝复制(这里我也是本机的服务器,所以配置的是127.0.0.1,注意ip,为了配置简单,我们先把密钥暂且删掉。

1
2
3
4
5
6
7
8
9
10
11
[myremote]

type = s3

provider = Minio

access\_key\_id = admin

secret\_access\_key = admin123

endpoint = http://127.0.0.1:9999/

然后安装artivc

1
2
3
brew tap infuseai/artivc

brew install artivc

集成使用

初始化工程init

1
avc init rclone://myremote/dalong/first

(这里相当于初始化之后的路径/rclone://myremote//桶的名称//下面的子页面)

添加文件以及push

1
2
3
echo "testAVC" \> demoapp

avc push