> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-dbrian-docs-serverless-training-quickstart.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 単一のrunまたは分散プロセスから新しいアーティファクトバージョンを作成します。

# アーティファクトバージョンを作成する

単一の[run](/ja/models/runs/)から、または分散された複数のrunが連携して、新しいアーティファクトバージョンを作成します。必要に応じて、以前のバージョン ([段階的アーティファクト](#create-a-new-artifact-version-from-an-existing-version)) から新しいアーティファクトバージョンを作成することもできます。

<Note>
  アーティファクト 内のファイルの一部に変更を適用する必要があり、元のアーティファクトのサイズが大幅に大きい場合は、段階的アーティファクトを作成することをお勧めします。
</Note>

<div id="create-new-artifact-versions-from-scratch">
  ## ゼロから新しいアーティファクトバージョンを作成する
</div>

新しいアーティファクトバージョンを作成する方法は 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 より大きくなります。

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-dbrian-docs-serverless-training-quickstart/ver7AAtIXSa_-khk/images/artifacts/single_distributed_artifacts.png?fit=max&auto=format&n=ver7AAtIXSa_-khk&q=85&s=ea1f4886be48865eb6d0d0894a915019" alt="アーティファクトワークフローの比較" width="2010" height="986" data-path="images/artifacts/single_distributed_artifacts.png" />
</Frame>

<div id="single-run">
  ### Single run
</div>

アーティファクト 内のすべてのファイルを生成する single run を使用して、アーティファクト の新しいバージョンをログします。これは、1 つの run ですべてのファイルが生成される場合に該当します。

ユースケースに応じて、以下のタブから 1 つ選択し、run 内または run 外で新しい アーティファクト バージョンを作成します。

<Tabs>
  <Tab title="run 内">
    W\&B run 内で アーティファクト バージョンを作成します。

    1. `wandb.init()` で run を作成します。
    2. `wandb.Artifact` を使用して、新しい アーティファクト を作成するか、既存の アーティファクト を取得します。
    3. `.add_file` で アーティファクト にファイルを追加します。
    4. `.log_artifact` で アーティファクト を run にログします。

    ```python theme={null}
    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)
    ```
  </Tab>

  <Tab title="run 外">
    W\&B run 外で アーティファクト バージョンを作成します。

    1. `wanb.Artifact` を使用して、新しい アーティファクト を作成するか、既存の アーティファクト を取得します。
    2. `.add_file` で アーティファクト にファイルを追加します。
    3. `.save` で アーティファクト を保存します。

    ```python theme={null}
    artifact = wandb.Artifact("artifact_name", "artifact_type")
    # `.add`、`.add_file`、`.add_dir`、
    # `.add_reference` を使用して Artifact にファイルとアセットを追加します
    artifact.add_file("image1.png")
    artifact.save()
    ```
  </Tab>
</Tabs>

<div id="distributed-runs">
  ### 分散 run
</div>

コミットする前に、複数の run からなるコレクションで 1 つのバージョンを共同で作成できます。これは、前述の single run モード (1 つの run が新しいバージョンのすべてのデータを提供するモード) とは対照的です。

<Note>
  1. コレクション内の各 run は、同じバージョンで共同作業するために、同じ一意の ID (`distributed_id`) を認識している必要があります。デフォルトでは、存在する場合、W\&B は `wandb.init(group=GROUP)` で設定された run の `group` を `distributed_id` として使用します。
  2. バージョンを「コミット」してその状態を永続的にロックするための、最後の run が必要です。
  3. 共同の アーティファクト に追加するには `upsert_artifact` を使用し、コミットを完了するには `finish_artifact` を使用します。
</Note>

次の例を見てみましょう。異なる run (以下では **Run 1**、**Run 2**、**Run 3** と表記) が、`upsert_artifact` を使用して、それぞれ異なる画像ファイルを同じ アーティファクト に追加します。

<div id="run-1">
  #### Run 1
</div>

```python theme={null}
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")
```

<div id="run-2">
  #### Run 2
</div>

```python theme={null}
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")
```

<div id="run-3">
  #### Run 3
</div>

Run 1 と Run 2 の完了後に実行する必要があります。`wandb.Run.finish_artifact()` を呼び出す run では、アーティファクト にファイルを含めることもできますが、必須ではありません。

```python theme={null}
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")
```

<div id="create-a-new-artifact-version-from-an-existing-version">
  ## 既存のバージョンから新しい artifact バージョンを作成する
</div>

変更のないファイルを再インデックスすることなく、以前の artifact バージョンのファイルの一部を追加、変更、または削除できます。以前の artifact バージョンのファイルの一部を追加、変更、または削除すると、*段階的 artifact* と呼ばれる新しい artifact バージョンが作成されます。

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-dbrian-docs-serverless-training-quickstart/ver7AAtIXSa_-khk/images/artifacts/incremental_artifacts.png?fit=max&auto=format&n=ver7AAtIXSa_-khk&q=85&s=6408cb4352f45b370e2ee831aa7bc25b" alt="アーティファクトの段階的なバージョン管理" width="2140" height="916" data-path="images/artifacts/incremental_artifacts.png" />
</Frame>

発生する可能性のある段階的な変更の各タイプについて、シナリオを紹介します。

* add: 新しいバッチを収集するたびに、新しいファイルのサブセットをデータセットに追加します。
* remove: 重複するファイルが複数見つかり、それらをArtifactから削除したい場合。
* update: 一部のファイルのアノテーションを修正し、古いファイルを正しいファイルに置き換えたい場合。

段階的な artifact と同じ機能を実現するために、artifact をゼロから作成することもできます。ただし、ゼロから作成する場合は、artifact のすべてのコンテンツをローカルディスク上に用意する必要があります。段階的な変更を行う場合は、以前の artifact バージョンのファイルを変更せずに、単一ファイルの追加、削除、または変更が可能です。

<Note>
  single run 内、または複数の run (分散モード) で、段階的な artifact を作成できます。
</Note>

以下の手順に従って、Artifactを段階的に変更します。

1. 段階的な変更を加える対象の Artifact バージョンを取得します。

<Tabs>
  <Tab title="run 内">
    ```python theme={null}
    saved_artifact = run.use_artifact("my_artifact:latest")
    ```
  </Tab>

  <Tab title="run の外">
    ```python theme={null}
    client = wandb.Api()
    saved_artifact = client.artifact("my_artifact:latest")
    ```
  </Tab>
</Tabs>

2. 以下を使用してドラフトを作成します：

```python theme={null}
draft_artifact = saved_artifact.new_draft()
```

3. 次のバージョンに反映したい変更を段階的に行います。エントリは、追加、削除、または既存のエントリの変更が可能です。

各変更の実行例については、いずれかのタブを選択してください。

<Tabs>
  <Tab title="追加">
    `add_file` メソッドを使用して、既存の artifact バージョンにファイルを追加します。

    ```python theme={null}
    draft_artifact.add_file("file_to_add.txt")
    ```

    <Note>
      `add_dir` メソッドでディレクトリを追加すると、複数のファイルをまとめて追加することもできます。
    </Note>
  </Tab>

  <Tab title="削除">
    `remove` メソッドを使用して、既存の artifact バージョンからファイルを削除します。

    ```python theme={null}
    draft_artifact.remove("file_to_remove.txt")
    ```

    <Note>
      ディレクトリパスを渡すと、`remove` メソッドで複数のファイルをまとめて削除することもできます。
    </Note>
  </Tab>

  <Tab title="変更">
    ドラフトから古い内容を削除し、新しい内容を追加し直すことで、内容を変更または置き換えます。

    ```python theme={null}
    draft_artifact.remove("modified_file.txt")
    draft_artifact.add_file("modified_file.txt")
    ```
  </Tab>
</Tabs>

4. 最後に、変更をログするか保存してください。以下のタブでは、W\&B run の内外で変更を保存する方法を示しています。ご利用のケースに適したタブを選択してください。

<Tabs>
  <Tab title="run 内">
    ```python theme={null}
    run.log_artifact(draft_artifact)
    ```
  </Tab>

  <Tab title="run 外">
    ```python theme={null}
    draft_artifact.save()
    ```
  </Tab>
</Tabs>

以上をまとめると、上記のコード例は次のようになります。

<Tabs>
  <Tab title="run 内">
    ```python theme={null}
    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 の出力としてマークします
    ```
  </Tab>

  <Tab title="run 外">
    ```python theme={null}
    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()  # ドラフトへの変更をコミットします
    ```
  </Tab>
</Tabs>
