我正在使用 Windows 机器,并且我有一个为 Python 2.7 设计的代码,可以解决统计模型。由于模型取决于参数的值,因此我创建了一个并行版本,它为每个参数值求解一个模型。例如,考虑一个名为的第一个文件main_function,其中包含以下代码(此代码是为了可复制性,但与问题无关):import numpy as npimport cvxpydef lm_lasso(x, y, lambda1=None): n = x.shape[0] m = x.shape[1] lambda_param = cvxpy.Parameter(sign="positive") # Define the objective function beta_var = cvxpy.Variable(m) lasso_penalization = lambda_param * cvxpy.norm(beta_var, 1) lm_penalization = (1.0 / n) * cvxpy.sum_squares(y - x * beta_var) objective = cvxpy.Minimize(lm_penalization + lasso_penalization) problem = cvxpy.Problem(objective) beta_sol_list = [] for l in lambda1: lambda_param.value = l problem.solve(solver=cvxpy.ECOS) beta_sol = np.asarray(np.row_stack([b.value for b in beta_var])).flatten() beta_sol_list.append(beta_sol) return beta_sol_list第二个名为的文件parallel_function包含以下代码:import multiprocessing as mpimport numpy as npimport functoolsimport zz_main_function as mfdef lm_lasso_parallel(x, y, lambda1): chunks = np.array_split(lambda1, mp.cpu_count()) pool = mp.Pool(processes=mp.cpu_count()) results = pool.map(functools.partial(mf.lm_lasso, x, y), chunks) pool.close() pool.join() return results我将函数拆分为两个文件的原因是因为这样一切似乎都可以正常工作,而无需添加if __name__ == '__main__':处理多处理时通常所需的内容。这段代码是几个月前编写的,无论是从 python 控制台还是运行 python 文件,都可以完美运行,例如:import zz_parallel_function as pffrom sklearn.datasets import load_bostonboston = load_boston()x = boston.datay = boston.targetlambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]r_parallel = pf.lm_lasso_parallel(x, y, lambda1)最近我不得不格式化我的电脑,当我重新安装 python 2.7 并尝试运行之前描述的代码时,我遇到了以下错误:如果我尝试直接从 python 控制台运行它:import zz_parallel_function as pffrom sklearn.datasets import load_bostonboston = load_boston()x = boston.datay = boston.targetlambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]r_parallel = pf.lm_lasso_parallel(x, y, lambda1)如果我将其作为独立文件运行:所以我的问题是:为什么这段代码以前有效,现在无效?(可能)唯一改变的是安装的一些模块的版本,但我认为这无关紧要关于如何让它再次工作的任何猜测?
1 回答
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
您不能mulitprocessing
直接从 python 解释器生成新的子进程。
从文档中,
注意:此包中的功能要求 子模块可以导入主模块。这在编程指南中有介绍,但值得在这里指出。这意味着某些示例,例如 Pool 示例将无法在交互式解释器中工作。
指导方针说
安全导入主模块
确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程)。
在 Windows 以外的任何操作系统上调用时,调用 freeze_support() 均无效。另外,如果模块在 Windows 上被 Python 解释器正常运行(程序没有被冻结),则 freeze_support() 无效。
此外,应使用if __name__ == '__main__':
以下方式保护程序的“入口点”:
from multiprocessing import Process, freeze_support
def f():
print 'hello world!'
if __name__ == '__main__':
freeze_support()
Process(target=f).start()
如果freeze_support()省略该行,则尝试运行冻结的可执行文件(例如,使用pyinstalleror创建py2exe)将引发RuntimeError。
添加回答
举报
0/150
提交
取消