메인 콘텐츠로 건너뛰기
W&B Python SDK를 사용해 W&B 실행에서 아티팩트를 생성합니다. 파일, 디렉터리, URI, 그리고 병렬 실행의 파일을 아티팩트에 추가할 수 있습니다. 파일을 아티팩트에 추가한 후에는 아티팩트를 W&B 서버 또는 자체 프라이빗 서버에 저장합니다. 각 아티팩트는 하나의 실행과 연결됩니다. Amazon S3에 저장된 파일과 같은 외부 파일을 추적하는 방법은 외부 파일 추적 페이지를 참조하세요.

아티팩트 구성

다음 세 단계로 W&B 아티팩트를 구성합니다:
  1. wandb.Artifact()로 아티팩트 Python 객체를 생성합니다
  2. 아티팩트에 하나 이상의 파일을 추가합니다
  3. 아티팩트를 W&B 서버에 저장합니다

1. wandb.Artifact()를 사용해 아티팩트 Python 객체 생성하기

wandb.Artifact() 클래스를 초기화하여 아티팩트 객체를 생성합니다. 다음 파라미터를 지정합니다:
  • Name: 아티팩트의 이름입니다. 이름은 고유하고, 설명적이며, 기억하기 쉬워야 합니다.
  • Type: 아티팩트의 타입입니다. 타입은 단순하고 설명적이어야 하며, 머신 러닝 파이프라인의 단일 단계와 대응되어야 합니다. 일반적인 아티팩트 타입에는 'dataset' 또는 'model'이 있습니다.
W&B는 W&B 앱에서 유향 비순환 그래프를 생성하기 위해 사용자가 제공한 “name”과 “type”을 사용합니다. 자세한 내용은 아티팩트 그래프 탐색 및 이동을 참고하세요.
아티팩트는 타입에 상관없이 동일한 이름을 가질 수 없습니다. 즉, 타입이 datasetcats라는 이름의 아티팩트를 만들고, 동일한 이름에 타입이 model인 또 다른 아티팩트를 생성할 수는 없습니다.
아티팩트 객체를 초기화할 때 선택적으로 description과 metadata를 제공할 수 있습니다. 사용 가능한 속성과 파라미터에 대한 자세한 내용은 Python SDK Reference Guide의 wandb.Artifact 클래스 정의를 참고하세요. 다음 코드 스니펫을 복사해 붙여넣어 아티팩트 객체를 생성하세요. <name><type> 플레이스홀더를 실제 값으로 교체하세요:
import wandb

# 아티팩트 객체 생성
artifact = wandb.Artifact(name="<name>", type="<type>")

2. 아티팩트에 파일 하나 더 추가하기

파일, 디렉터리, 외부 URI 참조(예: Amazon S3) 등을 추가해서 아티팩트 객체에 포함시킬 수 있습니다. 단일 파일을 추가하려면 아티팩트 객체의 Artifact.add_file() 메서드를 사용하세요.
artifact.add_file(local_path="path/to/file.txt", name="<name>")
디렉터리를 추가하려면 Artifact.add_dir() 메서드를 사용하세요.
artifact.add_dir(local_path="path/to/directory", name="<name>")
서로 다른 파일 유형을 아티팩트에 추가하는 방법에 대한 자세한 내용은 다음 섹션인 아티팩트에 파일 추가하기를 참고하세요.

3. 아티팩트를 W&B 서버에 저장하기

아티팩트를 W&B 서버에 저장합니다. 이를 위해 실행 객체의 wandb.Run.log_artifact() 메서드를 사용해 아티팩트를 저장합니다.
with wandb.init(project="<project>", job_type="<job-type>") as run:
    run.log_artifact(artifact)
wandb.Run.log_artifact()Artifact.save()를 언제 사용할지
  • 새로운 아티팩트를 생성하고 특정 실행과 연결하려면 wandb.Run.log_artifact()를 사용하세요.
  • 새로운 실행을 생성하지 않고 기존 아티팩트를 업데이트하려면 Artifact.save()를 사용하세요.
지금까지의 내용을 종합하면, 아래 코드 예시는 데이터셋 아티팩트를 생성하고 그 아티팩트에 파일을 추가한 다음, 해당 아티팩트를 W&B에 저장하는 방법을 보여줍니다:
import wandb

artifact = wandb.Artifact(name="<name>", type="<type>")
artifact.add_file(local_path="path/to/file.txt", name="<name>")
artifact.add_dir(local_path="path/to/directory", name="<name>")

with wandb.init(project="<project>", job_type="<job-type>") as run:
    run.log_artifact(artifact)
