단일 run으로 새 artifact 버전을 만들거나, 분산된 여러 run이 함께 새 artifact 버전을 만들 수 있습니다. 필요에 따라 이전 버전에서 새 artifact 버전을 만들 수도 있으며, 이를 incremental artifact라고 합니다.
원본 artifact의 크기가 상당히 큰 상태에서 artifact에 포함된 일부 파일에만 변경 사항을 적용해야 하는 경우에는 incremental artifact를 만드는 것이 좋습니다.
새 artifact 버전을 만드는 방법은 두 가지입니다. 단일 run에서 만드는 방법과 분산 run에서 만드는 방법입니다. 각각은 다음과 같습니다.
- 단일 run: 하나의 run이 새 버전에 필요한 모든 데이터를 제공합니다. 이는 가장 일반적인 경우이며, run이 필요한 데이터를 완전히 재생성할 수 있을 때 가장 적합합니다. 예를 들어 저장된 모델이나 분석용 table에 담긴 모델 예측을 출력하는 경우입니다.
- 분산 run: 여러 run의 집합이 함께 새 버전에 필요한 모든 데이터를 제공합니다. 이는 여러 run이 대개 병렬로 데이터를 생성하는 분산 작업에 가장 적합합니다. 예를 들어 모델을 분산 방식으로 평가하고 예측을 출력하는 경우입니다.
프로젝트에 존재하지 않는 이름을 wandb.Artifact API에 전달하면 W&B가 새 artifact를 만들고 v0 alias를 할당합니다. 같은 artifact에 다시 로깅하면 W&B가 콘텐츠의 체크섬을 계산합니다. artifact가 변경되면 W&B가 새 버전 v1을 저장합니다.
프로젝트의 기존 artifact와 일치하는 이름과 artifact type을 wandb.Artifact API에 전달하면 W&B가 기존 artifact를 조회합니다. 조회된 artifact의 버전은 1보다 큽니다.
아티팩트의 모든 파일을 생성하는 단일 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")
# 다음을 사용해 artifact에 파일과 asset을 추가합니다.
# `.add`, `.add_file`, `.add_dir`, and `.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")
# 다음을 사용해 artifact에 파일과 asset을 추가합니다.
# `.add`, `.add_file`, `.add_dir`, and `.add_reference`
artifact.add_file("image1.png")
artifact.save()
버전을 커밋하기 전에 여러 run이 하나의 버전에 함께 기여할 수 있습니다. 이는 위에서 설명한 single run 모드와는 대조적이며, single run 모드에서는 하나의 run이 새 버전에 필요한 모든 데이터를 제공합니다.
- 컬렉션의 각 run은 동일한 버전에서 협업하려면 같은 고유 ID(
distributed_id라고 함)를 알고 있어야 합니다. 기본적으로 W&B는 wandb.init(group=GROUP)으로 설정한 run의 group이 있으면 이를 distributed_id로 사용합니다.
- 버전을 “커밋”하여 해당 상태를 영구적으로 잠그는 마지막 run이 반드시 있어야 합니다.
- 협업 artifact에 내용을 추가할 때는
upsert_artifact를 사용하고, 커밋을 최종 완료할 때는 finish_artifact를 사용합니다.
다음 예를 살펴보세요. 서로 다른 run(아래에서 Run 1, Run 2, Run 3으로 표시됨)이 upsert_artifact를 사용해 동일한 artifact에 서로 다른 이미지 파일을 추가합니다.
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# 다음을 사용해 artifact에 파일과 asset을 추가합니다.
# `.add`, `.add_file`, `.add_dir`, and `.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")
# 다음을 사용해 artifact에 파일과 asset을 추가합니다.
# `.add`, `.add_file`, `.add_dir`, and `.add_reference`
artifact.add_file("image2.png")
run.upsert_artifact(artifact, distributed_id="my_dist_artifact")
Run 1과 Run 2가 완료된 후에 실행해야 합니다. wandb.Run.finish_artifact()를 호출하는 run은 아티팩트에 파일을 포함할 수 있지만, 반드시 포함할 필요는 없습니다.
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# 다음을 사용해 artifact에 파일과 asset을 추가합니다.
# `.add`, `.add_file`, `.add_dir`, and `.add_reference`
artifact.add_file("image3.png")
run.finish_artifact(artifact, distributed_id="my_dist_artifact")
변경되지 않은 파일을 다시 인덱싱할 필요 없이 이전 아티팩트 버전에서 파일의 일부를 추가, 수정 또는 제거합니다. 이전 아티팩트 버전에서 파일의 일부를 추가, 수정 또는 제거하면 _증분 아티팩트_라고 하는 새 아티팩트 버전이 생성됩니다.
다음은 발생할 수 있는 각 유형의 증분 변경에 대한 시나리오입니다:
- 추가: 새 배치를 수집한 후 데이터셋에 새 파일 하위 집합을 주기적으로 추가합니다.
- 제거: 중복 파일을 여러 개 발견하여 아티팩트에서 제거하려고 합니다.
- 업데이트: 파일 하위 집합에 대한 주석을 수정하고 이전 파일을 올바른 파일로 교체하려고 합니다.
증분 아티팩트와 동일한 기능을 수행하기 위해 아티팩트를 처음부터 만들 수 있습니다. 그러나 아티팩트를 처음부터 만들 때는 아티팩트의 모든 내용이 로컬 디스크에 있어야 합니다. 증분 변경을 수행할 때는 이전 아티팩트 버전의 파일을 변경하지 않고 단일 파일을 추가, 제거 또는 수정할 수 있습니다.
단일 run 내에서 또는 여러 run의 집합(분산 모드)으로 증분 아티팩트를 만들 수 있습니다.
아티팩트를 증분 변경하려면 아래 절차를 따르세요:
- 증분 변경을 수행할 아티팩트 버전을 가져옵니다:
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() # 초안 버전을 만듭니다
# modify a subset of files in the draft version
draft_artifact.remove("deleted_file.txt")
draft_artifact.add_file("modified_file.txt")
draft_artifact.save() # commit changes to the draft