GPU上的预训练Keras模型可以用于仅CPU的PC上的预测吗?

时间:2020-09-04 10:33:47

标签: python tensorflow machine-learning keras deep-learning

我是机器学习的新手。非常抱歉,如果这是一个愚蠢的问题,但我在互联网上找不到任何答案。

我正在学习Keras。我的问题是,如果我在RTX Titan这样的高端GPU上训练模型,是否可以导出模型,将其加载到另一台低端计算机上的新程序中,然后仅使用CPU进行预测。

从理论上讲,我认为机器学习就是这样。该模型在高端GPU上进行训练,一旦导出,就可以将其加载到任何计算机上,无论它是否具有GPU,都可以用来进行预测。

如果不是,则为Machine学习部署在具有多个GPU的高端服务器上的模型?

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,它会无缝运行。 Keras使用tensorflow back将检查GPU是否可用,如果可用,则将在GPU上训练模型。

类似地,在加载模型时进行推断,如果没有可用的GPU,它将使用CPU。

使用google colab进行的实验

让我们使用“ GPU”运行时启动Google协作

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import tensorflow as tf 

tf.compat.v1.debugging.set_log_device_placement(True)
print(tf.config.list_physical_devices('GPU'))

model = Sequential()
model.add(Dense(1024, input_dim=8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])

X = np.random.randn(10,8) 
y = np.random.randn(10) 

model.fit(X, y, epochs=2)
model.save("model.h5")

输出

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
Epoch 1/2
1/1 [==============================] - 0s 1ms/step - loss: 0.6570 - accuracy: 0.0000e+00
Epoch 2/2
1/1 [==============================] - 0s 983us/step - loss: 0.6242 - accuracy: 0.0000e+00
<tensorflow.python.keras.callbacks.History at 0x7fcad09366a0>

因此,在这种情况下,模型是在可用的GPU上训练的。您可以使用命令!nvidia-smi看到它占用了GPU。我们已将模型另存为model.h5。让我们下载并制作本地副本

现在,将colab的运行时更改为“ CPU”。让我们将model.h5上传到协作室并进行预测。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import tensorflow as tf 


from keras.models import load_model
tf.compat.v1.debugging.set_log_device_placement(True)
print(tf.config.list_physical_devices('GPU'))

model = load_model('model.h5')
model.predict(X)

输入量:

[]
array([[0.4464949 ],
       [0.43229908],
       [0.49823508],
       [0.4367126 ],
       [0.47648385],
       [0.48096564],
       [0.47863394],
       [0.5031184 ],
       [0.45698297],
       [0.45885688]], dtype=float32)

如您所见,没有可用的GPU,并且已加载模型并在CPU上运行了预测。

Keras无缝。但是在pytorch中,我们必须手动将模型从GPU移到CPU,这是不同的。

答案 1 :(得分:0)

是的,有可能。这是一个例子。 MobileNetv2受过一堆GPU甚至TPU的训练,在这里,我将加载预先训练的权重并进行预测。请注意,此行将确保它使用的是CPU,而不是GPU:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

现在,如果您列出可用的GPU,则没有:

print(tf.config.list_physical_devices('GPU'))
[]

这是MobileNetv2的完整示例:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
import tensorflow as tf
import numpy as np

model = tf.keras.applications.MobileNetV2(weights='imagenet')

random_input = np.random.rand(1, 224, 224, 3).astype(np.float32)

model(random_input)
<tf.Tensor: shape=(10,), dtype=float32, numpy=
array([9.0857502e-06, 1.7574477e-05, 1.1161536e-04, 8.0340644e-05,
       1.1069454e-03, 1.4179133e-04, 5.5307936e-04, 9.6242256e-06,
       3.0724725e-06, 4.4839562e-06], dtype=float32)>