multiprocessing ImportError: No module named <input>
multiprocessing ImportError: No module named <input>
我使用的是 Windows 机器,我有一个为 Python 2.7 设计的代码,用于求解统计模型。由于模型取决于参数值,因此我创建了一个并行版本,为每个参数值求解一个模型。
例如,考虑第一个名为 main_function
的文件,其中包含以下代码(此处的代码是为了可复制性,但与问题无关):
import numpy as np
import cvxpy
def 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 mp
import numpy as np
import functools
import zz_main_function as mf
def 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 控制台还是通过 运行nig 一个 python 文件都可以完美运行,例如:
import zz_parallel_function as pf
from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
lambda1 = [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 pf
from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
lambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]
r_parallel = pf.lm_lasso_parallel(x, y, lambda1)
- 如果我运行它作为一个独立的文件:
所以我的问题是:
为什么这段代码以前可以用,现在不行了?唯一(可能)改变的是安装的一些模块的版本,但我不认为这是相关的
想知道如何让它再次工作吗?
编辑 1
通过在代码中添加if __name__ == '__main__':
并将其运行设置为一个独立的文件,它可以毫无问题地执行。但是,当我尝试在 python 控制台中执行它时,它会提供与以前相同的错误。
根据收到的评论,这可能是由于需要冻结代码。 python 控制台中的代码未冻结,这可能是问题的原因。然后我考虑了 运行 宁 multiprocessing for windows
中的以下示例
from multiprocessing import Process, freeze_support
def foo():
print 'hello'
if __name__ == '__main__':
freeze_support()
p = Process(target=foo)
p.start()
这段代码应该会冻结代码,但是当 运行 在 python 控制台中启用它时,我得到了与以前相同的错误。
您不能直接从 python 解释器使用 mulitprocessing
生成新的子进程。
来自docs,
Note: Functionality within this package requires that the main
module be importable by the children. This is covered in Programming
guidelines however it is worth pointing out here. This means that some
examples, such as the Pool examples will not work in the interactive
interpreter.
而 guideline 表示
Safe importing of main module
Make sure that the main module can be safely imported by a new Python interpreter without causing unintended side effects (such a
starting a new process).
Calling freeze_support() has no effect when invoked on any operating
system other than Windows. In addition, if the module is being run
normally by the Python interpreter on Windows (the program has not
been frozen), then freeze_support() has no effect.
此外,应该使用 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()
行,则尝试 运行 冻结的可执行文件(例如,使用 pyinstaller
或 py2exe
创建)将引发 RuntimeError
。
我使用的是 Windows 机器,我有一个为 Python 2.7 设计的代码,用于求解统计模型。由于模型取决于参数值,因此我创建了一个并行版本,为每个参数值求解一个模型。
例如,考虑第一个名为 main_function
的文件,其中包含以下代码(此处的代码是为了可复制性,但与问题无关):
import numpy as np
import cvxpy
def 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 mp
import numpy as np
import functools
import zz_main_function as mf
def 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 控制台还是通过 运行nig 一个 python 文件都可以完美运行,例如:
import zz_parallel_function as pf
from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
lambda1 = [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 pf from sklearn.datasets import load_boston boston = load_boston() x = boston.data y = boston.target lambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3] r_parallel = pf.lm_lasso_parallel(x, y, lambda1)
- 如果我运行它作为一个独立的文件:
所以我的问题是:
为什么这段代码以前可以用,现在不行了?唯一(可能)改变的是安装的一些模块的版本,但我不认为这是相关的
想知道如何让它再次工作吗?
编辑 1
通过在代码中添加if __name__ == '__main__':
并将其运行设置为一个独立的文件,它可以毫无问题地执行。但是,当我尝试在 python 控制台中执行它时,它会提供与以前相同的错误。
根据收到的评论,这可能是由于需要冻结代码。 python 控制台中的代码未冻结,这可能是问题的原因。然后我考虑了 运行 宁 multiprocessing for windows
中的以下示例from multiprocessing import Process, freeze_support
def foo():
print 'hello'
if __name__ == '__main__':
freeze_support()
p = Process(target=foo)
p.start()
这段代码应该会冻结代码,但是当 运行 在 python 控制台中启用它时,我得到了与以前相同的错误。
您不能直接从 python 解释器使用 mulitprocessing
生成新的子进程。
来自docs,
Note: Functionality within this package requires that the main module be importable by the children. This is covered in Programming guidelines however it is worth pointing out here. This means that some examples, such as the Pool examples will not work in the interactive interpreter.
而 guideline 表示
Safe importing of main module
Make sure that the main module can be safely imported by a new Python interpreter without causing unintended side effects (such a starting a new process).
Calling freeze_support() has no effect when invoked on any operating system other than Windows. In addition, if the module is being run normally by the Python interpreter on Windows (the program has not been frozen), then freeze_support() has no effect.
此外,应该使用 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()
行,则尝试 运行 冻结的可执行文件(例如,使用 pyinstaller
或 py2exe
创建)将引发 RuntimeError
。