我有一个使用Theano / Lasagne的多层感知器代码,当我在一个小数据集上运行时,正确地使用了多个内核。
但是,当我在一个更大的数据集(使用相同的代码)上运行它并且我在htop中观察CPU利用率时,我不会看到它并行化。它创建了 .theanorc 文件中定义的进程数,如下所示:
[global]
OMP_NUM_THREADS=15
openmp=True
floatX = float32
[blas]
ldflags=-L/usr/lib/ -lblas -lgfortran
但是大部分时间(~90%)只有一个创建的进程正在运行(尽管利用率上升了很短的时间)。
我想有一个操作没有使用多核,而其他操作正在使用它,因为当我在一个小数据集上运行代码时,我发现大部分时间都使用了所有核心。所有的操作都是矩阵乘法(稀疏和密集),所以我不知道 知道为什么有些运营不使用多核。
这是正在运行的代码部分:
for n in xrange(self.n_epochs):
x_batch, y_batch = self.X, Y_train
l_train, acc_train = self.f_train(x_batch, y_batch, self.train_indices)
l_val, acc_val = self.f_val(self.X, Y_dev, self.dev_indices)
val_pred = self.f_predict(self.X, self.dev_indices)
if acc_val > best_val_acc:
best_val_loss = l_val
best_val_acc = acc_val
best_params = lasagne.layers.get_all_param_values(self.l_out)
n_validation_down = 0
else:
#early stopping
n_validation_down += 1
logging.info('epoch ' + str(n) + ' ,train_loss ' + str(l_train) + ' ,acc ' + str(acc_train) + ' ,val_loss ' + str(l_val) + ' ,acc ' + str(acc_val) + ',best_val_acc ' + str(best_val_acc))
if n_validation_down > self.early_stopping_max_down:
logging.info('validation results went down. early stopping ...')
break
我的numpy / blas信息:
lapack_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blas_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blis_info:
NOT AVAILABLE
openblas_lapack_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
请注意,输入矩阵是稀疏的,我使用S.dot在自定义图层中进行一些额外的稀疏乘法。