当前位置: 首页 > 知识库问答 >
问题:

如何确保Keras使用带有tensorflow后端的GPU?

龚苏燕
2023-03-14

我已经在纸质空间云架构体系上创建了虚拟笔记本,后端有Tensorflow GPU P5000虚拟实例。当我开始训练我的网络时,它比我的MacBook Pro用纯CPU运行时引擎慢2倍。如何确保Keras NN在训练过程中使用GPU而不是CPU?

请在下面找到我的代码:

from tensorflow.contrib.keras.api.keras.models import Sequential
from tensorflow.contrib.keras.api.keras.layers import Dense
from tensorflow.contrib.keras.api.keras.layers import Dropout
from tensorflow.contrib.keras.api.keras import utils as np_utils
import numpy as np
import pandas as pd

# Read data
pddata= pd.read_csv('data/data.csv', delimiter=';')

# Helper function (prepare & test data)
def split_to_train_test (data):
    trainLenght = len(data) - len(data)//10

    trainData = data.loc[:trainLenght].sample(frac=1).reset_index(drop=True)
    testData = data.loc[trainLenght+1:].sample(frac=1).reset_index(drop=True)

    trainLabels = trainData.loc[:,"Label"].as_matrix()
    testLabels = testData.loc[:,"Label"].as_matrix()

    trainData = trainData.loc[:,"Feature 0":].as_matrix()
    testData  = testData.loc[:,"Feature 0":].as_matrix()

    return (trainData, testData, trainLabels, testLabels)

# prepare train & test data
(X_train, X_test, y_train, y_test) = split_to_train_test (pddata)

# Convert labels to one-hot notation
Y_train = np_utils.to_categorical(y_train, 3)
Y_test  = np_utils.to_categorical(y_test, 3)

# Define model in Keras
def create_model(init):
    model = Sequential()
    model.add(Dense(101, input_shape=(101,), kernel_initializer=init, activation='tanh'))
    model.add(Dense(101, kernel_initializer=init, activation='tanh'))
    model.add(Dense(101, kernel_initializer=init, activation='tanh'))
    model.add(Dense(101, kernel_initializer=init, activation='tanh'))
    model.add(Dense(3, kernel_initializer=init, activation='softmax'))
    return model

# Train the model
uniform_model = create_model("glorot_normal")
uniform_model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
uniform_model.fit(X_train, Y_train, batch_size=1, epochs=300, verbose=1, validation_data=(X_test, Y_test)) 

共有3个答案

汝楷
2023-03-14

考虑到keras是tensorflow自2.0版以来的内置版本:

import tensorflow as tf
tf.test.is_built_with_cuda()  
tf.test.is_gpu_available(cuda_only = True)  

注意:后一种方法可能需要几分钟才能运行。

陶睿
2023-03-14

把这个放在你木星笔记本的顶部附近。评论出你不需要的东西。

# confirm TensorFlow sees the GPU
from tensorflow.python.client import device_lib
assert 'GPU' in str(device_lib.list_local_devices())

# confirm Keras sees the GPU (for TensorFlow 1.X + Keras)
from keras import backend
assert len(backend.tensorflow_backend._get_available_gpus()) > 0

# confirm PyTorch sees the GPU
from torch import cuda
assert cuda.is_available()
assert cuda.device_count() > 0
print(cuda.get_device_name(cuda.current_device()))

注意:随着TensorFlow 2.0的发布,Keras现在作为TF API的一部分包含在内。

最初在这里回答。

范侯林
2023-03-14

您需要使用在TensorFlow会话中设置的log_device_placement=True运行网络(下面示例代码中最后一行之前的行)。有趣的是,如果您在会话中设置它,它仍然会在Keras进行拟合时应用。所以下面这段代码(测试过)确实输出了每个张量的位置。请注意,我已经短路了数据读取,因为您的数据不可用,所以我只是用随机数据运行网络。这种方式的代码是自包含的,任何人都可以运行。另一个注意事项:如果您从Jupyter Notebook运行此操作,log_device_placement的输出将转到启动Jupyter Notebook的终端,而不是笔记本单元的输出。

from tensorflow.contrib.keras.api.keras.models import Sequential
from tensorflow.contrib.keras.api.keras.layers import Dense
from tensorflow.contrib.keras.api.keras.layers import Dropout
from tensorflow.contrib.keras.api.keras import utils as np_utils
import numpy as np
import pandas as pd
import tensorflow as tf

# Read data
#pddata=pd.read_csv('data/data.csv', delimiter=';')
pddata = "foobar"

# Helper function (prepare & test data)
def split_to_train_test (data):

    return (
        np.random.uniform( size = ( 100, 101 ) ),
        np.random.uniform( size = ( 100, 101 ) ),
        np.random.randint( 0, size = ( 100 ), high = 3 ),
        np.random.randint( 0, size = ( 100 ), high = 3 )
    )

    trainLenght = len(data) - len(data)//10

    trainData = data.loc[:trainLenght].sample(frac=1).reset_index(drop=True)
    testData = data.loc[trainLenght+1:].sample(frac=1).reset_index(drop=True)

    trainLabels = trainData.loc[:,"Label"].as_matrix()
    testLabels = testData.loc[:,"Label"].as_matrix()

    trainData = trainData.loc[:,"Feature 0":].as_matrix()
    testData  = testData.loc[:,"Feature 0":].as_matrix()

    return (trainData, testData, trainLabels, testLabels)

