Neural network 在较大的数据集上,无CPU多核利用率较低

Neural network 在较大的数据集上,无CPU多核利用率较低,neural-network,theano,multicore,lasagne,Neural Network,Theano,Multicore,Lasagne,我有一个多层感知器代码,使用了Theano/Lasagne,当我在一个小数据集上运行时,它正确地使用了多个核心 但是,当我在一个更大的数据集上运行它(使用相同的代码)并观察htop中的CPU利用率时,我没有看到它并行化。它创建.theanoc文件中定义的进程数,如下所示: [global] OMP_NUM_THREADS=15 openmp=True floatX = float32 [blas] ldflags=-L/usr/lib/ -lblas -lgfortran 但大多数情况下(~

我有一个多层感知器代码,使用了Theano/Lasagne,当我在一个小数据集上运行时,它正确地使用了多个核心

但是,当我在一个更大的数据集上运行它(使用相同的代码)并观察htop中的CPU利用率时,我没有看到它并行化。它创建.theanoc文件中定义的进程数,如下所示:

[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在自定义层中执行一些额外的稀疏乘法。

您能试试哪一个有很多优化,并将MKL作为后端吗?@Patric我想看看我是否能在当前环境中做些什么,但如果我不能解决问题,我很乐意测试Intel Theano。谢谢你的介绍。谢谢,如果你能提供一个可复制的案例,我也可以试一试。