Gurobi
Gurobi est une suite logicielle du commerce qui permet de résoudre des problèmes complexes d'optimisation. Nous abordons ici son utilisation pour la recherche sur les grappes de Calcul Canada. Des renseignements additionnels seront fournis dès que disponibles.
Limites de la licence
Calcul Canada dispense le soutien technique pour la licence gratuite disponible sur Graham, Cedar, Béluga et Niagara. Cette licence permet 4096 utilisations simultanées (avec jetons) et l'optimisation distribuée sur un maximum de 100 nœuds. Un utilisateur peut faire exécuter plusieurs tâches en simultané. Vous devez cependant accepter certaines conditions. Faites parvenir un courriel au soutien technique avec l'entente (Academic Usage Agreement) dûment complétée; vous pourrez ensuite utiliser les applications après un délai de quelques jours.
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).
Allocations interactives
Ligne de commande
[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
Interpréteur interactif
[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()
où
* 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
Répéter des appels API
Il est possible d'enregistrer des appels API et de rejouer l'enregistrement avec la commande
[gra800:~] gurobi_cl recording000.grbr
Référence : https://www.gurobi.com/documentation/8.1/refman/recording_api_calls.html
Tâches en lots
Format LP
Le script suivant est un exemple pour un modèle au format LP.
#!/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)
# utilisez une version >= 9.0.3
module load StdEnv/2020
module load gurobi/9.1.0
# Créez le fichier d'environnement dans le répertoire courant en indiquant le nombre de fils.
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
gurobi_cl ${GUROBI_HOME}/examples/data/coins.lp
Gurobi-Python
Le script suivant est un exemple de modèle qui utilise 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)
# utilisez une version <= 9.0.2
module load StdEnv/2016.4 # or StdEnv/2018.3
module load gurobi/9.0.2
# Créez le fichier d'environnement dans le répertoire courant en indiquant le nombre de fils.
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
gurobi.sh ${GUROBI_HOME}/examples/python/facility.py
Environnements virtuels Python
Gurobi a sa propre version de Python qui ne contient aucun autre paquet de tiers autre que Gurobi. Pour utiliser Gurobi avec d'autres paquets Python comme NumPy, Matplotlib, Pandas et autres, il faut créer un environnement virtuel Python dans lequel seront installés gurobipy
et par exemple pandas
.
Nous devons d'abord déterminer la combinaison des versions de Gurobi et Python à utiliser.
[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
Nous voyons que gurobi/8.1.1
a sa propre installation de python2.7/
et des paquets Python pour les versions de Python 2.7, 3.5, 3.6 et 3.7 (pythonX.Y_utf32/
),
et que gurobi/9.0.1
utilise par défaut python3.7/
et fournit les paquets Python pour les versions Python 2.7, 3.5, 3.6, 3.7 et 3.8 (pythonX.Y_utf32/
).
Dans cet exemple, nous voulons créer un environnement Python basé sur python/3.7
où nous voulons utiliser gurobi/9.0.1
et installer le paquet Pandas.
Créer un environnement virtuel Python
Cette procédure est effectuée une seule fois pour chaque système.
Chargez d'abord les modules pour créer l'environnement virtuel, puis activez l'environnement.
[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
Une fois l'environnement activé, vous pouvez installer les paquets Python que vous voulez, ici pandas
.
Installez ensuite gurobipy dans l'environnement.
(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
(env_gurobi) [name@server ~] $ cd
Utilisation
Les scripts Python peuvent maintenant importer Pandas et Gurobi.
import pandas as pd import numpy as np import gurobipy as gurobi from gurobipy import * # [...]
Nous pouvons maintenant activer Gurobi et l'environnement avec
module load gurobi/9.0.1 source ~/env_gurobi/bin/activate python my_gurobi_script.py
Remarquez que nous utilisons maintenant python
plutôt que gurobi.sh
.
Voici un exemple de script pour une tâche :
#!/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
Comment citer Gurobi
Référez-vous à How do I cite Gurobi software for an academic publication?