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

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

ただいまの
回答率

90.32%

  • Python

    9230questions

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

  • 機械学習

    769questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • TensorFlow

    758questions

  • Keras

    289questions

GPUのエラー'OOM when allocating tensor'について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,152

trafalbad

score 195

質問の変更申し訳ありません。

GPUで実行すると下記のエラーが出ます

実行環境はAWSのp2インスタンスのp2.8xlargeなのでメモリが足りないことはないと思うのですが、バッチを8にしてもこのエラーが出てしまいます。

何が原因なのでしょうか?
ちなみにjupyter上ではなくAWSのEC2のターミナル上で実行しました
ご教授お願いします

追記

config = tf.ConfigProto(log_device_placement=True) 
sess = tf.Session(config=config) 

K.set_session(sess)


に変更して、画像サイズ減らす、input関数の画像枚数増やす処理なくせば良いのかなと思うのですが

#エラー
W tensorflow/core/common_runtime/bfc_allocator.cc:279] *************************************************************************************************xxx
2018-07-24 08:58:04.962110: W tensorflow/core/framework/op_kernel.cc:1295] OP_REQUIRES failed at constant_op.cc:75 : Resource exhausted: OOM when allocating tensor of shape [1,1,1088,192] and type float
2018-07-24 08:58:04.962293: E tensorflow/core/common_runtime/executor.cc:660] Executor failed to create kernel. Resource exhausted: OOM when allocating tensor of shape [1,1,1088,192] and type float
     [[Node: training/SGD/zeros_176 = Const[dtype=DT_FLOAT, value=Tensor<type: float shape: [1,1,1088,192] values: [[[0 0 0]]]...>, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
error
Traceback (most recent call last):
  File "Inception_resnet_v2_train.py", line 303, in <module>
    coord.join(threads) 
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/coordinator.py", line 389, in join
    six.reraise(*self._exc_info_to_raise)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/six.py", line 693, in reraise
    raise value
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/queue_runner_impl.py", line 252, in _run
    enqueue_callable()
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1244, in _single_operation_run
    self._call_tf_sessionrun(None, {}, [], target_list, None)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1409, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[150,150,3] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
     [[Node: Cast_1 = Cast[DstT=DT_FLOAT, SrcT=DT_UINT8, _class=["loc:@random_flip_left_right/Switch_1"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](Reshape)]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

     [[Node: per_image_standardization/_25 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_58_per_image_standardization", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

コード(一部抜粋)

#input用の関数
from __future__ import print_function
from __future__ import absolute_import

import warnings
import time
import os
import math
import numpy as np
import tensorflow as tf
from keras.optimizers import SGD
from keras.callbacks import History
from keras.callbacks import Callback
from keras.callbacks import ModelCheckpoint
from keras.callbacks import TensorBoard
from keras.callbacks import CSVLogger
from keras import layers
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Activation
from keras.layers import AveragePooling2D
from keras.layers import BatchNormalization
from keras.layers import Concatenate
from keras.layers import Conv2D
from keras.layers import Dense
from keras.layers import GlobalAveragePooling2D
from keras.layers import GlobalMaxPooling2D
from keras.layers import Input
from keras.layers import Lambda
from keras.layers import MaxPooling2D
from keras.utils.data_utils import get_file
from keras.engine.topology import get_source_inputs
from keras import backend as K
from keras import metrics
from keras import utils as np_utils
from keras.utils.vis_utils import plot_model, model_to_dot
import matplotlib.pyplot as plt
from keras.callbacks import EarlyStopping
tf.logging.set_verbosity(tf.logging.ERROR)


# In[2]:


from tensorflow.python.client import device_lib
device_lib.list_local_devices()


# In[4]:


def input_data(data_dir, batch_size, distort=False):

    num_class = 45
    filenames = [os.path.join(data_dir, 'train_%d.tfrecords' % i)
               for i in range(1, 61)]
    for f in filenames:
        if not tf.gfile.Exists(f):
            raise ValueError('Failed to find file: ' + f)

    # Create a queue that produces the filenames to read.
    filename_queue = tf.train.string_input_producer(filenames)
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read(filename_queue)

    features = tf.parse_single_example(serialized_example,
      features={"label": tf.FixedLenFeature([], tf.int64),
          "image": tf.FixedLenFeature([], tf.string)})

    label = tf.cast(features["label"], tf.int32)
    imgin = tf.reshape(tf.decode_raw(features["image"], tf.uint8), tf.stack([150, 150, 3]))
    float_image = tf.cast(imgin, tf.float32)

    num_preprocess_threads = 16
    min_fraction_of_examples_in_queue = 0.4
    NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN = 2900000

    if distort is True:
        distorted_image = tf.image.random_flip_left_right(float_image)

        distorted_image = tf.image.random_brightness(distorted_image, max_delta=63)
        distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8)
        distorted_image = tf.image.per_image_standardization(distorted_image)
        distorted_image.set_shape([150, 150, 3])

        min_fraction_of_examples_in_queue = 0.4
        min_queue_examples = int(NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN *
                            min_fraction_of_examples_in_queue)
        print ('Filling queue with %d CIFAR images before starting to train. '
         'This will take a few minutes.' % min_queue_examples)

        images, label_batch = tf.train.shuffle_batch([distorted_image, label], batch_size=batch_size,
        num_threads=num_preprocess_threads, capacity=min_queue_examples + 3 * batch_size,
        min_after_dequeue=min_queue_examples)

    else:

        images, label_batch = tf.train.batch([float_image, label], batch_size=batch_size,
        num_threads=num_preprocess_threads, capacity=min_queue_examples + 3 * batch_size,
        min_after_dequeue=min_queue_examples)

    return tf.subtract(tf.div(images,127.5), 1.0), tf.one_hot(tf.reshape(label_batch, [batch_size]),num_class)

#session実行部
config = tf.ConfigProto(allow_soft_placement=True)
config.gpu_options.allocator_type = 'BFC'
config.gpu_options.per_process_gpu_memory_fraction = 0.40
config.gpu_options.allow_growth=True

sess = K.get_session()
train_image, train_labels = input_data('/home/ubuntu/train_tf',16, distort=True)
input_ = Input(tensor=train_image)
output_ = InceptionResNetV2(img_input=input_)
train_model = Model(input_, output_, name='inception_resnet_v2')
train_model.compile(optimizer=SGD(decay=0.1, momentum=0.9, nesterov=True),
                        loss='categorical_crossentropy',
                    metrics=['accuracy'], target_tensors=[train_labels])


# In[7]:


history = History()
callback = []
# callbacks.append(ModelCheckpoint(filepath="model.best.h5", save_best_only=True))
callback.append(history)
callback.append(ModelCheckpoint(filepath="/home/ubuntu/check_dir/model.ep{epoch:02d}.h5"))
callback.append(EarlyStopping("loss", patience=1))

# In[8]:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess, coord)
try:
    history = train_model.fit(epochs=10, steps_per_epoch=int(np.ceil(2900000/16)), callbacks=callback)
    print(history)
except:
    print('error')

coord.request_stop()
coord.join(threads) 
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2018/07/24 12:14

    提示された資料はなんのラベルづけもないような時系列データに対する異常検知であり、単語という一意の情報の単位時間あたりの発生数を見るのであれば、ご自身がご提示されているようにcountしたものだけに着目して、単位時間あたりの上昇率のみで判断するのでも十分に思うのですが、何かご懸念されている点はあるのでしょうか?

    キャンセル

  • trafalbad

    2018/07/24 12:59 編集

    目的は特定の単語の上昇の検知です。countしたものは複数の単語数であり、単一の単語ではないので、特定の単語の上昇によるものか判断できないためです。異常検知手法で上昇数から単語の特定というのは可能でしょうか?

    キャンセル

回答 1

check解決した方法

0

resize


 #distorted_image = tf.image.random_brightness(distorted_image, max_delta=63)
        #distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8)
        #distorted_image = tf.image.per_image_standardization(distorted_image)

とって、configの設定以下の通りにした

config = tf.ConfigProto(log_device_placement=True) 
sess = tf.Session(config=config) 
K.set_session(sess)

# input関数

def input_data(data_dir, batch_size, distort=False):

    num_class = 45
    filenames = [os.path.join(data_dir, 'train_%d.tfrecords' % i)
               for i in range(1, 61)]
    for f in filenames:
        if not tf.gfile.Exists(f):
            raise ValueError('Failed to find file: ' + f)

    # Create a queue that produces the filenames to read.
    filename_queue = tf.train.string_input_producer(filenames)
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read(filename_queue)

    features = tf.parse_single_example(serialized_example,
      features={"label": tf.FixedLenFeature([], tf.int64),
          "image": tf.FixedLenFeature([], tf.string)})

    label = tf.cast(features["label"], tf.int32)
    imgin = tf.reshape(tf.decode_raw(features["image"], tf.uint8), tf.stack([150, 150, 3]))
    float_image = tf.cast(imgin, tf.float32)
    float_image = tf.image.resize_images(float_image, [90, 90])
    num_preprocess_threads = 16
    min_fraction_of_examples_in_queue = 0.4
    NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN = 2900000

    if distort is True:
        distorted_image = tf.image.random_flip_left_right(float_image)

        #distorted_image = tf.image.random_brightness(distorted_image, max_delta=63)
        #distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8)
        #distorted_image = tf.image.per_image_standardization(distorted_image)
        distorted_image.set_shape([90, 90, 3])

        min_queue_examples = int(NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN *
                            min_fraction_of_examples_in_queue)
        print ('Filling queue with %d CIFAR images before starting to train. '
         'This will take a few minutes.' % min_queue_examples)

        images, label_batch = tf.train.shuffle_batch([distorted_image, label], batch_size=batch_size,
        num_threads=num_preprocess_threads, capacity=min_queue_examples + 3 * batch_size,
        min_after_dequeue=min_queue_examples)

    else:

        images, label_batch = tf.train.batch([float_image, label], batch_size=batch_size,
        num_threads=num_preprocess_threads, capacity=min_queue_examples + 3 * batch_size,
        min_after_dequeue=min_queue_examples)

    return tf.subtract(tf.div(images,127.5), 1.0), tf.one_hot(tf.reshape(label_batch, [batch_size]),num_class)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9230questions

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

  • 機械学習

    769questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • TensorFlow

    758questions

  • Keras

    289questions