DVC 설명 및 필수 활용 방법 정리

2023. 12. 8. 23:18꿀팁 분석 환경 설정/파이썬 개발 팁

728x90

소개

모든 머신 러닝(ML) 개발자들은 ML 프로젝트의 성공에 있어서 데이터가 얼마나 중요한지 잘 알고 있습니다. 아주 조금의 데이터 변경도 결과에 극적인 변화를 가져올 수 있습니다. 그래서 데이터에 발생하는 모든 변화를 추적하는 것이 매우 중요합니다.

우리가 이야기하는 것은 'data versioning'라고 불립니다.

data versioning란 무엇인가?

data versioning(버전 관리)는 프로젝트의 다양한 시점에서 스냅샷을 유지하는 행위입니다. 이 방법은 수십 년 동안 소프트웨어 공학에서 흔히 알려져 있으며, 현대 소프트웨어 개발 과정에서 매우 중요해졌습니다. 버전 관리를 하는 것은 프로젝트 소유자에게 두 가지 주요 이점을 제공합니다:

  1. 가시성: 작업의 버전을 유지함으로써 소유자는 시간이 지남에 따라 프로젝트에 무엇이 추가되었고, 수정되었으며, 제거되었는지에 대한 아이디어를 얻을 수 있습니다.
  2. 위험 관리: 한 버전에 예상치 못한 문제가 발생한 경우, 프로젝트 소유자는 적절하다고 생각되는 다른 버전을 사용하여 문제를 완화할 수 있습니다. 각 버전의 세부 사항을 설명하는 문서를 갖고 있으면 소유자가 각각의 차이점을 알고 상황을 더 잘 관리하는 데 도움이 됩니다.

 

데이터 과학은 소프트웨어 개발과 주로 코드가 작동 가능한 제품의 설계도가 아니라는 점에서 다릅니다.
ML 프로젝트는 레시피와 같으며 코드는 요리 단계(전처리, 모델 훈련 및 평가)를 설명하여 요리(예측 모델, 분석 보고서 또는 맞춤형 출력)를 만듭니다.
그러나 적절한 재료(데이터)가 없다면 단계를 알고 있다고 해서 요리를 만들 수는 없습니다.
따라서 ML 프로젝트를 재현 가능하게 만들기 위해 소유자는 코드와 데이터 모두에 대한 버전 관리가 필요합니다.

재현성이 왜 그렇게 중요한지 묻는 질문이 있을 수 있습니다. 생성 단계에 신경 쓰지 않고 모델만 사용할 수는 없을까요? 물론 할 수 있습니다. 실제로 제 경험에 따르면 많은 ML 프로젝트들이 초기 단계에서는 그것에 대해 신경 쓰지 않았습니다.
그러나 프로젝트가 더 복잡해지면, 이러한 무질서한 과정은 종종 문제를 일으킵니다.
배포한 모델이 우연히 손실되고 아무도 백업을 갖고 있지 않다면 어떻게 될까요? 모델 성능을 최적화하지만 재훈련이 필요한 새로운 버전의 ML 라이브러리가 있다면 어떻게 될까요? 머지않아 작업이 재현 가능해야 할 것입니다. 개발 초기부터 이를 강조함으로써 장기적으로 더 즐겁고 생산적인 작업을 할 수 있습니다.

![[Pasted image 20231208151446.png]]

DVC를 사용한 데이터 버전 관리 이제 데이터 버전 관리가 왜 필요한지 알게 되었으니, 관련된 패키지를 소개합니다.
먼저 필요한 것은 도구이며, 이 게시물에서는 여기에 있는 지침을 따라 쉽게 설정할 수 있는 DVC를 사용할 것입니다.

DVC는 Git과 같은 버전 관리 시스템과 함께 사용하기 위해 설계된 도구입니다.

전반적으로, DVC의 작동 방식은 데이터를 DVC 명령을 사용하여 프로젝트에 추가할 때, DVC가 데이터를 원격 저장소에 업로드하고 해당 위치를 가리키는 메타데이터 파일을 생성합니다. 그런 다음, 메타데이터 파일을 Git 저장소에 추가하여 버전 관리됩니다. 데이터 파일이 수정되거나 추가/제거되면 메타데이터 파일이 업데이트되고 새 데이터가 업로드됩니다. 이 방법으로 메타데이터 파일을 사용하여 실제로 저장소에 저장하지 않고도 데이터를 추적하고 협업자와 공유할 수 있습니다.

실제로 손을 대지 않으면 이것이 매우 혼란스러울 수 있습니다. 따라서 다음 기사에서는 DVC를 사용하여 기계 학습 데이터를 버전 관리하는 방법을 단계별로 보여드리겠습니다.

그렇다면 이제 DVC에서 말하는 특징은 다음과 같습니다
DVC USER 가이드

Data Version Control는 데이터 관리, ML 파이프라인 자동화 및 실험 관리를 위한 무료 오픈 소스 도구입니다. 이는 데이터 과학 및 기계 학습 팀이 대규모 데이터 세트를 관리하고, 프로젝트를 재현 가능하게 만들고, 더 효과적으로 협업하는 데 도움이 됩니다.

DVC(Data Version Control)에 대한 설명을 한국어로 번역 및 요약하면 다음과 같습니다:

  1. Codification: DVC는 기계 학습(ML) 프로젝트의 모든 요소(데이터 및 모델 버전, ML 파이프라인, 실험 등)를 사람이 읽을 수 있는 메타파일로 정의할 수 있게 해줍니다. 이를 통해 데이터 과학과 소프트웨어 엔지니어링 간의 격차를 줄이면서, 기존의 엔지니어링 도구 및 모범 사례를 사용할 수 있습니다.
  2. Versioning: DVC는 Git이나 다른 소스 코드 관리(SCM) 시스템을 사용하여 전체 ML 프로젝트를 버전 관리하고 공유할 수 있게 해줍니다. 이는 소스 코드, 설정, 매개변수, 메트릭뿐만 아니라 데이터 자산과 프로세스도 포함합니다. 이때, DVC 메타파일이 플레이스홀더로 사용됩니다.
  3. Secure collaboration: DVC는 프로젝트의 모든 측면에 대한 접근을 제어하고, 선택된 사람이나 팀과 안전하게 공유할 수 있게 해줍니다.

이러한 방식으로 DVC는 기존 소프트웨어 엔지니어링 도구(Git, IDE, CI/CD, 클라우드 스토리지 등)와 통합되어 ML 프로젝트 관리를 효율적으로 지원합니다.

지금부터 간단하게 사용 방법에 대해서 알아보고자 합니다

사용자 가이드에서는 주로 간단한 사용 방법 그리고 1) 데이터랑 모델 관리하는 가이드, 2)파이프라인을 정의 3) 파이프라인으로 실험 돌리기 4) 실험 결과 공유하기
정도만 공유하고자 합니다.

실제로는 더 많은 기능들이 있어서 관심이 있는 분들은 가이드를 보면 좋을 것 같습니다.

사용 가이드

설치

pip install dvc

Initiating DVC

DVC를 사용하기 전에, 다음 명령을 사용하여 필요한 모든 구성을 생성해야 합니다. (참고: 이 작업은 Git 저장소의 루트에서 수행되어야 합니다.)
이 명령은 DVC를 초기화하며, 이 과정은 프로젝트에 필요한 DVC 설정 파일과 디렉토리를 생성합니다. 이 초기화는 Git 저장소의 루트 디렉토리에서 수행되어야 하므로, 프로젝트가 이미 Git으로 관리되고 있는지 확인하고 해당 디렉토리에서 dvc init을 실행해야 합니다.

dvc init

