如何强制让 TensorFlow 和 Keras 运行在 GPU 上?

4
我在Linux Ubuntu上拥有TensorFlow、NVIDIA GPU(CUDA)/CPU、Keras和Python 3.7。我按照以下教程的步骤进行操作: https://www.youtube.com/watch?v=dj-Jntz-74g 当我运行以下代码时:
# What version of Python do you have?
import sys

import tensorflow.keras
import pandas as pd
import sklearn as sk
import tensorflow as tf

print(f"Tensor Flow Version: {tf.__version__}")
print(f"Keras Version: {tensorflow.keras.__version__}")
print()
print(f"Python {sys.version}")
print(f"Pandas {pd.__version__}")
print(f"Scikit-Learn {sk.__version__}")
gpu = len(tf.config.list_physical_devices('GPU'))>0
print("GPU is", "available" if gpu else "NOT AVAILABLE")

我获得了以下结果:

Tensor Flow Version: 2.4.1
Keras Version: 2.4.0

Python 3.7.10 (default, Feb 26 2021, 18:47:35) 
[GCC 7.3.0]
Pandas 1.2.3
Scikit-Learn 0.24.1
GPU is available

然而,我不知道如何在GPU上运行我的Keras模型。当我运行我的模型时,执行$ nvidia-smi -l 1 命令,GPU使用率几乎为0%。
from keras import layers
from keras.models import Sequential
from keras.layers import Dense, Conv1D, Flatten
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from keras.callbacks import EarlyStopping
 
model = Sequential()
model.add(Conv1D(100, 3, activation="relu", input_shape=(32, 1)))
model.add(Flatten())
model.add(Dense(64, activation="relu"))
model.add(Dense(1, activation="linear"))
model.compile(loss="mse", optimizer="adam", metrics=['mean_squared_error'])
model.summary()

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=70)

history = model.fit(partial_xtrain_CNN, partial_ytrain_CNN, batch_size=100, epochs=1000,\
                    verbose=0, validation_data=(xval_CNN, yval_CNN), callbacks = [es])

我需要更改代码的哪些部分或添加哪些内容才能让它在GPU上运行?


1
通过观察GPU利用率无法确定是否正在使用GPU,因为您的模型非常小,几乎无法从GPU计算中获益。 - Dr. Snoopy
是的,我选择了最少的层数来检查GPU性能。然而数据集并不小。它大约有100000行和32个输入。那么,我应该如何知道它是否正在使用GPU?或者我的模型应该有多大才能使用GPU? - user14655550
2个回答

1
要让TensorFlow在GPU上工作,需要执行几个步骤,而这些步骤相当困难。
首先,与其他框架相比,这些框架与NVIDIA的兼容性更好,因此如果GPU是NVIDIA,则可能会遇到较少问题,应位于list中。
第二件事是您需要安装所有要求,包括:
1- GPU驱动程序的最新版本 2- CUDA安装,显示在here 3- 然后在安装时将Anaconda添加到环境中。
完成所有安装后,在命令提示符中运行以下命令。 conda install numba & conda install cudatoolkit 现在,使用此代码来评估结果:
from numba import jit, cuda 
import numpy as np 
# to measure exec time 
from timeit import default_timer as timer    
  
# normal function to run on cpu 
def func(a):                                 
    for i in range(10000000): 
        a[i]+= 1      
  
# function optimized to run on gpu  
@jit(target ="cuda")                          
def func2(a): 
    for i in range(10000000): 
        a[i]+= 1
if __name__=="__main__": 
    n = 10000000                            
    a = np.ones(n, dtype = np.float64) 
    b = np.ones(n, dtype = np.float32) 
      
    start = timer() 
    func(a) 
    print("without GPU:", timer()-start)     
      
    start = timer() 
    func2(a) 
    print("with GPU:", timer()-start) 

这个答案的部分内容来源于这里, 您可以阅读以获得更多信息。

谢谢Sadegh的回复。当我运行这段代码时,它能够很好地工作,并使用CPU和GPU给出经过的时间。然而,当我运行我的代码时,它只占用了GPU内存,GPU利用率仍为0。不管怎样,我找到了一个解决方法,如下所述。谢谢。 - user14655550

0
我找到了我的问题的解决方案。我认为问题在于 NVIDIA 驱动程序、Cudnn 和 TensorFlow 不兼容。因为我在笔记本电脑上有新的 NVIDIA 图形卡(RTX 3060),它具有 NVIDIA Ampere 架构 GPU,可能与其他设备不兼容。
相反,我参考了这些链接下载了 21.02 的 Docker 容器,然后我挂载了这个 Docker。在这个由 NVIDIA 提供的容器中,一切都经过测试,应该能够提供良好的性能。

https://docs.nvidia.com/deeplearning/frameworks/tensorflow-wheel-release-notes/tf-wheel-rel.html

https://docs.nvidia.com/deeplearning/frameworks/tensorflow-release-notes/rel_21-02.html#rel_21-02

另外,在Linux中安装Docker,您可以按照此处解释的步骤进行操作:

https://towardsdatascience.com/deep-learning-with-docker-container-from-ngc-nvidia-gpu-cloud-58d6d302e4b2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接