728x90

빌드 프로세스를 자동화하는 것은 개발자들에게 매우 유용함

이를 효율적으로 수행하기 위해 Makefile을 사용하는 것은 일반적인 방법 중 하나

makefile이란?

Makefile은 소프트웨어 빌드 프로세스를 자동화하기 위한 텍스트 파일

가장 많이 사용하는 반복적인 작업 표준화하거나, 여러 작업을 한꺼번에 실행하는 표준화된 방법을 제공함

여러 명령어를 포함할 수 있으며, 변수, 조건문, 반복문 등을 사용하여 복잡한 빌드 프로세스를 자동화할 수 있음

makefile 기본 구조

target: dependencies
    command
  • target : 생성하고자 하는 파일의 이름이나 작업의 이름
  • dependencies : 해당 작업을 수행하는 데 필요한 파일이나 작업
  • command : 해당 작업을 수행하는 명령어

makefile을 이용한 빌드 자동화 구현 예시 (python)

# 작업디렉토리 구조
src
 ㄴ __init__.py
 ㄴ point_location.py
tests
 ㄴ test_point_location.py
Makefile
# src/point_location.py
from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

def location(p: Point) -> str:
    """맵에서 좌표에 해당하는 객체를 검색"""
    return f'{p.x, p.y}'
# tests/test_point_location.py
from src.point_location import Point, location

def test_location():
    # 포인트 객체 생성
    p = Point(1, 2)
    
    # 좌표를 검색하고 결과를 확인
    result = location(p)
    assert result == "(1, 2)"
# Makefile
# .PHONY는 make 명령어를 실행할 때 해당 명령어를 실행하도록 하는 것
.PHONY: typehint
typehint:
    mypy --ignore-missing-imports src/

.PHONY: test
test:
    pytest tests/

.PHONY: lint
lint:
    pylint src/

.PHONY: checklist
checklist: typehint test lint

.PHONY: black
black:
    black -l 79 *.py

.PHONY: clean
clean:
    find . -type f -name "*.pyc" | xargs rm -fr
    find . -type d -name "__pycache__" | xargs rm -fr
더보기

# 실행 명령어

export PYTHONPATH="${PYTHONPATH}:$(pwd)"

make checklist mypy --ignore-missing-imports src/

 

# 실행결과

Success: no issues found in 2 source files

pytest tests/ ============================================ test session starts =============================================

platform darwin -- Python 3.8.10, pytest-8.1.1, pluggy-1.4.0

rootdir: /Users/stone/Desktop/pythonworkspace

collected 1 item

 

tests/test_point_location.py . [100%]

 

============================================= 1 passed in 0.02s ==============================================

pylint src/

************* Module src.point_location

src/makefile_test.py:1:0: C0114: Missing module docstring (missing-module-docstring)

src/makefile_test.py:4:0: C0115: Missing class docstring (missing-class-docstring)

 

----------------------------------- Your code has been rated at 6.67/10

make: *** [lint] Error 16

728x90

'AI > ML ops' 카테고리의 다른 글

DVC 기초 및 사용법  (0) 2022.11.02
대용량 데이터 버전관리 오픈소스 LFS vs DVC  (0) 2022.10.28
728x90

DVC (Data Version Control)

DVC는 Git을 기반으로 하는 새로운 유형의 데이터 관리 무료 오픈소스

DVC 용도

일반적으로는 git과 함께 사용하여 git tag를 통해 대용량 데이터 버전관리를 할 때 유용하게 쓰인다.
git에서는 2GB 이상의 데이터를 push할 수 없기 때문에, 대용량 폴더는 dvc로 관리하고 git ignore에 명시하여 git이 추적하지 않도록 한다.

대용량 폴더는 dvc를 이용하여 데이터를 원격저장소에 저장한다.
dvc가 관리하는 파일들은 [폴더명.dvc]라는 메타정보파일이 남는다.
이 메타정보 파일에는 원격저장소에 저장된 데이터 경로와 데이터 size, 파일개수가 쓰여있다.
git은 이 메타정보 파일을 추적하여 버전관리를 한다.

예시)

