単一の run または分散された複数の run を通じて、新しい Artifacts バージョンを作成します。オプションで、以前のバージョンから新しい Artifacts バージョンを作成することもできます。これは インクリメンタルアーティファクト と呼ばれます。
元の Artifacts のサイズが非常に大きく、その中のファイルのサブセットのみに変更を適用する必要がある場合は、インクリメンタルアーティファクトを作成することをお勧めします。
ゼロからの新しい Artifacts バージョンの作成
新しい Artifacts バージョンを作成する方法には、単一の run から作成する方法と、分散された複数の run から作成する方法の2つがあります。それぞれの定義は以下の通りです。
- Single run (単一の run): 1つの run が新しいバージョンのすべてのデータを提供します。これは最も一般的なケースであり、run が必要なデータを完全に再作成する場合に最適です。例えば、保存された Models や分析用のテーブル内のモデル予測を出力する場合などが挙げられます。
- Distributed runs (分散 run): 一連の run が集合的に新しいバージョンのすべてのデータを提供します。これは、多くの場合並列でデータを生成する複数の run を持つ分散ジョブに最適です。例えば、分散環境でモデルを評価し、その予測結果を出力する場合などが挙げられます。
wandb.Artifact API に、プロジェクト内に存在しない名前を渡すと、W&B は新しい Artifacts を作成し、v0 エイリアスを割り当てます。同じ Artifacts に再度ログを記録すると、W&B は内容のチェックサムを確認します。Artifacts が変更されている場合、W&B は新しいバージョン v1 を保存します。
wandb.Artifact API に、プロジェクト内の既存の Artifacts と一致する名前と Artifacts タイプを渡すと、W&B は既存の Artifacts を取得します。取得された Artifacts のバージョンは1より大きくなります。
Single run
Artifacts 内のすべてのファイルを生成する単一の run で、Artifacts の新しいバージョンをログに記録します。このケースは、1つの run が Artifacts に含まれるすべてのファイルを生成する場合に発生します。
ユースケースに合わせて、以下のタブから run の内部または外部で新しい Artifacts バージョンを作成する方法を選択してください。
W&B run の内部で Artifacts バージョンを作成します。
wandb.init で run を作成します。
wandb.Artifact で新しい Artifacts を作成するか、既存のものを取得します。
.add_file で Artifacts にファイルを追加します。
.log_artifact で Artifacts を 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 の外部で Artifacts バージョンを作成します。
wandb.Artifact で新しい Artifacts を作成するか、既存のものを取得します。
.add_file で Artifacts にファイルを追加します。
.save で Artifacts を保存します。
artifact = wandb.Artifact("artifact_name", "artifact_type")
# `.add`、`.add_file`、`.add_dir`、`.add_reference` を使用して
# ファイルやアセットをアーティファクトに追加します
artifact.add_file("image1.png")
artifact.save()
Distributed runs
一連の run が、コミットする前に共同で1つのバージョンを作成できるようにします。これは、1つの run が新しいバージョンのすべてのデータを提供する上述の Single run モードとは対照的です。
- 同じバージョンで共同作業を行うために、コレクション内の各 run は同じユニーク ID(
distributed_id と呼ばれます)を認識している必要があります。デフォルトでは、wandb.init(group=GROUP) で設定された run の group が存在する場合、W&B はそれを distributed_id として使用します。
- バージョンを「コミット」し、その状態を永続的にロックする最終的な run が必要です。
- 共同 Artifacts に追加するには
upsert_artifact を使用し、コミットを完了するには finish_artifact を使用します。
次の例を考えてみましょう。異なる run(以下、Run 1、Run 2、Run 3 と表記)が、upsert_artifact を使用して同じ Artifacts に異なる画像ファイルを追加します。
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 が完了した後に実行する必要があります。finish_artifact を呼び出す run は、Artifacts にファイルを含めることができますが、必須ではありません。
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")
既存のバージョンから新しい Artifacts バージョンを作成する
変更されていないファイルを再インデックス化することなく、以前の Artifacts バージョンからファイルのサブセットを追加、修正、または削除します。以前の Artifacts バージョンからファイルのサブセットを追加、修正、または削除して作成された新しい Artifacts バージョンは、incremental artifact (インクリメンタルアーティファクト) と呼ばれます。
以下は、発生する可能性のある各タイプの増分変更のシナリオです。
- add (追加): 新しいバッチを収集した後、データセットに新しいファイルのサブセットを定期的につぎ足す。
- remove (削除): 重複したファイルがいくつか見つかったため、Artifacts からそれらを削除したい。
- update (更新): 一部のファイルの注釈を修正したため、古いファイルを正しいものに置き換えたい。
インクリメンタルアーティファクトと同じ機能を実行するために、ゼロから Artifacts を作成することも可能です。しかし、ゼロから作成する場合は、Artifacts の全内容をローカルディスクに用意する必要があります。増分変更を行う場合は、以前の Artifacts バージョンのファイルを変更することなく、単一のファイルを追加、削除、または修正できます。
インクリメンタルアーティファクトは、単一の run 内、または一連の run(分散モード)で作成できます。
Artifacts を段階的に変更するには、以下の手順に従ってください。
- 増分変更を行いたい Artifacts バージョンを取得します。
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 メソッドを使用して、既存の Artifacts バージョンにファイルを追加します。draft_artifact.add_file("file_to_add.txt")
add_dir メソッドを使用してディレクトリを追加することで、複数のファイルを一度に追加することもできます。
remove メソッドを使用して、既存の Artifacts バージョンからファイルを削除します。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() # ドラフトへの変更をコミットします