동일한 이름과 타입으로 아티팩트를 로그할 때마다 W&B는 해당 아티팩트의 새 버전을 생성합니다. 자세한 내용은 새 아티팩트 버전 생성하기를 참조하세요.
W&B는 업로드 성능을 위해 wandb.Run.log_artifact()를 비동기적으로 호출합니다. 이로 인해 반복문에서 아티팩트를 기록할 때 예상치 못한 동작이 발생할 수 있습니다. 예를 들어:
with wandb.init() as run:
    for i in range(10):
        a = wandb.Artifact(name = "race",
            type="dataset",
            metadata={
                "index": i,
            },
        )
        # ... 아티팩트 a에 파일을 추가합니다 ...
        run.log_artifact(a)
아티팩트 버전 v0의 메타데이터에서 index 값이 0이라고 보장되지 않습니다. 아티팩트는 임의의 순서로 기록될 수 있기 때문입니다.

아티팩트에 파일 추가하기

다음 섹션에서는 다양한 유형의 객체를 아티팩트에 추가하는 방법을 보여줍니다. 예제를 살펴보면서 다음과 같은 구조의 디렉터리가 있다고 가정하십시오:
root-directory
| - hello.txt
| - images/
| -- | cat.png
| -- | dog.png
| - checkpoints/
| -- | model.h5
| - models/
| -- | model.h5

단일 파일 추가

wandb.Artifact.add_file()를 사용하여 단일 로컬 파일을 아티팩트에 추가하세요. local_path 매개변수에 파일의 로컬 경로를 지정하세요:
import wandb

# 아티팩트 객체 초기화
artifact = wandb.Artifact(name="<name>", type="<type>")

# 단일 파일 추가
artifact.add_file(local_path="path/file.format")
예를 들어, 현재 작업 중인 로컬 디렉터리에 'hello.txt'라는 파일이 있다고 가정해 보겠습니다.
artifact.add_file("hello.txt")
이제 아티팩트의 내용은 다음과 같습니다:
hello.txt
선택적으로 name 매개변수에 다른 이름을 전달하여 아티팩트 객체 내부에서 파일의 이름을 변경할 수 있습니다. 앞의 예시를 이어서 보면:
artifact.add_file(
    local_path="hello.txt", 
    name="new/path/hello_world.txt"
    )
아티팩트는 다음과 같은 형태로 저장됩니다:
new/path/hello_world.txt
다음 표는 서로 다른 API 호출에 따라 아티팩트에 어떤 파일이 포함되는지 보여줍니다:
API Call생성된 아티팩트
artifact.new_file('hello.txt')hello.txt
artifact.add_file('model.h5')model.h5
artifact.add_file('checkpoints/model.h5')model.h5
artifact.add_file('model.h5', name='models/mymodel.h5')models/mymodel.h5

여러 파일 추가하기

로컬 디렉터리의 여러 파일을 아티팩트에 추가하려면 wandb.Artifact.add_dir() 메서드를 사용하십시오. local_path 매개변수에 해당 디렉터리의 로컬 경로를 지정하십시오.
import wandb

# 아티팩트 객체 초기화
artifact = wandb.Artifact(name="<name>", type="<type>")

# 아티팩트에 로컬 디렉토리 추가
artifact.add_dir(local_path="path/file.format", name="optional-prefix")
다음 표는 서로 다른 API 호출이 서로 다른 아티팩트 내용을 어떻게 생성하는지 보여 줍니다:
API CallResulting artifact
artifact.add_dir('images')

cat.png

dog.png

artifact.add_dir('images', name='images')

images/cat.png

images/dog.png

URI 참조 추가

URI에 W&B 라이브러리가 처리할 수 있는 스킴이 포함되어 있으면, 아티팩트는 재현성을 위해 체크섬 및 기타 정보를 추적합니다. wandb.Artifact.add_reference() 메서드를 사용해 아티팩트에 외부 URI 참조를 추가합니다. 'uri' 문자열을 실제 URI로 바꾸십시오. 선택적으로 name 매개변수에 아티팩트 내부에서 사용할 원하는 경로를 전달할 수 있습니다.
# URI 참조 추가
artifact.add_reference(uri="uri", name="optional-name")
아티팩트는 현재 다음 URI 스킴을 지원합니다:
  • http(s)://: HTTP를 통해 액세스할 수 있는 파일 경로입니다. HTTP 서버가 ETagContent-Length 응답 헤더를 지원하는 경우 아티팩트는 ETag와 크기 메타데이터 형태로 체크섬을 추적합니다.
  • s3://: S3의 객체 또는 객체 프리픽스 경로입니다. 아티팩트는 참조된 객체에 대해 체크섬과 버전 관리 정보(버킷에 객체 버전 관리가 활성화된 경우)를 추적합니다. 객체 프리픽스는 해당 프리픽스 아래의 객체를 최대 10,000개까지 포함하도록 확장됩니다.
  • gs://: GCS의 객체 또는 객체 프리픽스 경로입니다. 아티팩트는 참조된 객체에 대해 체크섬과 버전 관리 정보(버킷에 객체 버전 관리가 활성화된 경우)를 추적합니다. 객체 프리픽스는 해당 프리픽스 아래의 객체를 최대 10,000개까지 포함하도록 확장됩니다.