명령이 완료되면, .dvcignore 파일과 .dvc 폴더가 생성된 것을 볼 수 있습니다. 현재는 .dvcignore 파일을 무시해도 좋습니다. 이 파일은 고급 사용을 위한 것으로, 지금 당장 다루지 않을 예정입니다. .dvc 폴더를 확장해 보면 내부에 여러 폴더와 파일들이 있는 것을 볼 수 있습니다.
원격 저장소를 구성할 때 .dvc/config 파일만 사용할 예정입니다.
초기 설정을 완료하려면, 모든 파일을 Git 저장소에 추가하고 커밋하면 됩니다.

이를 위해 다음과 같은 Git 명령을 사용할 수 있습니다:

![[1_Fo1XPOJly2_z3QwodNE90g.gif]]

Tracking the data

dvc add _<path-to-file-or-folder>_

명령이 실행되면 두 개의 파일이 생성됩니다: .gitignore  <file-or-folder-name>.dvc 입니다.

  • .gitignore — 이 파일은 Git 저장소에서 특정 파일이나 폴더를 제외합니다.
  • <file-or-folder-name>.dvc — 이 파일은 추가된 파일이나 폴더에 대한 정보를 저장하는 메타데이터이며, 특정 데이터 버전과 연결됩니다.

.dvc 파일을 실제 데이터를 가리키는 플레이스홀더로 생각할 수 있습니다. 데이터를 버전 관리하기 위해서, 이 파일을 다음 명령을 사용하여 Git 저장소에 추가해야 합니다:

git add .gitignore <file-or-folder-name>.dvc
git commit -m "Add data to project"

이것이 데이터를 버전 관리하는 데 필요한 모든 작업입니다. 그러나, 이 커밋에 대해 Git 태그를 생성하는 것이 좋습니다. 태그가 있으면 원하는 커밋을 찾기 위해 모든 커밋을 검색할 필요 없이 데이터 버전 간에 쉽게 전환할 수 있습니다. 태그를 생성하려면 다음 명령을 사용하세요:

git tag -a <tag_name> -m <Description>

이 명령을 통해 원하는 태그 이름과 설명을 추가하여 데이터 버전을 보다 명확하게 식별할 수 있습니다. 태그는 프로젝트의 특정 시점을 표시하는 데 유용하며, 나중에 필요한 데이터 버전으로 쉽게 돌아갈 수 있게 해줍니다.!

![[1_AWXHk3I8rFW_LFtc7oBsHA.gif]]

Pushing the data to a remote server

DVC가 데이터를 추적하고 있지만, 이 데이터는 현재 로컬에만 존재합니다. 기계에 문제가 생기면 데이터가 영원히 사라질 수 있기 때문에 이는 매우 위험합니다.
따라서 데이터를 안전하게 백업할 수 있는 원격 저장소를 갖는 것이 필수적입니다. DVC는 이를 지원하는 기능을 갖추고 있습니다. 다음은 그 사용 방법입니다.

먼저, 다음 명령을 사용하여 원격 저장소를 구성해야 합니다:

dvc remote add -d <storage_name> <url_to_remote_storage>

이 명령이 완료되면, .dvc/config 파일이 다음과 같이 수정된 것을 볼 수 있습니다:

[core]
   remote = storage_name
['remote "storage_name"']
   url = url_to_remote_storage

이제 다음 명령을 사용하여 데이터를 클라우드 저장소에 업로드할 수 있습니다:

dvc push

클라우드 저장소 제공업체에 따라, 클라우드 저장소 자격 증명을 구성해야 할 수도 있습니다. 이 게시물에서는 Google 드라이브를 사용하고 있으며, 인증 링크를 통해 본인을 인증해야 합니다. 아래 GIF는 DVC를 사용하여 Google 드라이브에 데이터를 업로드하는 단계별 방법을 보여줍니다.

![[1_ZK8DJhkTljlEkXJWlGpPrg.gif]]

Modifying the data

지금까지 우리가 한 것은 단지 추적 및 백업뿐입니다.
그러나 데이터 버전 관리의 진정한 이점은 데이터를 수정하기 시작할 때 두드러집니다.

데이터를 수정하려면 파일이나 폴더의 내용을 업데이트(또는 교체)한 다음 추가할 때와 동일한 명령을 실행하면 됩니다. .dvc 파일이 변경된 것을 알 수 있습니다. 스냅샷을 원하는 모든 버전에 대해 해당 메타데이터 파일을 커밋하세요. 아래 GIF는 이 과정이 어떻게 보이는지 보여줍니다.

![[1_Yxcgy4F-bRJXBrH14ksWgw.gif]]

데이터 전환 이전 섹션에서 우리는 두 가지 버전의 데이터를 가지고 있습니다. 최신 버전이 문제가 있다고 판단되어 첫 번째 버전으로 돌아가야 한다고 가정해 봅시다. 다음은 그 방법입니다.

첫 번째 데이터 버전이 추가된 커밋으로 .dvc 파일을 체크아웃합니다.

git checkout <commit_id> <file-or-folder-name>.dvc

해당 태그를 만들었다면, 다음을 사용할 수도 있습니다:

git checkout <tag_name> <file-or-folder-name>.dvc

이것이 처음에 태그를 만드는 것이 권장되는 이유입니다. 완전히 무작위인 커밋 ID보다 의미 있는 태그 이름을 찾는 것이 더 쉽기 때문입니다.

그런 다음, 다음을 사용하여 특정 버전을 검색합니다:

dvc pull

아래 그림은 데이터 버전을 전환하는 방법을 단계별로 보여줍니다.

![[1_WBndJMfdWdDbQls8_tPInQ.gif]]

사용가이드 - 데이터 관리

Data Versioning

코드와 함께 대규모 데이터셋과 머신 러닝 모델을 추적하고, 이를 Git에 저장하는 데 따른 제한은 항상 프로젝트마다 발생하게 됩니다.
만약 저장소를 복제한 후에 데이터셋, 체크포인트 및 모델이 바로 작업 공간에 준비되어 있다면 이러한 문제를 해결할 수 있을 것입니다. 그리고 또한, git checkout을 사용하여 100Gb 파일의 다른 버전으로 1초 미만으로 빠르게 전환하는 것이 가능합니다.

💫 DVC는 바로 여러분의 '데이터를 위한 Git' 이라고 합니다.

데이터 추적

초기화된 프로젝트 디렉토리 내에서 작업하며, 우리는 작업할 데이터를 선택합니다. 예시로 data.xml 파일을 사용하겠지만, 모든 텍스트나 이진 파일(또는 디렉토리)도 사용할 수 있습니다. 시작하기 위해 다음을 실행하세요:

dvc get https://github.com/iterative/dataset-registry \
          get-started/data.xml -o data/data.xml

위에서 'dvc get' 명령어를 사용하여 DVC가 어떻게 Git 저장소를 "data registry"로 변환할 수 있는지 보여주었습니다. 'dvc get'은 DVC 저장소에서 추적되는 어떠한 파일이나 디렉토리도 다운로드할 수 있습니다.

이 기능은 데이터 공유와 재사용을 편리하게 만들며, 사용자가 특정 데이터셋에 쉽게 접근할 수 있도록 해줍니다. DVC를 사용함으로써, Git 저장소 내에 데이터를 안전하고 효율적으로 관리하고, 필요할 때마다 쉽게 검색하고 다운로드할 수 있습니다. 이는 데이터 기반 프로젝트의 협업과 관리를 크게 간소화하는 강력한 도구입니다.

Use dvc add to start tracking the dataset file:

dvc add data/data.xml

DVC는 추가된 파일에 대한 정보를 data/data.xml.dvc라는 특별한 .dvc 파일에 저장합니다. 이 작고 인간이 읽을 수 있는 메타데이터 파일은 Git 추적을 위해 원본 데이터를 대신하는 플레이스홀더 역할을 합니다.

다음으로, Git에서 변경 사항을 추적하기 위해 다음 명령들을 실행하세요:

  1. Git에 .dvc 파일 추가하기: 먼저, 생성된 .dvc 파일을 Git 저장소에 추가합니다. 이는 DVC가 추적하는 파일의 변경 사항을 Git에서도 추적할 수 있게 해줍니다.
