単一のrunから、または分散された複数のrunが連携して、新しいアーティファクトバージョンを作成します。必要に応じて、以前のバージョン (段階的アーティファクト) から新しいアーティファクトバージョンを作成することもできます。
アーティファクト 内のファイルの一部に変更を適用する必要があり、元のアーティファクトのサイズが大幅に大きい場合は、段階的アーティファクトを作成することをお勧めします。
ゼロから新しいアーティファクトバージョンを作成する
新しいアーティファクトバージョンを作成する方法は 2 つあります。single run から作成する方法と、分散 run から作成する方法です。以下でそれぞれ説明します。
- Single run: 1 つの run が、新しいバージョンに必要なすべてのデータを提供します。これは最も一般的なケースで、run によって必要なデータを完全に再生成できる場合に最適です。たとえば、保存済みモデルを出力したり、分析用の表にモデルの予測を出力したりする場合です。
- 分散 run: 複数の runs がまとまって、新しいバージョンに必要なすべてのデータを提供します。これは、複数の runs がしばしば並列にデータを生成する分散ジョブに最適です。たとえば、モデルを分散方式で評価し、予測を出力する場合です。
wandb.Artifact API に、project 内に存在しない名を渡すと、W&B は新しいアーティファクトを作成し、v0 alias を割り当てます。W&B は、同じアーティファクトに再度ログするときに内容のチェックサムを計算します。アーティファクトが変更されている場合、W&B は新しいバージョン v1 を保存します。
wandb.Artifact API に、project 内の既存のアーティファクトと一致する名とアーティファクトタイプを渡すと、W&B は既存のアーティファクトを取得します。取得されたアーティファクトのバージョンは 1 より大きくなります。
アーティファクト 内のすべてのファイルを生成する single run を使用して、アーティファクト の新しいバージョンをログします。これは、1 つの run ですべてのファイルが生成される場合に該当します。
ユースケースに応じて、以下のタブから 1 つ選択し、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 にファイルとアセットを追加します
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`、`.add_file`、`.add_dir`、
# `.add_reference` を使用して Artifact にファイルとアセットを追加します
artifact.add_file("image1.png")
artifact.save()
コミットする前に、複数の run からなるコレクションで 1 つのバージョンを共同で作成できます。これは、前述の single run モード (1 つの run が新しいバージョンのすべてのデータを提供するモード) とは対照的です。
- コレクション内の各 run は、同じバージョンで共同作業するために、同じ一意の ID (
distributed_id) を認識している必要があります。デフォルトでは、存在する場合、W&B は wandb.init(group=GROUP) で設定された run の group を distributed_id として使用します。
- バージョンを「コミット」してその状態を永続的にロックするための、最後の run が必要です。
- 共同の アーティファクト に追加するには
upsert_artifact を使用し、コミットを完了するには finish_artifact を使用します。
次の例を見てみましょう。異なる run (以下では 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 の完了後に実行する必要があります。wandb.Run.finish_artifact() を呼び出す run では、アーティファクト にファイルを含めることもできますが、必須ではありません。
with wandb.init() as run:
artifact = wandb.Artifact("artifact_name", "artifact_type")
# ファイルとアセットをartifactに追加する
# `.add`、`.add_file`、`.add_dir`、`.add_reference`
artifact.add_file("image3.png")
run.finish_artifact(artifact, distributed_id="my_dist_artifact")
既存のバージョンから新しい artifact バージョンを作成する
変更のないファイルを再インデックスすることなく、以前の artifact バージョンのファイルの一部を追加、変更、または削除できます。以前の artifact バージョンのファイルの一部を追加、変更、または削除すると、段階的 artifact と呼ばれる新しい artifact バージョンが作成されます。
発生する可能性のある段階的な変更の各タイプについて、シナリオを紹介します。
- add: 新しいバッチを収集するたびに、新しいファイルのサブセットをデータセットに追加します。
- remove: 重複するファイルが複数見つかり、それらをArtifactから削除したい場合。
- update: 一部のファイルのアノテーションを修正し、古いファイルを正しいファイルに置き換えたい場合。
段階的な artifact と同じ機能を実現するために、artifact をゼロから作成することもできます。ただし、ゼロから作成する場合は、artifact のすべてのコンテンツをローカルディスク上に用意する必要があります。段階的な変更を行う場合は、以前の artifact バージョンのファイルを変更せずに、単一ファイルの追加、削除、または変更が可能です。
single run 内、または複数の run (分散モード) で、段階的な artifact を作成できます。
以下の手順に従って、Artifactを段階的に変更します。
- 段階的な変更を加える対象の Artifact バージョンを取得します。
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 メソッドを使用して、既存の artifact バージョンにファイルを追加します。draft_artifact.add_file("file_to_add.txt")
add_dir メソッドでディレクトリを追加すると、複数のファイルをまとめて追加することもできます。
remove メソッドを使用して、既存の artifact バージョンからファイルを削除します。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"
) # artifact を取得して 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") # artifact を読み込みます
draft_artifact = saved_artifact.new_draft() # ドラフトバージョンを作成します
# ドラフトバージョン内のファイルの一部を変更します
draft_artifact.remove("deleted_file.txt")
draft_artifact.add_file("modified_file.txt")
draft_artifact.save() # ドラフトへの変更をコミットします