11
4

More than 5 years have passed since last update.

PytorchのDatasetをDataLoaderで並列に読み込みたいときのエラー(Windows)

Last updated at Posted at 2019-08-06

まえがき

Pytorchの嬉しいところは,HDDからデータをメモリに並列に読み込む仕組みが標準で実装されているところだと思う(Kerasでは自前で作成する必要があってだるい).
実現のためには,torch.utils.data.Datasettorch.utils.data.Dataloaderを使用する.それらを使用する際に一か所つまづいた.

実行環境は以下.

  • OS: Windows10 (64bit, 1903)
  • pytorch: 1.1

TL; DR

Windowsで明示的・暗黙的に並列処理するときには,並列処理する対象のクラスを別のファイルに定義すること.
つまり,DataLoaderのインスタンス化とDatasetクラスの定義を同じ.pyで行ってはいけない.

詳細に

以下のように書くと,Broken Pipeだのなんだのよくわからんエクセプションが吐かれて泣きたくなる.
(ちなみにこのコードは切ったり貼ったり名前変えたりしたので,正確ではないです.)

main.py

if __name__ == '__main__':
  ... do something

  import numpy as np

  class MyDataset(torch.utils.data.Dataset):
    def __init__(self, csv_path):
      data = np.loadtxt(csv_path, delimiter="\t")

      self.vector = data[:, 0:9]
      self.target = data[:, 10]

    def __len__(self):
      return len(self.target)

    def __getitem__(self, idx):
      return ( self.vector[idx], self.target[idx] )

  train_loader = torch.utils.data.DataLoader(
    MyDataset(path),
    batch_size=batch_size,
    shuffle=True,
    num_workers=7,
    pin_memory=True
  )

動作させるためには,MyDatasetの定義を別のファイルに移動させればよい.

mydataset.py
import numpy as np

class MyDataset(torch.utils.data.Dataset):
  def __init__(self, csv_path):
    data = np.loadtxt(csv_path, delimiter="\t")

    self.vector = data[:, 0:9]
    self.target = data[:, 10]

  def __len__(self):
    return len(self.target)

  def __getitem__(self, idx):
    return ( self.vector[idx], self.target[idx] )
main.py

if __name__ == '__main__':
  ... do something

  train_loader = torch.utils.data.DataLoader(
    MyDataset(path),
    batch_size=batch_size,
    shuffle=True,
    num_workers=7,
    pin_memory=True
  )

あとがき

たぶんLinuxマシンでは直面しない問題なので,細部でフラストレーション感じたくなければUbuntuとか使っとくのがいいんだと思います.
僕はWindows大正義だと思っているのでもう少し苦しもうと思います.

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4