Sanfor实习-大模型数据存储调研方案
大模型数据存储方案调研
背景和需求
在训练大模型时,通常需要使用大量的数据来训练模型。这些数据通常以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 | docker run --name lakefs --pull always \ |
docker部署lakefs,使用minio作为底层存储,需要dremio组件。
- 构建dremio的dockerfile。
1 | FROM DREMIO/DREMIO-OSS:20.1.0 |
2.创建docker-copose.yaml文件,进行编排。
1 | docker run --name lakefs --pull always \ |
1 | 1.docker-compose.yaml |
4.2dagsHub+dvc
创建仓库之后需要,git的命令
1 | git clone https://dagshub.com/wsyyyyyyyy/data-storage-test.git |
配置数据存储有四个选项,选择DVC存储。
1 | mkdir data |
注意 : DagsHub 不支持 DVC 3.0 及其新的哈希机制。请使用 DVC 2.x
4.3minio+dvc
minio部署
docker创建一个节点的minio
1 | mkdir minio |
需要为minio开放两个端口,一个9000端口,一个静态端口,此处为9999
1 | docker run --name minio \ |
访问MinIO Console即可访问 admin/admin123
创建的存储桶的名称为using-dvc-for-version-management-of-data-storage
创建访问密钥访问密钥:2HSkCcNeJB4xeuNCRf3R
密钥:4a0GdZ69RUatfNGXxoamKTzVNoJ5TL8tnLKWpnYy
底层协议应该是一样的,所以可以直接调用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 | setup default remote (change "bucket-name" to your minio backet name) |
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 | version: '3' |
1.首先安装rclone
方法一:在线安装(有权限)
sudo -v ; curl https://rclone.org/install.sh | sudo bash
方法二:离线安装(内网)
1 | $ mkdir ~/Temp |
2.配置rlcone,s3 环境准备好了之后就是进行rclone 的配置,通过配置一个minio s3 的就可以了,参考上边的配置,~/.config/rclone/rclone.conf 可以直接拷贝复制(这里我也是本机的服务器,所以配置的是127.0.0.1,注意ip,为了配置简单,我们先把密钥暂且删掉。
1 | [myremote] |
然后安装artivc
1 | brew tap infuseai/artivc |
集成使用
初始化工程init
1 | avc init rclone://myremote/dalong/first |
(这里相当于初始化之后的路径/rclone://myremote//桶的名称//下面的子页面)
添加文件以及push
1 | echo "testAVC" \> demoapp |