# prepare train & test data
(X_train, X_test, y_train, y_test) = split_to_train_test (pddata)

# Convert labels to one-hot notation
Y_train = np_utils.to_categorical(y_train, 3)
Y_test  = np_utils.to_categorical(y_test, 3)

# Define model in Keras
def create_model(init):
    model = Sequential()
    model.add(Dense(101, input_shape=(101,), kernel_initializer=init, activation='tanh'))
    model.add(Dense(101, kernel_initializer=init, activation='tanh'))
    model.add(Dense(101, kernel_initializer=init, activation='tanh'))
    model.add(Dense(101, kernel_initializer=init, activation='tanh'))
    model.add(Dense(3, kernel_initializer=init, activation='softmax'))
    return model

# Train the model
uniform_model = create_model("glorot_normal")
uniform_model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
with tf.Session( config = tf.ConfigProto( log_device_placement = True ) ):
    uniform_model.fit(X_train, Y_train, batch_size=1, epochs=300, verbose=1, validation_data=(X_test, Y_test)) 

终端输出(部分,太长):

...
VarIsInitializedOp_13: /job:localhost/replica:0/任务:0/设备:GPU:0
2018-04-21 21:54:33.485870:I tenorflow/core/common_runtime/placer.cc:884]
VarIsInitializedOp_13:localhost/replica:0/任务:0/设备:GPU: 0
训练/SGD/mul_18/ReadVariableOp:(ReadVariableOp): /job:localhost/replica: 0/任务: 0/设备: GPU: 0
2018-04-21 21:54:33.485895: I tenorflow/core/common_runtime/placer.cc:884]
训练/SGD/mul_18/ReadVariableOp:(ReadVariableOp)/作业:localhost/replica: 0/任务: 0/设备: GPU: 0
训练/SGD/Variable_9/阅读/ReadVERableOp:(ReadVERableOp): /job:localhost/replica: 0/任务: 0/设备: GPU: 0
2018-04-21 21:54:33.485903: I tenorflow/core/common_runtime/placer.cc:884]
训练/SGD/Variable_9/阅读/##############################################################################################################################################################################

请注意,许多行末尾的GPU:0。

Tensorflow手册的相关页面:使用GPU:日志设备放置。

 类似资料:
  • 问题内容: 我使用keras版本2.0.0和tensorflow版本0.12.1构建了docker 镜像的gpu版本https://github.com/floydhub/dl- docker 。然后,我运行了mnist教程https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py,但意识到keras没有使用GPU。以下是

  • 问题内容: 我安装了Tensorflow后端和CUDA的Keras。我有时想按需强迫Keras使用CPU。不用说在虚拟环境中安装单独的仅CPU的Tensorflow就能做到吗?如果可以,怎么办?如果后端是Theano,则可以设置标志,但是我还没有听说过可以通过Keras访问Tensorflow标志。 问题答案: 如果要强制Keras使用CPU 方式1 在导入Keras / Tensorflow之前

  • 我知道在安装tensorflow时,您可以安装GPU或CPU版本。如何检查安装了哪一个(我使用linux)。 如果安装了GPU版本,如果GPU不可用,它会自动在CPU上运行吗?如果GPU可用,是否需要设置特定的字段或值来确保它在GPU上运行?

  • Keras是紧凑,易于学习的高级Python库,运行在TensorFlow框架之上。它的重点是理解深度学习技术,例如为神经网络创建维护形状和数学细节概念的层。freamework的创建可以是以下两种类型 - 顺序API 功能API 在Keras中创建深度学习模型有以下 8 个步骤 - 加载数据 预处理加载的数据 模型的定义 编译模型 指定模型 评估模型 进行必要的预测 保存模型 下面将使用Jupy

  • 问题内容: 运行keras脚本时,得到以下输出: 这是什么意思?我是否正在使用GPU或CPU版本的Tensorflow? 在安装keras之前,我正在使用Tensorflow的GPU版本。 还显示和没有什么像。 运行[此stackoverflow问题]中提到的命令,将得到以下信息: 问题答案: 您正在使用GPU版本。您可以列出可用的tensorflow设备(也请检查此问题): 编辑: 使用tens

  • 请注意,CPU没有被利用,任务管理器上的任何其他内容都表明任何东西都没有被充分利用。我没有以太网连接,并且连接到Wifi(我不认为这会影响任何事情,但我不确定Jupyter是否会影响Wifi,因为它是通过web浏览器运行的)。我正在培训大量数据(~128GB),这些数据都加载到RAM(512GB)中。我运行的模型是一个完全卷积的神经网络(基本上是一个U型网络结构),具有566290个可训练参数。到