パフォーマンスのヒント

このドキュメントは、TFDS固有のパフォーマンスのヒントを提供します。 TFDSとしてデータセットを提供することを注意tf.data.Dataset S、SOからのアドバイスtf.dataガイドはまだ適用されます。

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

使用tfds.benchmark(ds)ベンチマークいずれかにtf.data.Datasetオブジェクト。

示すために確認してくださいbatch_size= ( - > 3200元/ secで例えば100 ITER /秒)の結果を正規化します。任意の反復可能で、この作品(例えばtfds.benchmark(tfds.as_numpy(ds))

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

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

すべてのTFDSデータセットは、ディスク上のデータを保存TFRecordフォーマット。小さなデータセットの場合(例えばMnist、Cifar、...)、からの読み取り.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またはNumPy配列としてロードすることもできます。これは、設定によってそうすることが可能であるbatch_size=-1つのバッチへのすべての例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レコードをシャッフルし、あなたも設定する必要があります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を補完するものです。まずsubplitのAPIが適用される( train[:50%] 、その後、読むためにファイルのリストに変換される) ds.shard() opは、それらのファイルに適用されます。例:使用してtrain[: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オペアンプを。

両方の例のコードはで提供され、デコードガイド

未使用の機能をスキップする

機能のサブセットのみを使用している場合は、一部の機能を完全にスキップすることができます。データセットに未使用の機能が多数ある場合、それらをデコードしないと、パフォーマンスが大幅に向上する可能性があります。参照してくださいhttps://www.tensorflow.org/datasets/decode#only_decode_a_sub-set_of_the_featuresを