다음 표는 서로 다른 API 호출이 서로 다른 아티팩트 내용을 어떻게 생성하는지 보여줍니다:
API call생성되는 아티팩트 내용
artifact.add_reference('s3://my-bucket/model.h5')model.h5
artifact.add_reference('s3://my-bucket/checkpoints/model.h5')model.h5
artifact.add_reference('s3://my-bucket/model.h5', name='models/mymodel.h5')models/mymodel.h5
artifact.add_reference('s3://my-bucket/images')

cat.png

dog.png

artifact.add_reference('s3://my-bucket/images', name='images')

images/cat.png

images/dog.png

병렬 실행에서 아티팩트에 파일 추가하기

대규모 데이터셋이나 분산 학습에서는 여러 개의 병렬 실행이 단일 아티팩트 하나에 함께 기여해야 할 수도 있습니다.
import wandb
import time

# 이 예시는 데모 목적으로 Ray를 사용하여 병렬로 실행합니다.
import ray

ray.init()

artifact_type = "dataset"
artifact_name = "parallel-artifact"
table_name = "distributed_table"
parts_path = "parts"
num_parallel = 5

# 병렬 writer의 각 배치는 고유한
# 그룹 이름을 가져야 합니다.
group_name = "writer-group-{}".format(round(time.time()))


@ray.remote
def train(i):
    """
    writer 작업입니다. 각 writer는 아티팩트에 이미지 하나를 추가합니다.
    """
    with wandb.init(group=group_name) as run:
        artifact = wandb.Artifact(name=artifact_name, type=artifact_type)

        # wandb 테이블에 데이터를 추가합니다.
        table = wandb.Table(columns=["a", "b", "c"], data=[[i, i * 2, 2**i]])

        # 아티팩트의 폴더에 테이블을 추가합니다.
        artifact.add(table, "{}/table_{}".format(parts_path, i))

        # 아티팩트를 upsert하면 아티팩트에 데이터를 생성하거나 추가합니다.
        run.upsert_artifact(artifact)


# 실행을 병렬로 시작합니다.
result_ids = [train.remote(i) for i in range(num_parallel)]

# 아티팩트를 완료하기 전에 모든 writer의 파일이
# 추가되었는지 확인하기 위해 join합니다.
ray.get(result_ids)

# 모든 writer가 완료되면 아티팩트를 완료하여
# 준비 상태로 표시합니다.
with wandb.init(group=group_name) as run:
    artifact = wandb.Artifact(artifact_name, type=artifact_type)

    # 테이블 폴더를 가리키는 "PartitionTable"을 생성하고
    # 아티팩트에 추가합니다.
    artifact.add(wandb.data_types.PartitionedTable(parts_path), table_name)

    # 아티팩트 완료는 아티팩트를 확정하며, 이 버전에 대한
    # 이후 "upsert"를 허용하지 않습니다.
    run.finish_artifact(artifact)

기록된 아티팩트 및 기타 메타데이터의 경로 찾기

다음 코드 스니펫은 W&B Public API를 사용하여 실행에 포함된 파일의 이름과 URL을 나열하는 방법을 보여줍니다. <entity/project/run-id> 플레이스홀더를 여러분의 값으로 바꾸세요:
from wandb.apis.public.files import Files
from wandb.apis.public.api import Api

# 예시 실행 객체
run = Api().run("<entity/project/run-id>")

# 실행의 파일을 반복하기 위한 Files 객체 생성
files = Files(api.client, run)

# 파일 반복
for file in files:
    print(f"파일 이름: {file.name}")
    print(f"파일 URL: {file.url}")
    print(f"버킷의 파일 경로: {file.direct_url}")
사용 가능한 속성과 메서드에 대한 자세한 내용은 File 클래스를 참고하세요.