메인 콘텐츠로 건너뛰기
단일 run으로 새 아티팩트 버전을 만들거나, 여러 분산 run이 함께 새 아티팩트 버전을 만들 수 있습니다. 필요에 따라 증분 아티팩트라고 하는 이전 버전에서 새 아티팩트 버전을 만들 수도 있습니다.
아티팩트의 일부 파일에 변경 사항을 적용해야 하고 원본 아티팩트의 크기가 상당히 큰 경우에는 증분 아티팩트를 만드는 것이 좋습니다.

처음부터 새 아티팩트 버전 만들기

새 아티팩트 버전을 만드는 방법은 두 가지입니다. 단일 run에서 만드는 방법과 분산 run에서 만드는 방법입니다. 각 방식은 다음과 같습니다.
  • Single run: 하나의 run이 새 버전에 필요한 모든 데이터를 제공합니다. 가장 일반적인 경우이며, run이 필요한 데이터를 완전히 재생성할 수 있을 때 가장 적합합니다. 예를 들어 저장된 모델을 출력하거나, 분석을 위해 테이블에 모델 예측을 출력하는 경우입니다.
  • Distributed runs: 여러 run의 집합이 함께 새 버전에 필요한 모든 데이터를 제공합니다. 보통 여러 run이 병렬로 데이터를 생성하는 분산 작업에 가장 적합합니다. 예를 들어 모델을 분산 방식으로 평가하고 예측을 출력하는 경우입니다.
프로젝트에 없는 이름을 wandb.Artifact API에 전달하면 W&B는 새 아티팩트를 만들고 v0 별칭을 부여합니다. 동일한 아티팩트에 다시 log하면 W&B는 콘텐츠의 체크섬을 계산합니다. 아티팩트가 변경된 경우 W&B는 새 버전 v1을 저장합니다. 프로젝트의 기존 아티팩트와 일치하는 이름과 유형을 wandb.Artifact API에 전달하면 W&B는 기존 아티팩트를 가져옵니다. 가져온 아티팩트의 버전은 1보다 큽니다.
아티팩트 워크플로 비교

단일 run

아티팩트의 모든 파일을 하나의 run에서 생성하는 경우, 해당 단일 run으로 아티팩트의 새 버전을 기록합니다. 이 경우는 단일 run이 아티팩트의 모든 파일을 생성할 때 발생합니다. 사용 사례에 따라 아래 탭 중 하나를 선택하여 run 내부 또는 외부에서 새 아티팩트 버전을 생성하세요:
W&B run 내에서 아티팩트 버전을 생성하세요:
  1. wandb.init()으로 run을 생성합니다.
  2. wandb.Artifact로 새 아티팩트를 생성하거나 기존 아티팩트를 가져옵니다.
  3. .add_file로 아티팩트에 파일을 추가합니다.
  4. .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)

분산 run

커밋하기 전에 run 컬렉션이 버전에 공동으로 작업할 수 있습니다. 이는 위에서 설명한 단일 run 모드와 달리, 새 버전에 필요한 모든 데이터를 하나의 run이 제공하는 방식입니다.
  1. 컬렉션의 각 run이 동일한 버전에서 함께 작업하려면 동일한 고유 ID(distributed_id)를 알고 있어야 합니다. 기본적으로 이 값이 있으면 W&B는 wandb.init(group=GROUP)로 설정한 run의 groupdistributed_id로 사용합니다.
  2. 버전을 “커밋”하여 상태를 영구적으로 잠그는 최종 run이 반드시 있어야 합니다.
  3. 공동 작업 중인 아티팩트에 내용을 추가하려면 upsert_artifact를 사용하고, 커밋을 최종 완료하려면 finish_artifact를 사용하세요.
다음 예제를 살펴보세요. 서로 다른 run(아래에서 Run 1, Run 2, Run 3으로 표시됨)이 upsert_artifact를 사용해 동일한 아티팩트에 각기 다른 이미지 파일을 추가합니다.

Run 1

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")

Run 2

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 3

Run 1과 Run 2가 완료된 후 실행해야 합니다. wandb.Run.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: 새 배치를 수집한 후 데이터셋에 파일 일부를 주기적으로 추가합니다.
  • 제거: 중복 파일 여러 개를 발견했고 이를 아티팩트에서 제거하려는 경우입니다.
  • 업데이트: 일부 파일의 annotation을 수정했으며, 이전 파일을 올바른 파일로 교체하려고 합니다.
처음부터 아티팩트를 생성하여 증분 아티팩트와 동일한 기능을 수행할 수 있습니다. 그러나 처음부터 아티팩트를 생성하면 아티팩트의 모든 콘텐츠가 로컬 디스크에 있어야 합니다. 증분 변경을 수행할 때는 이전 아티팩트 버전의 파일을 그대로 유지하면서 단일 파일을 추가, 제거 또는 수정할 수 있습니다.
단일 run 내에서 또는 run 집합(분산 모드)을 사용하여 증분 아티팩트를 생성할 수 있습니다.
아티팩트를 점진적으로 변경하려면 아래 절차를 따르세요.
  1. 증분 변경을 적용할 아티팩트 버전을 획득하세요:
saved_artifact = run.use_artifact("my_artifact:latest")
  1. 다음을 사용해 초안을 만드세요:
draft_artifact = saved_artifact.new_draft()
  1. 다음 버전에 반영할 변경분을 적용하세요. 항목을 추가하거나 제거하거나 기존 항목을 수정할 수 있습니다.
각 변경 사항을 수행하는 방법의 예시를 보려면 탭 중 하나를 선택하세요.
add_file 방법을 사용해 기존 아티팩트 버전에 파일을 추가하세요:
draft_artifact.add_file("file_to_add.txt")
add_dir 방법을 사용해 디렉터리를 추가하면 여러 파일도 추가할 수 있습니다.
  1. 마지막으로, 변경 사항을 기록하거나 저장하세요. 다음 탭에서는 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의 출력으로 표시합니다