百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

主编推荐 | Gurobi 并行计算的设置和操作(附代码)

liuian 2025-01-01 21:37 50 浏览


『运筹OR帷幄』原创

作者:运筹OR帷幄


编者按

实际应用问题往往具有较高的计算复杂度,而优化算法难以在实际中落地的主要瓶颈就在于无法满足实际问题对计算时间的苛刻要求。然而近年来随着计算力的蓬勃发展,并行计算和分布式计算已经在深度学习中被广泛应用。本文就带大家了解一下如何使用Gurobi求解器来进行并行计算的设置和操作,以达到加速优化算法求解的目的。


Gurobi 是目前被科研学术界和企业界广泛采用的数学规划求解器,不但内置了多种先进算法,也保持了对计算机前沿硬件技术的密切跟踪。随着计算机硬件配置升级,计算能力不断提升,利用最新计算机硬件系统进行并行计算,已经是提升算法整体效率的不可缺少的方法。并行计算不但可以发生在单台电脑中的多核多线程当中,也可以发生在多台计算机组成的集群或者网络中。针对不同的硬件配置,以及不同的算法参数设置,Gurobi 用户可以创建多种并行计算方法。

Gurobi 在官网上提供了在算法设计层面不同算法(单纯形法,内点法,分支定界法等)和并行计算的紧密关系和适用程度的说明,有兴趣的用户可以下载视频和资料观看。链接是https://www.gurobi.com/resource/parallelism-linear-mixed-integer-programming/

在这篇文章中,我们将从设置和操作的层面,介绍Gurobi几个并行计算的应用场景,解释一些并行计算的概念和操作方法。为了说明方便,我们归纳一张表格,显示了一个模型或者多个模型在一台电脑上,或者多台电脑集群上进行并行计算的方式。我们以混合整数模型为例。


一台机器内单发


这是目前最常见的使用方式。

(1)一个模型:大部分情况下,Gurobi用户创建环境对象 Env(Python语言提供默认的环境对象,用户无需显性定义),然后由Env 产生一个模型对象,用户对于这个模型对象进行各种变量、约束和目标的添加和修改,最终通过运行 optimize()函数启动单个模型的优化。当模型优化时,Gurobi会自动根据模型结构、求解阶段和Threads等参数设置来决定使用一个或者多个线程。用户无需做额外过多设置,这个模型就已经在调用Gurobi内部的并行计算算法。

(2)多个模型:一个Env对象可以产生多个模型对象,在Gurobi 中不允许多个模型简单的同时并行计算,会产生不可预见的错误。用户可以依次串行运行,一个模型运行结束之后再运行另外一个模型。


一台机器内并发


(1)一个模型:Gurobi 允许在一台电脑内通过设置ConcurrentMIP参数,运行同一个模型的多个复制模型。这样的好处是用户可以为不同的复制模型设置不同的优化参数。多个复制模型在不同参数设置下同时运行,胜者决定最终速度。例如一台机器的核数是16核,ConcurrentMIP = 4,那么就会同时有4个同样的模型运行,每个模型占用4个核。

(2)多个模型:之前提到在Gurobi 中不允许多个模型简单的同时并行计算。当多个不同模型同时运行时,如果开发语言是C,Java,C++,.Net 等高级语言,可以采用Gurobi的异步优化函数;如果开发语言是Python,则可以利用Python的多并发进程模块。具体使用方式如下。

如果开发语言是C,Java,C++,.Net 等高级语言,可以采用Gurobi的异步优化函数。当有多个模型时,需要为每个模型创建一个环境对象 Env,由该环境对象产生对应的模型,构造模型之后,调用optimizeasync()启动异步优化。Gurobi不用等优化结束,会将语句控制权直接跳到下个语句,用户可以启动第二、第三或者多个模型。用户可以不断查看模型当前优化状态,来判断模型优化是否结束。优化结束后,需要调用sync()函数进行同步化,之后才能删除模型和环境对象。以下是一个Java 示范案例。

