Gurobi/fr: Difference between revisions

From Alliance Doc
Jump to navigation Jump to search
No edit summary
(Updating to match new version of source page)
Line 107: Line 107:
== Environnements virtuels Python ==
== Environnements virtuels Python ==


<div class="mw-translate-fuzzy">
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>.
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>.
 
</div>
Nous devons d'abord déterminer la combinaison des versions de Gurobi et Python à utiliser.


{{Commands|prompt=[name@server ~] $
{{Commands|prompt=[name@server ~] $
|module load StdEnv/2016  (not needed for gurobi>9.0.2)
|module load gurobi/8.1.1  
|module load gurobi/8.1.1  
|cd $EBROOTGUROBI/lib  
|cd $EBROOTGUROBI/lib  
|ls -dF python*
|ls -d python*
   python2.7/       python2.7_utf32/  python3.6_utf32/
   python2.7        python2.7_utf32   python2.7_utf16
   python2.7_utf16/ python3.5_utf32/  python3.7_utf32/
   python3.5_utf32 python3.6_utf32    python3.7_utf32
     
}}
{{Commands|prompt=[name@server ~] $
|module load StdEnv/2016  (not needed for gurobi>9.0.2)
|module load gurobi/9.0.1
|module load gurobi/9.0.1
|cd $EBROOTGUROBI/lib  
|cd $EBROOTGUROBI/lib  
|ls -dF python*
|ls -d python*
   python2.7_utf16/ python3.5_utf32/ python3.7/        python3.8_utf32/
   python3.7        python2.7_utf16  python2.7_utf32
  python2.7_utf32/ python3.6_utf32/ python3.7_utf32/
  python3.5_utf32  python3.8_utf32  python3.6_utf32  python3.7_utf32
     
|cd
}}
}}


<div class="mw-translate-fuzzy">
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>),
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>).
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>).
</div>


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.
<div class="mw-translate-fuzzy">
 
=== Créer un environnement virtuel Python ===
=== Créer un environnement virtuel Python ===
</div>


Cette procédure est effectuée une seule fois pour chaque système.
<div class="mw-translate-fuzzy">
 
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.
Chargez d'abord les modules pour [[Python/fr#Créer_et_utiliser_un_environnement_virtuel|créer l'environnement virtuel]], puis activez l'environnement.
</div>


<div class="mw-translate-fuzzy">
{{Commands|prompt=[name@server ~] $
{{Commands|prompt=[name@server ~] $
| module load gurobi/9.0.1 python/3.7
| module load gurobi/9.0.1 python/3.7
Line 147: Line 151:
| source ~/env_gurobi/bin/activate
| source ~/env_gurobi/bin/activate
}}
}}
</div>


Une fois l'environnement activé, vous pouvez installer les paquets Python que vous voulez, ici <code>pandas</code>.
<div class="mw-translate-fuzzy">
 
{{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
}}
 
Installez ensuite <tt>gurobipy</tt> dans l'environnement.
Installez ensuite <tt>gurobipy</tt> dans l'environnement.
</div>


<div class="mw-translate-fuzzy">
{{Commands|prompt=(env_gurobi) [name@server ~] $
{{Commands|prompt=(env_gurobi) [name@server ~] $
| cd $EBROOTGUROBI
| cd $EBROOTGUROBI
Line 182: Line 178:
| cd
| cd
}}
}}
</div>


<div class="mw-translate-fuzzy">
=== Environnement virtuel ===
=== Environnement virtuel ===
</div>


Les scripts Python peuvent maintenant importer Pandas et Gurobi.
Les scripts Python peuvent maintenant importer Pandas et Gurobi.


import pandas as pd
{{Commands|prompt=[name@server ~] $
import numpy as np
| cat my_gurobi_script.py
import gurobipy as gurobi
  import pandas as pd
from gurobipy import *
  import numpy as np
  # [...]
  import gurobipy as gurobi
  from gurobipy import *
  etc
  }}


<div class="mw-translate-fuzzy">
Nous pouvons maintenant activer Gurobi et l'environnement avec
Nous pouvons maintenant activer Gurobi et l'environnement avec
</div>


module load gurobi/9.0.1
{{Commands|prompt=[name@server ~] $
source ~/env_gurobi/bin/activate
| module load gurobi/9.0.1
python my_gurobi_script.py
  source ~/env_gurobi/bin/activate
  (env_gurobi) python my_gurobi_script.py
}}


<div class="mw-translate-fuzzy">
Remarquez que nous utilisons maintenant <code>python</code> plutôt que <code>gurobi.sh</code>.
Remarquez que nous utilisons maintenant <code>python</code> plutôt que <code>gurobi.sh</code>.
</div>


Voici un exemple de script pour une tâche :
{{File
{{File
   |name=gurobi-py_example.sh
   |name=gurobi-py_example.sh
Line 221: Line 228:
python  my_gurobi_script.py
python  my_gurobi_script.py
}}
}}
== Using Gurobi with Jupyter notebooks ==
Various topics can be found by visiting [https://support.gurobi.com/ support.gurobi.com] and searching for <I>Jupyter notebooks</I>. "The article titled Where can I learn more about building optimization models?" provides several examples.  Information specific to using Gurobi with Jupyter notebooks on Compute Canada systems will be added to this wiki section in the future as required.


== Comment citer Gurobi ==
== Comment citer Gurobi ==


Voir [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?'']
Voir [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 18:26, 6 August 2021

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. Si le résultat affiche un échec (Fail), contactez le soutien technique.

$ module load gurobi
$ gurobi_cl 1> /dev/null && echo Success || echo Fail

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

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)

# use a version >= 9.0.3 
module load StdEnv/2020
module load gurobi/9.1.0

# 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


Interface Gurobi Python

Le script suivant est un exemple de modèle qui utilise Gurobi-Python.

File : gurobi-py_example.sh

#!/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)

# use a version <= 9.0.2 
module load StdEnv/2016.4     # or StdEnv/2018.3
module load gurobi/9.0.2

# 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


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.

[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 Python

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.

[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

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

Environnement virtuel

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 Gurobi et l'environnement 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.


File : gurobi-py_example.sh

#!/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


Using Gurobi with Jupyter notebooks

Various topics can be found by visiting support.gurobi.com and searching for Jupyter notebooks. "The article titled Where can I learn more about building optimization models?" provides several examples. Information specific to using Gurobi with Jupyter notebooks on Compute Canada systems will be added to this wiki section in the future as required.

Comment citer Gurobi

Voir How do I cite Gurobi software for an academic publication?