Gurobi

Revision as of 22:00, 28 December 2021 by Diane27 (talk | contribs)
Other languages:

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()

   * 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.

File : gurobi_example.sh

#!/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&nbsp;:

<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&nbsp;:


<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&nbsp;:

<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?