Workspace를 보면 train.py, pred.py, data폴더, model폴더가 존재한다.
이 중 data와 model은 대용량폴더이기 때문에 dvc로 관리한다.
그렇게 되면 git repository에는 train.py, pred.py와 data와 model 폴더의 메타정보를 담은 data.dvc, model.dvc 파일이 관리되고, 데이터는 원격저장소로 push되어 원격저장소 내에 저장되어있다.
model.dvc 내용을 살펴보면 model의 원격저장소 위치와 size, 파일개수, path 정보가 들어있다.
원격저장소에서 c6/efae81ddbbf2a8a88d6d3790e60e61.dir을 찾아가서 살펴보면 원격저장소 파일경로와 실제파일명이 매칭되어 적혀있다.
10/d2a131081a3095726c5721ed31c21f의 내용을 확인하면 Workspace/model/model1.pt 파일내용을 볼 수 있다

 

dvc는 왜 파일을 이렇게 복잡한 파일명으로 관리하는걸까?
dvc는 해시값을 이용하여 데이터를 관리한다.
해시값이란 파일의 데이터를 해시 함수(Hash Funtion) 또는 해시 알고리즘(Hash Algorithm)을 통해 계산하여 산출된 값으로 이러한 값은 해당 파일의 고유한 값이다.
해시값은 고유한 값이기 때문에 두 파일의 해시값이 같다는 것은 두 파일이 동일한 파일임을 의미한다.
해시값을 이용하여 데이터를 저장하면 동일한 파일을 중복저장하지 않을 수 있다.
파일명만 다르고 내용이 동일한 파일이 있는 경우, 데이터는 한 번만 저장되고 동일한 해시 값을 참조한다.

# model1과 model2의 파일내용이 같다고 가정하면
[{“md5”:” 10d2a131081a3095726c5721ed31c21f”, “relpath”:”model/model1.pt},
{“md5”:” 10d2a131081a3095726c5721ed31c21f”, “relpath”:”model/model2.pt}]

DVC 장점

DVC 튜토리얼 (기본 사용법)

workspace로 사용하기 위한 gitrepo폴더를 만들고 그 안에서 작업함
gitrepo / samplemodel / modelfile 만듦

dvc 설치

pip install dvc

dvc 시작 (dvc init)

dvc → git과 같이 사용

cd C:\Users\stone\seokhwa_practice\DVC\gitrepo
# set git repository
git init
git remote add origin https://github.com/seokhwaLee/DVCtest
# set dvc
# pip install dvc
dvc init
# git commit
git commit -m "Initialize DVC"

dvc → git 없이 사용 가능

dvc init --no-scm
dvc remote add [remote명] [AI모델저장소storage경로]

파일 또는 디렉토리 추적 :  dvc add {추적할폴더}

aimodel폴더 내용 추적

dvc add samplemodel
git add samplemodel.dvc .gitignore
# git status : add 상태 확인
git commit -m "add model"

변경사항 반영 : dvc commit

# 추적설정 되어있는 폴더/파일의 변경사항 반영
dvc commit # git과 같이 commit message를 따로 넣어주는 옵션은 없음

저장 및 공유

원격 저장소 추가 : dvc remote add {원격저장소명} {원격저장소위치}

# 원격 저장위치 설정
# model 내용을 두 개의 원격저장소에 push해보기
dvc remote add aimodel C:\Users\stone\seokhwa_practice\DVC\aimodel
# 원격저장소 config git add
git add .dvc/config
git commit -m "Configure remote storage"

원격저장소에 push하기 : dvc push -r {원격저장소명} {add폴더}

# 원격저장소로 위에서 add한 data push
dvc push -r aimodel samplemodel
# add한 것 중 특정 데이터만 push 가능
dvc push aimodel.dvc -r aimodel samplemodel

하나의 git repository에서 여러 개의 원격저장소에 push 가능

# 원격 저장소 추가
dvc remote add data C:\Users\stone\seokhwa_practice\DVC\project
# 원격저장소 config git add
git add .dvc/config
git commit -m "Configure remote storage"

dvc add sampledata
git add sampledata.dvc .gitignore

# git status : add 상태 확인
git commit -m "add data"
dvc push -r data sampledata

이미 푸시한 내용 다른 원격저장소에 푸시 가능

# 새로운 원격 저장소 추가
dvc remote add testtest C:\Users\stone\seokhwa_practice\DVC\testtest
# 원격저장소 config git add
git add .dvc/config
git commit -m "Configure remote storage"

dvc push -r testtest sampledata

원격저장소로부터 데이터 불러오기 : dvc pull {불러올데이터파일명.dvc}

dvc pull samplemodel.dvc -r aimodel

데이터 삭제

