我是机器学习的新手。非常抱歉,如果这是一个愚蠢的问题,但我在互联网上找不到任何答案。
我正在学习Keras。我的问题是,如果我在RTX Titan这样的高端GPU上训练模型,是否可以导出模型,将其加载到另一台低端计算机上的新程序中,然后仅使用CPU进行预测。
从理论上讲,我认为机器学习就是这样。该模型在高端GPU上进行训练,一旦导出,就可以将其加载到任何计算机上,无论它是否具有GPU,都可以用来进行预测。
如果不是,则为Machine学习部署在具有多个GPU的高端服务器上的模型?
谢谢!
答案 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)>