W&B Python SDK を使用して、W&B Runs からアーティファクトを作成します。ファイル、ディレクトリ、URI、並列 run からのファイルをアーティファクトに追加できます。ファイルをアーティファクトに追加したら、そのアーティファクトを W&B サーバーまたは 独自のプライベートサーバーに保存します。各アーティファクトは run に関連付けられます。
Amazon S3 に保存されたファイルなどの外部ファイルを追跡する方法については、Track external files ページを参照してください。
3 つのステップで W&B Artifact を作成します:
wandb.Artifact() でアーティファクトの Python オブジェクトを作成する
- 1 つ以上のファイルをアーティファクトに追加する
- アーティファクトを W&B サーバーに保存する
1. wandb.Artifact() でアーティファクトの Python オブジェクトを作成する
wandb.Artifact() クラスを初期化して、アーティファクトオブジェクトを作成します。次のパラメータを指定します:
- Name: アーティファクトの名前。名前は一意で、わかりやすく、覚えやすいものにします。
- Type: アーティファクトの種類。種類はシンプルで説明的であり、機械学習パイプラインの単一のステップに対応している必要があります。一般的なアーティファクトの種類には
'dataset' や 'model' などがあります。
アーティファクトは、種類に関係なく、同じ名前を付けることはできません。言い換えると、dataset タイプで cats という名前のアーティファクトを作成した場合、同じ名前で model タイプのアーティファクトを作成することはできません。
アーティファクトオブジェクトを初期化するときに、任意で description と metadata を指定できます。利用可能な属性とパラメータの詳細については、Python SDK Reference Guide の wandb.Artifact クラス定義を参照してください。
次のコードスニペットをコピーして貼り付けて、アーティファクトオブジェクトを作成します。<name> と <type> プレースホルダを適切な値に置き換えてください:
import wandb
# アーティファクトオブジェクトを作成する
artifact = wandb.Artifact(name="<name>", type="<type>")
ファイル、ディレクトリ、外部 URI 参照(Amazon S3 など)などを追加して、アーティファクトオブジェクトに含めます。
ファイルを 1 つ追加するには、アーティファクトオブジェクトの Artifact.add_file() メソッドを使用します。
artifact.add_file(local_path="path/to/file.txt", name="<name>")
ディレクトリを追加するには、Artifact.add_dir() メソッドを使います。
artifact.add_dir(local_path="path/to/directory", name="<name>")
アーティファクトにさまざまなファイルタイプを追加する方法の詳細については、次のセクション アーティファクトにファイルを追加する を参照してください。
3. アーティファクトを W&B サーバーに保存する
アーティファクトを W&B サーバーに保存します。run オブジェクトの wandb.Run.log_artifact() メソッドを使って、アーティファクトを保存します。
with wandb.init(project="<project>", job_type="<job-type>") as run:
run.log_artifact(artifact)
wandb.Run.log_artifact() と Artifact.save() を使うタイミング
- 新しいアーティファクトを作成し、特定の run に関連付けるには
wandb.Run.log_artifact() を使用します。
- 新しい run を作成せずに既存のアーティファクトを更新するには
Artifact.save() を使用します。
これらを踏まえて、次のコードスニペットでは、データセットのアーティファクトを作成し、そのアーティファクトにファイルを追加し、アーティファクトを W&B に保存する方法を示します。
import wandb
artifact = wandb.Artifact(name="<name>", type="<type>")
artifact.add_file(local_path="path/to/file.txt", name="<name>")
artifact.add_dir(local_path="path/to/directory", name="<name>")
with wandb.init(project="<project>", job_type="<job-type>") as run:
run.log_artifact(artifact)
同じ名前と種類でアーティファクトをログするたびに、W&B はそのアーティファクトの新しいバージョンを作成します。詳細については、Create a new artifact version を参照してください。
W&B は、アップロード性能を高めるために wandb.Run.log_artifact() を非同期で呼び出します。これにより、ループ内でアーティファクトをログする場合に予期しない動作が発生することがあります。たとえば、次のコードのようになります。with wandb.init() as run:
for i in range(10):
a = wandb.Artifact(name = "race",
type="dataset",
metadata={
"index": i,
},
)
# ... アーティファクト a にファイルを追加する ...
run.log_artifact(a)
アーティファクトバージョン v0 がメタデータ内の index として 0 を持つことは保証されません。アーティファクトは任意の順序でログされる可能性があるためです。
次のセクションでは、さまざまな種類のオブジェクトをアーティファクトに追加する方法を説明します。以降の例を読み進めるにあたって、次のような構造のディレクトリがあるものと仮定します。
root-directory
| - hello.txt
| - images/
| -- | cat.png
| -- | dog.png
| - checkpoints/
| -- | model.h5
| - models/
| -- | model.h5
wandb.Artifact.add_file() を使用して、ローカルファイルを 1 つアーティファクトに追加します。ファイルのローカルパスを local_path パラメータとして指定します。
import wandb
# アーティファクトオブジェクトを初期化する
artifact = wandb.Artifact(name="<name>", type="<type>")
# 単一ファイルを追加する
artifact.add_file(local_path="path/file.format")
たとえば、ローカルの作業ディレクトリに 'hello.txt' というファイルがあるとします。
artifact.add_file("hello.txt")
現在、このアーティファクトには次の内容が含まれています:
必要に応じて、name パラメータに別の名前を渡すことで、アーティファクトオブジェクト内でのファイル名を変更できます。先ほどの例を続けると、次のようになります。
artifact.add_file(
local_path="hello.txt",
name="new/path/hello_world.txt"
)
アーティファクトは以下のように保存されます:
次の表は、API 呼び出しによってアーティファクトの内容がどのように変わるかを示しています。
| API Call | 生成されるアーティファクト |
|---|
artifact.new_file('hello.txt') | hello.txt |
artifact.add_file('model.h5') | model.h5 |
artifact.add_file('checkpoints/model.h5') | model.h5 |
artifact.add_file('model.h5', name='models/mymodel.h5') | models/mymodel.h5 |
wandb.Artifact.add_dir() メソッドを使用して、ローカルディレクトリから複数のファイルをアーティファクトに追加します。local_path パラメータにディレクトリのローカルパスを指定します。
import wandb
# アーティファクトオブジェクトを初期化する
artifact = wandb.Artifact(name="<name>", type="<type>")
# ローカルディレクトリをアーティファクトに追加する
artifact.add_dir(local_path="path/file.format", name="optional-prefix")
次の表は、異なる API 呼び出しによって生成されるアーティファクトの内容がどのように変わるかを示しています:
| API Call | 生成されるアーティファクトの内容 |
|---|
artifact.add_dir('images') | cat.png
dog.png
|
artifact.add_dir('images', name='images') | images/cat.png
images/dog.png
|
URI に W&B ライブラリがサポートしているスキームが含まれている場合、Artifacts は再現性のためにチェックサムなどの情報を追跡します。
wandb.Artifact.add_reference() メソッドを使って、外部 URI 参照をアーティファクトに追加します。'uri' 文字列を自分の URI に置き換えてください。必要に応じて、アーティファクト内で目的のパスを name パラメータに渡します。
# URI参照を追加する
artifact.add_reference(uri="uri", name="optional-name")
Artifacts は現在、次の URI スキームをサポートしています:
http(s)://: HTTP 経由でアクセス可能なファイルへのパス。HTTP サーバーが ETag と Content-Length レスポンスヘッダーをサポートしている場合、アーティファクトは ETag とサイズのメタデータという形でチェックサムを追跡します。
s3://: S3 内のオブジェクトまたはオブジェクトプレフィックスへのパス。アーティファクトは、参照されるオブジェクトのチェックサムとバージョン情報 (バケットでオブジェクトバージョニングが有効な場合) を追跡します。オブジェクトプレフィックスは、プレフィックス配下のオブジェクトを最大 10,000 個まで含めるように展開されます。
gs://: GCS 内のオブジェクトまたはオブジェクトプレフィックスへのパス。アーティファクトは、参照されるオブジェクトのチェックサムとバージョン情報 (バケットでオブジェクトバージョニングが有効な場合) を追跡します。オブジェクトプレフィックスは、プレフィックス配下のオブジェクトを最大 10,000 個まで含めるように展開されます。
次の表は、異なる API 呼び出しがどのようなアーティファクト内容を生成するかを示しています:
| API call | 生成されるアーティファクトの内容 |
|---|
artifact.add_reference('s3://my-bucket/model.h5') | model.h5 |
artifact.add_reference('s3://my-bucket/checkpoints/model.h5') | model.h5 |
artifact.add_reference('s3://my-bucket/model.h5', name='models/mymodel.h5') | models/mymodel.h5 |
artifact.add_reference('s3://my-bucket/images') | cat.png
dog.png
|
artifact.add_reference('s3://my-bucket/images', name='images') | images/cat.png
images/dog.png
|
並列実行中の run からアーティファクトにファイルを追加する
大規模なデータセットや分散学習の場合、複数の並列 run が 1 つのアーティファクトを共有してファイルを追加する必要がある場合があります。
import wandb
import time
# この例では、デモンストレーション目的でRayを使用して
# 並列でrunを実行します。
import ray
ray.init()
artifact_type = "dataset"
artifact_name = "parallel-artifact"
table_name = "distributed_table"
parts_path = "parts"
num_parallel = 5
# 並列ライターの各バッチには、固有の
# グループ名が必要です。
group_name = "writer-group-{}".format(round(time.time()))
@ray.remote
def train(i):
"""
ライタージョブ。各ライターはアーティファクトに1つの画像を追加します。
"""
with wandb.init(group=group_name) as run:
artifact = wandb.Artifact(name=artifact_name, type=artifact_type)
# wandbテーブルにデータを追加します。
table = wandb.Table(columns=["a", "b", "c"], data=[[i, i * 2, 2**i]])
# アーティファクト内のフォルダにテーブルを追加します
artifact.add(table, "{}/table_{}".format(parts_path, i))
# アーティファクトをupsertすると、アーティファクトへのデータの作成または追記が行われます
run.upsert_artifact(artifact)
# runを並列で起動します
result_ids = [train.remote(i) for i in range(num_parallel)]
# アーティファクトを完了する前に、すべてのライターのファイルが
# 追加済みであることを確認するために待機します。
ray.get(result_ids)
# すべてのライターが完了したら、アーティファクトを完了して
# 使用可能な状態としてマークします。
with wandb.init(group=group_name) as run:
artifact = wandb.Artifact(artifact_name, type=artifact_type)
# テーブルのフォルダを指す "PartitionTable" を作成し、
# アーティファクトに追加します。
artifact.add(wandb.data_types.PartitionedTable(parts_path), table_name)
# finish_artifactはアーティファクトを確定し、このバージョンへの
# 以降の "upsert" を禁止します。
run.finish_artifact(artifact)
次のコードスニペットは、W&B Public API を使用して run 内のファイルを、ファイル名と URL とともに一覧表示する方法を示します。<entity/project/run-id> プレースホルダーを自身の値に置き換えてください。
from wandb.apis.public.files import Files
from wandb.apis.public.api import Api
# run オブジェクトの例
run = Api().run("<entity/project/run-id>")
# run 内のファイルを反復処理するための Files オブジェクトを作成する
files = Files(api.client, run)
# ファイルを反復処理する
for file in files:
print(f"File Name: {file.name}")
print(f"File URL: {file.url}")
print(f"Path to file in the bucket: {file.direct_url}")
利用可能な属性およびメソッドの詳細については、File クラスを参照してください。