Gurobi: Difference between revisions
mNo edit summary |
(Marked this version for translation) |
||
Line 127: | Line 127: | ||
packages like NumPy, Matplotlib, Pandas and others, we need to create a [[Python#Creating_and_using_a_virtual_environment|virtual Python environment]] in which we can install both <code>gurobipy</code> and e.g. <code>pandas</code>. Before we start, we need to decide which combination of versions for Gurobi and Python to use. For example compare the python versions supported by the gurobi 8.11 and 9.0.1 modules: | packages like NumPy, Matplotlib, Pandas and others, we need to create a [[Python#Creating_and_using_a_virtual_environment|virtual Python environment]] in which we can install both <code>gurobipy</code> and e.g. <code>pandas</code>. Before we start, we need to decide which combination of versions for Gurobi and Python to use. For example compare the python versions supported by the gurobi 8.11 and 9.0.1 modules: | ||
<!--T:201--> | |||
{{Commands|prompt=[name@server ~] $ | {{Commands|prompt=[name@server ~] $ | ||
|module load StdEnv/2016 (not needed for gurobi>9.0.2) | |module load StdEnv/2016 (not needed for gurobi>9.0.2) | ||
Line 205: | Line 206: | ||
Python scripts can now import both Pandas and Gurobi: | Python scripts can now import both Pandas and Gurobi: | ||
<!--T:202--> | |||
{{Commands|prompt=[name@server ~] $ | {{Commands|prompt=[name@server ~] $ | ||
| cat my_gurobi_script.py | | cat my_gurobi_script.py | ||
Line 217: | Line 219: | ||
Once created we can activate our Gurobi environment at any time with: | Once created we can activate our Gurobi environment at any time with: | ||
<!--T:203--> | |||
{{Commands|prompt=[name@server ~] $ | {{Commands|prompt=[name@server ~] $ | ||
| module load gurobi/9.0.1 | | module load gurobi/9.0.1 | ||
Line 226: | Line 229: | ||
Note that we now use <code>python</code> instead of <code>gurobi.sh</code>! This is an example job script that we can use: | Note that we now use <code>python</code> instead of <code>gurobi.sh</code>! This is an example job script that we can use: | ||
<!--T:204--> | |||
{{File | {{File | ||
|name=gurobi-py_example.sh | |name=gurobi-py_example.sh | ||
Line 235: | Line 239: | ||
#SBATCH --mem-per-cpu=1000M # memory per CPU (in MB) | #SBATCH --mem-per-cpu=1000M # memory per CPU (in MB) | ||
<!--T:205--> | |||
module load StdEnv/2016.4 | module load StdEnv/2016.4 | ||
module load gurobi/9.0.1 | module load gurobi/9.0.1 | ||
<!--T:206--> | |||
source ~/env_gurobi/bin/activate | source ~/env_gurobi/bin/activate | ||
<!--T:207--> | |||
# Create environment file in current directory setting the number of threads: | # Create environment file in current directory setting the number of threads: | ||
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env | echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env | ||
<!--T:208--> | |||
python my_gurobi_script.py | python my_gurobi_script.py | ||
}} | }} | ||
Line 248: | Line 256: | ||
== Using Gurobi with Jupyter notebooks == <!--T:200--> | == Using Gurobi with Jupyter notebooks == <!--T:200--> | ||
<!--T:209--> | |||
Various topics can be found by visiting [https://support.gurobi.com/ support.gurobi.com] and searching for <I>Jupyter notebooks</I>. "The article titled Where can I learn more about building optimization models?" provides several examples. Information specific to using Gurobi with Jupyter notebooks on Compute Canada systems will be added to this wiki section in the future as required. | Various topics can be found by visiting [https://support.gurobi.com/ support.gurobi.com] and searching for <I>Jupyter notebooks</I>. "The article titled Where can I learn more about building optimization models?" provides several examples. Information specific to using Gurobi with Jupyter notebooks on Compute Canada systems will be added to this wiki section in the future as required. | ||
Revision as of 18:25, 6 August 2021
Gurobi is a commercial software suite for solving complex optimization problems. This page wiki page describes the non-commercial use of Gurobi software on Compute Canada clusters and is currently a work in progress.
License limitations
Compute Canada supports and provides a free license to use Gurobi on the Graham, Cedar, Béluga and Niagara clusters. The license provides a total number of 4096 simultaneous uses (tokens in use) and permits distributed optimization with up to 100 nodes. A single user can run multiple simultaneous jobs. In order to use Gurobi you must agree to certain conditions. Please contact support and include a copy of the following completed Academic Usage Agreement. You will then be added into the Compute Canada license file as a permitted user within a few days:
Academic Usage Agreement
My Compute Canada username is "_______" and I am a member of the academic institution "_____________________". This message confirms that I will only use the Compute Canada Gurobi license provided on Compute Canada systems for the purpose of non-commercial research project(s) to be published in publicly available article(s).
Configuring your account
You do NOT need to create a ~/.licenses/gurobi.lic
file. The required settings to use the Compute Canada Gurobi license are configured by default when you load a gurobi module on any cluster. To verify your username has been added to the Compute Canada Gurobi license and is working properly run the following command. If it returns "Fail" then please contact support to request help.
$ module load gurobi $ gurobi_cl 1> /dev/null && echo Success || echo Fail
Interactive Allocations
Gurobi Command-Line Tools
[gra-login2:~] salloc --time=1:00:0 --cpus-per-task=8 --mem=1G --account=def-xyz [gra800:~] module load gurobi [gra800:~] gurobi_cl Record=1 Threads=8 Method=2 ResultFile=p0033.sol LogFile=p0033.log $GUROBI_HOME/examples/data/p0033.mps [gra800:~] gurobi_cl --help
Gurobi Interactive Shell
[gra-login2:~] salloc --time=1:00:0 --cpus-per-task=8 --mem=1G --account=def-xyz [gra800:~] module load gurobi [gra800:~] echo "Record 1" > gurobi.env see * [gra800:~] gurobi.sh gurobi> m = read('/cvmfs/restricted.computecanada.ca/easybuild/software/2017/Core/gurobi/8.1.1/examples/data/glass4.mps') gurobi> m.Params.Threads = 8 see ** gurobi> m.Params.Method = 2 gurobi> m.Params.ResultFile = "glass4.sol" gurobi> m.Params.LogFile = "glass4.log" gurobi> m.optimize() gurobi> m.write('glass4.lp') gurobi> m.status see *** gurobi> m.runtime see **** gurobi> help()
where
* https://www.gurobi.com/documentation/8.1/refman/recording_api_calls.html ** https://www.gurobi.com/documentation/8.1/refman/parameter_descriptions.html *** https://www.gurobi.com/documentation/8.1/refman/optimization_status_codes.html **** https://www.gurobi.com/documentation/8.1/refman/attributes.html
Replaying API calls
You can record API calls and repeat them with command
[gra800:~] gurobi_cl recording000.grbr
Reference: https://www.gurobi.com/documentation/8.1/refman/recording_api_calls.html
Batch Jobs
Model in LP-format
This is an example job script for an optimization model written in the LP format.
#!/bin/bash
#SBATCH --account=def-group # some account
#SBATCH --time=0:30 # time limit (D-HH:MM)
#SBATCH --mem-per-cpu=1000M # memory per CPU (in MB)
# use a version >= 9.0.3
module load StdEnv/2020
module load gurobi/9.1.0
# Create environment file in current directory setting the number of threads:
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
gurobi_cl ${GUROBI_HOME}/examples/data/coins.lp
Job using Gurobi Python
This is an example jobscript for a model using Gurobi-Python.
#!/bin/bash
#SBATCH --account=def-group # some account
#SBATCH --time=0-00:30 # time limit (D-HH:MM)
#SBATCH --cpus-per-task=1 # number of CPUs (threads) to use
#SBATCH --mem-per-cpu=1000M # memory per CPU (in MB)
# use a version <= 9.0.2
module load StdEnv/2016.4 # or StdEnv/2018.3
module load gurobi/9.0.2
# Create environment file in current directory setting the number of threads:
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
gurobi.sh ${GUROBI_HOME}/examples/python/facility.py
Using Gurobi in Python virtual environments
Gurobi brings it's own version of Python but that one does not contain any 3rd-party Python packages except Gurobi. In order to use Gurobi together with popular Python
packages like NumPy, Matplotlib, Pandas and others, we need to create a virtual Python environment in which we can install both gurobipy
and e.g. pandas
. Before we start, we need to decide which combination of versions for Gurobi and Python to use. For example compare the python versions supported by the gurobi 8.11 and 9.0.1 modules:
[name@server ~] $ module load StdEnv/2016 (not needed for gurobi>9.0.2)
[name@server ~] $ module load gurobi/8.1.1
[name@server ~] $ cd $EBROOTGUROBI/lib
[name@server ~] $ ls -d python*
python2.7 python2.7_utf32 python2.7_utf16
python3.5_utf32 python3.6_utf32 python3.7_utf32
[name@server ~] $ module load StdEnv/2016 (not needed for gurobi>9.0.2)
[name@server ~] $ module load gurobi/9.0.1
[name@server ~] $ cd $EBROOTGUROBI/lib
[name@server ~] $ ls -d python*
python3.7 python2.7_utf16 python2.7_utf32
python3.5_utf32 python3.8_utf32 python3.6_utf32 python3.7_utf32
We see that gurobi/8.1.1
brings it's own installation of python2.7
and Python packages for Python 2.7, 3.5, 3.6 and 3.7 (pythonX.Y_utf32
) while gurobi/9.0.1
by default uses python3.7
and brings Python packages for Python 2.7, 3.5, 3.6, 3.7 and 3.8 (pythonX.Y_utf32
).
Creating the virtual environment
In this example we want to create a Python environment based on python/3.7
in which we want to use gurobi/9.0.1
and install the Pandas package. The following steps need to be done only once per system. First load the modules to create the virtual environment and activate it:
[name@server ~] $ module load gurobi/9.0.1 python/3.7
[name@server ~] $ virtualenv --no-download ~/env_gurobi
Using base prefix '/cvmfs/soft.computecanada.ca/easybuild/software/2017/Core/python/3.7.4'
New python executable in /home/name/env_gurobi/bin/python
Installing setuptools, pip, wheel...
done.
[name@server ~] $ source ~/env_gurobi/bin/activate
Now that the environment has been activated install the Python packages we want to use, in this case pandas
for example:
(env_gurobi) [name@server ~] $ pip install --no-index pandas
Ignoring pip: markers 'python_version < "3"' don't match your environment
Looking in links:
/cvmfs/soft.computecanada.ca/custom/python/wheelhouse/nix/avx2
/cvmfs/soft.computecanada.ca/custom/python/wheelhouse/nix/generic
/cvmfs/soft.computecanada.ca/custom/python/wheelhouse/generic
Collecting pandas,
Collecting numpy>1.13.3 (from pandas)
[...]
Successfully installed numpy-1.18.4 pandas-1.0.3 python-dateutil-2.8.1 pytz-2020.1 six-1.15.0
The third and final step is to install gurobipy into the environment:
(env_gurobi) [name@server ~] $ cd $EBROOTGUROBI
(env_gurobi) [name@server ~] $ python setup.py build --build-base /tmp/${USER} install
running build
running build_py
creating /tmp/name
creating /tmp/name/lib
creating /tmp/name/lib/gurobipy
copying lib/python3.7_utf32/gurobipy/__init__.py -> /tmp/name/lib/gurobipy
copying lib/python3.7_utf32/gurobipy/gurobipy.so -> /tmp/name/lib/gurobipy
running install
running install_lib
creating /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy
copying /tmp/name/lib/gurobipy/gurobipy.so -> /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy
copying /tmp/name/lib/gurobipy/__init__.py -> /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy
byte-compiling /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy/__init__.py to __init__.cpython-37.pyc
running install_egg_info
Writing /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy-9.0.1-py3.7.egg-info
Using the virtual environment
Python scripts can now import both Pandas and Gurobi:
[name@server ~] $ cat my_gurobi_script.py
import pandas as pd
import numpy as np
import gurobipy as gurobi
from gurobipy import *
etc
Once created we can activate our Gurobi environment at any time with:
[name@server ~] $ module load gurobi/9.0.1
source ~/env_gurobi/bin/activate
(env_gurobi) python my_gurobi_script.py
Note that we now use python
instead of gurobi.sh
! This is an example job script that we can use:
#!/bin/bash
#SBATCH --time=0-00:30 # time limit (D-HH:MM)
#SBATCH --cpus-per-task=1 # number of CPUs (threads) to use
#SBATCH --mem-per-cpu=1000M # memory per CPU (in MB)
module load StdEnv/2016.4
module load gurobi/9.0.1
source ~/env_gurobi/bin/activate
# Create environment file in current directory setting the number of threads:
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
python my_gurobi_script.py
Using Gurobi with Jupyter notebooks
Various topics can be found by visiting support.gurobi.com and searching for Jupyter notebooks. "The article titled Where can I learn more about building optimization models?" provides several examples. Information specific to using Gurobi with Jupyter notebooks on Compute Canada systems will be added to this wiki section in the future as required.
Cite Gurobi
Please see How do I cite Gurobi software for an academic publication?