dvc(data version control) 는 말 그대로 데이터 버전 컨트롤 cli 툴이다.
데이터의 메타 정보는 git 으로
실제 데이터를 git lfs 나 별도 리모트 스토리지(s3,gs,azure,ssh 등)에 저장해 관리한다.
주로 ML reproducible 을 위래 데이터나 모델을 버저닝에 많이 사용한다.
# brew 로 설치시
brew install dvc
# pip 로 설치시
pip install dvc
# git 프로젝트로 이동해서
# dvc 초기화(설정 파일 생성)
dvc init
# 초기화 되면 다음 파일을 생성되고 스테이지에 추가되어 있다.(git add 되어 있음)
# 이를 커밋,푸시해줘야 한다.
# 참고로 .gitignore 는 git 이 사용하는 설정으로 dvc 가 트랙하는 파일과 중복되지 않도록 무시하도록 하기 위해 필요하고 .dvcignore 는 dvc 가 dvc 에 사용하지않은 파일은 무시하기 위한 설정이다.
# git status
# new file: .dvc/.gitignore
# new file: .dvc/config
# new file: .dvcignore
git commit -m "initialize dvc"
git push
# dvc remote 저장소(스토리지) 추가
# s3 추가
# -d --default set as default remote.
dvc remote add -d ysoftman_s3 s3://버킷명
# google drive 추가시(해시값은 google drive 경로이동후 주소 표시줄에 마지막에 표시된다.)
dvc remote add -d ysoftman_gdrive gdrive://1IJetT6gdSjOU6t4BC-VgLya8RDaQQWMU
# 설정 확인
# .dvc/config 에 아래 스토리 정보가 추가된다.
# [core]
# remote = ysoftman_gdrive
# ['remote "ysoftman_s3"']
# url = s3://버킷명
# ['remote "ysoftman_gdrive"']
# url = gdrive://1IJetT6gdSjOU6t4BC-VgLya8RDaQQWMU
dvc config -l
# 변경된 config 커밋
git add .dvc/config
git commit -m "configure dvc remote stroage"
# 간단한 data/data.csv 파일을 만들고
mkdir data
echo "apple,lemon,orange" > data/data.csv
# dvc 트랙(dvc로 관리,추적할 파일)에 추가
dvc add data/data.csv
# dvc add 되면,
# data/datav.csv.dvc 로 .dvc 확장가 붙은 메타정보(해쉬,경로등)파일이 생성된다.
# data/.gitignore 가 생성되면 /data.csv 가 추가되어 git 에서 무시하도록 한다.
# git 에는 메타 정보 파일과 .gitignore 파일을 커밋한다.
git add data/data.csv.dvc data/.gitignore
git commit -m "add data.csv meta"
# 이제 dvc push 하면 현재 -d(default)로 설정된 google drive 로 푸시한다.
# google drive 의 인증 URL 이 표시되고 해당 페이지에 인증후 인증코드를 터미널에 입력
# .dvc/tmp/gdrive-user-credentials.json 인증정보가 저장된다.
# google drive 에 랜덤(.dvc 에 있는 해시값중 앞2자리)이름이 디렉토리로 생성되며 그안에 특정 바이너리 파일로 저장된다.
dvc push
# git 에도 .dvc 메타정보 .gitignore 파일 push
git push
# 데이터를 변경해보자.
echo "banana,mango" >> data/data.csv
# 변경된 데이터 파일을 dvc 트랙에 추가한다.
# storage 내에 새로운 디렉토리로 저장된다.
dvc add data/data.csv
dvc push
# 자동으로 data.csv.dvc 파일도 변경됐으니 이것도 커밋,푸시한다.
git add data/data.csv.dvc
git commit -m "update data"
git push
# git checkout 등으로 히스토리(버전)로 변경 후 dvc checkout 하면 .dvc 메타정보에 맞는 파일로 변경된다.
git checkout abc123
dvc checkout
# git 에는 .dvc 메타정보만 있기 때문에 git 저장소를 로컬에 새로 clone 받은 경우
# dvc pull 하면 버전에 맞는 데이터가 다운로드 된다.
# 데이터를 삭제할 때
# data/.gitignore 에서 data2.csv.dvc 가 빠진다.
dvc remove data/data2.csv.dvc
# 변경 사항 커밋
git add data/.gitignore
git add data/data2.csv.dvc
git commit -m "remove data2"
# dvc remote storage 확인
dvc remote list
# 디폴트 스토리지 변경
dvc remote default ysoftman_s3
# dvc 서비스되는 파일 보기 /data path
# github > .dvc/config > ysoftman_s3 가 디폴트인 경우
dvc list https://github.com/ysoftman/dvc_test/ data
#####
# google-drive client_id, client_secret 설정
# google cloud > api & service > credentials > oauth 2.0 client ids > desktop app > client id, client secret 파악 후 dvc 설정 후
# github 으로 푸시
dvc remote modify ysoftman_gdrive gdrive_client_id '123'
dvc remote modify ysoftman_gdrive gdrive_client_secret '123'
git commit .dvc/config -m "add ysoftman_gdrive credentials"
git push