Gurobi: Difference between revisions
(create new section) |
|||
Line 96: | Line 96: | ||
== Using Gurobi in Python virtual environments == | == 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 [[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. | |||
{{Commands|prompt=[name@server ~] $ | |||
|module load gurobi/8.1.1 | |||
|cd $EBROOTGUROBI/lib | |||
|ls -dF python* | |||
python2.7/ python2.7_utf32/ python3.6_utf32/ | |||
python2.7_utf16/ python3.5_utf32/ python3.7_utf32/ | |||
|module load gurobi/9.0.1 | |||
|cd $EBROOTGUROBI/lib | |||
|ls -dF python* | |||
python2.7_utf16/ python3.5_utf32/ python3.7/ python3.8_utf32/ | |||
python2.7_utf32/ python3.6_utf32/ python3.7_utf32/ | |||
|cd | |||
}} | |||
We see that <code>gurobi/8.1.1</code> brings it's own installation of <code>python2.7/</code> and Python packages for Python 2.7, 3.5, 3.6 and 3.7 (<code>pythonX.Y_utf32/</code>), | |||
while <code>gurobi/9.0.1</code> by default uses <code>python3.7/</code> and brings Python packages for Python 2.7, 3.5, 3.6, 3.7 and 3.8 (<code>pythonX.Y_utf32/</code>). | |||
In this example we want to create a Python environment based on <code>python/3.7</code> in which we want to use <code>gurobi/9.0.1</code> and install the Pandas package. | |||
=== Creating a Python virtual environments with Gurobi === | |||
These steps need to be done only once per system. | |||
The first step is to load the modules, [[Python#Creating_and_using_a_virtual_environment|create the virtual environment]] and activate it. | |||
{{Commands|prompt=[name@server ~] $ | |||
| module load gurobi/9.0.1 python/3.7 | |||
| 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. | |||
| source ~/env_gurobi/bin/activate | |||
}} | |||
Now that the environment has been activated we can install the Python packages we want to use, in this case <code>pandas</code>. | |||
{{Commands|prompt=(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 step is to install gurobipy into the environment: | |||
{{Commands|prompt=(env_gurobi) [name@server ~] $ | |||
| cd $EBROOTGUROBI | |||
| python setup.py build --build-base /dev/shm/${USER} install | |||
running build | |||
running build_py | |||
creating /dev/shm/name | |||
creating /dev/shm/name/lib | |||
creating /dev/shm/name/lib/gurobipy | |||
copying lib/python3.7_utf32/gurobipy/__init__.py -> /dev/shm/name/lib/gurobipy | |||
copying lib/python3.7_utf32/gurobipy/gurobipy.so -> /dev/shm/name/lib/gurobipy | |||
running install | |||
running install_lib | |||
creating /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy | |||
copying /dev/shm/name/lib/gurobipy/gurobipy.so -> /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy | |||
copying /dev/shm/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 | |||
| cd | |||
}} | |||
=== Using the Gurobi-enabled virtual environment === | |||
Python scripts can now import both Pandas and Gurobi: | |||
import pandas as pd | |||
import numpy as np | |||
import gurobipy as gurobi | |||
from gurobipy import * | |||
# [...] | |||
Once created we can activate Gurobi and the environment with: | |||
module load gurobi/8.1.1 | |||
source ~/env_gurobi/bin/activate | |||
python my_gurobi_script.py | |||
Note that we now use <code>python</code> instead of <code>gurobi.sh</code>! | |||
And this is an example job script that we can use: | |||
{{File | |||
|name=gurobi-py_example.sh | |||
|lang="sh" | |||
|contents= | |||
#!/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 purge | |||
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 | |||
}} | |||
== Cite Gurobi == | == Cite Gurobi == | ||
Please see [https://support.gurobi.com/hc/en-us/articles/360013195592-How-do-I-cite-Gurobi-software-for-an-academic-publication- How do I cite Gurobi software for an academic publication?] | Please see [https://support.gurobi.com/hc/en-us/articles/360013195592-How-do-I-cite-Gurobi-software-for-an-academic-publication- How do I cite Gurobi software for an academic publication?] |
Revision as of 19:24, 17 July 2020
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, Beluga 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).
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
Replay API Call Recording
[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 jobscript for an optimization model written in the LP format.
#!/bin/bash
#SBATCH --time=0:30 # time limit (D-HH:MM)
#SBATCH --mem-per-cpu=1000M # memory per CPU (in MB)
module purge
module load gurobi
# 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 --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 purge
module load gurobi
# 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 environmentin 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.
[name@server ~] $ module load gurobi/8.1.1
[name@server ~] $ cd $EBROOTGUROBI/lib
[name@server ~] $ ls -dF python*
python2.7/ python2.7_utf32/ python3.6_utf32/
python2.7_utf16/ python3.5_utf32/ python3.7_utf32/
[name@server ~] $ module load gurobi/9.0.1
[name@server ~] $ cd $EBROOTGUROBI/lib
[name@server ~] $ ls -dF python*
python2.7_utf16/ python3.5_utf32/ python3.7/ python3.8_utf32/
python2.7_utf32/ python3.6_utf32/ python3.7_utf32/
[name@server ~] $ cd
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/
).
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.
Creating a Python virtual environments with Gurobi
These steps need to be done only once per system.
The first step is to load the modules, 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 we can install the Python packages we want to use, in this case pandas
.
The third step is to install gurobipy into the environment:
(env_gurobi) [name@server ~] $ cd $EBROOTGUROBI
(env_gurobi) [name@server ~] $ python setup.py build --build-base /dev/shm/${USER} install
running build
running build_py
creating /dev/shm/name
creating /dev/shm/name/lib
creating /dev/shm/name/lib/gurobipy
copying lib/python3.7_utf32/gurobipy/__init__.py -> /dev/shm/name/lib/gurobipy
copying lib/python3.7_utf32/gurobipy/gurobipy.so -> /dev/shm/name/lib/gurobipy
running install
running install_lib
creating /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy
copying /dev/shm/name/lib/gurobipy/gurobipy.so -> /home/name/env_gurobi/lib/python3.7/site-packages/gurobipy
copying /dev/shm/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
(env_gurobi) [name@server ~] $ cd
Using the Gurobi-enabled virtual environment
Python scripts can now import both Pandas and Gurobi:
import pandas as pd import numpy as np import gurobipy as gurobi from gurobipy import * # [...]
Once created we can activate Gurobi and the environment with:
module load gurobi/8.1.1 source ~/env_gurobi/bin/activate python my_gurobi_script.py
Note that we now use python
instead of gurobi.sh
!
And 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 purge
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
Cite Gurobi
Please see How do I cite Gurobi software for an academic publication?