1

ネットワークをトレーニングするために時系列データセットを読み込む必要があります。生データからこれらのファイルを抽出するときのメモリの問題のため、データセットは多くのチャンク、、、、(41 チャンク)にtrain_x_0.npy分割されました。ただし、サイズが大きすぎて (約 1000 GB)、すべてを RAM にロードできませんでした。この問題を解決するために、私は2つの方法を考えてきました。train_x_1.npytrain_x_40.npy.npy

  1. np.load()with argumentを使用してデータ チャンクをロードしますmmap_mode='r+'。メモリ マップされたチャンクは Python list に格納されますself.data__getitem__(self, idx)PytorchクラスのメソッドではDataset、 と に変換idxchunk_idxsample_idxでサンプルを取得しますself.data[chunk_idx][sample_idx]
  2. 生データからファイルを再度抽出.npyし、データをサンプルごとに保存します。つまり、1 つの.npyファイルが 1 つのサンプルであり、データ チャンクではありません。メソッドでは__getitem__(self, idx)、 を使用してロードすることで 1 つのサンプルを取得しnp.load(sample_path)ます。

PytorchDataLoaderを使用してすべてのサンプルを反復処理すると仮定すると、どの方法がより高速になりますか?

生データの抽出またはファイルのロードに関する別の提案がある場合は.npy、ご意見をお聞かせください。

4

1 に答える 1

2

各サンプルはオンデマンドでディスクからロードされるため、推奨される両方のアプローチはファイルシステムの IO によって制限されます (特定のパッチが要求されると、メモリ マッピングは実際のロードを高速化しません)。

特に、多くのエポックのトレーニングを計画している場合は、元のチャンク などを一度に 1 つ (または RAM に保持できる数だけ) ロードし、切り替える前にこのチャンクで複数のエポックをトレーニングすることで、大幅な高速化を実現できtrain_x_0.npyますtrain_x_1.npy。次へ。

このためには、 によって要求されたサンプル インデックスを制御する必要がありますdataloader。そのために、キャッシュされたそれぞれのデータ チャンクで使用可能なサンプル インデックスが渡されるサンプラーを定義できます。疑似コードでは、一度に 1 つのチャンクをキャッシュする場合、トレーニング ループは次のようになります。

from yourproject import Dataset
from torch.utils.data import DataLoader
from torch.utils.data.sampler import SubsetRandomSampler

dataset = Dataset(train_data_path, ...)
for chunk_idx in range(num_chunks):
  dataset.cache_chunk(chunk_idx)
  chunk_sample_inds = dataset.get_chunk_sample_inds(chunk_idx)
  chunk_sampler = SubsetRandomSampler(chunk_sample_inds)
  chunk_loader = DataLoader(dataset=dataset, sampler=chunk_sampler)
  for chunk_epoch in range(num_chunk_epoch):
    for sample_idx, sample in enumerate(chunk_loader):
       output = model(sample)

これにより、あなたのDatasetクラスは世話をする必要があります

  • cache_chunkチャンク idx (メソッドによって示される) を指定して、指定されたチャンクをキャッシュ (RAM にロード) します。
  • get_chunk_sample_inds指定されたチャンク idx (メソッドによって示される) の有効なサンプル インデックスのリストを返す

高速な GPU (RAM にキャッシュされたデータであっても、RAM と VRAM の間でデータをやり取りすることによって制限されることが多い) を使用する場合、このアプローチを使用すると、数桁の速度向上が期待できます (データを埋めようとするのではなく)。各サンプルの HDD からの VRAM)。

于 2020-09-08T01:01:09.123 に答える