하나의 run에서 새 아티팩트 버전을 생성하거나, 분산된 run들과 협업하여 생성할 수 있습니다. 또한 이전 버전에서 새 아티팩트 버전을 생성할 수도 있으며, 이를 incremental artifact(증분 아티팩트)라고 합니다.
원본 아티팩트의 크기가 상당히 크고 그중 일부 파일에만 변경 사항을 적용해야 할 때는 incremental artifact를 생성하는 것을 권장합니다.
새로운 아티팩트 버전을 생성하는 방법은 두 가지입니다. 단일 run에서 생성하는 방법과 분산 run에서 생성하는 방법입니다. 각각 다음과 같이 정의됩니다:
- Single run: 하나의 run이 새 버전에 필요한 모든 데이터를 제공합니다. 가장 일반적인 경우이며, run이 필요한 데이터를 완전히 재생성할 수 있을 때 가장 적합합니다. 예를 들어, 분석을 위해 저장된 모델 또는 모델 예측값을 테이블로 출력하는 경우입니다.
- Distributed runs: 여러 run 집합이 함께 새 버전에 필요한 모든 데이터를 제공합니다. 여러 run이 보통 병렬로 데이터를 생성하는 분산 작업에 가장 적합합니다. 예를 들어, 모델을 분산 방식으로 평가하고 예측값을 출력하는 경우입니다.
프로젝트에 존재하지 않는 이름을 wandb.Artifact API에 전달하면, W&B는 새로운 아티팩트를 생성하고 v0 별칭을 부여합니다. 동일한 아티팩트에 다시 로그할 때 W&B는 내용의 체크섬을 계산합니다. 아티팩트가 변경되었다면 W&B는 새로운 버전 v1을 저장합니다.
프로젝트에 이미 존재하는 아티팩트와 이름과 아티팩트 타입이 모두 일치하는 값을 wandb.Artifact API에 전달하면, W&B는 기존 아티팩트를 가져옵니다. 가져온 아티팩트의 버전은 1보다 큰 값입니다.
하나의 run이 아티팩트에 포함된 모든 파일을 생성하는 경우, 해당 run으로 아티팩트의 새 버전을 로깅합니다. 이 시나리오는 단일 run이 아티팩트에 포함되는 모든 파일을 생성할 때 발생합니다.
사용 사례에 따라 아래 탭 중 하나를 선택하여 run 내부 또는 run 외부에서 새 아티팩트 버전을 생성하세요:
W&B run 내부에서 아티팩트 버전을 생성하려면:
wandb.init으로 run을 생성합니다.
wandb.Artifact로 새 아티팩트를 생성하거나 기존 아티팩트를 가져옵니다.
.add_file로 아티팩트에 파일을 추가합니다.
.log_artifact로 아티팩트를 run에 로깅합니다.
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# `.add`, `.add_file`, `.add_dir`, `.add_reference`를 사용해
# 파일과 에셋을 아티팩트에 추가합니다.
artifact.add_file("image1.png")
run.log_artifact(artifact)
W&B run 외부에서 아티팩트 버전을 생성하려면:
wanb.Artifact로 새 아티팩트를 생성하거나 기존 아티팩트를 가져옵니다.
.add_file로 아티팩트에 파일을 추가합니다.
.save로 아티팩트를 저장합니다.
artifact = wandb.Artifact("artifact_name", "artifact_type")
# `.add`, `.add_file`, `.add_dir`, `.add_reference`를 사용해
# 파일과 에셋을 아티팩트에 추가합니다.
artifact.add_file("image1.png")
artifact.save()
여러 개의 run으로 구성된 컬렉션이 하나의 버전에 대해 커밋하기 전에 함께 작업할 수 있도록 합니다. 이는 위에서 설명한 단일 run 모드(하나의 run이 새 버전에 필요한 모든 데이터를 제공하는 모드)와는 대조적입니다.
- 컬렉션에 포함된 각 run은 동일한 고유 ID(
distributed_id라고 부름)를 알고 있어야 같은 버전에서 함께 작업할 수 있습니다. 기본적으로, 설정되어 있다면 W&B는 run의 group( wandb.init(group=GROUP)으로 설정된 값)을 distributed_id로 사용합니다.
- 해당 버전을 “커밋”하여 상태를 영구적으로 잠그는 최종 run이 하나 있어야 합니다.
- 협업용 아티팩트에 추가할 때는
upsert_artifact를, 커밋을 최종 확정할 때는 finish_artifact를 사용합니다.
다음 예시를 살펴보세요. 서로 다른 run들(아래에서 Run 1, Run 2, Run 3로 표시됨)이 upsert_artifact를 사용해 동일한 아티팩트에 서로 다른 이미지 파일을 추가합니다.
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# `.add`, `.add_file`, `.add_dir`, `.add_reference`를 사용하여
# 아티팩트에 파일 및 에셋 추가
artifact.add_file("image1.png")
run.upsert_artifact(artifact, distributed_id="my_dist_artifact")
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# 아티팩트에 파일 및 에셋을 추가하려면
# `.add`, `.add_file`, `.add_dir`, `.add_reference`를 사용하세요
artifact.add_file("image2.png")
run.upsert_artifact(artifact, distributed_id="my_dist_artifact")
Run 1과 Run 2가 완료된 후에 실행되어야 합니다. finish_artifact를 호출하는 Run은 아티팩트에 파일을 포함할 수 있지만, 반드시 포함할 필요는 없습니다.
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# 아티팩트에 파일 및 에셋 추가
# `.add`, `.add_file`, `.add_dir`, `.add_reference`
artifact.add_file("image3.png")
run.finish_artifact(artifact, distributed_id="my_dist_artifact")
변경되지 않은 파일을 다시 인덱싱하지 않고도 이전 아티팩트 버전에서 일부 파일을 추가, 수정 또는 삭제할 수 있습니다. 이전 아티팩트 버전에서 일부 파일을 추가, 수정 또는 삭제하면 _증분 아티팩트_라고 하는 새로운 아티팩트 버전이 생성됩니다.
다음은 발생할 수 있는 각 유형의 증분 변경에 대한 시나리오 예시입니다:
- add: 새 배치를 수집한 뒤 주기적으로 새로운 파일 부분 집합을 데이터셋에 추가합니다.
- remove: 중복된 파일을 여러 개 발견해서 아티팩트에서 제거하려고 합니다.
- update: 일부 파일의 어노테이션을 수정했고, 기존 파일을 올바른 파일로 교체하려는 경우입니다.
증분 아티팩트와 동일한 기능을 수행하기 위해 아티팩트를 처음부터 새로 만들 수도 있습니다. 그러나 아티팩트를 처음부터 새로 만들 경우, 아티팩트의 모든 콘텐츠가 로컬 디스크에 있어야 합니다. 증분 변경을 사용하면 이전 아티팩트 버전의 파일은 그대로 유지하면서 단일 파일을 추가, 제거 또는 수정할 수 있습니다.
단일 run 내에서 또는 여러 Runs(분산 모드)에서 증분 아티팩트를 생성할 수 있습니다.
아티팩트를 점진적으로 변경하려면 다음 절차를 따르세요:
- 증분 업데이트를 수행할 아티팩트 버전을 가져옵니다:
saved_artifact = run.use_artifact("my_artifact:latest")
client = wandb.Api()
saved_artifact = client.artifact("my_artifact:latest")
- 다음을 사용하여 초안을 만듭니다:
draft_artifact = saved_artifact.new_draft()
- 다음 버전에 반영되길 원하는 증분 변경을 수행하세요. 기존 항목을 추가, 삭제 또는 수정할 수 있습니다.
각 변경 사항을 수행하는 방법의 예시를 보려면 탭을 선택하세요:
기존 아티팩트 버전에 add_file 메서드를 사용해 파일을 추가합니다:draft_artifact.add_file("file_to_add.txt")
add_dir 메서드로 디렉터리를 추가하면 여러 파일을 한 번에 추가할 수도 있습니다.
기존 아티팩트 버전에서 remove 메서드를 사용해 파일을 삭제합니다:draft_artifact.remove("file_to_remove.txt")
디렉터리 경로를 인자로 전달하면 remove 메서드로 여러 파일을 한 번에 삭제할 수도 있습니다.
드래프트 아티팩트에서 이전 내용을 삭제한 다음 새 내용을 다시 추가하여 내용을 수정하거나 교체합니다:draft_artifact.remove("modified_file.txt")
draft_artifact.add_file("modified_file.txt")
- 마지막으로 변경 사항을 로그에 기록하거나 저장합니다. 아래 탭은 W&B run 내부와 외부에서 변경 사항을 저장하는 방법을 각각 보여 줍니다. 자신의 사용 사례에 맞는 탭을 선택하세요:
run.log_artifact(draft_artifact)
위의 내용을 모두 종합하면 코드 예시는 다음과 같습니다:
with wandb.init(job_type="modify dataset") as run:
saved_artifact = run.use_artifact(
"my_artifact:latest"
) # 아티팩트를 가져와 run의 입력으로 사용
draft_artifact = saved_artifact.new_draft() # 드래프트 버전 생성
# 드래프트 버전에서 일부 파일만 수정
draft_artifact.add_file("file_to_add.txt")
draft_artifact.remove("dir_to_remove/")
run.log_artifact(
draft_artifact
) # 변경 사항을 로깅해 새 버전을 생성하고 해당 버전을 run의 출력으로 지정
client = wandb.Api()
saved_artifact = client.artifact("my_artifact:latest") # 아티팩트를 로드
draft_artifact = saved_artifact.new_draft() # 드래프트 버전 생성
# 드래프트 버전에서 일부 파일만 수정
draft_artifact.remove("deleted_file.txt")
draft_artifact.add_file("modified_file.txt")
draft_artifact.save() # 드래프트에 대한 변경 사항 커밋