Загрузка обучающих данных в Керас, Tensorflow - PullRequest
0 голосов
/ 01 апреля 2020

Я использую большую машину, чтобы загрузить свой полный набор данных в память для обучения следующим способом: (Используя мой генератор, чтобы загрузить все данные в топор и тензор y)

training_generator = my_generator(train_data_file, batch_size=TOTAL_SAMPLES)
x_tensor, y_tensor = training_generator.__getitem__(0)

Я делаю так, чтобы тренироваться быстрее без использования генератора во время тренировки. У меня достаточно ОЗУ для загрузки этого набора данных, но я получаю следующую ошибку. Я не уверен, почему мой графический процессор используется в момент загрузки данных. Как я могу изменить свой метод, чтобы не чрезмерно использовать память графического процессора? Ниже моя функция getitem , затем трассировка.

from tensorflow import cast, float16
    def __getitem__(self, idx) :
        """
        Function for tensorflow to get a Batch of Data
        return batch_x:
        return batch_y:
        """
        # X Data
        x_list = []
        # Y Data
        y_list = []
        # Loop Through Batch
        for i in range(0, self.batch_size):
            x_list.append(cast(self.h5_data[self.batches[idx][i]]['x'][:], dtype=float16))
            df = pd.DataFrame(data=self.h5_data[self.batches[idx][i]]['y'][:])
            y_list.append(cast(convert_dataframe_to_tensor(df),dtype=float16))

        # Stack X List into Tensor
        batch_x = np.stack(x_list, axis=0)
        # Stack Y List into Tensor
        batch_y = np.stack(y_list, axis=0)

        return batch_x, batch_y

---------------------------------------------------------------------------
InternalError                             Traceback (most recent call last)
<ipython-input-11-ae34a7e4c3fd> in <module>
     30
---> 31     x_tensor, y_tensor = training_generator.__getitem__(0)
     32 
     33     

~/thirdeye/lib/generators.py in __getitem__(self, idx)
     71             df = pd.DataFrame(data=self.h5_data[self.batches[idx][i]]['y'][:])
     72             
---> 73             y_list.append(cast(convert_dataframe_to_tensor(df),dtype=float16))                                 
     74 
     75         # Stack X List into Tensor

/opt/conda/lib/python3.7/site-packages/tensorflow_core/python/util/dispatch.py in wrapper(*args, **kwargs)
    178     """Call target, and fall back on dispatchers if there is a TypeError."""
    179     try:
--> 180       return target(*args, **kwargs)
    181     except (TypeError, ValueError):
    182       # Note: convert_to_eager_tensor currently raises a ValueError, not a

/opt/conda/lib/python3.7/site-packages/tensorflow_core/python/ops/math_ops.py in cast(x, dtype, name)
    705       x = ops.convert_to_tensor(x, name="x")
    706       if x.dtype.base_dtype != base_type:
--> 707         x = gen_math_ops.cast(x, base_type, name=name)
    708     if x.dtype.is_complex and base_type.is_floating:
    709       logging.warn("Casting complex to real discards imaginary part.")

/opt/conda/lib/python3.7/site-packages/tensorflow_core/python/ops/gen_math_ops.py in cast(x, DstT, Truncate, name)
   1969         pass  # Add nodes to the TensorFlow graph.
   1970     except _core._NotOkStatusException as e:
-> 1971       _ops.raise_from_not_ok_status(e, name)
   1972   # Add nodes to the TensorFlow graph.
   1973   DstT = _execute.make_type(DstT, "DstT")

/opt/conda/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py in raise_from_not_ok_status(e, name)
   6604   message = e.message + (" name: " + name if name is not None else "")
   6605   # pylint: disable=protected-access
-> 6606   six.raise_from(core._status_to_exception(e.code, message), None)
   6607   # pylint: enable=protected-access
   6608 

/opt/conda/lib/python3.7/site-packages/six.py in raise_from(value, from_value)

InternalError: Failed copying input tensor from /job:localhost/replica:0/task:0/device:CPU:0 to /job:localhost/replica:0/task:0/device:GPU:0 in order to run Cast: Dst tensor is not initialized. [Op:Cast] name: Cast/

1 Ответ

0 голосов
/ 02 апреля 2020

Память, потребляемая на GPU, представляет собой сумму обучаемых параметров в сети (например, 300 МБ для VGG19), типа с плавающей запятой (FP16 или FP32), количества активаций и размера изображений, которые вы подаете, и размера пакета. Поэтому, когда у нас есть 100 ГБ набора данных в нашей ОЗУ (в ОЗУ наших компьютеров, а не в графических процессорах), мы используем его для обучения сетей, а затем берем еще один пакет, поскольку все это не может поместиться в памяти графического процессора (что составляет 11 ГБ для потребительского уровня). RTX2080Ti).

Ваш training_generator = my_generator(train_data_file, batch_size=TOTAL_SAMPLES) имеет batch_size, определенный как TOTAL_SAMPLES, что, я думаю, означает общее количество выборок в вашей базе данных. Таким образом, вы не сможете разместить свою базу данных объемом 100 ГБ в оперативной памяти объемом 11 ГБ. Попробуйте начать с 32 и увеличивать с умножением на 32, пока не получите ошибку OOM.

...