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

2024-06-12 10:24:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

理论上,我认为机器学习就是这样工作的。该模型在高端GPU上进行训练,一旦导出,无论是否有GPU,都可以加载到任何机器上,并可用于进行预测。

如果没有,那么机器学习模型是否部署在具有多个GPU的高端服务器上?

谢谢


Tags: 答案模型程序机器gpu部署互联网cpu
2条回答

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

是的,在keras中,它将无缝工作。使用tensorflow back的Keras将检查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

相关问题 更多 >