git add data/data.xml.dvc data/.gitignore
$ git commit -m "Add raw data"

이제 데이터에 대한 메타데이터는 소스 코드와 함께 버전 관리되고 있으며, 원본 데이터 파일은 .gitignore에 추가되었습니다.

  • 궁금증 데이터를 다운로드해야 하나요?
    • 'dvc add'를 사용하면 순수 Git에서는 관리하기 어려운 파일과 디렉토리를 추적하고 관리할 수 있지만, 경우에 따라 DVC로 추적하는 것도 비현실적일 수 있습니다. 예를 들어, 클라우드에 저장된 대량의 데이터에서 직접 Spark 기반 워크플로우를 실행하는 경우, 각 버전의 사본을 다운로드하고 저장하고 싶지 않을 수 있습니다. 다음 페이지에서는 DVC가 관리하지 않는 외부 데이터의 변경 사항을 감지하기 위해 DVC의 파이프라인을 어떻게 사용할 수 있는지에 대한 팁을 볼 수 있습니다.

저장 및 공유

DVC로 추적된 데이터를 "remote"라고 불리는 다양한 저장 시스템(원격 또는 로컬)에 업로드할 수 있습니다. 간단함을 위해, 이 가이드에서는 로컬 파일 시스템의 디렉토리인 "로컬 remote"를 사용할 것입니다.

이 접근 방식은 데이터를 효율적으로 관리하고, 필요에 따라 다른 버전으로 쉽게 전환할 수 있게 해줍니다.
로컬 파일 시스템을 이용한 "로컬 remote" 설정은 특히 개발 초기 단계나 소규모 프로젝트에 적합하며, DVC의 기능을 쉽게 탐색하고 이해하는 데 도움이 됩니다.

Configuring a remote

Before pushing data to a remote we need to set it up using the dvc remote add command

mkdir /tmp/dvcstore
$ dvc remote add -d myremote /tmp/dvcstore
  • 궁금증
    • DVC는 Amazon S3, NFS, SSH, Google 드라이브, Azure Blob 저장소, HDFS 등 다양한 유형의 원격 저장소를 지원합니다.
    • 일반적인 사용 사례로, Amazon S3 원격 저장소를 구성하는 예시는 다음과 같습니다:
      dvc remote add -d storage s3://mybucket/dvcstore

Uploading data

Now that a storage remote was configured, run dvc push to upload data:

dvc push

Retrieving data

원격으로 저장된 DVC 추적 데이터와 모델들은 필요할 때 'dvc pull'을 사용하여 다운로드할 수 있습니다(예를 들어, 이 프로젝트의 다른 복사본에서). 보통 'git pull'이나 'git clone'을 실행한 후에 'dvc pull'을 실행합니다.

dvc pull
  • 궁금증 : 테스트
    • 이런 식으로 삭제하고 테스트하면 데이터를 가져올 수 있게 됩니다.
      $ rm -rf .dvc/cache
      $ rm -f data/data.xml
      $ dvc pull

Making local changes

다음으로, 외부 소스에서 더 많은 데이터를 얻었다고 가정해 봅시다. 이를 시뮬레이션하기 위해 데이터셋의 내용을 두 배로 늘려 보겠습니다. 이것은 데이터 과학 프로젝트에서 흔히 발생하는 상황을 모방하는데, 새로운 데이터가 프로젝트에 통합될 때 이를 효과적으로 관리하는 방법을 보여줍니다. 데이터셋을 두 배로 늘리는 과정은 다음과 같습니다:

cp data/data.xml /tmp/data.xml
$ cat /tmp/data.xml >> data/data.xml

수정 후 다시 dva add로 최신 버전을 추적합니다.

dvc add data/data.xml

remote storage의 변화를 업로드하기 위해서 dvc push를 진행합니다.
그 후에는 변경 사항을 추적하기 위해 git commit을 실행합니다.

dvc push
$ git commit data/data.xml.dvc -m "Dataset updates"

Switching between versions

일반적으로 사용되는 워크플로우는 git checkout을 사용하여 브랜치로 전환하거나 특정 .dvc 파일 버전을 체크아웃한 다음, dvc checkout을 실행하여 데이터를 작업 공간과 동기화하는 것입니다. 이 과정은 다음과 같습니다:

  1. Git Checkout 사용하기: 먼저, 다른 브랜치로 전환하거나 특정 .dvc 파일의 이전 버전으로 전환하기 위해 git checkout 명령을 사용합니다. 예를 들어, 특정 브랜치로 전환하거나 특정 커밋에서 .dvc 파일을 체크아웃할 수 있습니다.
    git checkout <...>
    
2. **DVC Checkout 사용하기**: 그 다음, `dvc checkout` 명령을 실행하여 DVC가 추적하는 데이터를 최신 상태로 동기화합니다. 이 명령은 데이터 파일을 현재 Git 브랜치 또는 체크아웃한 `.dvc` 파일 버전에 해당하는 상태로 복원합니다.