/* Gurobi Example for Running Multiple Models in Parallel */
import gurobi.*;
public class GurobiParallel {
  public static void main(String[] args) {
    try {
      // Create three environments and start. One environment for one model
      GRBEnv env1 = new GRBEnv(true);
      env1.start();
      GRBEnv env2 = new GRBEnv(true);
      env2.start();
      GRBEnv env3 = new GRBEnv(true);
      env3.start();
      
      // Create three models from mps files
      GRBModel model1 = new GRBModel(env1, "misc07.mps");
      GRBModel model2 = new GRBModel(env2, "glass4.mps");
      GRBModel model3 = new GRBModel(env3, "p0033.mps");
      
      // Set up parameters
      model1.set(GRB.IntParam.Threads, 1);
      model2.set(GRB.IntParam.Threads, 2);
      model3.set(GRB.IntParam.Threads, 1);
      
      // Start optimization
      model1.optimizeasync();
      model2.optimizeasync();
      model3.optimizeasync();
      
      // Check optimization status
      while(true){
         int completed = 0;
        int status1 = model1.get(GRB.IntAttr.Status);
        if (status1 != GRB.Status.INPROGRESS) {
          System.out.println("Model 1 is completed!");
          System.out.println("The optimal objective is " +
                    model1.get(GRB.DoubleAttr.ObjVal));
          completed ++;
        }
        
        int status2 = model2.get(GRB.IntAttr.Status);
        if (status2 != GRB.Status.INPROGRESS) {
          System.out.println("Model 2 is completed!");
          System.out.println("The optimal objective is " +
                    model2.get(GRB.DoubleAttr.ObjVal));
          completed ++;
        }
        
        int status3 = model3.get(GRB.IntAttr.Status);
        if (status3 != GRB.Status.INPROGRESS) {
          System.out.println("Model 3 is completed!");
          System.out.println("The optimal objective is " +
                    model3.get(GRB.DoubleAttr.ObjVal));
          completed ++;
        }
        
        if (completed == 3) break; 


        try {
      Thread.sleep(500);
        } catch (InterruptedException e) {
      e.printStackTrace();
    }
      
      }
      
      model1.sync();
      model2.sync();
      model3.sync();
      
      model1.dispose();
      env1.dispose();
      
      model2.dispose();
      env2.dispose();
      
      model3.dispose();
      env3.dispose();


    } catch (GRBException e) {
      System.out.println("Error code: " + e.getErrorCode() + ". " +
                         e.getMessage());
    }
  }
}

如果开发语言是Python,则可以利用Python的多并发进程模块,为每个进程创建一个 Env 对象,然后由Env 产生模型。多个模型在不同的进程内同时运行。以下是一个Python 示范案例。

import multiprocessing as mp
import gurobipy as gp


def solve_model(input_data):
    with gp.Env() as env, gp.Model(env=env) as model:
        # define model
        model.optimize()
        # retrieve data from model


if __name__ == '__main__':
    with mp.Pool() as pool:
        pool.map(solve_model, [input_data1, input_data2, input_data3]


多台机器间分布(集群计算)


分布计算意味着多个计算资源共同运行同一个模型,而非一个模型的多个复制模型。对于基于分支定界的Gurobi 混合整数模型而言,意味着多个计算资源作用于同一个搜索树的不同分支部分,相互协调。当模型的分支节点数量较大时,多台机器或者集群机可以有效地分担计算负载,加快搜索速度,提升求解模型的效率。

很多科研和企业配备有计算机集群,或者有数十台高性能计算机组成的计算网络,这些资源可以用来进行Gurobi分布式计算,增强复杂模型的计算能力。不论求解一个模型,还是多个模型,任何需要多台机器相互协调、分担负载、相互连通、同时运算的使用方式,都需要Gurobi的特殊分布式插件许可。

Gurobi 分布式计算需要配置一台管理机和多台工作机。管理机用于启动优化任务、配置工作机优化资源、协调和决定优化结果。而工作机则用于参与到分布式计算中。一般情况下,一台管理机启动一个优化任务。如果需要同时启动多个优化任务(多个并发模型),则需要配置多台管理机。

(1)一个模型:在管理机上设置 DistributedMIPJOb 参数,启动模型优化任务,让多台工作机共同运行一个模型。这是典型的分布式计算方式。

(2)多个模型:如果多个模型串行时,可以参考上面单一模型运行方法,在管理机上依次串行启动模型。如果多个模型需要并行时,一个模型需要配置一台管理机。工作机可以共享,但不推荐。


多台机器间并发


除了让多台工作机运算同一个分支树的不同部分,Gurobi 分布式许可也允许每台工作机采用不同优化参数运行同一个模型的完整复制模型,哪台工作机速度快,哪台决定最终结果。

(1)一个模型:在管理机上设置ConcurrentJobs 参数,启动模型优化任务,让多台工作机的每台机器跑同一个模型的复制模型。

(2)多个模型:如果多个模型串行时,可以参考上面单一模型运行方法,在管理机上依次串行启动模型。如果多个模型需要并行时,一个模型需要配置一台管理机。工作机可以共享,但不推荐。

总结:Gurobi 提供了多种灵活方式进行单发、并发和分布式计算。用户可以结合模型的特点,以及可调用的计算资源,进行配置和操作。如果使用过程中有任何问题,可以参考软件自带的使用手册和参考手册,或者发送邮件到 help@gurobi.cn 邮箱。

相关推荐

2023年最新微信小程序抓包教程(微信小程序 抓包)

声明:本公众号大部分文章来自作者日常学习笔记,部分文章经作者授权及其他公众号白名单转载。未经授权严禁转载。如需转载,请联系开百。请不要利用文章中的相关技术从事非法测试。由此产生的任何不良后果与文...

测试人员必看的软件测试面试文档(软件测试面试怎么说)

前言又到了毕业季,我们将会迎来许多需要面试的小伙伴,在这里呢笔者给从事软件测试的小伙伴准备了一份顶级的面试文档。1、什么是bug?bug由哪些字段(要素)组成?1)将在电脑系统或程序中,隐藏着的...

