Gurobi/fr: Difference between revisions
No edit summary |
(Updating to match new version of source page) |
||
Line 4: | Line 4: | ||
[http://www.gurobi.com/ 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. | [http://www.gurobi.com/ 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. | ||
<div class="mw-translate-fuzzy"> | |||
==Limites de la licence== | ==Limites de la licence== | ||
</div> | |||
Calcul Canada dispense le soutien technique pour la licence gratuite disponible sur [[Graham/fr|Graham]], [[Cedar/fr|Cedar]], [[Béluga]] et [[Niagara/fr|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é. | Calcul Canada dispense le soutien technique pour la licence gratuite disponible sur [[Graham/fr|Graham]], [[Cedar/fr|Cedar]], [[Béluga]] et [[Niagara/fr|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é. | ||
Line 60: | Line 62: | ||
Référence : https://www.gurobi.com/documentation/8.1/refman/recording_api_calls.html | Référence : https://www.gurobi.com/documentation/8.1/refman/recording_api_calls.html | ||
<div class="mw-translate-fuzzy"> | |||
== Tâches en lots == | == Tâches en lots == | ||
</div> | |||
import pandas as pd | |||
import numpy as np | |||
import gurobipy as gurobi | |||
from gurobipy import * | |||
# [...] | |||
<div class="mw-translate-fuzzy"> | |||
=== Format LP === | |||
</div> | |||
<div class="mw-translate-fuzzy"> | |||
Le script suivant est un exemple pour un modèle au [https://www.gurobi.com/documentation/8.1/refman/lp_format.html format LP]. | Le script suivant est un exemple pour un modèle au [https://www.gurobi.com/documentation/8.1/refman/lp_format.html format LP]. | ||
{{File | {{File | ||
Line 73: | Line 86: | ||
#SBATCH --time=0:30 # time limit (D-HH:MM) | #SBATCH --time=0:30 # time limit (D-HH:MM) | ||
#SBATCH --mem-per-cpu=1000M # memory per CPU (in MB) | #SBATCH --mem-per-cpu=1000M # memory per CPU (in MB) | ||
</div> | |||
Voici un exemple de script pour une tâche : | |||
<div class="mw-translate-fuzzy"> | |||
# use a version >= 9.0.3 | # use a version >= 9.0.3 | ||
module load StdEnv/2020 | module load StdEnv/2020 | ||
module load gurobi/9.1.0 | module load gurobi/9.1.0 | ||
</div> | |||
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?''] | |||
<div class="mw-translate-fuzzy"> | |||
Le script suivant est un exemple de modèle qui utilise [https://www.gurobi.com/documentation/8.1/refman/py_python_api_overview.html#sec:Python Gurobi-Python]. | Le script suivant est un exemple de modèle qui utilise [https://www.gurobi.com/documentation/8.1/refman/py_python_api_overview.html#sec:Python Gurobi-Python]. | ||
{{File | {{File | ||
Line 96: | Line 109: | ||
#SBATCH --cpus-per-task=1 # number of CPUs (threads) to use | #SBATCH --cpus-per-task=1 # number of CPUs (threads) to use | ||
#SBATCH --mem-per-cpu=1000M # memory per CPU (in MB) | #SBATCH --mem-per-cpu=1000M # memory per CPU (in MB) | ||
</div> | |||
<div class="mw-translate-fuzzy"> | |||
# use a version <= 9.0.2 | # use a version <= 9.0.2 | ||
module load StdEnv/2016.4 # or StdEnv/2018.3 | module load StdEnv/2016.4 # or StdEnv/2018.3 | ||
module load gurobi/9.0.2 | 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 | |||
<div class="mw-translate-fuzzy"> | |||
# 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 | |||
</div> | |||
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env | echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env | ||
<div class="mw-translate-fuzzy"> | |||
gurobi.sh ${GUROBI_HOME}/examples/python/facility.py | gurobi.sh ${GUROBI_HOME}/examples/python/facility.py | ||
}} | }} | ||
</div> | |||
== Environnements virtuels Python == | == Environnements virtuels Python == | ||
Line 226: | Line 251: | ||
== Utiliser Gurobi avec Java == | == Utiliser Gurobi avec Java == | ||
<div class="mw-translate-fuzzy"> | |||
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 : | 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 : | ||
{{File | {{File | ||
Line 235: | Line 261: | ||
#SBATCH --cpus-per-task=1 # number of CPUs (threads) to use | #SBATCH --cpus-per-task=1 # number of CPUs (threads) to use | ||
#SBATCH --mem=4096M # memory per CPU (in MB) | #SBATCH --mem=4096M # memory per CPU (in MB) | ||
</div> | |||
module load java/14.0.2 | module load java/14.0.2 | ||
module load gurobi/9.1.2 | module load gurobi/9.1.2 | ||
java -Djava.library.path=$EBROOTGUROBI/lib -Xmx4g -jar my_java_file.jar | |||
}} | |||
<div class="mw-translate-fuzzy"> | |||
java -Djava.library.path=$EBROOTGUROBI/lib -Xmx4g -jar my_java_file.jar | java -Djava.library.path=$EBROOTGUROBI/lib -Xmx4g -jar my_java_file.jar | ||
}} | }} | ||
== Utiliser Gurobi avec des notebooks Jupyter == | == Utiliser Gurobi avec des notebooks Jupyter == | ||
</div> | |||
Vous trouverez de l'information sur [https://www.gurobi.com/resources/ Resources], [https://www.gurobi.com/resources/?category-filter=code-example Code and Modeling Examples] et [https://www.gurobi.com/resource/modeling-examples-using-the-gurobi-python-api-in-jupyter-notebook/ Optimization with Python – Jupyter Notebook Modeling Examples]. Sur le site [https://support.gurobi.com/ support.gurobi.com] faites une recherche avec <I>Jupyter Notebooks</I>. Nous ajouterons au besoin des renseignements particuliers sur comment utiliser Guroby avec Jupyter Notebooks sur les systèmes de Calcul Canada. | Vous trouverez de l'information sur [https://www.gurobi.com/resources/ Resources], [https://www.gurobi.com/resources/?category-filter=code-example Code and Modeling Examples] et [https://www.gurobi.com/resource/modeling-examples-using-the-gurobi-python-api-in-jupyter-notebook/ Optimization with Python – Jupyter Notebook Modeling Examples]. Sur le site [https://support.gurobi.com/ support.gurobi.com] faites une recherche avec <I>Jupyter Notebooks</I>. Nous ajouterons au besoin des renseignements particuliers sur comment utiliser Guroby avec Jupyter Notebooks sur les systèmes de Calcul Canada. |
Revision as of 03:17, 22 December 2021
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
Tâches en lots
import pandas as pd
import numpy as np import gurobipy as gurobi from gurobipy import * # [...]
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)
</div>
Voici un exemple de script pour une tâche :
<div class="mw-translate-fuzzy">
# use a version >= 9.0.3
module load StdEnv/2020
module load gurobi/9.1.0
</div>
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?'']
<div class="mw-translate-fuzzy">
Le script suivant est un exemple de modèle qui utilise [https://www.gurobi.com/documentation/8.1/refman/py_python_api_overview.html#sec:Python Gurobi-Python].
<div class="code-file">
<div class="filename">'''File :''' gurobi-py_example.sh</div>
<div class="download_form">
'"`UNIQ--htmltag-00000003-QINU`"'
</div>
'"`UNIQ--syntaxhighlight-00000007-QINU`"'
</div>
</div>
== 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 [[Python/fr#Créer_et_utiliser_un_environnement_virtuel|créer un environnement virtuel Python]] dans lequel seront installés <code>gurobipy</code> et par exemple <code>pandas</code>. 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;:
<div class="command">
'"`UNIQ--syntaxhighlight-00000012-QINU`"'</div>
<div class="command">
'"`UNIQ--syntaxhighlight-0000001D-QINU`"'</div>
Nous remarquons que <code>gurobi/8.1.1</code> apporte sa propre installation de <code>python2.7/</code> et des paquets pour Python 2.7, 3.5, 3.6 et 3.7 (<code>pythonX.Y_utf32/</code>),
alors que <code>gurobi/9.0.1</code> utilise par défaut <code>python3.7/</code> et les paquets pour Python 2.7, 3.5, 3.6, 3.7 et 3.8 (<code>pythonX.Y_utf32/</code>).
=== Créer un environnement virtuel ===
Dans cet exemple, nous voulons créer un environnement Python basé sur <code>python/3.7</code> où nous voulons utiliser <code>gurobi/9.0.1</code> et installer le paquet Pandas. Il faut suivre les étapes suivantes une fois sur chaque système. Chargez d'abord les modules pour [[Python/fr#Créer_et_utiliser_un_environnement_virtuel|créer l'environnement virtuel]], puis activez cet environnement.
<div class="command">
'"`UNIQ--syntaxhighlight-00000026-QINU`"'</div>
Maintenant que l'environnement est activé, installez les paquets que nous voulons utiliser, ici <code>pandas</code>. Par exemple
<div class="command">
'"`UNIQ--syntaxhighlight-0000002B-QINU`"'</div>
La troisième et dernière étape est d'installer gurobipy dans l'environnement :
<div class="command">
'"`UNIQ--syntaxhighlight-00000034-QINU`"'</div>
=== Environnement virtuel pour Gurobi ===
Les scripts Python peuvent maintenant importer Pandas et Gurobi.
<div class="command">
'"`UNIQ--syntaxhighlight-00000039-QINU`"'</div>
Nous pouvons maintenant activer notre environnement Gurobi avec
<div class="command">
'"`UNIQ--syntaxhighlight-0000003E-QINU`"'</div>
Remarquez que nous utilisons maintenant <code>python</code> plutôt que <code>gurobi.sh</code>. L'exemple suivant est un script que nous pouvons utiliser pour une tâche :
<div class="code-file">
<div class="filename">'''File :''' gurobi-py_example.sh</div>
<div class="download_form">
'"`UNIQ--htmltag-00000040-QINU`"'
</div>
'"`UNIQ--syntaxhighlight-00000044-QINU`"'
</div>
== Utiliser Gurobi avec Java ==
<div class="mw-translate-fuzzy">
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 :
<div class="code-file">
<div class="filename">'''File :''' gurobi-java.sh</div>
<div class="download_form">
'"`UNIQ--htmltag-00000046-QINU`"'
</div>
'"`UNIQ--syntaxhighlight-0000004A-QINU`"'
</div>
<div class="mw-translate-fuzzy">
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?