테이블을 정의하려면 각 데이터 행에 대해 보고자 하는 열(columns)을 지정하세요. 각 행은 학습 데이터셋의 단일 아이템, 학습 중 특정 스텝(step)이나 에포크(epoch), 테스트 아이템에 대해 모델이 만든 예측, 모델이 생성한 객체 등일 수 있습니다. 각 열은 숫자, 텍스트, 불리언, 이미지, 비디오, 오디오 등과 같은 고정 타입을 가집니다. 타입을 미리 지정할 필요는 없습니다. 각 열에 이름을 지정하고, 해당 열 인덱스에는 그 타입의 데이터만 전달되도록 하세요. 더 자세한 예제는 W&B Tables 가이드를 참고하세요.wandb.Table 생성자는 두 가지 방식으로 사용할 수 있습니다:
행 리스트(List of Rows):이름이 지정된 열과 데이터 행들을 로깅합니다. 예를 들어 다음 코드 스니펫은 두 개의 행과 세 개의 열을 가진 테이블을 생성합니다:
# 모델이 네 개의 이미지에 대한 예측을 반환했다고 가정합니다# 다음 필드를 사용할 수 있습니다:# - 이미지 id# - wandb.Image()로 래핑된 이미지 픽셀# - 모델의 예측 레이블# - 실제 정답 레이블my_data = [ [0, wandb.Image("img_0.jpg"), 0, 0], [1, wandb.Image("img_1.jpg"), 8, 0], [2, wandb.Image("img_2.jpg"), 7, 1], [3, wandb.Image("img_3.jpg"), 1, 1],]# 해당 열로 wandb.Table()을 생성합니다columns = ["id", "image", "prediction", "truth"]test_table = wandb.Table(data=my_data, columns=columns)
테이블은 변경 가능합니다. 스크립트가 실행되는 동안 최대 200,000개 행까지 테이블에 데이터를 계속 추가할 수 있습니다. 테이블에 데이터를 추가하는 방법은 두 가지입니다:
행 추가: table.add_data("3a", "3b", "3c"). 새 행은 리스트로 전달하지 않는다는 점에 유의하세요. 행이 리스트 형태라면 별표 표기 *를 사용해 리스트를 위치 인자로 펼쳐서 전달합니다: table.add_data(*my_row_list). 행에는 테이블의 열 개수와 동일한 개수의 항목이 포함되어야 합니다.
열 추가: table.add_column(name="col_name", data=col_data). col_data의 길이는 테이블의 현재 행 수와 같아야 합니다. 여기서 col_data는 리스트 또는 NumPy NDArray일 수 있습니다.
이 코드 예제는 W&B 테이블을 순차적으로 생성하고 채우는 방법을 보여줍니다. 먼저 가능한 모든 레이블에 대한 신뢰도 점수를 포함해 미리 정의된 열로 테이블을 정의한 다음, 추론 중에 행 단위로 데이터를 추가합니다. 또한 재개한 실행에서 테이블에 데이터를 순차적으로 추가할 수도 있습니다.
# 각 레이블의 신뢰도 점수를 포함하여 테이블의 열을 정의합니다columns = ["id", "image", "guess", "truth"]for digit in range(10): # 각 숫자(0-9)에 대한 신뢰도 점수 열을 추가합니다 columns.append(f"score_{digit}")# 정의된 열로 테이블을 초기화합니다test_table = wandb.Table(columns=columns)# 테스트 데이터셋을 순회하며 테이블에 행 단위로 데이터를 추가합니다# 각 행에는 이미지 ID, 이미지, 예측 레이블, 실제 레이블, 신뢰도 점수가 포함됩니다for img_id, img in enumerate(mnist_test_data): true_label = mnist_test_data_labels[img_id] # 정답 레이블 guess_label = my_model.predict(img) # 예측 레이블 test_table.add_data( img_id, wandb.Image(img), guess_label, true_label ) # 테이블에 행 데이터를 추가합니다
아티팩트에서 기존 테이블을 불러와 마지막 행의 데이터를 가져온 뒤, 거기에 최신 지표를 추가하면 재개된 실행에서도 W&B 테이블을 순차적으로 업데이트할 수 있습니다. 그런 다음 호환성을 위해 테이블을 다시 초기화하고, 업데이트된 버전을 W&B에 다시 로그하세요.
import wandb# 실행 초기화 with wandb.init(project="my_project") as run: # 아티팩트에서 기존 테이블 로드 best_checkpt_table = run.use_artifact(table_tag).get(table_name) # 재개를 위해 테이블의 마지막 행 데이터 가져오기 best_iter, best_metric_max, best_metric_min = best_checkpt_table.data[-1] # 필요에 따라 최적 메트릭 업데이트 # 업데이트된 데이터를 테이블에 추가 best_checkpt_table.add_data(best_iter, best_metric_max, best_metric_min) # 호환성 확보를 위해 업데이트된 데이터로 테이블 재초기화 best_checkpt_table = wandb.Table( columns=["col1", "col2", "col3"], data=best_checkpt_table.data ) # 실행 초기화 with wandb.init() as run: # 업데이트된 테이블을 W&B에 로깅 run.log({table_name: best_checkpt_table})
Row Iterator: for ndx, row in table.iterrows(): ... 와 같은 Table의 행 이터레이터를 사용해 데이터의 행을 효율적으로 순회할 수 있습니다.
열 가져오기 (Get a Column): table.get_column("col_name") 을 사용해 하나의 열을 가져올 수 있습니다. 편의를 위해 convert_to="numpy" 를 전달하면 해당 열을 NumPy NDArray 원시 타입 배열로 변환할 수 있습니다. 이는 열에 wandb.Image 와 같은 미디어 타입이 포함된 경우, 그 열의 실제 데이터에 직접 접근하는 데 유용합니다.
with wandb.init() as run: my_table = wandb.Table(columns=["a", "b"], data=[["1a", "1b"], ["2a", "2b"]]) run.log({"table_key": my_table})
동일한 키에 테이블을 기록할 때마다 테이블의 새 버전이 생성되어 백엔드에 저장됩니다. 즉, 동일한 테이블을 여러 학습 단계에 걸쳐 기록하여 시간이 지남에 따라 모델 예측이 어떻게 개선되는지 확인하거나, 동일한 키로 기록되는 한 서로 다른 실행 간에 테이블을 비교할 수 있습니다. 최대 200,000개의 행을 기록할 수 있습니다.
200,000개보다 많은 행을 기록하려면 다음과 같이 제한을 재정의할 수 있습니다:wandb.Table.MAX_ARTIFACT_ROWS = X다만 이렇게 하면 UI에서 쿼리가 느려지는 등 성능 문제가 발생할 수 있습니다.
워크스페이스 대신 실행의 Artifacts 섹션에 테이블을 로그하려면 artifact.add()를 사용하세요. 이 기능은 한 번만 로그해 두고 이후 실행에서 다시 참조하고 싶은 데이터셋이 있을 때 유용합니다.
with wandb.init(project="my_project") as run: # 각 의미 있는 단계마다 wandb 아티팩트 생성 test_predictions = wandb.Artifact("mnist_test_preds", type="predictions") # [위와 같이 예측 데이터를 구성] test_table = wandb.Table(data=data, columns=columns) test_predictions.add(test_table, "my_test_key") run.log_artifact(test_predictions)
wandb.JoinedTable(table_1, table_2, join_key)를 사용해서 로컬에서 생성한 테이블이나 다른 아티팩트에서 가져온 테이블을 조인할 수 있습니다.
Args
Description
table_1
(str, wandb.Table, ArtifactEntry) 아티팩트 내 wandb.Table의 경로, 테이블 객체, 또는 ArtifactEntry
table_2
(str, wandb.Table, ArtifactEntry) 아티팩트 내 wandb.Table의 경로, 테이블 객체, 또는 ArtifactEntry
join_key
(str, [str, str]) 조인을 수행할 키 또는 키 목록
아티팩트 컨텍스트에서 이전에 로깅해 둔 두 개의 테이블을 조인하려면, 해당 테이블들을 아티팩트에서 가져와 결과를 새로운 테이블로 조인합니다.예를 들어, 다음 코드 예시는 'original_songs'라는 이름의 원곡 테이블 하나와 동일한 곡들의 합성 버전이 들어 있는 'synth_songs'라는 또 다른 테이블을 읽는 방법을 보여 줍니다. 이 코드는 두 테이블을 "song_id" 기준으로 조인하고, 결과 테이블을 새로운 W&B 테이블로 업로드합니다:
import wandbwith wandb.init(project="my_project") as run: # 원본 노래 테이블 가져오기 orig_songs = run.use_artifact("original_songs:latest") orig_table = orig_songs.get("original_samples") # 합성 노래 테이블 가져오기 synth_songs = run.use_artifact("synth_songs:latest") synth_table = synth_songs.get("synth_samples") # "song_id"를 기준으로 테이블 조인 join_table = wandb.JoinedTable(orig_table, synth_table, "song_id") join_at = wandb.Artifact("synth_summary", "analysis") # 아티팩트에 테이블 추가 및 W&B에 로그 기록 join_at.add(join_table, "synth_explore") run.log_artifact(join_at)
이 튜토리얼을 참고하여 서로 다른 아티팩트 객체에 저장된 두 개의 기존 테이블을 조인하는 방법을 확인하세요.