Pytorch: CUDAメモリリーク?

作成日 2017年04月11日  ·  3コメント  ·  ソース: pytorch/pytorch

from torch.autograd import Variable
import torch
import torch.nn as nn
import torch.backends.cudnn as cudnn
cudnn.benchmark = True

import sys
print('__Python VERSION:', sys.version)
print('__pyTorch VERSION:', torch.__version__)
print('__CUDA VERSION')
from subprocess import call
call(["nvcc", "--version"])
print('__CUDNN VERSION:', torch.backends.cudnn.version())
print('__Number CUDA Devices:', torch.cuda.device_count())
print('__Devices')
call(["nvidia-smi", "--format=csv", "--query-gpu=index,name,driver_version,memory.total,memory.used,memory.free"])
print('Active CUDA Device: GPU', torch.cuda.current_device())
# print('  Try to change to Device 2 - with "torch.cuda.device(2)"')
# torch.cuda.device(2)
# print('  ! Active CUDA Device is still:', torch.cuda.current_device())
#
# print('  Try again with environment vars')
# import os
# os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"   # see issue #152
# os.environ["CUDA_VISIBLE_DEVICES"]="2"
# print('  ! Active CUDA Device is still:', torch.cuda.current_device())

import time
from torch.nn import Conv1d as Conv1d

num_runs = 10
s = 5*22050

print('\n')
for seqlen in [s]:
    for batch_size in [16, 32]:
        for dilation in reversed([64, 128, 256, 512]):
            m = nn.Sequential(Conv1d(32, 32, kernel_size=2, dilation=dilation),
                              Conv1d(32, 32, kernel_size=2, dilation=dilation),
                              Conv1d(32, 32, kernel_size=2, dilation=dilation),
                              Conv1d(32, 32, kernel_size=2, dilation=dilation),
                              Conv1d(32, 32, kernel_size=2, dilation=dilation)).cuda()
            input = torch.randn(batch_size, 32, seqlen).float().cuda()

            torch.cuda.synchronize()
            start = time.time()
            for j in range(num_runs):
                output = m(Variable(input, requires_grad=True))
                output.backward(output.data)
            torch.cuda.synchronize()
            mean_time = (time.time() - start) / float(num_runs)
            print('batch_size: %i\tdilation: %i\tseqlen: %i\t time %f\t runs: %i' %(batch_size, dilation, seqlen, mean_time, num_runs))

出力:

__Python VERSION: 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00) 
__pyTorch VERSION: 0.1.11+8aa1cef
__CUDA VERSION
Cuda compilation tools, release 8.0, V8.0.61
__CUDNN VERSION: 6020
__Number CUDA Devices: 4
__Devices
index, name, driver_version, memory.total [MiB], memory.used [MiB], memory.free [MiB]
0, GeForce GTX 1080 Ti, 381.09, 11158 MiB, 318 MiB, 10840 MiB
1, GeForce GTX 1080 Ti, 381.09, 11172 MiB, 11 MiB, 11161 MiB
2, GeForce GTX 1080 Ti, 381.09, 11172 MiB, 11 MiB, 11161 MiB
3, GeForce GTX 1080 Ti, 381.09, 11172 MiB, 11 MiB, 11161 MiB
Active CUDA Device: GPU 0

batch_size: 16  dilation: 512   seqlen: 110250   time 0.204314   runs: 10
batch_size: 16  dilation: 256   seqlen: 110250   time 0.162138   runs: 10
batch_size: 16  dilation: 128   seqlen: 110250   time 0.148690   runs: 10
batch_size: 16  dilation: 64    seqlen: 110250   time 0.141783   runs: 10
batch_size: 32  dilation: 512   seqlen: 110250   time 0.279548   runs: 10
Traceback (most recent call last):
  File "benchmark_test.py", line 48, in <module>
    output = m(Variable(input, requires_grad=True))
  File "/home/USERNAME/anaconda3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 206, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/USERNAME/anaconda3/lib/python3.6/site-packages/torch/nn/modules/container.py", line 64, in forward
    input = module(input)
  File "/home/USERNAME/anaconda3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 206, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/USERNAME/anaconda3/lib/python3.6/site-packages/torch/nn/modules/conv.py", line 143, in forward
    self.padding, self.dilation, self.groups)
  File "/home/USERNAME/anaconda3/lib/python3.6/site-packages/torch/nn/functional.py", line 62, in conv1d
    return f(input, weight, bias)
RuntimeError: CUDNN_STATUS_ALLOC_FAILED

なぜCUDNN_STATUS_ALLOC_FAILEDを取得したのか疑問に思いました。
いくつかの実験の結果、エラーかどうかは拡張リストのシーケンスに依存することがわかりました。
37行目: for dilation in reversed([64, 128, 256, 512]):
reversedなしで実行すると、エラーは発生しません。

私はまだすべてに精通していません。 私は何かが足りないのですか?

-
ありがたいことに、このコードを#967から採用しました。
ちなみに、アクティブなCUDAデバイスを変更できない理由にも興味があります(コードのコメントを参照)…しかし、おそらくもっと詳しく調べる必要があります…

最も参考になるコメント

cudnn.benchmark=Falseで実行してみてください。 cudnn.benchmarkは、とにかく拡張された畳み込みに対して何の役にも立ちません。

全てのコメント3件

cudnn.benchmark=Falseで実行してみてください。 cudnn.benchmarkは、とにかく拡張された畳み込みに対して何の役にも立ちません。

やあ、
使用するGPUを変更するには、 torch.cuda.set_device(2)を使用する必要があります。

with torch.cuda.device(2):
    # do stuff on gpu 2
# Back on the default GPU

また、 CUDA_VISIBLE_DEVICESは、スクリプトを開始する前に設定されている場合にのみ実行に影響します。

うわー、迅速かつ非常に正確な答えをありがとう!

@ngimel :考えたことはありません... cudnn.benchmark=Falseを使用するとうまくいきました。 私が試したリストのサイズに関係なく。 エラーは再び表示されませんでした。

@albanD :それもやった! set_device()を使用しなかったのは、そのドキュメントにdevice()を優先して推奨されていないと記載されているためです。 変。

このページは役に立ちましたか?
0 / 5 - 0 評価