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

问题描述

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

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

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

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

谢谢!

解决方法

是的,它会无缝运行。 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,这是不同的。

,

是的,有可能。这是一个例子。 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,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)>