```cli
dvc checkout

이 워크플로우는 데이터와 코드의 버전을 쉽게 관리할 수 있게 해줍니다. 예를 들어, 다른 실험을 위한 브랜치로 전환하거나 이전 데이터셋 버전으로 되돌아가는 등의 작업을 간단하게 할 수 있습니다. 이 방식으로, 데이터 과학자들과 개발자들은 데이터와 코드의 버전을 쉽게 관리하고, 프로젝트의 다양한 단계와 실험을 효율적으로 처리할 수 있습니다.

Return to a previous version of the dataset

이제 원래 버전의 데이터로 돌아가 보겠습니다:

  1. Git Checkout 실행하기: 먼저, data/data.xml.dvc 파일의 이전 버전으로 체크아웃합니다.
git checkout HEAD~1 data/data.xml.dvc
  1. DVC Checkout 실행하기: 그 후에 dvc checkout을 실행하여 해당 데이터 파일을 이전 버전으로 복원합니다.
    dvc checkout
  2. 변경 사항 커밋하기: 이제 이 변경 사항을 커밋합니다. 이번에는 dvc push를 할 필요가 없습니다. 이미 이전 버전의 데이터셋은 저장되어 있기 때문입니다.
    git commit data/data.xml.dvc -m "Revert dataset updates"

DVC는 기술적으로 독자적인 버전 관리 시스템은 아닙니다! DVC는 .dvc 파일을 조작하는데, 이 파일의 내용이 데이터 파일 버전을 정의합니다. 이미 코드를 버전 관리하는 데 사용되는 Git은 이제 데이터를 코드와 함께 버전 관리하는 데도 사용할 수 있습니다.

사용가이드 - Fast and Secure Data Caching Hub

![[Pasted image 20231208165915.png]]
데이터 과학에서 사용되는 데이터셋은 일반적인 저장 및 네트워크 용량을 초과하는 경우가 많습니다. 더 많은 사람들이 동일한 데이터를 획득할수록 저장 공간이 급속하게 확장되어 중복이 발생하며 (비용이 증가함) 다운로드를 기다리는 데 소중한 시간이 낭비됩니다.

DVC의 내장 데이터 캐싱 기능을 사용하면 팀 전체에 대한 간단하고 효율적인 저장 레이어를 전 세계적으로 구현할 수 있습니다. 이 접근 방식은 다음과 같은 도움이 될 수 있습니다:

  • 클라우드의 대용량 객체 스토어에서 데이터 전송 속도를 높이거나 데이터를 여러 기기 간에 빠르게 공유합니다.
  • 자주 사용되는 데이터에 대한 빠른 액세스만 지불하고 (전체 저장 플랫폼 업그레이드는 비용이 많이 듦).
  • 여러 사람이 동일한 데이터에서 작업할 때 (예: 공유 개발 서버에서) 데이터를 다시 다운로드하고 파일을 중복으로 만드는 것을 피합니다.
  • 기계 학습 실험에 사용되는 공유 서버에서 데이터 입력을 빠르게 전환하고 다시 다운로드하지 않습니다.
    ![[Pasted image 20231208165941.png]]근처 위치 (네트워크, 외장 드라이브 등)에 공유 DVC 캐시를 설정하여 모든 프로젝트에 대한 단일 스토리지를 사용할 수 있습니다. 이를 통해 데이터셋 간에 파일을 중복으로 만들지 않고 작업 파일과 디렉토리를 연결하여 반복 전송을 방지합니다. 데이터 보안 정책을 신뢰성 있게 구현할 수 있으며 데이터가 중앙 저장소를 벗어나지 않으므로 데이터 백업 및 외부/원격 위치에서 데이터와 ML 모델을 공유하는 데도 DVC를 사용할 수 있습니다.

이제 팀이 주요 스토리지를 공유하므로 이를 프로젝트 인프라의 일부로 독립적으로 관리할 수 있습니다. 데이터 액세스 속도 및 비용 요구 사항에 따라 프로비저닝됩니다. 프로젝트의 디렉토리 구조나 코드를 변경하지 않고 언제든지 스토리지 제공 업체를 변경할 수 있는 유연성이 있습니다.

## Transfer existing cache (optional)

새로운 DVC 프로젝트를 설정하는 경우로서 기본적으로 사용되지 않은 로컬 캐시 디렉터리인 (.dvc/cache)이 있는 경우에는이 부분을 건너 뛸 수 있습니다.
그전에 DVC 프로젝트에서 작업하고 있었고 기존 캐시를 공유 캐시 디렉터리로 이전하려는 경우, 기존 위치에서 새 위치로 해당 내용을 이동해야 합니다.

$ mv .dvc/cache/* /home/shared/dvc-cache

그런 다음 캐시된 디렉터리 및 파일이 동료들에 의해 액세스 할 수 있도록 적절한 권한을 부여해야합니다 (동료의 사용자가 동일한 그룹의 구성원인 것으로 가정).

$ sudo find /home/shared/dvc-cache -type d -exec chmod 0775 {} \;
$ sudo find /home/shared/dvc-cache -type f -exec chmod 0444 {} \;
$ sudo chown -R myuser:ourgroup /home/shared/dvc-cache/

공유 캐시 구성

작업 공간 외부의 캐시 디렉토리를 외부 캐시라고합니다. dvc cache dir로 생성한 디렉토리로 설정하고 dvc config cache로 구성합니다.

$ dvc cache dir /home/shared/dvc-cache

$ dvc config cache.shared group
$ dvc config cache.type symlink

위에서 먼저 DVC에게 새 캐시 파일에 그룹 권한을 설정하도록 지시합니다. 그런 다음 작업 공간에서 외부 캐시로 복사본을 갖지 않도록 심볼릭 링크를 활성화합니다.

git add .dvc/config
$ git commit -m "config external/shared DVC cache"

사용가이드 - Pipelines

만약 프로젝트 결과물을 얻거나 업데이트하기 위해 일련의 작업을 반복하게 된다면, 이미 파이프라인을 가지고 있는 것일 수 있습니다. 예를 들어, 데이터 과학 워크플로우는 다음과 같은 단계를 포함할 수 있습니다:

  1. 훈련 및 검증을 위한 데이터 수집
  2. 훈련 데이터셋에서 유용한 기능 추출
  3. 머신 러닝 모델을 (재)훈련
  4. 검증 세트에 대한 결과 평가

DVC는 이러한 단계를 표준 YAML 형식(.dvc 및 dvc.yaml 파일)으로 정의하는 데 도움이 되어 파이프라인을 관리하고 재현하기 쉽게 만들어줍니다.

Defining Pipelines

파이프라인은 결과를 일관되게 재현하고자 하는 데이터 워크플로를 나타냅니다. 일반적인 파이프라인 프로세스는 다음과 같습니다:

프로젝트의 초기 데이터 요구 사항을 가져와서 dvc add 또는 dvc import를 사용합니다 (데이터 버전 관리 참조). 이렇게 하면 데이터가 캐시되고 .dvc 파일이 생성됩니다.

dvc.yaml 파일에서 파이프라인 단계를 정의합니다 (이후에 자세히 다룰 것입니다). 예제 구조는 다음과 같습니다:

stages:
  prepare: ... # stage 1 definition
  train: ... # stage 2 definition
  evaluate: ... # stage 3 definition

기타 유용한 메타데이터를 캡처하세요. 예를 들어 런타임 매개변수, 성능 메트릭, 시각화를 위한 플롯과 같은 것들을 포함합니다. DVC는 이러한 메타데이터를 위한 다양한 파일 형식을 지원합니다.

우리는 이를 파일 기반 정의 (YAML 형식인 경우)라고 부릅니다. 이것은 표준 Git 워크플로우 (및 GitOps)에서 파이프라인을 개발할 수 있는 추가 이점을 제공합니다.

보통 각 단계는 데이터를 가져오고 코드를 실행하여 출력 (예: ML 모델)을 생성합니다. 파이프라인은 이러한 단계를 상호 의존적으로 만들어 출력이 다른 단계의 입력이 되도록 형성됩니다. 기술적으로 이것은 의존성 그래프 (DAG)라고 합니다.

각 파이프라인이 그래프인 것은 의미하지만 단일 dvc.yaml 파일을 의미하지는 않습니다. DVC는 전체 프로젝트 트리를 확인하고 이러한 파일을 찾아 모든 파이프라인을 다시 구축하는 등의 작업을 수행합니다.

  • Directed Acyclic Graph (DAG)
    • Directed Acyclic Graph (DAG) DVC 내부에서 파이프라인을 그래프로 표현합니다. 여기서 노드는 단계이고 엣지는 방향성 있는 의존성 (예: A가 B보다 앞에 있음)입니다. 그리고 DVC가 파이프라인을 실행하려면 그 토폴로지가 비순환적이어야 합니다. 왜냐하면 순환을 실행하는 경우 (예: A -> B -> C -> A ...) 무한히 계속될 것이기 때문입니다. DAG에 대한 더 자세한 내용은 DAGs 페이지를 참조하십시오.
    • dvc dag를 사용하여 DAG를 시각화하거나 (또는 내보내기)할 수 있습니다.

Stages

specification

다음은 각 단계에서 허용되는 필드를 포함한 테이블 형식입니다:

필드설명

cmd (필수) 실행할 하나 이상의 쉘 명령 (단일 값 또는 목록 포함 가능). cmd 값은 params 파일에서 사전 대체를 사용할 수 있습니다. 명령은 모두 완료되거나 그 중 하나가 실패할 때까지 순차적으로 실행됩니다 (dvc repro 참조).
wdir (상대적으로 파일 위치 기준) cmd를 실행할 작업 디렉터리. 다른 필드의 경로도 이를 기준으로 합니다. 기본값은 . (파일 위치)입니다.
deps (작업 디렉터리 기준으로 상대적인) 종속성 경로 목록.
outs (작업 디렉터리 기준으로 상대적인) 출력 경로 목록. 이러한 경로에는 일부 선택적 하위 필드가 포함될 수 있습니다.
params params.yaml에서 추적할 매개변수 종속성 키 (필드 이름) 목록 (작업 디렉터리 기준). 목록에는 이들에서 추적할 매개변수 파일 이름과 그 안에서 추적할 param 이름의 하위 목록도 포함될 수 있습니다.
frozen 이 단계가 얼음 상태인지 여부 (복제 중에 실행 방지)
always_changed 이 단계를 항상 변경된 것으로 간주하도록 만듭니다. dvc status 및 dvc repro와 같은 명령에서 기본적으로는 false입니다.
meta (선택적) 임의의 메타데이터를 이 필드를 사용하여 수동으로 추가할 수 있습니다. YAML 내용이 지원됩니다. DVC에서는 meta 내용을 무시하지만 .dvc 파일을 직접 읽거나 쓰는 사용자 프로세스에는 의미가 있을 수 있습니다.
desc (선택적) 사용자 설명. 이는 DVC 작업에 영향을 주지 않습니다.

각 단계는 실행 가능한 쉘 명령을 감싸며 파일 기반 종속성과 출력을 지정합니다. 샘플 단계를 살펴보겠습니다: 이 단계는 실행되는 스크립트 파일 및 원시 데이터 입력에 종속됩니다 (이상적으로는 DVC에 이미 추적되어야 함):

수동 방식

stages:
  prepare:
    cmd: source src/cleanup.sh
    deps:
      - src/cleanup.sh
      - data/raw
    outs:
      - data/clean.csv

수동으로 dvc.yaml 파일을 작성하는 것 외에도 파이프라인을 설정하는 제한된 명령 줄 인터페이스인 'dvc stage add'를 사용하여 단계를 생성할 수 있습니다. 이 방법으로 다른 단계를 추가하고 생성된 dvc.yaml을 살펴보겠습니다.

데이터 과학 워크플로우의 경우:

  1. 훈련 및 검증 데이터 수집
  2. 훈련 데이터에서 유용한 기능 추출
  3. 머신 러닝 모델 훈련 및 재훈련
  4. 검증 세트를 사용하여 결과 평가

DVC는 이러한 단계를 표준 YAML 형식의 파일로 정의하도록 도와주며, 파이프라인을 더 쉽게 관리하고 재현 가능하도록 합니다. 이러한 단계를 정의하는 방법에 대한 자세한 내용은 "데이터 파이프라인 시작하기"를 참조하십시오.

cmd 방식

dvc stage add --name train \
                --deps src/model.py \
                --deps data/clean.csv \
                --outs data/predict.dat \
                python src/model.py data/clean.csv
stages:
  prepare:
    ...
    outs:
      - data/clean.csv
  train:
    cmd: python src/model.py data/model.csv
    deps:
      - src/model.py
      - data/clean.csv
    outs:
      - data/predict.dat

'dvc stage add'를 사용하는 장점 중 하나는 제공된 인수의 유효성을 검증한다는 것입니다(그렇지 않으면 단계 정의가 실행될 때까지 확인되지 않음). 단점 중 하나는 이 방법으로는 템플릿과 같은 고급 기능을 사용할 수 없다는 것입니다.

usage: dvc stage add [-h] [-q | -v] -n <name> [-f]
                 [-d <path>] [-p [<filename>:]<params_list>]
                 [-o <filename>] [-O <filename>] [-c <filename>]
                 [--outs-persist <filename>]
                 [--outs-persist-no-cache <filename>]
                 [-m <path>] [-M <path>]
                 [--plots <path>] [--plots-no-cache <path>]
                 [-w <path>] [--always-changed] [--desc <text>]
                 [--run]
                 command

positional arguments:
  command               Command to execute

Simple dependencies

간단한 종속성 (Simple dependencies)은 단계 명령어에서 입력으로 사용되는 파일 또는 디렉토리의 종속성 유형 중 하나입니다. 그 내용이 변경되면 DVC가 해당 단계를 "무효화"하며, 다시 실행해야 함을 알고 있습니다 (dvc status 참조). 이로 인해 파이프라인의 후속 단계도 다시 생성될 수 있습니다.

DVC는 파일/디렉토리 내용의 해시를 계산하여 이전 버전과 비교합니다. 이것은 make와 같은 전통적인 빌드 도구와 다른 독특한 메커니즘입니다.

파일 시스템 수준의 종속성은 dvc.yaml 단계의 deps 필드에서 정의되며, 또는 dvc stage add의 --deps (-d) 옵션을 사용하여 정의할 수 있습니다 (이전 섹션의 예 참조).

Parameter dependencies

매개변수 종속성(Parameter dependencies)은 더 세부적인 종속성 유형 중 하나로, 기계 학습에서 하이퍼파라미터(hyperparameters)와 같은 매개변수를 포함합니다. 이것들은 코드 내에서 데이터 처리를 조정하거나 다른 방식으로 단계 실행에 영향을 주는 데 사용되는 모든 값을 나타냅니다. 예를 들어, 신경망 훈련은 일반적으로 배치 크기 및 에포크 값이 필요합니다.

매개변수 값을 하드 코딩하는 대신 코드에서 구조화된 파일(예: YAML 형식)에서 읽을 수 있습니다. DVC는 기본적으로 params.yaml 파일에서 지원되는 키/값 쌍을 추적할 수 있습니다. Params는 그라뉴라 종속성입니다. 왜냐하면 DVC는 params 파일의 해당 부분이 변경되었을 때만 단계를 무효화합니다.

stages:
  train:
    cmd: ...
    deps: ...
    params: # from params.yaml
      - learning_rate
      - nn.epochs
      - nn.batch_size
    outs: ...
  • 실제 예시
    stages:
    preprocess:
      cmd: bin/cleanup raw.txt clean.txt
      deps:
        - raw.txt
      params:
        - threshold # track specific param (from params.yaml)
        - nn.batch_size
        - myparams.yaml: # track specific params from custom file
            - epochs
        - config.json: # track all parameters in this file
      outs:
        - clean.txt

Running pipelines

파이프라인을 실행하려면 dvc repro 또는 dvc exp run을 사용할 수 있습니다. 어느 쪽이든 파이프라인을 실행하며, dvc exp run은 결과를 실험으로 저장하고 (명령 줄에서 매개변수를 수정하는 등) 다른 실험 관련 기능도 제공합니다.

dvc exp run

dvc exp run --set-param featurize.ngrams=3

Reproducing experiment 'funny-dado'
'data/data.xml.dvc' didn't change, skipping
Stage 'prepare' didn't change, skipping
Running stage 'featurize':
> python src/featurization.py data/prepared data/features
Updating lock file 'dvc.lock'

Running stage 'train':
> python src/train.py data/features model.pkl
Updating lock file 'dvc.lock'

Running stage 'evaluate':
> python src/evaluate.py model.pkl data/features
Updating lock file 'dvc.lock'

Ran experiment(s): funny-dado
Experiment results have been applied to your workspace.

DAG

DVC는 DAG(stage dependency graph) 단계를 종속성 및 출력에 의해 정의된 순서대로 순차적으로 실행합니다. 다음과 같은 예시의 dvc.yaml을 고려해 보세요:

준비 단계는 항상 featurize 단계보다 앞서게 됩니다. 왜냐하면 data/prepared는 prepare의 출력이며 featurize의 의존성입니다.

stages:
  prepare:
    cmd: python src/prepare.py data/data.xml
    deps:
      - data/data.xml
      - src/prepare.py
    params:
      - prepare.seed
      - prepare.split
    outs:
      - data/prepared
  featurize:
    cmd: python src/featurization.py data/prepared data/features
    deps:
      - data/prepared
      - src/featurization.py
    params:
      - featurize.max_features
      - featurize.ngrams
    outs:
      - data/features

Caching Stages

DVC는 이전에 실행된 적이 있는 단계를 다시 계산하지 않으려고 시도합니다. 단계의 명령, 의존성 또는 매개변수를 변경하지 않고 단계를 실행하면 DVC는 해당 단계를 건너뛸 것입니다.

Stage 'prepare' didn't change, skipping

또한 실행 캐시를 사용하여 이전 실행의 출력을 복구할 것입니다.

Stage 'prepare' is cached - skipping run, checking out outputs

만약 단계를 항상 실행하려면 dvc.yaml에서 always changed를 사용할 수 있습니다.

stages:
  pull_latest:
    cmd: python pull_latest.py
    deps:
      - pull_latest.py
    outs:
      - latest_results.csv
    always_changed: true

Pull Missing Data

기본적으로 DVC는 파이프라인을 실행하기에 필요한 모든 데이터가 로컬에서 사용 가능하다고 가정합니다.
누락된 데이터는 삭제된 것으로 간주되어 파이프라인 실행에 실패할 수 있습니다. --pull 옵션을 사용하면 누락된 종속성을 다운로드하며 (이전 실행의 실행 캐시에 저장된 캐시된 출력도 다운로드합니다), 파이프라인을 실행하기 전에 프로젝트의 모든 데이터를 미리 가져올 필요가 없습니다. --allow-missing 옵션은 누락된 데이터 이외에 다른 변경 사항이 없는 단계를 건너뛸 것입니다.
변경된 단계를 실행하는 데 실제로 필요한 데이터만 가져오려면 --pull 및 --allow-missing 플래그를 결합할 수 있습니다.

예시-get-started-experiments에서 사용한 파이프라인을 고려해 봅시다:

dvc dag
    +--------------------+
    | data/pool_data.dvc |
    +--------------------+
               *
               *
               *
        +------------+
        | data_split |
        +------------+
         **        **
       **            **
      *                **
+-------+                *
| train |              **
+-------+            **
         **        **
           **    **
             *  *
         +----------+
         | evaluate |
         +----------+

모든 데이터가 누락된 상태의 머신에서 실행한다면 다음과 같은 절차를 따를 수 있습니다:

dvc status
Not in cache:
  (use "dvc fetch <file>..." to download files)
        models/model.pkl
        data/pool_data/
        data/test_data/
        data/train_data/

우리는 평가 단계를 수정할 수 있으며 DVC는 해당 단계를 실행하는 데 필요한 데이터만 가져올 것이며 (models/model.pkl data/test_data/) 다른 단계는 건너뛸 것입니다.

dvc exp run --pull --allow-missing --set-param evaluate.n_samples_to_save=20
Reproducing experiment 'hefty-tils'
'data/pool_data.dvc' didn't change, skipping
Stage 'data_split' didn't change, skipping
Stage 'train' didn't change, skipping
Running stage 'evaluate':
...

Verify Pipeline Status

비슷한 상황에서 CI 작업과 같이 파이프라인이 최신 상태인지 확인하려면 데이터를 가져오거나 실행하지 않고도 파이프라인이 어떤 단계를 실행해야 하는지 확인할 수 있습니다. dvc repro --dry는 파이프라인의 실행 단계를 실제로 실행하지 않고 확인합니다. 그러나 데이터가 누락된 경우 --dry는 실패합니다. 왜냐하면 DVC는 해당 데이터를 단순히 가져와야 하는지 아니면 다른 이유로 누락되었는지 알 수 없기 때문입니다. 어떤 단계를 실행해야 하는지 확인하고 누락된 데이터를 무시하려면 dvc repro --dry --allow-missing을 사용하십시오.

  • 예시
    • 아래 예에서 데이터가 누락되었는데, 이는 아무 것도 가져오지 않았기 때문입니다. 그러나 그 외에는 파이프라인이 최신 상태입니다.
      dvc status
      data_split:
        changed deps:
                deleted:            data/pool_data
        changed outs:
                not in cache:       data/test_data
                not in cache:       data/train_data
      train:
        changed deps:
                deleted:            data/train_data
        changed outs:
                not in cache:       models/model.pkl
      evaluate:
        changed deps:
                deleted:            data/test_data
                deleted:            models/model.pkl
      data/pool_data.dvc:
        changed outs:
                not in cache:       data/pool_data
dvc repro --allow-missing --dry
'data/pool_data.dvc' didn't change, skipping
Stage 'data_split' didn't change, skipping
Stage 'train' didn't change, skipping
Stage 'evaluate' didn't change, skipping

만약 무엇이라도 최신 상태가 아니라면, 이 명령은 실패합니다:

dvc repro --allow-missing --dry
'data/pool_data.dvc' didn't change, skipping
ERROR: failed to reproduce 'data_split': [Errno 2] No such file or directory: '.../example-get-started-experiments/data/pool_data'

모든 누락된 데이터가 원격에 존재하는지 확인하려면 아래 명령을 사용할 수 있습니다. 이 명령은 모든 데이터가 원격에 있는 경우 성공합니다 (exit code를 0으로 설정). 그렇지 않으면 실패합니다 (exit code를 1로 설정).

dvc data status --not-in-remote --json | grep -v not_in_remote
true

Debugging Stages

고급 기능을 사용하여 파이프라인의 값을 보간하는 경우, dvc repro -vv 또는 dvc exp run -vv를 실행하여 보간된 값을 얻을 수 있습니다. 이렇게 하면 다음과 같은 정보가 포함됩니다:

2023-05-18 07:38:43,955 TRACE: Hydra composition enabled.
Contents dumped to params.yaml: {'model': {'batch_size':
512, 'latent_dim': 8, 'lr': 0.01, 'duration': '00:00:30:00',
'max_epochs': 2}, 'data_path': 'fra.txt', 'num_samples':
100000, 'seed': 423}
2023-05-18 07:38:44,027 TRACE: Context during resolution of
stage download: {'model': {'batch_size': 512, 'latent_dim':
8, 'lr': 0.01, 'duration': '00:00:30:00', 'max_epochs': 2},
'data_path': 'fra.txt', 'num_samples': 100000, 'seed': 423}
2023-05-18 07:38:44,073 TRACE: Context during resolution of
stage train: {'model': {'batch_size': 512, 'latent_dim': 8,
'lr': 0.01, 'duration': '00:00:30:00', 'max_epochs': 2},
'data_path': 'fra.txt', 'num_samples': 100000, 'seed': 423}

Run Cache: Automatic Log of Stage Runs

DVC는 파이프라인을 실행할 때마다 각 단계 실행의 고유한 서명을 로그에 기록합니다(.dvc/cache/runs에 저장). 이전에 이 단계가 실행된 적이 없다면 해당 단계의 명령이 정상적으로 실행됩니다. 동일한 조건에서 단계가 다시 실행될 때마다 이전 결과를 즉시 복원할 수 있으므로 시간과 컴퓨팅 리소스를 절약할 수 있습니다. 자세한 내용은 링크를 참조하세요.

✅ 이 내장 기능은 실행 캐시라고 불리며 성능을 현저하게 향상시킬 수 있습니다. 이 기능은 기본적으로 활성화되어 있으며 (비활성화 가능), 즉 DVC는 이미 모든 테스트 및 실험 결과를 뒷단에서 자동으로 저장하고 있습니다.

Run cache

dvc exp run 및 dvc repro는 기본적으로 프로젝트에서 실행된 단계의 로그를 생성하고 재사용합니다. 이 로그는 캐시 (또는 원격 저장소) 내부의 runs/ 디렉토리에 저장됩니다.

단계 실행은 정확한 종속성 내용 (또는 매개변수 값) 및 실행할 명령의 조합으로 식별됩니다. 이러한 조합은 실행 캐시 디렉토리 내부의 파일 경로로 변환되는 특수 해시로 나타내집니다:

tree .dvc/cache/runs
.dvc/cache/runs
└── 86
    └── 8632e1555283d6e23ec808c9ee1fadc30630c888d5c08695333609ef341508bf
        └── e98a34c44fa6b564ef211e76fb3b265bc67f19e5de2e255217d3900d8f...

파일 자체는 해당 실행에서 생성된 dvc.lock 파일의 백업입니다.

dvc push, dvc pull, 및 dvc fetch는 --run-cache 플래그를 사용하여 실행 캐시를 원격 스토리지에 업로드 및 다운로드할 수 있습니다. 이를 통해 실행 캐시를 공유하거나 백업으로 사용할 수 있습니다.

Site cache dir

macOSLinux (typical*)Windows

/Library/Caches/dvc /var/tmp/dvc C:\ProgramData\iterative\dvc

External Dependencies and Outputs

외부 종속성은 DVC에 의해 추적되며 변경될 때 감지됩니다(예: dvc repro에서 실행 단계를 트리거함).

External Data

외부 프로젝트 내에 위치한 데이터를 버전 관리하려면 해당 데이터를 가져올 수 있습니다. 이때 데이터를 다운로드하고 DVC 원격 저장소에 복사본을 푸시할지 여부를 선택할 수 있습니다. 이렇게 데이터를 가져오면 원본 데이터 소스 위치에 그대로 두면서 데이터를 추적하는 것이 유용합니다.

How importing external data works

dvc import-url https://data.dvc.org/get-started/data.xml
Importing 'https://data.dvc.org/get-started/data.xml' -> 'data.xml'
dvc update data.xml.dvc

dvc push 중에 DVC는 data.xml.dvc로 추적되는 데이터 버전을 DVC 원격 저장소에 업로드하여 필요할 경우 복구할 수 있도록 백업합니다.

DVC는 원본 데이터 위치를 덮어쓰지 않습니다. 대신 DVC는 해당 데이터의 어떤 버전이든 로컬에서 확인할 수 있습니다. DVC는 다른 사용자에게 예상치 못한 덮어쓰기나 변경으로 인한 데이터의 손실을 방지하기 위해 설계되었으므로 현재 원본 위치에 저장된 내용을 잃지 않고 이전 버전을 복구할 수 있습니다.

외부 위치의 파일 또는 디렉토리를 단계 종속성으로 정의하려면 dvc.yaml(deps 필드)에 해당 원격 URL 또는 외부 경로를 지정하십시오. 다음과 같은 지원되는 dvc 원격 유형/프로토콜의 url과 동일한 형식을 사용하십시오:

  • Amazon S3
  • Microsoft Azure Blob Storage
  • Google Cloud Storage
  • SSH
  • HDFS
  • HTTP
  • 작업 공간 외부의 로컬 파일 및 디렉토리

예시 다음은 모든 지원 위치 유형에서 외부 위치에서 파일을 다운로드하는 download_file 단계를 정의하고 실행하는 방법을 보여줍니다. Remote 별칭 예제에서 수동 인증 설정이 필요한 원격 위치를 사용하는 방법에 대한 정보를 참조하십시오.

로컬인 경우

dvc stage add -n download_file \
          -d /home/shared/data.txt \
          -o data.txt \
          cp /home/shared/data.txt data.txt

사용자가이드 - # DVC Experiments Overview

DVC는 ML 실험을 자동으로 실행 중이거나 완료 후 수동으로 저장할 수 있습니다.
각 실험은 워크스페이스의 변경 내용을 기반으로 데이터 과학 프로젝트의 변형을 생성하고 추적합니다.

실험은 현재 브랜치의 최신 커밋 (Git HEAD)에 대한 연결을 유지하지만 일반적인 Git 트리의 일부가 아닙니다. 이로써 일시적인 커밋과 브랜치로 저장소가 부풀어 오르는 것을 방지합니다.

⚙️ DVC가 실험을 어떻게 추적하는지 알아보세요.

실험 저장 실험을 저장하려면 다음 중 하나의 방법을 따를 수 있습니다:

DVC 파이프라인이 없는 경우 DVCLive를 초기화하여 Python 코드에서 실시간 결과를 기록할 수 있습니다. DVC 파이프라인이 있는 경우 dvc exp run을 사용하여 코드 파이프라인을 실행하고 실험 결과를 저장할 수 있습니다. dvc exp run은 한 번에 많은 실험을 대기열에 추가하는 등의 고급 기능도 활성화합니다. 실험은 기본적으로 로컬에 저장되지만 다른 사람이 작업을 복제할 수 있도록 공유할 수 있습니다.

메트릭, 플롯, 매개변수 DVC는 YAML, JSON, CSV와 같은 표준 구조화된 파일에 저장된 매개변수, 메트릭 및 플롯 데이터를 추적하고 비교할 수 있으며 이러한 데이터를 리포지토리의 일부로 추적할 수 있습니다. 이러한 매개변수, 메트릭 및 플롯을 생성하고 (자동으로 구성하는 방법 중 하나로) DVCLive를 사용할 수 있습니다. 또한 이러한 파일을 수동으로 생성하고 dvc.yaml 메타 파일을 사용하여 어떤 파일이 매개변수, 메트릭 또는 플롯인지 (그리고 어떻게 플롯을 시각화할지) 지정할 수 있습니다.

모델 및 데이터셋 DVC는 모델 또는 데이터셋을 리포지토리의 일부로 추적할 수 있으며 모델 레지스트리에서 해당 모델을 관리할 수 있습니다. 모델 또는 다른 아티팩트를 기록하는 한 가지 방법은 DVCLive를 사용하는 것입니다. 또한 dvc add로 추적하고 dvc.yaml에서 모델 레지스트리에 대한 메타데이터를 선언할 수 있습니다.

GUI에서 DVC 실험 사용하기 DVC 실험은 VS Code IDE나 DVC Studio라는 온라인 웹 UI를 통해 직접 사용할 수 있습니다. 이 UI는 모든 데이터 과학 도구를 통합한 것입니다.

Running Experiments

DVC는 실험을 실행하는 데 사용하는 명령이 포함된 dvc.yaml 파일을 활용합니다. 이러한 파일은 실험 워크플로우의 여러 단계 (코드, 의존성, 출력 등)를 정의하는 파이프라인을 구체화합니다.

https://dvc.org/doc/start/experiments

Running the pipeline(s)

파이프라인 실행 실험 파이프라인을 실행하려면 dvc exp run을 사용할 수 있습니다. 기본적으로 현재 디렉토리의 ./dvc.yaml 파일을 사용합니다.

dvc exp run
...
Reproduced experiment(s): matte-vies

DVC는 단계 간의 종속성 그래프를 관찰하여 변경된 종속성이나 캐시에서 누락된 출력만 실행합니다. 이를 특정 재현 대상으로 제한하거나 단일 단계로 제한할 수 있습니다 (--single-item 플래그).

실제로 DVC 프로젝트는 하나 이상의 dvc.yaml 파일에서 하나 이상의 파이프라인을 지원합니다. --all-pipelines 옵션을 사용하여 모두 한 번에 실행할 수 있습니다.

dvc exp run은 dvc repro의 실험 특화 대안입니다. 이들 간의 차이에 대한 자세한 내용은 Running Pipelines를 참조하십시오.

Experiment results

가장 최근의 dvc exp run 결과는 워크스페이스에서 볼 수 있습니다. 이러한 결과는 DVC에 의해 내부적으로 저장되고 추적됩니다.

여러 실험을 표시하고 비교하려면 매개변수와 메트릭과 함께 dvc exp show를 사용하십시오. dvc plots diff도 실험을 리비전으로 사용합니다. 자세한 내용은 Reviewing and Comparing Experiments를 참조하십시오.

다른 실험의 결과를 복원하려면 dvc exp apply를 사용하십시오. 자세한 정보는 Bring experiment results to your workspace를 참조하십시오.

Git 또는 DVC 중 하나에 의해 추적되는 파일만 실험에 저장됩니다. 추적되지 않은 파일은 복원할 수 없습니다.

Tuning (hyper)parameters

매개변수는 코드 내에서 모델링 속성을 조정하거나 실험 결과에 영향을 주는 데 사용되는 모든 값입니다. 예를 들어, 랜덤 포레스트 분류기는 최대 깊이 값을 필요로 할 수 있습니다. 머신러닝 실험은 종종 모델 메트릭을 개선하기 위해 하이퍼파라미터 공간을 정의하고 검색하는 작업을 포함합니다.

소스 코드는 매개변수 파일 (기본적으로 params.yaml)에서 매개변수를 읽어야 합니다. DVC가 추적하도록 하려면 dvc.yaml의 params 필드로 정의하십시오. 매개변수 값이 변경되면 dvc exp run은 해당 값을 의존하는 단계를 무효화하고 다시 생성합니다.

더 많은 세부 정보는 dvc params를 참조하십시오.

매개변수 파일을 수동으로 편집하고 해당 파일을 입력으로 사용하여 실험을 실행할 수 있습니다. 이는 일반적인 순서이므로 dvc exp run --set-param (-S)이라는 내장 옵션이 제공됩니다. 기존의 매개변수 이름과 값을 가져와 실행 전에 파일을 업데이트합니다.

cat params.yaml
...
train:
  valid_pct: 0.1
  arch: shufflenet_v2_x2_0
  img_size: 256
  batch_size: 8
  fine_tune_args:
    epochs: 8
    base_lr: 0.01
...

$ dvc exp run --set-param train.fine_tune_args.base_lr=0.001
...

$ dvc exp run -S train.img_size=1024 -S train.batch_size=512  # set multiple params
...

The experiments queue

dvc exp run의 --queue 옵션은 실험을 나중에 실행할 수 있도록 추가하도록 DVC에 지시합니다. 실제로 아무것도 실행되지 않습니다. 몇 가지 실험을 큐에 추가해 보겠습니다.

dvc exp run --queue -S train.fine_tune_args.base_lr=0.001
Queueing with overrides '{'params.yaml': ['train.fine_tune_args.base_lr=0.001']}'.
Queued experiment 'blowy-pail' for future execution.
$ dvc exp run --queue -S train.fine_tune_args.base_lr=0.002
Queueing with overrides '{'params.yaml': ['train.fine_tune_args.base_lr=0.002']}'.
Queued experiment 'nubby-gram' for future execution

또는 하이퍼파라미터 그리드 서치를 설정할 수 있습니다.

dvc exp run --queue \
    -S train.arch='resnet18,shufflenet_v2_x2_0' \
    -S 'train.fine_tune_args.base_lr=range(0.001, 0.01, 0.001)'
Queueing with overrides '{'params.yaml': ['train.arch=resnet18', 'train.fine_tune_args.base_lr=0.001']}'.
Queued experiment 'bijou-chis' for future execution.
Queueing with overrides '{'params.yaml': ['train.arch=resnet18', 'train.fine_tune_args.base_lr=0.002']}'.
Queued experiment 'color-meal' for future execution.
Queueing with overrides '{'params.yaml': ['train.arch=resnet18', 'train.fine_tune_args.base_lr=0.003']}'.
Queued experiment 'fusil-chin' for future execution.
...
Queueing with overrides '{'params.yaml': ['train.arch=shufflenet_v2_x2_0', 'train.fine_tune_args.base_lr=0.001']}'.
Queued experiment 'lumpy-jato' for future execution.
Queueing with overrides '{'params.yaml': ['train.arch=shufflenet_v2_x2_0', 'train.fine_tune_args.base_lr=0.002']}'.
Queued experiment 'gypsy-wino' for future execution.
Queueing with overrides '{'params.yaml': ['train.arch=shufflenet_v2_x2_0', 'train.fine_tune_args.base_lr=0.003']}'.
...

dvc queue start를 사용하여 모두 실행합니다.

dvc queue start

대부분의 경우 실험 작업은 큐에 추가된 순서대로 실행됩니다 (FIFO, 선입선출),
그러나 이것은 보장되지 않습니다.

실행은 워크스페이스에서 분리된 임시 디렉토리에서 발생하므로 각 실험은 큐에 추가된 시점의 워크스페이스에서 파생됩니다.

기본적으로 대기열에 대기 중인 실험은 직렬로 처리되지만 여러 --jobs (dvc queue start에 하나 이상의 worker를 사용)를 사용하여 병렬로 실행할 수 있습니다.

환경이 처리할 수 있는 작업 수 (CPU 코어 수보다 많지 않음)를 사용하는지 확인하십시오. 대기 중인 실험은 서로 분리되어 실행되므로 실행 캐시 상태에 따라 공통 단계가 여러 번 실행될 수 있음을 유의하십시오.

실험을 대기열에서 지우고 다시 시작하려면 dvc queue remove --queued를 사용하십시오. 더 고급 그리드 검색에 대한 DVC는 Hydra composition을 통한 복잡한 구성을 지원합니다.

Hydra Composition

  • 예시 참고

Reviewing and Comparing Experiments

Show a table of experiments

실험은 선택하기 전에 많은 가능성을 생성하는 것입니다. 멋지게 서식이 지정된 표에서 모든 메트릭(노란색), 매개변수(파란색) 및 종속성(보라색)을 표시하는 실험 테이블을 얻을 수 있습니다.

dvc exp show

![[Pasted image 20231208180230.png]]

dvc exp show는 작업 디렉토리와 HEAD에있는 실험만 표로 만듭니다. 프로젝트의 모든 실험을 표시하려면 --all-commits (-A) 플래그를 사용할 수 있습니다.

Customize the table of experiments

실험 테이블 출력이 메트릭, 매개 변수 및 종속성이 많은 경우 혼잡 할 수 있습니다. DVC는 테이블에 표시할 열을 선택하는 데 사용할 수 있는 여러 옵션을 제공합니다.

dvc exp show --only-changed

![[Pasted image 20231208180343.png]]

dvc exp show --csv | csvstat

![[Pasted image 20231208180406.png]]

import dvc.api

exps = dvc.api.exp_show()
[
  {
    "Experiment": "paled-acre",
    "rev": "883442c",
    "Created": "Apr 19, 2023",
    "dice_multi": 0.8590125166103912,
    "train.arch": "squeezenet1_1"
  },
  {
    "Experiment": "vocal-suer",
    "rev": "231e504",
    "Created": "Apr 19, 2023",
    "dice_multi": 0.8997336177828745,
    "train.arch": "resnet34"
  },
  {
    "Experiment": "banal-hogs",
    "rev": "ff4a08a",
    "Created": "Apr 19, 2023",
    "dice_multi": 0.8758231459806097,
    "train.arch": "alexnet"
  }
]

Compare plots

dvc plots diff를 사용하여 실험 간에 플롯을 비교할 수 있습니다. 비교할 실험의 이름을 얻으려면 dvc exp list --name-only를 사용하면 HEAD의 모든 실험의 이름이 반환됩니다. 다른 실험 세트를 선택하려면 dvc exp list의 옵션을 참조하십시오.

dvc plots diff $(dvc exp list --name-only)

![[Pasted image 20231208180453.png]]

Removing experiments

DVC는 실험을 추적하기 위해 최소한의 리소스를 사용하지만 실험 목록과 작업 영역을 혼란스럽게 할 수 있습니다. 실험을 이름별로 삭제하려면 dvc exp remove를 사용하고 실험 이름을 제공하십시오.

여러 실험을 삭제하기 위한 옵션에 대한 자세한 내용은 dvc exp remove 옵션을 참조하십시오.

실험을 삭제하더라도 DVC 캐시의 객체, 예를 들어 모델 파일, 중간 아티팩트 등은 삭제되지 않습니다. 실험과 관련된 캐시 객체를 제거하려면 dvc gc를 사용할 수 있습니다.

dvc exp list
main:
    2399f24 [cnn-128]
    4e8a178 [cnn-32]
    f1edf21 [cnn-64]
$ dvc exp remove cnn-32 cnn-64
Removed experiments: cnn-32,cnn-64

Sharing Experiments

실시간 메트릭 및 플롯을 DVC Studio로 보낼 수 있으며, 완료된 실험 전체를 푸시할 수 있으며 (데이터, 모델 및 코드 포함), 실험을 Git 리포지토리의 지속 브랜치 또는 커밋으로 변환할 수 있습니다.

모든 작동 방식에 대한 자세한 내용은 VS Code용 DVC 확장 프로그램을 사용하는 동영상을 참조하거나 계속 읽어보세요.

  • DVC Studio는 돈을 내야하므로 관심의 대상이 아니라서 패스

![[Pasted image 20231208180843.png]]

728x90