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).
Configurer votre compte
Il n'est pas nécessaire de créer le fichier ~/.licenses/gurobi.lic
. Les paramètres pour l'utilisation de la licence Gurobi de Calcul Canada sont configurés par défaut quand un module Gurobi est chargé sur une grappe. Pour savoir si votre nom d'utilisateur a été ajouté à la licence et qu'elle fonctionne correctement, lancez la commande qui suit.
$ module load gurobi $ gurobi_cl 1> /dev/null && echo Success || echo Fail
[gra800:~] gurobi_cl recording000.grbr
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
Soumettre une tâche en lots sur une grappe
import pandas as pd
import numpy as np import gurobipy as gurobi from gurobipy import * # [...]
Exemple de données
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)
</div>
Voici un exemple de script pour une tâche :
module load gurobi/9.5.0
Référez-vous à [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?'']
=== Exemple avec Python ===
<div class="mw-translate-fuzzy">
# use a version <= 9.0.2
module load StdEnv/2016.4 # or StdEnv/2018.3
module load gurobi/9.0.2
</div>
#module load StdEnv/2016 # for versions < 9.0.3
module load StdEnv/2020 # for versions > 9.0.2
module load gurobi/9.5.0
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
. Il faut d'abord décider quelles versions de Gurobi et Python nous voulons utiliser. Par exemple, comparons les versions de Python compatibles avec les modules Gurobi 8.11 et 9.0.1%nbsp;:
[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
Nous remarquons que gurobi/8.1.1
apporte sa propre installation de python2.7/
et des paquets pour Python 2.7, 3.5, 3.6 et 3.7 (pythonX.Y_utf32/
),
alors que gurobi/9.0.1
utilise par défaut python3.7/
et les paquets pour Python 2.7, 3.5, 3.6, 3.7 et 3.8 (pythonX.Y_utf32/
).
Créer un environnement virtuel
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. Il faut suivre les étapes suivantes une fois sur chaque système. Chargez d'abord les modules pour créer l'environnement virtuel, puis activez cet 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
Maintenant que l'environnement est activé, installez les paquets que nous voulons utiliser, ici pandas
. Par exemple
(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
La troisième et dernière étape est d'installer 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
Environnement virtuel pour Gurobi
Les scripts Python peuvent maintenant importer Pandas et Gurobi.
[name@server ~] $ cat my_gurobi_script.py
import pandas as pd
import numpy as np
import gurobipy as gurobi
from gurobipy import *
etc
Nous pouvons maintenant activer notre environnement Gurobi avec
[name@server ~] $ module load gurobi/9.0.1
source ~/env_gurobi/bin/activate
(env_gurobi) python my_gurobi_script.py
Remarquez que nous utilisons maintenant python
plutôt que gurobi.sh
. L'exemple suivant est un script que nous pouvons utiliser 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
Utiliser Gurobi avec Java
Vous devez aussi charger un module Java et ajouter une option à la commande Java pour permettre à l'environnement virtuel Java de localiser les bibliothèques Gurobi, comme dans l'exemple suivant :
#!/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=4096M # memory per CPU (in MB)
</div>
module load java/14.0.2
module load gurobi/9.1.2
java -Djava.library.path=$EBROOTGUROBI/lib -Xmx4g -jar my_java_file.jar
== Utiliser Gurobi avec des notebooks Jupyter ==
Vous trouverez de l'information sur Resources, Code and Modeling Examples et Optimization with Python – Jupyter Notebook Modeling Examples. Sur le site support.gurobi.com faites une recherche avec Jupyter Notebooks. Nous ajouterons au besoin des renseignements particuliers sur comment utiliser Guroby avec Jupyter Notebooks sur les systèmes de Calcul Canada.
Comment citer Gurobi
Voir How do I cite Gurobi software for an academic publication?