単一の run から、または分散 run を用いて共同で新しいアーティファクトバージョンを作成できます。既存のバージョンから新しいアーティファクトバージョンを作成することもでき、この場合はインクリメンタルアーティファクトと呼びます。
元のアーティファクトのサイズが大きく、その中の一部のファイルのみを変更する必要がある場合は、インクリメンタルアーティファクトを作成することを推奨します。
ゼロから新しいアーティファクトバージョンを作成する
新しいアーティファクトバージョンを作成する方法は 2 つあります。単一の run から作成する方法と、分散 run から作成する方法です。定義は次のとおりです。
- Single run: 1 つの run が新しいバージョンに必要なすべてのデータを提供する場合です。これは最も一般的なケースであり、run が必要なデータを完全に再生成する場合に最適です。例: 保存済みモデルやモデル予測を、分析用のテーブルとして出力する。
- Distributed runs: 複数の run の集合で新しいバージョンに必要なすべてのデータを提供する場合です。これは、複数の run が並列にデータを生成するような分散ジョブに最適です。例: モデルを分散的に評価し、その予測結果を出力する。
wandb.Artifact API に、プロジェクト内に存在しない名前を渡した場合、W&B は新しいアーティファクトを作成し、そのアーティファクトに v0 エイリアスを割り当てます。同じアーティファクトに対して再度ログするとき、W&B は内容のチェックサムを計算します。アーティファクトが変更されていた場合、W&B は新しいバージョン v1 を保存します。
wandb.Artifact API に、プロジェクト内に既に存在するアーティファクトと一致する名前とアーティファクトタイプを渡した場合、W&B は既存のアーティファクトを取得します。取得されたアーティファクトのバージョンは 1 より大きい値になります。
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")
# `.add`, `.add_file`, `.add_dir`, `.add_reference` を使って
# アーティファクトにファイルやアセットを追加する
artifact.add_file("image1.png")
run.log_artifact(artifact)
W&B run の外でアーティファクトバージョンを作成します:
wandb.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()
コミットする前のバージョンに対して、複数の runs が共同で作業できるようにします。これは、上で説明した単一 run モードとは対照的で、1 つの run が新しいバージョンのすべてのデータを提供します。
- コレクション内の各 run は、同じバージョンで協調して作業するために、同一の一意な ID(
distributed_id と呼びます)を認識している必要があります。デフォルトでは、設定されている場合、W&B は run の group(wandb.init(group=GROUP) で設定)を distributed_id として使用します。
- バージョンを「コミット」して、その状態を永続的にロックする最終的な run が必要です。
- 共同作業用アーティファクトに追加するには
upsert_artifact を、コミットを確定するには finish_artifact を使用します。
次の例を見てみましょう。異なる runs(以下で 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: 一部のファイルのアノテーションを修正したため、古いファイルを修正版と置き換えたい。
インクリメンタルアーティファクトと同じ機能を実現するために、アーティファクトをゼロから作成することもできます。ただし、ゼロから作成する場合は、アーティファクトのすべての内容をローカルディスク上に用意する必要があります。インクリメンタルな変更を行う場合は、以前のアーティファクトバージョンのファイルを変更せずに、1つのファイルを追加、削除、または変更できます。
単一の 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() # 変更をドラフトにコミットする