这是我的当前运行的GridSearch的pstree
输出,我很好奇正在进行什么进程,还有一些我尚不能解释的东西。
├─bash─┬─perl───20*[bash───python─┬─5*[python───31*[{python}]]]
│ │ └─11*[{python}]]
│ └─tee
└─bash───pstree
我删除了与主题无关的内容。花括号表示线程。
- Perl的出现是因为我使用了
parallel -j 20
启动我的Python作业。正如您所看到的,20 *
确实显示了有20个进程。 - 每个Python进程之前的
bash
进程是由于使用source activate venv
激活Anaconda虚拟环境。 - 在每个Python进程内部,又产生了另外5个Python进程(
5 *
)。这是因为我将n_jobs = 5
指定给GridSearchCV
。
我的理解到此结束。
问题:有人能解释一下为什么还有另外11个Python线程(11 * [{python}]
)连同网格搜索一起出现,并且在每个5个网格搜索作业内部生成31个Python线程(31 * [{python}]
)吗?
更新:添加了调用GridSearchCV
的代码
Cs = 10 ** np.arange(-2, 2, 0.1)
skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
clf = LogisticRegression()
gs = GridSearchCV(
clf,
param_grid={'C': Cs, 'penalty': ['l1'],
'tol': [1e-10], 'solver': ['liblinear']},
cv=skf,
scoring='neg_log_loss',
n_jobs=5,
verbose=1,
refit=True)
gs.fit(Xs, ys)
更新(2017-09-27):
我在 gist 上整理了一个测试代码,如果您感兴趣可以轻松地复现。
我在 Mac Pro 和多台 linux 机器上测试了相同的代码,并重现了 @igrinis 的结果,但仅在 Mac Pro 上。在 Linux 机器上,我得到的数字与之前不同,但一致。因此,生成的线程数可能取决于传递给 GridSearchCV 的特定数据源。
python─┬─5*[python───31*[{python}]]
└─3*[{python}]
请注意,Homebrew/Linuxbrew在Mac Pro和Linux机器上安装的pstree版本是不同的。这里我发布我使用的确切版本:
Mac:
pstree $Revision: 2.39 $ by Fred Hucht (C) 1993-2015
EMail: fred AT thp.uni-due.de
Linux:
pstree (PSmisc) 22.20
Copyright (C) 1993-2009 Werner Almesberger and Craig Small
Mac 版本似乎没有显示线程的选项,这可能是它们在结果中未被看到的原因。我还没有找到一种在 Mac Pro 上轻松检查线程的方法。如果您知道方法,请留言。
更新(2017-10-12)
在另一组实验中,我确认设置环境变量OMP_NUM_THREADS
会产生影响。
在export OMP_NUM_THREADS=1
之前,存在许多(63个)线程,其用途不明确如上所述:
bash───python─┬─23*[python───63*[{python}]]
└─3*[{python}]
这里没有使用Linux的parallel
。 n_jobs=23
。
在执行export OMP_NUM_THREADS=1
后,没有启动线程,但是3个Python进程仍然存在,我仍然不知道它们的用途。
bash───python─┬─23*[python]
└─3*[{python}]
我最初了解OMP_NUM_THREADS
是因为它会导致我的一些GridSearchCV作业出现错误,错误消息类似于这样
OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint: Try decreasing the value of OMP_NUM_THREADS.
export OMP_NUM_THREADS=1
,这可能会起到作用。 - zyxue