質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7649閲覧

PyTorchの学習データの読み込みが尋常じゃなく遅い

wotaku

総合スコア13

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/27 19:04

タイトル通りですが,PyTorchのライブラリを用いてデータを読み込む速度が尋常じゃなく遅いです.

Python

1# データローダを定義 2transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) 3trainset = torchvision.datasets.MNIST(root='./', train=True, download=True, transform=transform) 4trainloader = torch.utils.data.DataLoader(trainset, batch_size=256, shuffle=True)

Python

1# Trainsetの読み込み時間の計測 2t = time.time() 3for x in trainset: 4 pass 5print(time.time() - t) # 7.56477427482605

Python

1# Dataloaderの読み込み時間の計測 2t = time.time() 3for x, y in trainloader: 4 pass 5 6print(time.time() - t) # 7.814661026000977 7

1x28x28の画像を,バッチサイズ256で60,000枚を読み込むのに8秒弱はかかり過ぎだと思うのです….

ちなみに,環境はGoogle Colabなので,マシンの性能がネックになっていることはないと思います.
pin_memory=Trueを試したり,num_workersを適当に8として実行してみたりしましたが,殆ど変化はありませんでした.

助言をいただけると幸いです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/09/28 00:14

trainsetから1つの要素を取り出すのが 133 µs かかるのが遅すぎでは? という主旨でしょうか?
meg_

2020/09/28 01:39

手元の環境で実施した場合と比べて遅すぎる、という意味ですか?
wotaku

2020/09/28 09:11

> quickquip様 はい,その主旨で投稿させていただきました. > meg_様 すみません.比較対象は, (x_train, y_train), (x_test, y_test) = datasets.mnist.load_data() x_train = x_train.astype(np.float32) / 255 x_train = (x_train - 127.5) / 127.5 BATCH_SIZE = 32 BUFFER_SIZE = 60000 train_dataset = tf.data.Dataset.from_tensor_slices(x_train).shuffle(BUFFER_SIZE).batch(BATCH_SIZE) という処理で生成したtrain_datasetから取り出すものです. しかし,よく考えれば,上記の処理では最初に一旦すべてのMNISTデータを配列に格納しています. しかし,質問文のプログラムでは,trainloaderがfor内で呼び出されるたびにデータを呼び出している?という処理のように思えます. この理解は合っていますか? また,合っているならやはり遅くなって当然ということでしょうか?
quickquip

2020/09/28 16:01

情報は質問を編集して、質問文の中に含めてください。
guest

回答1

0

ベストアンサー

https://github.com/pytorch/vision/blob/v0.6.1/torchvision/datasets/mnist.py#L82`

純粋にtorchvision.datasets.MNISTの__getitem__の実装が、呼び出されるたびにtansformの計算をしているので、その時間かと思います。"推測するな、計測せよ"の格言からすると本当にはプロファイルを取らないといけませんが、質問のソースに続けて

python

1preprocessed = list(trainloader) # ここは時間がかかる

として、計算した結果を格納してしまえば、

python

1t = time.time() 2for x, y in preprocessed: 3 pass 4 5print(time.time() - t)

と結果を読み出す方はすぐに終わります。

こちらが想定している動作なのかと想像しました。

投稿2020/09/28 16:04

quickquip

総合スコア11235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wotaku

2020/09/28 18:55

記述してくださった方法で試したところ,0.0001761…程度でループを回すことができました. kerasで書かれたものはそもそも予めデータを格納していたために,ループ時に当然早く回せていただけなのですね.(PyTorchのローダが遅い・おかしいというのではなく,そもそも比較状況が不揃いだった) メモリに乗り切らないデータではやはりローダを適宜ループで呼び出す他ないと思いますが,メモリに乗り切るデータ量の場合はこの方法でも良さそうです.本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問