【问题标题】:Can KerasClassifier wtih TF model works with sklearn.cross_val_score when setting n_job=-1 and TF runs on a single GPU?当设置 n_job=-1 并且 TF 在单个 GPU 上运行时,带有 TF 模型的 KerasClassifier 可以与 sklearn.cross_val_score 一起使用吗?
【发布时间】:2017-11-28 06:09:43
【问题描述】:

我有这个示例代码,它只能使用n_jobs=1 运行。

Tensorflow 后端在 GPU 上运行。

当我在方法 cross_val_score 上使用 n_jobs=-1 运行时,程序在输出 4 行 Epoch 1/100 后卡住/停止工作或给出任何输出(因为我有一个 4 核 CPU,我假设它将使用所有 4 个内核做 CV 并且每个人都尝试在 GPU 上启动一个 tf 会话)

from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout

def build_classifier():
    classifier = Sequential()
    classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
    classifier.add(Dropout(0.3))
    classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))
    # classifier.add(Dropout(0.3))
    classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
    classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
    return classifier
classifier = KerasClassifier(build_fn = build_classifier, batch_size = 100, epochs = 100, verbose=0)
accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = 1)

我也尝试过以这种方式限制 TF GPU 的使用,但 n_job=-1 仍然不起作用。

np.random.seed(123)
tf.set_random_seed(123)
config = tf.ConfigProto(inter_op_parallelism_threads=1)
config.gpu_options.per_process_gpu_memory_fraction = 0.1 # in my case this setting will use around 1G memory on GPU
set_session(tf.Session(config=config))

【问题讨论】:

    标签: tensorflow scikit-learn keras cross-validation


    【解决方案1】:

    我有同样的问题,我使用下面的代码行

    配置 GPU 以使用所有内存

    config = tf.ConfigProto(allow_soft_placement=True)
    config.gpu_options.per_process_gpu_memory_fraction = 1.0
    set_session(tf.Session(config=config))
    
    def build_classifier():
        classifier = Sequential()
        classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
        classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))
        classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
        classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
        return classifier
    classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 100)
    accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10)
    mean = accuracies.mean()
    variance = accuracies.std()
    

    然后我删除了 n_jobs = -1 然后我尝试再次运行它并使用 GPU-Z 检查 GPU 利用率下面是运行中的照片。

    也许您的问题是您感觉不到使用 GPU 的性能提升。为了回答这个问题,我使用 CPU 和 GPU 运行相同的代码。

    GPU 至少在我的平均实验 3:1 CPU 中。我相信它应该花费更少的时间,但这是达到的最大性能。

    你也可以找到一些很好的讨论Run Keras with GPU

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2018-05-23
      • 1970-01-01
      • 2020-08-31
      • 2018-01-21
      相关资源
      最近更新 更多