# パフォーマンスのチューニング

シンギュラリティでは、データの準備パフォーマンスを最適化するためのさまざまな設定が用意されています。このガイドでは、これらの設定について詳しく説明し、効果的にチューニングするための手順を提供します。

## インライン準備

* **説明**: インライン準備により、CAR ファイルを保存するための余分なディスク容量が不要になります。ただし、データベースの検索と保存にわずかなオーバーヘッドが発生します。
* **影響**: オーバーヘッドは通常無視できる程度ですが、多くの小さなファイルを含むデータセットの場合には重要な要素となることがあります。
* **設定**: 無効にするには、`singularity prep create` に `--no-inline` オプションを使用します。
* **詳細情報**: [インライン準備](../topics/inline-preparation)

## DAG の更新

* **説明**: シンギュラリティは、準備中に各ディレクトリの DAG と CID を更新します。これにより、変更のリアルタイムの追跡が可能になります。
* **影響**: CAR ファイルの準備ごとにディレクトリが更新されるため、わずかなデータベースのオーバーヘッドが発生します。
* **設定**: 無効にするには、`singularity prep create` に `--no-dag` オプションを使用します。

## データ準備における並列処理

### スキャン

* **説明**: スキャンは、ソースストレージをトラバースしてファイルリストを作成する作業です。ローカルストレージでは高速ですが、S3 のようなリモートストレージでは遅くなる可能性があります。
* **設定**:
  * **並列処理の有効化**: `singularity storage create` または `singularity storage update` で `--client-scan-concurrency <number>` オプションを使用します。
  * **注意**: 有効にすると、ファイルが非決定的な順序で処理される可能性があります。

### パッキング

* **説明**: パッキングは、複数のファイルを単一の CAR ファイルに結合する、CPU と I/O の両方に負荷のかかる操作です。ネットワーク制約があるリモートストレージでは、並列処理を増やすことが有益です。
* **設定**:
  * **並列処理の調整**: `singularity run dataset-worker` で `--concurrency <number>` オプションを使用します。

## サーバーの最終更新時刻を使用する

* **説明**: `AWS S3` のような一部のリモートストレージでは、カスタムの `mtime` とサーバー側の最終更新時刻を提供しています。シンギュラリティはデフォルトでカスタムの `mtime` をチェックし、利用可能でない場合にはサーバーの最終更新時刻を使用します。
* **影響**: カスタムの `mtime` のチェックをスキップして直接サーバーの最終更新時刻を使用することで、リモートストレージへのリクエスト回数を減らすことができます。
* **設定**: `singularity storage create` または `singularity storage update` で `--client-use-server-mod-time` オプションを使用して、サーバーの時刻を優先しオブジェクトのメタデータ取得をバイパスします。

## リトライ戦略

### ネットワークリクエストのリトライ

* **説明**: リモートフォルダのリスト取得やファイルのオープンが失敗した場合、シンギュラリティは RClone のリトライメカニズムを利用します。
* **設定**: リトライ回数を増やすには、`singularity storage create` または `singularity storage update` で `--client-low-level-retries <number>` オプションを使用します。

### ネットワーク I/O のリトライ

* **説明**: ネットワークリクエストは成功しても、不安定なネットワーク接続のためにネットワーク I/O が失敗する場合があります。シンギュラリティはリトライと最後の成功したポイントからの再開をサポートしています。
* **設定**: `singularity storage create` または `singularity storage update` で以下のフラグを使用します。

```shell
 --client-retry-backoff value      # IO 読み取りエラーのリトライのための遅延バックオフ（デフォルト: 1s）
 --client-retry-backoff-exp value  # IO 読み取りエラーの指数関数的な遅延バックオフ（デフォルト: 1.0）
 --client-retry-delay value        # IO 読み取りエラーの再試行前の初期遅延（デフォルト: 1s）
 --client-retry-max value          # IO 読み取りエラーの最大リトライ回数（デフォルト: 10）
```

## アクセスできないファイルのスキップ

* **説明**: 権限によりリモートストレージから特定のファイルにアクセスできない場合があります。これらの問題は、ファイルを開こうとしたときにのみ表面化し、パッキングジョブが失敗する原因となります。
* **設定**: `singularity storage create` または `singularity storage update` で `--client-skip-inaccessible-files` オプションを使用して、アクセスできないファイルをスキップします。
