无法使用 Plaidml 在 GPU 上运行 Keras 模型

Posted

技术标签:

【中文标题】无法使用 Plaidml 在 GPU 上运行 Keras 模型【英文标题】:Cannot Run Keras Model On GPU With Plaidml 【发布时间】:2022-01-10 20:01:04 【问题描述】:

我想在我的 GPU 上运行这个 Keras 模型,但它在我使用的 cpu 上运行 Plaidml 使用我的 AMD GPU,plaidml 已正确设置并运行 完美适用于其他型号 我想也许是因为我正在导入 tensorflow,但我不确定,我需要模型在 GPU 上运行,我有其他不导入 tensorflow 的模型与 Plaidml 完美配合

源代码

import numpy as np

from os import environ
environ["KERAS_BACKEND"] = "plaidml.keras.backend"
import keras
from keras.layers import Dense


import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers


master_url_root = "https://raw.githubusercontent.com/numenta/NAB/master/data/"

df_small_noise_url_suffix = "artificialNoAnomaly/art_daily_small_noise.csv"
df_small_noise_url = master_url_root + df_small_noise_url_suffix
df_small_noise = pd.read_csv(
    df_small_noise_url, parse_dates=True, index_col="timestamp"
)

df_daily_jumpsup_url_suffix = "artificialWithAnomaly/art_daily_jumpsup.csv"
df_daily_jumpsup_url = master_url_root + df_daily_jumpsup_url_suffix
df_daily_jumpsup = pd.read_csv(
    df_daily_jumpsup_url, parse_dates=True, index_col="timestamp"
)



fig, ax = plt.subplots()
df_small_noise.plot(legend=False, ax=ax)
plt.show()



training_mean = df_small_noise.mean()
training_std = df_small_noise.std()
df_training_value = (df_small_noise - training_mean) / training_std
print("Number of training samples:", len(df_training_value))




TIME_STEPS = 288

# Generated training sequences for use in the model.
def create_sequences(values, time_steps=TIME_STEPS):
    output = []
    for i in range(len(values) - time_steps + 1):
        output.append(values[i : (i + time_steps)])
    return np.stack(output)


x_train = create_sequences(df_training_value.values)
print("Training input shape: ", x_train.shape)



model = keras.Sequential(
    [
        layers.Input(shape=(x_train.shape[1], x_train.shape[2])),
        layers.Conv1D(
            filters=32, kernel_size=7, padding="same", strides=2, activation="relu"
        ),
        layers.Dropout(rate=0.2),
        layers.Conv1D(
            filters=16, kernel_size=7, padding="same", strides=2, activation="relu"
        ),
        layers.Conv1DTranspose(
            filters=16, kernel_size=7, padding="same", strides=2, activation="relu"
        ),
        layers.Dropout(rate=0.2),
        layers.Conv1DTranspose(
            filters=32, kernel_size=7, padding="same", strides=2, activation="relu"
        ),
        layers.Conv1DTranspose(filters=1, kernel_size=7, padding="same"),
    ]
)
model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.001), loss="mse")
model.summary()


history = model.fit(
    x_train,
    x_train,
    epochs=50,
    batch_size=128,
    validation_split=0.1,
    callbacks=[
        keras.callbacks.EarlyStopping(monitor="val_loss", patience=5, mode="min")
    ],
)

plt.plot(history.history["loss"], label="Training Loss")
plt.plot(history.history["val_loss"], label="Validation Loss")
plt.legend()
plt.show()

这是我的任务管理器的图像(Plaidml 设置为在 GPU 0 上运行 [它适用于其他源代码])

【问题讨论】:

【参考方案1】:

尝试从 keras 导入 keras,而不是使用 tensorflow keras。

 import keras
 from keras import layers

你应该仍然可以访问所有相同的层、模型等。你可能需要安装没有 tensorflow 的 keras

 pip install keras

还要查看您的 GPU 内存使用情况。它应该跳起来,因为数据存储在上面。在 plaidml 中,大多数计算实际上并不是在 GPU 上运行,而是将权重和数据存储在其上。

【讨论】:

以上是关于无法使用 Plaidml 在 GPU 上运行 Keras 模型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Python 在 GPU (Jetson Nano) 上运行 tflite 模型

无法在 GPU 上运行 tensorflow

由于总线错误,无法使用Anaconda运行tensorflow GPU

如何在 GPU 上的数组上运行 expit 函数?

tensorflow只能在装有gpu的机器上运行

在 Ubuntu 20.4 LTS 上使用 GPU (CUDA-11.0) 运行代码时的 TensorFlow 问题