포스팅 개요
이번 포스팅은 데이터와 머신러닝 모델(Machine Learning model)의 버전을 관리할 수 있는 Data Version Control(DVC)에 대해 작성합니다.
Machine Learning 프로젝트(혹은 Deep Learning)을 하다보면 ML 모델의 버전 관리, 데이터 버전 관리에 대해서 생각을 하게 되는데요. 그것을 지원해주는 것이 Data Version Control(DVC) 입니다.
저도 회사 선배님께 DVC 키워드를 얼마전 듣게 되었고 바로 간단하게 학습을 해보았습니다.
이번 포스팅에서 사용하려는 DVC는 https://dvc.org/ 입니다. 이 DVC는 open source이고 github에도 자료가 있습니다.참고한 자료는 아래와 같습니다.
포스팅 본문
Data Version Control, DVC란?
Data Version Control 또는 DVC라 불리우는 이 프로젝트 github에 들어가면 DVC에 대해서 설명이 있는데요. 번역하면(영어를 잘 못하지만..) 아래와 같은 내용입니다.
- DVC는 오픈소스이며 data science와 machine learning project를 위한 도구이다
- Git을 같이 사용하며 DB 설치와 같은 설치, 유지가 필요하지 않다
- dataset과 machine learning models를 versioning하고 관리한다. 또한, 데이터는 S3, Google cloud, Azure, HDFS, SSH server 등에 저장된다.
- 프로젝트를 reproducible, shareable 할 수 있도록 한다. model을 어떻게 구축하였는지 질문에 답변이 된다.
- Git의 Tag/Branch 등을 이용해 버전 관리를 한다.
제가 처음 회사 선배님께 이야기를 듣고 하루 정도 학습해본 경험상의 DVC는 아래와 같습니다.
- 대용량 데이터를 Git에 올릴 수 없고, 머신러닝(machine learning) model의 버전 관리가 필요하므로 Data Version Control 이라는 개념니 나오게 되었다.
- DVC는 dataset을 마치 Git 처럼 관리해준다.
- Git을 사용하는 이유는 DVC data의 version관리를 위해서 사용한다.
- 또한, git repo에(github, gitlab 등) .dvc 파일(dataset이 아닙니다.)을 올려 놓고 공유할 수 있으며 원한다면 .dvc 파일을 이용해 데이터를 받을 수 있다.
- 정말 simple 하면서도 강력하다.
좀 더 자세하게 DVC가 어떻게 동작되는지 알고 싶으시면 개요에 공유해드린 github 주소에서 아래 그림과 글을 확인해보시면 됩니다.
DVC에 대한 간단한 설명은 여기까지 하고 바로 파이썬(Python)을 활용해 어떻게 동작이 되는지 실습을 해보겠습니다.
Data Version Control - DVC 실습
먼저, 제가 해본 실습 환경은 아래와 같이 2가지가 있습니다.
- Mac OS
- Windows 10
두 개의 환경 모두 동작이 되었음을 확인했습니다. 실습 방법은 똑같습니다만, 이번 포스팅에서는 Windows 기준으로 설명을 드리겠습니다. (Mac도 아래 방법이랑 똑같습니다.)
그러나, Mac이 훨씬 더 편합니다. 명령어가 매우매우 간편하기 때문입니다. 그리고 Mac 사용자 분들도 아래와 같이 똑같이 하시면 같은 실습을 하실 수 있습니다.
먼저, 제 Mac과 Windows 환경에 설치된 프로젝트 환경은 아래와 같습니다.
- Git 설치
- Python3.6
1. 관련 패키지 설치 및 설정 초기화
먼저, pip install dvc로 dvc 패키지를 설치해줍니다. 설치하는데 시간이 조금 걸립니다. 굉장히 뭔가 많이 설치하더라구요.
그리고 이제 DVC를 test할 디렉토리를 하나 만들어주겠습니다. 저는 디렉토리 이름을 dvc-test 라고 지었습니다.
그리고 dvc-test 안에 들어가서 git init을 통해 git을 초기화 해줍니다.
위 사진과 같이 말이죠!
git init을 한 뒤 dvc init을 해줍니다. 그러면 dvc와 관련된 환경이 초기화 됩니다.
그럼 아래 사진과 같이 2개의 폴더가 생성된 것을 확인할 수 있으실겁니다.
.dvc와 .git 폴더가 생성되었습니다.
2. local 원격 저장소 생성
저는 실습 환경이기 때문에 local 원격 저장소를 생성하려고 합니다. 이 원격 저장소는 DVC에서 관리하는 실제 데이터가 저장되는 장소입니다. 그 말인 즉슨, local 말고 다른 곳도 가능하다는 것이죠.
- S3
- HDFS
- Google Cloude 등
여기서는 local 저장소를 선택해서 하려고합니다.
제가 사용할 데이터가 있는 datas라는 폴더를 만들어줍니다.
그리고 이 datas를 원격 저장소에 연결시켜주기 위해 다음과 같은 명령어를 사용합니다.
dvc remote add -d datas D:\dvc-test\dvc-test-remote
만약, s3에 저장하고 싶으시면
dvc remote add -d datas s3://bucket/ 이런 식으로 하시면 되는 것입니다.
위와 같이 저는 local 저장소에 remote 저장소를 만들었습니다.
그리고 나면, 아까 생성되었던 .dvc 폴더 안에 config 라는 파일이 있는데요. 이 파일을 확인하시면
이렇게 방금 설정한 정보가 들어간 것을 확인할 수 있습니다.
3. 데이터 생성
자, 이제 데이터를 하나 임의로 생성하겠습니다.
방금 만들었던 datas 폴더 안에 Python 파일을 하나 만들겠습니다. 이 파일은 testfile.txt 파일을 만들고 그 안에 random으로 뽑힌 숫자가 입력되도록 하는 코드입니다.
코드와 구조는 위 사진을 참고하시면 되겠습니다.
이제 Python 파일을 실행해서 testfile.txt 파일을 하나 생성하겠습니다.
자! 생성이 되었습니다.
4. Data Version Control에 data add 및 push
이제 DVC 원격 저장소에 data를 add합니다. 여기서 헷갈리시면 안되는 것이 마치 Git과 명령어가 비슷하고, Git도 연동이 되어 있기 때문에 git이랑 헷갈릴 수도 있는데요.
DVC와 Git은 별개입니다. DVC는 말 그대로 Data들을 저장하는 것이고 Git은 이 DVC 데이터들의 Version을 체크하는 용도입니다. (제가 느끼기엔...)
dvc add datas 명령어로 방금 추가한 Python 파일과 testfile.txt이 있는 datas 디렉토리를 add 시켜줍니다.
이렇게 add를 하게 되면 한 가지 변화가 생성되는데요
.dvc 파일과(폴더가 아닙니다) .gitignore 파일이 생성되었다는 것입니다.
그래서 git status를 보면
Untracked files에 .gitignore와 datas.dvc 파일이 생성되었음을 확인할 수 있습니다.
여기서 유심히 보셔야 할 것이 저희가 방금 dvc add datas를 했던 그 datas 폴더의 .dvc 입니다.
그리고 gitignore 파일을 확인해보시면
저희가 가지고 있는 데이터 폴더인 datas는 무시되는 것으로 나오고 있습니다.
즉, 원본 데이터는 무시하고 그 데이터의 정보가 담긴 .dvc를 괸라하는 것입니다.
원본 데이터를 무시하는 이유는 big data와 같은 데이터를 git에 올릴 수 없기 때문이고 이런 데이터는 S3와 같은 데이터 저장소에서 직접 관리하기 때문입니다. 그래서 datas.dvc 파일을 열어서 보면 실제 아래와 같이 보여지고 있습니다.
자! 이제 아까 설정한 원격 저장소(여기에서는 제 local이 원격 저장소)에 push를 하겠습니다.
dvc push를 해줍니다.
그러면 아래 사진과 같이 dvc-test-remote라는 아까 설정했던 디렉토리가 만들어지게 되고 그 안에 데이터 값이 있는 것을 확인할 수 있습니다.
위와 같이 dvc-test-remote라는 디렉토리가 만들어지게 되고
각각의 파일을 보면 위와 같이 데이터 정보가 담겨 있음을 확인할 수 있습니다.
그럼 한 번 더 데이터를 생성(혹은 업데이트) 하게 되면 어떻게 될까요? 실습을 해보죠
아까 만들었던 Python 파일을 한 번 더 실행해서 testfiles.txt 파일을 업데이트 시켜줍니다.
그리고 아까 했던 add, push 과정을 다시 진행합니다.
자 이렇게 했을 때 변화를 살펴보면 아래 사진과 같이 데이터가 추가 되었음을 확인할 수 있습니다.
굉장히 신기합니다 ㅎㅎ
5. Git을 활용해 Version 관리
이제 Git을 활용해서 Tag를 달아 버전 관리(versioning)을 해보겠습니다.
먼저, 아래와 같이 저는 제 github에 실습 환경을 만들었습니다.(https://github.com/lsjsj92/data_version_control)
초반에 dvc 환경에 git init을 하면서 초기화를 했는데요. 이제 remote 설정을 해주겠습니다.
git remote add origin https::깃주소 를 합니다.
아무 에러없이 끝나면 잘 된 것입니다.
여기서 git status를 입력하면 현재 branch는 Master이고 아까 Untracked files가 그대로 있음을 확인합니다.
저는 feature/DVC라는 branch를 하나 생성하겠습니다.
git checkout -b "feature/DVC" 로 branch를 만들면서 branch를 바꾸겠습니다.
그리고 나서 git add .gitignore datas.dvc 파일을 추가해줍니다.
동시에 commit과 tag를 진행해주는데요. tag에는 version 정보를 넣어줍니다.
이제 해당 정보를 git push origin feature/DVC 로 Pull Request 요청 하는 방식으로 보내겠습니다.
짠! 그러면 feature/DVC 안에 해당 자료가 연동되어 올라왔음을 확인할 수 있습니다.
6. datas pull 하기
마지막으로 해볼 것은 datas 디렉토리를 삭제(data가 저장되고 있었던) 하고 pull하는 방법입니다.
먼저 아래와 같이 아까 만들었던 datas 폴더를 삭제합니다.
그리고 dvc pull을 하게 되면~
이미 원격 저장소에 dvc가 연동되어 있기 때문에 pull을 하게 되면 데이터를 가져오는 것을 확인할 수 있습니다.
결론
이번 포스팅은 Data Version Control(DVC) 에 대해서 작성했습니다. 솔직히 아직 기본적인 것만 사용해봐서 자세히는 잘 모르겠습니다.
하지만, 굉장히 흥미롭고 재미있는 주제이네요. 잘 사용만 한다면 굉장히 큰 도움이 될 것 같습니다.
제가 설명한 것 중 틀린 것과, 잘못된 것이 분명히 있을겁니다. 지적해주시면 감사하겠습니다!
'Data Engineering 및 Infra' 카테고리의 다른 글
kubeflow pipeline 사용해보기 - kubeflow pipeline example with iris data (22) | 2020.04.07 |
---|---|
kubeflow 설치하기 - Machine Learning pipeline kubeflow install (14) | 2020.04.05 |
머신러닝 파이프라인이란? - ML Pipeline에 대하여 (6) | 2020.03.29 |
쿠버네티스(kubernetes) example - Python Django 웹 페이지 배포하기 (8) | 2020.03.22 |
AWS Chalice란? Python 기반 serverless framework chalice 사용하기 (4) | 2020.02.25 |