dvc remove {삭제할데이터파일명.dvc} : dvc파일 삭제
dvc gc -w -c -r {원격저장소명} -f : 원격저장소에서 dvc workspace에서 추적하지 않는 파일 삭제

remove를 이용하여 추적 취소 후, gc를 이용하여 dvc workspace에서 추적하지 않는 파일 원격 저장소에서 삭제한다

dvc remove sampledata.dvc
dvc gc -w -c -r testtest -f

 

참고 링크

DVC homepage
DVC github
DVC docs

 

 

대용량 데이터 버전관리 오픈소스 LFS vs DVC

대용량 데이터를 체계적으로 관리하는 방안이 필요해져, 대표적인 두 가지 오픈소스를 비교해보았다. Git LFS는 유료 서비스라는 점에서 조건미달이었기 때문에, 깊이 공부하지 않고 DVC를 선택하

bigseok.tistory.com

 

728x90
728x90

대용량 데이터를 체계적으로 관리하는 방안이 필요해져, 대표적인 두 가지 오픈소스를 비교해보았다.

Git LFS는 유료 서비스라는 점에서 조건미달이었기 때문에, 깊이 공부하지 않고 DVC를 선택하여 서비스를 구현하였다.

DVC 사용법 관련 포스팅은 추후 다른 게시글에서 자세히 다루어볼 예정이다.

 

Git LFS (Large File Storage)

Git LFS는 대용량 파일을 별도의 서버에 올리고, 원래 위치에는 포인터를 남긴다.

즉, 대용량 파일은 다른 서버에서 받아오고 있지만, 포인터가 설정되어 있기 때문에 사용자 입장에서는 Git, Push, Pull 등을 그대로 사용할 수 있다.

Git LFS는 실제 파일(다른 곳에 저장됨)에 대한 참조 역할을 하는 포인터 파일을 만든다.

GitHub는 저장소에서 이 포인터 파일을 관리한다.

저장소를 clone할 때, GitHub는 포인터 파일을 보고 큰 파일을 찾아온다.

사용중인 Git LFS version을 추적한 다음 파일의 고유 식별자(oid)를 추적한다.

Git LFS pointer 예시

version https://git-lfs.github.com/spec/v1
oid sha256:4cac19622fc3ada9c0fdeadb33f88f367b541f38b89102a3f1261ac81fd5bcb5
size 84977953

Price

github

gitlab

 

DVC (Data Version Control)

DVC는 Git을 기반으로 하는 새로운 유형의 데이터 버전 관리 무료 오픈소스이다.

DVC는 설치가 빠르고 특별한 인프라가 필요하지 않으며 API나 외부 서비스에 의존하지 않는 독립 실행형 CLI 도구이다.

Git으로 .gitignore(데이터파일이 git에 저장되는 것 방지)과 .dvc(dvc 정보)파일을 통해 데이터 버전 정보를 관리한다.

Git의 Tag/Branch 등을 이용해 dataset과 ML model을 versioning하고 관리

.gitignore : 대용량데이터폴더는 git에서 무시하도록 git ignore에 명시

/[대용량데이터폴더명]

.dvc/config : 등록된 원격저장소 정보 (실제 대용량 데이터 저장 위치)

[core]
    remote = datas
['remote "datas"']
    url = C:\Users\stone\seokhwa_practice\DVC\data-repo

[대용량데이터폴더명].dvc : [대용량데이터폴더]의 사이즈, 파일개수, 경로, 원격저장소 메타정보 위치

outs:
- md5: c6efae81ddbbf2a8a88d6d3790e60e61.dir
  size: 3980577
  nfiles: 185
  path: datas

DVC를 통해 실제 데이터를 관리

간단한 명령어를 통해 원격저장소(S3, Google Cloud, Azure, HDFS, SSH server 등)와 연결하여 데이터를 push 하거나 pull 할 수 있다.

dvc remote add -d datas C:\Users\stone\seokhwa_practice\DVC\data-repo

 

LFS vs DVC

두 가지 서비스 모두 사용법은 유사하다.

하지만 LFS 서버를 무료로 사용할 경우 데이터 사이즈 제약이 있고, DVC 의 경우 무료 > data 를 저장할 storage 만 설정해주면 된다.

 

참고 사이트

728x90

'AI > ML ops' 카테고리의 다른 글

Makefile을 이용한 빌드 자동화 스크립트  (0) 2024.04.21
DVC 기초 및 사용법  (0) 2022.11.02

+ Recent posts