当设置 n_job=-1 并且 TF 在单个 GPU 上运行时,带有 TF 模型的 KerasClassifier 可以与 sklearn.cross_val_score 一起使用吗?

Posted

技术标签:

【中文标题】当设置 n_job=-1 并且 TF 在单个 GPU 上运行时,带有 TF 模型的 KerasClassifier 可以与 sklearn.cross_val_score 一起使用吗?【英文标题】:Can KerasClassifier wtih TF model works with sklearn.cross_val_score when setting n_job=-1 and TF runs on a single GPU? 【发布时间】: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))

【问题讨论】:

【参考方案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

【讨论】:

以上是关于当设置 n_job=-1 并且 TF 在单个 GPU 上运行时,带有 TF 模型的 KerasClassifier 可以与 sklearn.cross_val_score 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

tf_geometric的安装

tf_geometric的安装

TF/KERAS:将列表作为单个输出的损失传递

Tf-Idf vectorizer 分析来自行而不是单词的向量

SqlConnection 使用 Dynamics GP 用户名和密码——用户登录失败

tensorflow中命名空间变量命名的问题