Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow+;joblib:限制为8个进程?_Python_Tensorflow_Parallel Processing_Joblib_Dask Distributed - Fatal编程技术网

Python Tensorflow+;joblib:限制为8个进程?

Python Tensorflow+;joblib:限制为8个进程?,python,tensorflow,parallel-processing,joblib,dask-distributed,Python,Tensorflow,Parallel Processing,Joblib,Dask Distributed,我用TensorFlow创建了一个统计估计器。我遵循了sklearn的估计器,所以我有一个类可以打包所有内容,包括导入Tensorflow和启动TF的会话(如果我在类外导入TF,则没有任何并行工作) 我需要在随机数据上多次运行该估计器以查看经验分布,因此我使用joblib来并行化创建数据的代码,创建估计器对象并对数据运行估计。 我在一台64核(和大量内存)的linux服务器上工作,在那里我运行了比这更大的作业,也使用了joblib。然而,当我尝试运行基于TF的代码时,我只能运行8个进程。如果我尝

我用TensorFlow创建了一个统计估计器。我遵循了sklearn的估计器,所以我有一个类可以打包所有内容,包括导入Tensorflow和启动TF的会话(如果我在类外导入TF,则没有任何并行工作)

我需要在随机数据上多次运行该估计器以查看经验分布,因此我使用joblib来并行化创建数据的代码,创建估计器对象并对数据运行估计。 我在一台64核(和大量内存)的linux服务器上工作,在那里我运行了比这更大的作业,也使用了joblib。然而,当我尝试运行基于TF的代码时,我只能运行8个进程。如果我尝试使用9,那么在
top
中只显示8,当这8个都完成时,joblib不会再发送另一个8,也不会返回,或者返回以下错误消息

BrokerProcessPool:执行器中的进程突然终止 当未来正在运行或待定时。”

如果我将进程限制为8个,那么一切都正常工作。 我尝试将joblib的后端更改为dask.parallel,我也有同样的行为。我从后端获得了更多的信息,不断有消息说

“distributed.nanny-警告-工作进程7602被 未知信号“

我希望能够运行8个以上的进程问题是:这是一个硬限制还是我可以通过一些TF参数来改变它?我能以任何方式解决这个问题吗?我认为限制与Tensorflow有关,因为一旦8个进程运行(它们需要几个小时),我就无法在该机器上运行Tensorflow的任何其他程序

谢谢你的帮助

以下代码再现了该错误:

from sklearn.base import TransformerMixin
import numpy as np
from joblib import Parallel, delayed

class MyEstimator(TransformerMixin):
    def __init__(self):
        import tensorflow as tf
        self._tf = tf
        self._graph = tf.Graph()
        with self._graph.as_default():
            self.session = self._tf.Session()
            A0 = np.eye(10, 2)
            self.a_var = a_var = tf.Variable(A0, name='a_var', dtype=tf.float64)
            self._x = x = tf.placeholder(dtype=tf.float64)
            self._y = y= tf.placeholder(dtype=tf.float64)
            w = tf.tensordot(a_var, x, axes=0)
            self.f = tf.reduce_mean((y-w)**2)

    def fit(self, x, y):
        #self.session.run(
        #             self._tf.global_variables_initializer())
        self._f = self.session.run(self.f, feed_dict={self._x:x, self._y: y, self.a_var:np.eye(10, 2)})

        return self

def run_estimator():
    my_est = MyEstimator()
    x = np.random.normal(0,1,10)
    y = np.random.normal(0,1,10)
    my_est.fit(x,y)

Parallel(n_jobs=16)(delayed(run_estimator)() for _ in range(16))

我在Linux、Python 3.6.3、TensorFlow 1.7.0、joblib 0.12上工作。

几个月后,我找到了一个解决方案,一个TensorFlow服务器


您知道tensorflow 2.0中tf.train.Server.create_local_Server()的正确行吗?
from sklearn.base import TransformerMixin
import numpy as np
from joblib import Parallel, delayed

class MyEstimator(TransformerMixin):
    def __init__(self, target):
        import tensorflow as tf
        self._tf = tf
        self._graph = tf.Graph()
        with self._graph.as_default():
            config = self._tf.ConfigProto(
                    intra_op_parallelism_threads=1,
                    inter_op_parallelism_threads=1,
                    device_count={"CPU":4},
                    use_per_session_threads=True)
            config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1
            pool = config.session_inter_op_thread_pool.add()
            pool.num_threads = 1

            self.session = self._tf.Session(target)
            A0 = np.eye(10, 2)
            self.a_var = a_var = tf.Variable(A0, name='a_var', dtype=tf.float64)
            self._x = x = tf.placeholder(dtype=tf.float64)
            self._y = y= tf.placeholder(dtype=tf.float64)
            w = tf.tensordot(a_var, x, axes=0)
            self.f = tf.reduce_mean((y-w)**2)

    def fit(self, x, y):
        #self.session.run(
        #             self._tf.global_variables_initializer())
        self._f = self.session.run(self.f, feed_dict={self._x:x, self._y: y, self.a_var:np.eye(10, 2)})

        return self

def run_estimator(target):
    my_est = MyEstimator(target)
    x = np.random.normal(0,1,10)
    y = np.random.normal(0,1,10)
    my_est.fit(x,y)
    return 1

import tensorflow as tf
server = tf.train.Server.create_local_server()
Parallel(n_jobs=16)(delayed(run_estimator)(server.target) for _ in range(16))