재현성
재현성 (Reproducibility)
본문
재현 가능한 데이터의 이점
데이터는 자주 바뀌어요. 그래서 시간이 지나도록 데이터의 정확한 상태를 추적하는 일이 어려워져요. 대부분의 사람은 데이터의 단 하나 상태 - 현재 상태 - 만 유지하곤 해요.
이것은 작업에 부정적인 영향을 주어요. 다음이 어려워지죠:
-
데이터 이슈 디버깅
-
머신러닝 학습 정확도 검증 (다른 데이터로 모델을 다시 실행하면 다른 결과가 나와요)
-
데이터 감사, 특히 모델 감사 준수
비교하자면, lakeFS는 데이터에 Git 같은 인터페이스를 노출해 현재 상태 이상의 추적을 가능하게 해요. 덕분에 임의 시점의 상태를 재현하는 일이 간단해져요.
lakeFS로 재현성 달성하기
데이터를 재현 가능하게 만들려면, lakeFS 저장소 안의 데이터가 바뀔 때마다 새 커밋을 찍는 것을 권장해요. 커밋이 찍혀 있으면, 특정 상태를 재현하는 프로세스는 각 커밋에 대해 생성된 고유한 commit_id를 포함하는 경로에서 데이터를 읽는 것만큼 간단해요.
현재 상태의 데이터를 읽으려면 저장소와 브랜치 이름을 담은 정적 경로를 사용할 수 있어요. 예를 들어 example이라는 저장소와 main이라는 브랜치가 있다면, 이 데이터의 최신 상태를 Spark Dataframe으로 읽는 것은 항상 다음과 같아요:
Example
df = spark.read.parquet("s3://example/main/")
위 코드는 이 경로 아래 저장소의 모든 객체가 parquet 형식으로 저장되어 있다고 가정해요. 다른 형식을 사용한다면 해당하는 Spark read 메서드를 사용해야 해요.
커밋 사용하기
lakeFS 저장소에서는 데이터 위에 여러 커밋을 찍을 수 있어서, 많은 시점들을 재현 가능하게 만들 수 있어요.
위 저장소에서는 모델 학습 스크립트를 실행할 때마다 새 커밋이 찍히고, 커밋 메시지에 특정 실행 번호를 포함시켜요.
과거 실행, 예를 들어 run #435의 정확히 같은 결과를 재현하려고 모델 학습 스크립트를 다시 실행하고 싶다면, 그 실행에 연관된 커밋 ID를 복사해 다음처럼 데이터를 데이터프레임으로 읽으면 돼요:
df = spark.read.parquet("s3://example/296e54fbee5e176f3f4f4aeb7e087f9d57515750e8c3d033b8b841778613cb23/training_dataset/")
코드에서 특정 commit_id를 참조할 수 있는 능력은 데이터 컬렉션의 특정 상태, 심지어 여러 컬렉션의 상태를 재현하는 것을 단순화해요. 이것에는 과거 디버깅, 데이터 컬렉션에서의 델타 식별, 감사 컴플라이언스 같은 데이터 개발에서 흔한 많은 활용이 있어요.
태그 사용하기
커밋 외에도 lakeFS는 태그를 지원해요. 태그는 특정 커밋을 가리키는 사람이 읽을 수 있는 레이블이에요.
태그는 중요한 시점을 표시하고 싶을 때 유용해요:
- 프로덕션 데이터 릴리스
- 특정 모델 학습 데이터셋
- 감사에 사용된 데이터셋
읽기 어려운 commit_id를 참조하는 대신, 코드에서 태그를 직접 참조할 수 있어요. 예를 들면:
df = spark.read.parquet("s3://example/v1.0/training_dataset/")
여기서 v1.0은 특정 커밋을 가리키는 태그예요. lakeFS의 커밋은 불변이지만, 태그는 그 불변 커밋들 중 하나를 가리키는 단순한 참조예요. 한 번 만들어진 태그는 다른 커밋을 가리키도록 업데이트될 수 없어요(삭제 후 재생성만 가능해요).
그 결과로, 태그를 통한 데이터 읽기는 그 태그가 존재하는 한 항상 정확히 같은 데이터 상태를 반환해요.
태그를 사용하면 읽기 쉽고, 공유 가능하고, 시간이 지나도 안정적인 방식으로 재현 가능한 데이터셋을 다루기가 더 쉬워져요.
더 알아보기 (Learn more)
공식 문서의 원문은 https://docs.lakefs.io/use-cases/reproducibility/ 에서 확인할 수 있어요.