このページは Cloud Translation API によって翻訳されました。
Switch to English

パフォーマンスのヒント

このドキュメントでは、TFDS固有のパフォーマンスのヒントを提供します。 TFDSはデータセットをtf.data.Datasetとして提供するため、 tf.dataガイドのアドバイスが引き続き適用されることにtf.dataください

ベンチマークデータセット

tfds.core.benchmark(ds)を使用して、 tf.data.Datasetオブジェクトをベンチマークします。

結果を正規化するには、 batch_size=を必ず指定してください(例:100 iter / sec-> 3200 ex / sec)。

ds = tfds.load('mnist', split='train').batch(32).prefetch()
# Display some benchmark statistics
tfds.core.benchmark(ds, batch_size=32)
# Second iteration is much faster, due to auto-caching
tfds.core.benchmark(ds, batch_size=32)

小さなデータセット(<GB)

すべてのTFDSデータセットは、 TFRecord形式でディスクにデータを保存します。小さなデータセット(例:Mnist、Cifarなど)の場合、 .tfrecordからの.tfrecordはかなりのオーバーヘッドを追加する可能性があります。

これらのデータセットはメモリに収まるので、データセットをキャッシュまたは事前に読み込むことにより、パフォーマンスを大幅に向上させることができます。 TFDSは小さなデータセットを自動的にキャッシュすることに注意してください(詳細については次のセクションを参照してください)。

データセットのキャッシュ

以下は、画像を正規化した後にデータセットを明示的にキャッシュするデータパイプラインの例です。

def normalize_img(image, label):
  """Normalizes images: `uint8` -> `float32`."""
  return tf.cast(image, tf.float32) / 255., label


ds, ds_info = tfds.load(
    'mnist',
    split='train',
    as_supervised=True,  # returns `(img, label)` instead of dict(image=, ...)
    with_info=True,
)
# Applying normalization before `ds.cache()` to re-use it.
# Note: Random transformations (e.g. images augmentations) should be applied
# after both `ds.cache()` (to avoid caching randomness) and `ds.batch()` (for
# vectorization [1]).
ds = ds.map(normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds = ds.cache()
# For true randomness, we set the shuffle buffer to the full dataset size.
ds = ds.shuffle(ds_info.splits['train'].num_examples)
# Batch after shuffling to get unique batches at each epoch.
ds = ds.batch(128)
ds = ds.prefetch(tf.data.experimental.AUTOTUNE)

このデータセットを反復処理する場合、キャッシングにより、2番目の反復は最初の反復よりもはるかに高速になります。

自動キャッシュ

デフォルトでは、TFDSは次の制約を満たすデータセットを自動キャッシュします。

  • データセットの合計サイズ(すべての分割)が定義され、250 MiB未満
  • shuffle_filesが無効になっているか、単一のシャードのみが読み取られます

渡すことによって、自動キャッシュをオプトアウトすることが可能であるtry_autocaching=Falsetfds.ReadConfigtfds.load 。特定のデータセットが自動キャッシュを使用するかどうかを確認するには、データセットカタログのドキュメントをご覧ください。

完全なデータを単一のTensorとして読み込む

データセットがメモリに収まる場合は、データセット全体を単一のTensorまたはNumPy配列としてロードすることもできます。これを行うには、 batch_size=-1を設定して、すべての例を単一のtf.Tensorにバッチtf.Tensorます。そして、使用tfds.as_numpyからの変換のためにtf.Tensornp.array

(img_train, label_train), (img_test, label_test) = tfds.as_numpy(tfds.load(
    'mnist',
    split=['train', 'test'],
    batch_size=-1,
    as_supervised=True,
))

大規模なデータセット

大規模なデータセットは分割され(複数のファイルに分割)、通常はメモリに収まらないため、キャッシュしないでください。

シャッフルとトレーニング

トレーニング中は、データをよく混ぜ直すことが重要です。データのシャッフルが不十分な場合、トレーニングの精度が低下する可能性があります。

ds.shuffleを使用してds.shuffleをシャッフルすることに加えて、 shuffle_files=Trueを設定して、複数のファイルに分割された大きなデータセットに対して適切なシャッフル動作をshuffle_files=Trueする必要もあります。そうでない場合、エポックは同じ順序でシャードを読み取るため、データは完全にランダム化されません。

ds = tfds.load('imagenet2012', split='train', shuffle_files=True)

さらに、 shuffle_files=True場合、TFDSはoptions.experimental_deterministic無効にします。これにより、パフォーマンスがわずかに向上する場合があります。決定論的なシャッフルを取得するには、それはオプトアウトでこの機能をすることが可能であるtfds.ReadConfigいずれかを設定することによって: read_config.shuffle_seedまたは上書きread_config.options.experimental_deterministic

ワーカー間でデータを自動シャーディング

複数の労働者のトレーニングは、あなたが使用することができた場合input_contextの引数tfds.ReadConfig各ワーカーは、データのサブセットを読み込みますので、。

input_context = tf.distribute.InputContext(
    input_pipeline_id=1,  # Worker id
    num_input_pipelines=4,  # Total number of workers
)
read_config = tfds.ReadConfig(
    input_context=input_context,
)
ds = tfds.load('dataset', split='train', read_config=read_config)

これは、サブスプリットAPIを補完するものです。最初にサブプリットAPIが適用され( train[:50%]が読み取るファイルのリストに変換されます)、次にこれらのファイルにds.shard() opが適用されます。例: num_input_pipelines=2train[:50%]num_input_pipelines=2すると、2人のワーカーそれぞれがデータの1/4を読み取ります。

shuffle_files=True場合、ファイルは1つのワーカー内でシャッフルされますが、ワーカー間ではシャッフルされません。各ワーカーは、エポック間でファイルの同じサブセットを読み取ります。

より高速な画像デコード

デフォルトでは、TFDSは画像を自動的にデコードします。ただし、 tfds.decode.SkipDecodingを使用して画像のデコードをスキップし、 tf.io.decode_image opを手動で適用した方がパフォーマンスが向上する場合があります。

  • 例をフィルタリングするとき( ds.filter )、例がフィルタリングされた後に画像をデコードします。
  • 画像をトリミングする場合、融合されたtf.image.decode_and_crop_jpeg opを使用します。

両方の例のコードは、 デコードガイドで入手できます。