为计算服务器开发


为计算服务器开发

除了少数例外,使用Gurobi Compute Server不需要对程序进行任何更改。本节将介绍例外情况。我们将讨论在Compute Server环境中可能出现的程序健壮性问题,并给出一个完整的列表,列出Compute Server中不支持的Gurobi特性。

编码的鲁棒性

客户机-服务器计算引入了一些健壮性情况,当所有计算都在一台机器上进行时,您不会遇到这些情况。具体来说,通过在客户机和服务器之间传递数据,您的程序取决于两台机器是否可用,以及两个系统之间是否有不间断的网络连接。Gurobi Compute Server的排队和负载平衡功能可以处理可能出现的绝大多数问题,但是如果想要实现最大可能的健壮性,您可以在程序中采取一些额外的步骤。

您可能需要防范的一种情况是,当构建和解决优化模型的程序部分正在运行时,您失去了与服务器的连接。Gurobi Compute Server将自动将排队的作业路由到另一个服务器,但是当服务器宕机时正在运行的作业将被中断(客户机将收到一个网络错误)。如果您希望您的程序能够在这样的失败中幸存下来,您将需要以这样一种方式来构建它,它将重新构建并解决优化模型以响应网络错误。具体的步骤取决于应用程序,但它们通常涉及将初始Gurobi环境创建和最后一次Gurobi调用之间的代码封装到一个函数中,在出现错误时可以重新调用该函数。

计算服务器不支持的特性

如前所述,有一些Gurobi特性在Compute Server中不受支持。我们已经提到了其中的一些,但为了完整起见,我们在这里给出完整的列表。如果希望应用程序在Compute Server环境中工作,则需要避免使用这些特性。

不支持的特性是:

  • 懒惰的约束:虽然我们提供MIPSOL回调,我们不允许你添加惰性约束来切断相关的MIP解决方案。
  • 用户削减:MIPNODE不支持回调,所以你没有机会添加你自己的削减。用户削减并不是保证正确性所必需的,但严重依赖于它们的应用程序可能会遇到性能问题。
  • 单个Gurobi环境中的多线程:通常Gurobi程序并不支持这一点,但是在Compute Server环境中,结果非常难以跟踪,因此我们在这里再次提到它。从一个环境构建的所有模型共享到Compute Server的单个连接。这个连接不能同时处理多个消息。如果希望从同一个程序中的多个线程调用Gurobi,则应该确保每个线程都在自己的Gurobi环境中工作。
  • 先进的单纯形基础例程:使用单形基的C例程(GRBFSolveGRBBSolveGRBBinvColjGRBBinvRowi,GRBgetBasisHead)不受支持。