复活,视频号一键下载,有手就会,长期更新(2023-12-21)

视频号下载的话题,也算是流量密码了。但也是比较麻烦的问题,频频失效不说,使用方法也难以入手。今天,奶酪就来讲讲视频号下载的新方案,更关键的是,它们有手就会有用,最后一个方法万能。实测2023-12-...

新款HTTP代理抓包工具Proxyman(界面美观、功能强大)

不论是普通的前后端开发人员,还是做爬虫、逆向的爬虫工程师和安全逆向工程,必不可少会使用的一种工具就是HTTP抓包工具。说到抓包工具,脱口而出的肯定是浏览器F12开发者调试界面、Charles(青花瓷)...

使用Charles工具对手机进行HTTPS抓包

本次用到的工具:Charles、雷电模拟器。比较常用的抓包工具有fiddler和Charles,今天讲Charles如何对手机端的HTTS包进行抓包。fiddler抓包工具不做讲解,网上有很多fidd...

苹果手机下载 TikTok 旧版本安装包教程

目前苹果手机能在国内免拔卡使用的TikTok版本只有21.1.0版本,而AppStore是高于21.1.0版本,本次教程就是解决如何下载TikTok旧版本安装包。前期准备准备美区...

【0基础学爬虫】爬虫基础之抓包工具的使用

大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬...

防止应用调试分析IP被扫描加固实战教程

防止应用调试分析IP被扫描加固实战教程一、概述在当今数字化时代,应用程序的安全性已成为开发者关注的焦点。特别是在应用调试过程中,保护应用的网络安全显得尤为重要。为了防止应用调试过程中IP被扫描和潜在的...

一文了解 Telerik Test Studio 测试神器

1.简介TelerikTestStudio(以下称TestStudio)是一个易于使用的自动化测试工具,可用于Web、WPF应用的界面功能测试,也可以用于API测试,以及负载和性能测试。Te...

HLS实战之Wireshark抓包分析(wireshark抓包总结)

0.引言Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接...

信息安全之HTTPS协议详解(加密方式、证书原理、中间人攻击 )

HTTPS协议详解(加密方式、证书原理、中间人攻击)HTTPS协议的加密方式有哪些?HTTPS证书的原理是什么?如何防止中间人攻击?一:HTTPS基本介绍:1.HTTPS是什么:HTTPS也是一个...

Fiddler 怎么抓取手机APP:抖音、小程序、小红书数据接口

使用Fiddler抓取移动应用程序(APP)的数据接口需要进行以下步骤:首先,确保手机与计算机连接在同一网络下。在计算机上安装Fiddler工具,并打开它。将手机的代理设置为Fiddler代理。具体方...

python爬虫教程:教你通过 Fiddler 进行手机抓包

今天要说说怎么在我们的手机抓包有时候我们想对请求的数据或者响应的数据进行篡改怎么做呢?我们经常在用的手机手机里面的数据怎么对它抓包呢?那么...接下来就是学习python的正确姿势我们要用到一款强...

Fiddler入门教程全家桶,建议收藏

学习Fiddler工具之前,我们先了解一下Fiddler工具的特点,Fiddler能做什么?如何使用Fidder捕获数据包、修改请求、模拟客户端向服务端发送请求、实施越权的安全性测试等相关知识。本章节...

fiddler如何抓取https请求实现手机抓包(100%成功解决)

一、HTTP协议和HTTPS协议。(1)HTTPS协议=HTTP协议+SSL协议,默认端口:443(2)HTTP协议(HyperTextTransferProtocol):超文本传输协议。默认...