新しいアーティファクトバージョンをシングル run で作成するか、分散 run を使って共同で作成します。以前のバージョンから新しいアーティファクトバージョンを作成することもできます。これを インクリメンタルアーティファクト と呼びます。
アーティファクト内のファイルの一部に変更を加える必要がある場合、元のアーティファクトのサイズがかなり大きい場合は、インクリメンタルアーティファクトを作成することをお勧めします。
新しいアーティファクトバージョンをゼロから作成する
新しいアーティファクトバージョンを作成する方法は、シングル run と分散 run による2つがあります。それぞれ次のように定義されています:
- シングル run: シングル run が新しいバージョンのすべてのデータを提供します。これは最も一般的なケースで、run が必要なデータを完全に再現する場合に最適です。例: 保存されたモデルやモデル予測を分析用のテーブルに出力する。
- 分散 run: 複数の run のセットが共同して新しいバージョンのすべてのデータを提供します。これは、複数の run が並行してデータを生成する分散ジョブに最適です。例: モデルを分散的に評価し、予測を出力する。
W&B は、プロジェクト内に存在しない名前を wandb.Artifact API に渡すと、新しいアーティファクトを作成し、それに v0 エイリアスを割り当てます。同じアーティファクトに再度ログを記録する際に内容をチェックサムします。アーティファクトが変更されている場合、W&B は新しいバージョン v1 を保存します。
プロジェクト内に既存のアーティファクトと一致する名前とアーティファクトタイプを wandb.Artifact API に渡すと、W&B は既存のアーティファクトを取得します。取得されたアーティファクトはバージョンが 1 より大きくなります。
シングル run
アーティファクト内のすべてのファイルを生成するシングル run によって、新しいバージョンのアーティファクトをログします。このケースは、シングル run がアーティファクト内のすべてのファイルを生成する場合に発生します。
ユースケースに基づいて、以下のタブのいずれかを選択して、run 内または run 外で新しいアーティファクトバージョンを作成してください:
Inside a run
Outside of a 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 Files and Assets to the artifact using
# `.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")
# Add Files and Assets to the artifact using
# `.add`, `.add_file`, `.add_dir`, and `.add_reference`
artifact.add_file("image1.png")
artifact.save()
分散 run
バージョンをコミットする前に、複数の run が共同で作業します。これは、上記のシングル run モードとは対照的です。こちらは1つの run が新しいバージョンのすべてのデータを提供します。
- コレクション内の各 run は、同じバージョンで共同作業をするために、同じユニークな ID (
distributed_id と呼ばれる) を認識している必要があります。デフォルトでは、存在する場合、W&B は run の group を、wandb.init(group=GROUP) によって設定された distributed_id として使用します。
- バージョンを「コミット」し、その状態を永続的にロックする最終 run が必要です。
- 協調的なアーティファクトに追加するには
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 Files and Assets to the artifact using
# `.add`, `.add_file`, `.add_dir`, and `.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 Files and Assets to the artifact using
# `.add`, `.add_file`, `.add_dir`, and `.add_reference`
artifact.add_file("image2.png")
run.upsert_artifact(artifact, distributed_id="my_dist_artifact")
Run 3
Run 1 と Run 2 が完了した後に実行する必要があります。finish_artifact を呼び出す Run は、アーティファクトにファイルを含めることができますが、必須ではありません。
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# Add Files and Assets to the artifact
# `.add`, `.add_file`, `.add_dir`, and `.add_reference`
artifact.add_file("image3.png")
run.finish_artifact(artifact, distributed_id="my_dist_artifact")
既存のバージョンから新しいアーティファクトバージョンを作成する
前のアーティファクトバージョンからファイルのサブセットを追加、変更、または削除して、変更されていないファイルを再インデックスする必要はありません。前のアーティファクトバージョンからファイルのサブセットを追加、変更、または削除すると、新しいアーティファクトバージョンが作成され、これをインクリメンタルアーティファクトと呼びます。
以下は、遭遇する可能性のあるインクリメンタルな変更の各タイプに対するシナリオです:
- add: 新しいバッチを収集した後、定期的にデータセットに新しいファイルのサブセットを追加します。
- remove: 重複ファイルをいくつか発見し、アーティファクトからそれらを削除することを希望します。
- update: ファイルのサブセットに対する注釈を修正し、古いファイルを正しいものと置き換えます。
インクリメンタルアーティファクトとしての同じ機能を実行するためにアーティファクトをゼロから作成することもできます。しかし、アーティファクトをゼロから作成する場合、アーティファクトのすべての内容をローカルディスクに持っている必要があります。インクリメンタルな変更を行う場合、前のアーティファクトバージョンのファイルを変更せずに、個々のファイルを追加、削除、または変更できます。
単一の run で、または複数の run (分散モード) でインクリメンタルアーティファクトを作成できます。
以下の手順に従って、アーティファクトをインクリメンタルに変更します:
- インクリメンタル変更を行いたいアーティファクトバージョンを取得します:
Inside a run
Outside of a 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 の内外で変更を保存する方法を示しています。適切なユースケースに応じてタブを選択してください:
Inside a run
Outside of a run
run.log_artifact(draft_artifact)
以上のコード例をまとめると、以下のようになります:
Inside a run
Outside of a run
with wandb.init(job_type="modify dataset") as run:
saved_artifact = run.use_artifact(
"my_artifact:latest"
) # fetch artifact and input it into your run
draft_artifact = saved_artifact.new_draft() # create a draft version
# modify a subset of files in the draft version
draft_artifact.add_file("file_to_add.txt")
draft_artifact.remove("dir_to_remove/")
run.log_artifact(
artifact
) # log your changes to create a new version and mark it as output to your run
client = wandb.Api()
saved_artifact = client.artifact("my_artifact:latest") # load your artifact
draft_artifact = saved_artifact.new_draft() # create a draft version
# 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