Keras Gpu:配置

Posted

技术标签:

【中文标题】Keras Gpu:配置【英文标题】:Keras Gpu: Configuration 【发布时间】:2019-07-13 03:37:21 【问题描述】:

我正在运行简单的密集层,但 Gpu 负载和 Cpu 负载一直都很低。 打印(device_lib.list_local_devices())

2019-02-19 19:06:23.911633: 我 tensorflow/core/platform/cpu_feature_guard.cc:141] 你的 CPU 支持 此 TensorFlow 二进制文件未编译使用的指令:AVX AVX2

2019-02-19 19:06:24.231261:Itensorflow/core/common_runtime/gpu/gpu_device.cc:1432] 找到具有属性的设备 0:名称:GeForce RTX 2080 主要:7 次要: 5 memoryClockRate(GHz): 1.83 pciBusID: 0000:65:00.0 totalMemory: 8.00GiB freeMemory: 6.55GiB 2019-02-19 19:06:24.237952: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] 添加可见 gpu 设备:0 2019-02-19 19:06:25.765790:我 tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 设备 用强度 1 边缘矩阵互连 StreamExecutor:2019-02-19 19:06:25.769303:我 张量流/核心/common_runtime/gpu/gpu_device.cc:988] 0 2019-02-19 19:06:25.771334: 我 张量流/核心/common_runtime/gpu/gpu_device.cc:1001] 0:N 2019-02-19 19:06:25.776384: 我 tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] 创建 TensorFlow 设备 (/device:GPU:0 with 6288 MB memory) -> 物理 GPU (设备:0,名称:GeForce RTX 2080,pci 总线 ID:0000:65:00.0,计算 能力:7.5)[名称:“/设备:CPU:0”设备类型:“CPU” memory_limit:268435456 locality 化身:5007262859900510599 , 名称: "/device:GPU:0" device_type: "GPU" memory_limit: 6594058650 位置 bus_id: 1 链接 化身: 16804701769178738279 physical_device_desc:“设备:0,名称:GeForce RTX 2080,pci 总线 ID:0000:65:00.0,计算能力:7.5"

至少,它在 GPU 上运行。但我不知道这是否是在这个 GPU 中处理这个深度学习网络的最大限制。

EDIT2:数据集

https://archive.ics.uci.edu/ml/datasets/combined+cycle+power+plant

大约有 10000 个数据点和 4 个描述变量。

EDIT3:代码,真的很简单。

num_p = 8
model = Sequential()
model.add(Dense(8*num_p, input_dim=input_features, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(16*num_p, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(16*num_p, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(16*num_p, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(16*num_p, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(8*num_p, input_dim=input_features, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation='linear'))
model.compile(loss='mae', optimizer='adam')

es = EarlyStopping(monitor='val_loss', min_delta=0.0005, patience=200, verbose=0, mode='min')
his = model.fit(x=X_train_scaled, y=y_train, batch_size=64, epochs=10000, verbose=0,
validation_split=0.2, callbacks=[es])

EDIT4:输入数据代码

df = pd.read_csv("dataset")
X_train, X_test, y_train, y_test = 
train_test_split(df.iloc[:, :-1].values, df.iloc[:, -1].values)
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
batch_size = 64
dataset = tf.data.Dataset.from_tensor_slices((X_train_scaled, y_train))
print(dataset)
dataset = dataset.cache()
print(dataset)
dataset = dataset.shuffle(len(X_train_scaled))
print(dataset)
dataset = dataset.repeat()
print(dataset)
dataset = dataset.batch(batch_size)
print(dataset)
dataset = dataset.prefetch(batch_size*10)
print(dataset)

<TensorSliceDataset shapes: ((4,), ()), types: (tf.float64, tf.float64)> 
<CacheDataset shapes: ((4,), ()), types: (tf.float64, tf.float64)> 
<ShuffleDataset shapes: ((4,), ()), types: (tf.float64, tf.float64)> 
<RepeatDataset shapes: ((4,), ()), types: (tf.float64, tf.float64)> 
<BatchDataset shapes: ((?, 4), (?,)), types: (tf.float64, tf.float64)> 
<PrefetchDataset shapes: ((?, 4), (?,)), types: (tf.float64, tf.float64)>

【问题讨论】:

你的输入管道是什么样子的? 谢谢评论,我放了模型总结。 如何将数据输入到模型中?你训练什么样的数据? 我的意思是你的代码是什么样的?您使用什么函数向模型提供数据? 你是怎么得到这些x=X_train_scaled, y=y_train的? 【参考方案1】:

您可以通过增加批量大小来提高 GPU 利用率。但是,考虑到相当小的数据集大小,使用 Dataset API 仍然可以提高性能。它是更具可扩展性的解决方案,能够处理大型数据集。

dataset = tf.data.Dataset.from_tensor_slices((X_train_scaled, y_train))
dataset = dataset.cache() #caches dataset in memory
dataset = dataset.shuffle(len(X_train_scaled)) #shuffles dataset
dataset = dataset.repeat() #with no parameter, repeats indefinitely
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(batch_size*10) #prefetches data 

然后您只需将数据集对象传递给model.fit 而不使用batch_size,因为它是之前指定的,并且使用steps_per_epoch 让模型知道epoch 的大小。

his = model.fit(dataset, steps_per_epoch=7500, epochs=1000)

附言使用这种大小的 csv 文件,很难获得高利用率。您可以轻松地将整个数据集作为一批传递并获得大约 60%。更多信息在这里https://www.tensorflow.org/guide/performance/datasets

【讨论】:

我收到错误,AttributeError: 'PrefetchDataset' object has no attribute 'ndim'. 我刚刚在输入代码后添加了您的代码。看了官方的攻略,还不是很明白。这个数据集本身有数据吗? 这个错误来自model.fit,这意味着很可能,数据集之前的数据类型错误。形状似乎还可以,?维度表示批量大小。数据集将数据提供给模型、keras 或估计器处理迭代。尝试使用 tf.Session 评估数据集以检查数据正确性。 iterator = dataset.make_one_shot_iterator()with tf.Session() as sess: print(sess.run(iterator.get_next())) 输出是(array([[0.61614731, 0.45118483, 0.23880228, 0.58324397]]), array([443.02])) 好像没问题? tf.shape 应该输出 [batch_size, num_columns] 在增加batch_size的同时,输出也会增加。不知何故,它起作用了。【参考方案2】:

您正在查看错误的显示以查看 tensorflow 的 GPU 使用情况。您看到的是视频卡的 3D 活动。

如果您注意到 3D、视频编码等旁边有一个下拉箭头,请将其中一个设置为 Cuda,另一个设置为 Copy。这使您可以查看计算使用情况和复制时间。

实际上,我正在处理一个类似类型的问题,在 Cuda 下我得到了大约 65% 的使用率,因为数据集太小了。您可以增加批量大小以增加 GPU 使用率,但结果也会损害网络,因此对于大多数情况,最好在批量大小约为 32-128 的数据集上进行训练,即使您的 GPU 内存可以工作得更多.

如果您能弄清楚如何使其正常工作,上述使用数据集的答案应该可以工作。这是我现在正在做的事情。

【讨论】:

以上是关于Keras Gpu:配置的主要内容,如果未能解决你的问题,请参考以下文章

keras上的多GPU训练错误(OOM)(足够的内存,可能是配置问题)

如何选择/配置 AWS GPU 实例以加速 TensorFlow.keras?

win10配置Keras及GPU环境

如何配置我的 jupyter notebook 以便它在使用 keras 时使用可用的 GPU?

Keras学习环境配置-GPU加速版(Ubuntu 16.04 + CUDA8.0 + cuDNN6.0 + Tensorflow)

Tensorboard 示例未重现 GPU 配置文件