【问题标题】:"Solver did not exit normally" - Jupyter / Python3 / Ubuntu“求解器没有正常退出” - Jupyter / Python3 / Ubuntu
【发布时间】:2019-06-16 12:31:40
【问题描述】:

我正在尝试让我的第一个 Pyomo 模型在我的 Ubuntu VM (Azure) 上运行。我在这台机器上安装了 Python3 和 COIN-OR 求解器。无论我尝试什么求解器,我都会得到相同的结果。

编辑:将求解器更改为 couenne(这是一个非线性问题),Jupyter 输出如下所示。当我打开 tmp 目录中的日志文件时,couenne.log 文件中没有任何内容,pyomo 文件是问题的表述。所以我假设 Pyomo 根本没有与 Couenne 求解器通信?

Solver log file: '/tmp/tmpezw0sov2_couenne.log'
Solver solution file: '/tmp/tmpq6afa7e8.pyomo.sol'
Solver problem files: ('/tmp/tmpq6afa7e8.pyomo.nl',)
ERROR: Solver (asl) returned non-zero return code (-1)
ERROR: See the solver log above for diagnostic information.
---------------------------------------------------------------------------
ApplicationError                          Traceback (most recent call last)
<ipython-input-6-486e3a9173f4> in <module>()
     20 #instance = model.create_instance()
     21 opt = SolverFactory('couenne', executable = solverpath_exe)
---> 22 opt.solve(model,tee=True,keepfiles=True)
     23 #solver=SolverFactory(solvername,executable=solverpath_exe)

/home/ralphasher/.local/lib/python3.6/site-packages/pyomo/opt/base/solvers.py in solve(self, *args, **kwds)
    598                     logger.error("Solver log:\n" + str(_status.log))
    599                 raise pyutilib.common.ApplicationError(
--> 600                     "Solver (%s) did not exit normally" % self.name)
    601             solve_completion_time = time.time()
    602             if self._report_timing:

ApplicationError: Solver (asl) did not exit normally

【问题讨论】:

  • keepfiles=True 可能程序没有覆盖现有的日志文件,您可以尝试移动或删除空的日志文件吗?
  • @steviestickman 好点! @Ralph 另外,Pyomo 是否能够与您的求解器通信?日志文件的内容应与您使用tee=True 获得的文本内容相同。您的终端中是否有某些内容显示 cbc 试图解决您的模型(使用 tee=True)?如果是这样,cbc 当时在做什么?
  • 以上编辑,请查看
  • 如果日志什么都没有,没有a means to reproduce the problem,我们就不能说什么。

标签: python ubuntu pyomo coin-or


【解决方案1】:

引发“catch-all”异常是因为求解器作为一个单独的非 Python 进程运行,因此 Python 真的无法判断它到底出了什么问题,它只是看到进程异常退出。

因此,求解器日志是要访问的东西,因为这是求解器本身写入其状态更新的地方,因此特定错误,无论是什么,都应该反映在那里。

如果求解器日志为空,这很可能意味着求解器根本无法启动(如果求解器进程使用流重定向运行,则在求解器命令为 @987654322 之前打开日志文件——由此创建—— @'d,所以这是程序启动出现问题时的常见症状)。因为pyomo 是启动求解器的东西,所以在求解器启动时获得确切发生的细节就是答案所在。


根据pyomo solve command — Pyomo 5.6.6 documentation,您可以使用--info--verbose 命令行选项来增加pyomo 日志的详细程度。

如果这仍然没有产生任何启示,那么是时候拿出大炮了:

  • pdb 下运行pyomo (pyomo 只是一个脚本,因此您可以将它传递给python -m pdb,就像任何其他的一样;确保使用与脚本的shebang 中相同的python 可执行文件) 并单步执行pyomo 机器中的代码,以查看它对求解器进程的确切作用(它传递了什么信息,它如何调用它)
    • 您将能够看到此过程中是否存在缺陷(例如,实际上没有传递任何信息)或手动重复相同的操作以直接查看结果;和/或
  • 运行strace -f下的命令(同时监控solver的子进程),看看有没有明显的错误,比如execsolver命令的错误或者打开文件的错误等等。

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2020-03-09
    • 2020-12-08
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多