当设置 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-Idf vectorizer 分析来自行而不是单词的向量