ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Gurobi安装与License激活全指南:从学术版申请到WLS配置

Gurobi安装与License激活全指南:从学术版申请到WLS配置 做运筹优化、物流调度、排产排程这些事情绕不开Gurobi这个名字。我最近在把一套混合整数规划模型从实验代码往工程环境迁移需要在笔记本和服务器上都把Gurobi装好、把license激活折腾了一下午踩了几个不算深但很耽误时间的坑。这篇把完整的gurobi安装与license激活过程记下来重点是学术版license怎么申请、grbgetkey怎么用以及换到服务器上时WLS是怎么代替license文件的。适合谁看刚拿到学术license不知道怎么激活的人在Windows和Linux上反复装环境的老手可以跳着看排错部分还有要帮实验室维护公共计算节点的人第5节那几条建议应该用得上。1. 装Gurobi前先想清楚版本、平台与授权类型1.1 Gurobi是哪路神仙为什么绕不开先给还没有概念的朋友解释一句Gurobi是一个商业数学优化求解器专门解决线性规划LP、混合整数规划MIP、二次规划QP这类模型。运筹学里建模建出来的问题最后基本都要丢给求解器去算Gurobi就是目前公认性能顶尖的那一档学术研究和工业应用里都大量使用。我自己的场景是生产排程和路径优化这类问题天生就是MIP变量多、约束复杂用开源求解器往往会卡在求解时间上。Gurobi的优势不光是最优解找得快它预求解Presolve、割平面和启发式那一套做得非常成熟能够在你去写各种分支定界细节之前就把问题规模压下来。打个不恰当的比方求解器之于搞运筹的人有点像编译器之于程序员模型是你写的源码Gurobi负责把它变成能执行的机器码。安装这一步本身不难难点在于搞清楚自己到底需要什么版本、什么平台、什么license类型这三件事没想清楚后面大概率会反复重来。1.2 授权类型怎么选学术版、WLS、节点锁各有各的适用场景Gurobi的授权体系比一般的商业软件要复杂一点选错了授权类型激活方式完全不一样这也是很多人安装时卡住的根源。我自己把它们分成四类License类型适用场景激活方式备注节点锁Node-locked个人笔记本/固定工作站grbgetkey生成license文件绑定机器不能随意迁移WLSWeb License Service服务器、容器、云环境在线验证配三个环境变量无license文件按验证失败可能断连浮动Floating实验室/团队共享连接license server需要自建server多人并发使用学术版Academic学生/高校科研人员官方申请走grbgetkey或WLS免费一年有效期以我个人经验如果你的场景就是一台笔记本上做研究学术版grbgetkey就够了如果要在实验室服务器或者云主机上跑任务强烈建议用WLS省去license文件路径、环境变量指向这一堆麻烦事。还有一点值得注意学术版license是免费的但申请人必须是在校学生或者高校科研人员并且用途只能是教学和研究不能用于商业项目。Gurobi在这块的审核还算宽松但也不要抱着侥幸心理拿学术license去跑企业业务出了问题license会被直接收回。1.3 安装前必须确认的三件事平台、Python环境、要不要命令行工具第一确认平台上CPU架构。目前Gurobi支持Windows、Linux、macOS但macOS的M系列芯片和Intel芯片用的是不同的安装包Linux x86_64和ARM比如树莓派、某些云主机也不一样。去官网下载页的时候要注意选对版本我一开始在Linux服务器上就差点下错。第二确认Python环境。Gurobi的Python接口叫gurobipy支持Python 3.8以上版本。如果你用的是Anaconda建议先在conda里建好项目环境再安装别一股脑装到base环境里。这个坑我后面会详细说它坑了一大批人。第三想清楚要不要命令行工具gurobi_cl。如果你只是写Python代码调用求解器其实只需要pip安装gurobipy它会自带的二进制求解器一起装好。但如果你需要在命令行直接求解LP/MIP文件、或者用shell脚本批量跑算例那就必须装完整版安装包因为gurobi_cl只在完整包里提供。我自己是两条路都走了Windows笔记本上装完整安装包方便在IDE里调试和跑小实验Linux服务器上也是完整安装包因为要给同一个环境里其他同事跑模型文件。2. Windows与Linux双环境安装全流程2.1 Windows下完整安装包的安装细节Gurobi官网的下载页面会根据你当前操作系统推荐安装包Windows下是exe文件下载后直接双击安装。安装路径我建议就用默认的C:\gurobi不要改成带空格或者带中文的路径后面配置环境变量时你会感谢我这个建议。安装完成之后目录结构大概是这样C:\gurobi\ └── 1200\ ├── win64\ │ ├── bin\ │ │ ├── gurobi_cl.exe │ │ ├── grbgetkey.exe │ │ └── ... │ ├── lib\ │ └── examples\ └── ...这里的1200对应版本号12.0.0Gurobi用这种方式区分大版本。bin目录下有两个可执行文件最重要一个是gurobi_cl.exe命令行求解工具另一个是grbgetkey.exe激活license要用的。Windows下安装包不会自动把Gurobi加入PATH环境变量我实测下来需要手动添加C:\gurobi\1200\win64\bin到系统的PATH中。有两条路径可以加按下WinR输入sysdm.cpl打开系统属性在高级-环境变量里编辑Path或者在PowerShell里直接执行setx PATH $env:PATH;C:\gurobi\1200\win64\bin加完之后最好重启终端让环境变量生效。这一步容易忽略但非常重要不然后面你在命令行里敲gurobi_cl会提示找不到命令。2.2 Linux下解压安装与环境变量配置Linux下的安装就是解压一个tar.gz包然后配环境变量。我一般习惯把Gurobi解压到/opt目录下这样所有用户都可以使用# 下载对应平台的tar.gz包例如gurobi12.0.1_linux64.tar.gz sudo tar -xzf gurobi12.0.1_linux64.tar.gz -C /opt解压后会得到/opt/gurobi1201/linux64这样的目录名字里的1201也是版本号。我一般会把Gurobi的bin目录加到PATH同时把lib目录加到LD_LIBRARY_PATH后者尤其关键因为gurobipy在import时会动态加载libgurobi这个核心库如果找不到会直接报出libgurobi120.so: cannot open shared object file这样的错误。环境变量我一般写入每个用户自己的~/.bashrc而不是全局的/etc/profile避免影响其他人的环境export GUROBI_HOME/opt/gurobi1201/linux64 export PATH$PATH:$GUROBI_HOME/bin export LD_LIBRARY_PATH$LD_LIBRARY_PATH:$GUROBI_HOME/lib**这里给一个实际教训服务器上改完.bashrc后一定要记得source ~/.bashrc再继续操作。我在一开始就忘了这一步导致在后面运行grbgetkey时系统提示找不到命令排查半天才意识到是环境变量没生效。2.3 Python接口安装pip和conda怎么选装好完整安装包之后还需要安装Python接口gurobipy。这里最容易混淆的是完整安装包≠gurobipy两者是独立的。完整安装包负责提供gurobi_cl、grbgetkey这些可执行文件和C库gurobipy则是Python直接调用求解器的那一层。通常情况下最简单的安装方式是pip install gurobipy这个命令会从PyPI下载gurobipy的wheel包里面已经自带了求解器动态库所以你甚至可以不装完整安装包、直接用pip方式运行。但代价是没有gurobi_cl命令也没有examples示例代码只能通过Python API来用。如果你用的是conda还可以这样装conda install -c gurobi gurobi这条命令会把完整Gurobi和gurobipy一起装进当前conda环境比pip方式更完整一些。我个人对比过之后在Windows上用的pip方式在Linux服务器上用的conda方式手动配置环境变量。因为pip的包更轻量而且PyPI上的版本更新往往更快。扎实建议如果你用的是Anaconda且在PyCharm里开发装完gurobipy后一定要确认PyCharm的Python解释器选的是当前这个conda环境。我见过太多次在conda prompt里import正常到PyCharm里就No module named gurobipy的问题十有八九都是解释器没对。3. License激活全程学术版grbgetkey与WLS两条路3.1 学术版License申请流程激活的第一步是去Gurobi官网注册账号并申请License。学术版申请地址是https://www.gurobi.com/academia/academic-program-and-licenses/ 你需要在官网注册一个账号注册的时候最好用学校邮箱。虽然Gurobi也接受其他邮箱加证明材料但用学校邮箱会方便得多审核几乎即时通过。申请页面里需要填写学校名称、个人姓名、研究领域这些信息提交之后页面上会显示一个激活码形如xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx的一长串UUID。注意这个激活码就是关键凭证不是马上能用的license需要通过工具把它拉到本地生成license文件或者换取WLS的凭证。另外一个经常被忽略的点学术版license的有效期是从你申请成功那天开始算一整年。到期前Gurobi会发邮件提醒你续期续期的操作很简单登录官网账号在License列表里找到对应的license点击Renew即可不需要重新走一遍申请流程。3.2 节点锁激活grbgetkey命令的完整交互流程拿到激活码后在Windows或Linux终端里运行grbgetkey把激活码带在后面。以Windows为例C:\gurobi\1200\win64\bin\grbgetkey.exe xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx如果PATH配置好了也可以直接敲grbgetkey xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx运行之后会有一段交互流程我记得大致经历这几步第一次提示你按回车确认激活直接回车询问license文件保存位置Windows下默认是C:\gurobi\gurobi.licLinux下默认是~/gurobi.lic。如果默认路径不合理可以手动输入完整路径询问是否允许Gurobi检查软件更新一般选n就行显示激活成功信息激活完成后license文件就生成了。此时还差一步设置环境变量GRB_LICENSE_FILE指向这个文件。Gurobi在运行时默认会在几个固定位置找license文件但为了保险我习惯把环境变量显式指出来。Windows下用setx命令setx GRB_LICENSE_FILE C:\gurobi\gurobi.licLinux下写入.bashrcecho export GRB_LICENSE_FILE~/gurobi.lic ~/.bashrc source ~/.bashrc这里要特别强调一个点grbgetkey激活的节点锁license会绑定当前机器的硬件指纹MAC地址。同一个激活码用的机器是不固定的所以你在一台机器上激活后如果换到另一台机器上重新运行grbgetkey新机器会生成新的license文件旧机器的license会失效。3.3 WLS激活方式不生成license文件的在线验证如果你要在很多机器上部署环境或者要在容器、云端服务器上跑任务grbgetkey这种节点锁方式就不太方便了。此时WLSWeb License Service是更好的选择它的核心思路是不生成license文件通过三个环境变量在每次运行时向Gurobi的授权服务器做在线验证。申请WLS同样是在官网的License页面里选择创建Web License Service类型的license创建成功后会得到三个关键字符串分别对应access id、secret key和license id。然后在你的环境中配置export GRB_WLSACCESSID你的accessid export GRB_WLSSECRET你的secretkey export GRB_LICENSEID你的licenseidWindows下同样用setx配置这三个变量setx GRB_WLSACCESSID 你的accessid setx GRB_WLSSECRET 你的secretkey setx GRB_LICENSEID 你的licenseid配置完成之后不需要任何license文件也不需要GRB_LICENSE_FILE环境变量运行Python程序时Gurobi会自动向授权服务器验证身份。实测下来在线验证的开销极小基本不影响求解性能。我自己在Linux服务器上用的就是WLS因为实验室的人经常在不同机器间切换而且偶尔要在Docker容器里编译运行模型节点锁方式完全没法满足这种流动性。但WLS也有一个明显缺点它依赖网络连接。如果在完全隔离的内网环境里跑任务建议还是用节点锁license文件或者用浮动license服务。3.4 环境变量校验如何确认license已经生效配置完环境变量后用一行简单的Python指令就能确认激活是否成功python -c import gurobipy as gp; egp.Env(); mgp.Model(enve); print(License OK)如果环境、license都正常会有类似这样的输出Set parameter LicenseID to 123456 Academic license - for non-commercial use only License OK看到Academic license - for non-commercial use only这一行就说明license生效了。如果没有出现这一行而是抛出了GurobiError: Cannot find license那基本就是GRB_LICENSE_FILE没设置对或者license文件不在Gurobi搜索的默认路径下。还有一个小技巧Windows下可以用echo %GRB_LICENSE_FILE%查看环境变量值Linux下用echo $GRB_LICENSE_FILE确认它指向了实际存在的gurobi.lic文件。4. 验证安装最小模型跑通与实测踩坑记录4.1 一个测试用最小LP模型license配好之后我建议先不要跑自己的复杂模型用一个小到不能再小的线性规划验证整个链路。我用的是Gurobi自带的一个基础LP问题示例并稍微改动了一下约束让它能打印有意义的结果import gurobipy as gp from gurobipy import GRB # 创建模型 model gp.Model(test_lp) # 添加变量取值范围0-10 x model.addVar(lb0, ub10, namex) y model.addVar(lb0, ub10, namey) # 设置目标函数最大化 x 2y model.setObjective(x 2 * y, GRB.MAXIMIZE) # 添加约束 model.addConstr(x y 8, c0) model.addConstr(2 * x - y 0, c1) # 求解 model.optimize() # 输出结果 print(f目标函数最优解: {model.ObjVal}) print(fx {x.X}, y {y.X})这个模型本身很简单最优解应该是在约束xy8和2x-y0的交界处取到也就是x8/3≈2.667y16/3≈5.333目标函数值为13.333。运行后模型求解日志会显示Optimal solution found接着打印出结果。跑通这个模型所有环节就都验证过了gurobipy正确安装、license正常激活、求解器能正常工作。之后再换成你自己的模型就没必要去怀疑环境本身了。4.2 我在安装激活过程中踩过的几个坑第一个坑Windows下grbgetkey激活时没有权限写入文件。当时我直接在普通终端里运行grbgetkey默认保存路径指向了系统盘的受限目录导致激活命令报错。解决办法是换到管理员终端或者干脆把保存路径指定到C:\gurobi\gurobi.lic因为C:\gurobi这个目录有完全控制权。第二个坑license文件放在了中文路径下。有一次我把gurobi.lic放到了桌面下带中文名的文件夹里结果Gurobi运行时怎么都读不到license。最后把文件挪到C:\gurobi\下才解决。Gurobi对中文路径的支持没有想象中好所有相关路径尽量都保持纯英文。第三个坑PyCharm的Python解释器没选对环境。我在conda环境里装好了gurobipy结果PyCharm里运行程序还是No module named gurobipy。这个坑前面提过排查半天发现解释器用的是系统自带的Python而不是conda里的那个。在PyCharm的Settings - Project - Python Interpreter里换成正确的解释器就好。第四个坑Linux服务器WLS环境变量名写错。WLS的三个环境变量名分别是GRB_WLSACCESSID、GRB_WLSSECRET、GRB_LICENSEID我把WLSSECRET写成了WSLSECRET导致连接授权服务器时一直提示认证失败。这种拼写错误特别难察觉最好直接复制官网上给的名。4.3 高频报错与排查对照表下面这些错误是我在实际环境里碰到过或者朋友问过我的列成一张表方便大家快速自查。报错信息原因分析解决方法GurobiError: Cannot find license找不到license文件检查GRB_LICENSE_FILE是否设置、文件是否存在于指定路径License expiredlicense过期学术版到期或使用了过期license文件去官网Renew或重新申请替换旧licenseNo module named gurobipyPython环境不对或没安装gurobipy确认当前解释器是哪个环境在该环境pip install gurobipylibgurobi120.so: cannot open shared object fileLinux下没配LD_LIBRARY_PATHexport LD_LIBRARY_PATH$GUROBI_HOME/lib并确认库文件存在grbgetkey: command not foundGurobi的bin目录没加入PATH配置PATH并source环境变量Windows下加到系统PATHWLS authentication failedWLS三个环境变量设置错误检查变量名和值是否正确尤其避免拼写错误Model is infeasible模型不可行这不是环境问题是模型本身约束冲突用model.computeIIS()找不可行约束集合5. 装好之后容易被忽略的几件事5.1 版本升级、卸载与清理Gurobi的版本迭代比较快每个大版本在算法上都有明显改进升级是常有的事。但升级时有一个坑要避开license通常绑定major version。你手上6.x版本的license可能没法直接激活12.x的新版本这时需要去官网确认当前license覆盖的版本范围学术版通常可以直接在官网Renew成最新版本支持的license。升级gurobipy比较简单pip安装方式直接覆盖pip install --upgrade gurobipy但如果是完整安装包升级建议先卸载旧版本再装新的。Windows下通过控制面板卸载Linux下直接把解压目录删掉即可rm -rf /opt/gurobi1200卸载干净后还要记得清理环境变量和license文件。特别是Windows下之前用setx命令设置的环境变量不会因为卸载软件自动消失需要手动进注册表编辑器或者再运行一次setx把值置空。5.2 服务器与集群环境的使用建议如果你和我一样要在Linux服务器上装Gurobi最后几个个人建议尽量用普通用户安装不要用root。因为Gurobi的license文件和环境变量都是按用户配置的用root安装会导致普通用户运行时权限混乱还要额外处理文件所有权。多人共用环境时各自维护自己的license。完整安装包是共享的但每一个用户最好在各自的.bashrc里配置GRB_LICENSE_FILE指向自己目录下的license文件互不干扰。用SLURM等作业调度系统时记得把环境变量传过去。在sbatch脚本里直接source一下.bashrc是最稳妥的办法或者用--exportALL把用户环境全部传给计算节点。我一开始在提交作业后总报找不到license就是因为环境变量没有传递到计算节点上。先跑小模型验证再上大规模算例。Gurobi求解大规模MIP时非常耗费内存和CPU时间环境有问题时往往要等很久才能看到报错。先用一个小模型快速验证整个链路是性价比最高的方式。最后分享一个我自己的习惯拿到新license后先不着急跑大模型用那个测试LP验证一遍确认license没问题再把同样的流程复制到其他机器。这样如果后面出了问题能很快定位是环境问题还是授权问题。另外学术版license到期时间记得在日历上标一下我上次就忘了renew跑实验跑到一半才发现license过期浪费了整整半天时间。
返回列表