Gurobi/fr: Difference between revisions

From Alliance Doc
Jump to navigation Jump to search
No edit summary
No edit summary
Line 19: Line 19:
  $ gurobi_cl 1> /dev/null && echo Success || echo Fail
  $ gurobi_cl 1> /dev/null && echo Success || echo Fail


<div class="mw-translate-fuzzy">
Si vous obtenez ''Success'', vous pouvez utiliser Gurobi immédiatement. Si vous obtenez ''Fail'', vérifiez s'il existe un fichier nommé <i>~/.license/gurobi</i>; si c'est le cas, supprimez ou renommez ce fichier, chargez le module Gurobi de nouveau et refaites le test.
Si vous obtenez ''Success'', vous pouvez utiliser Gurobi. Si vous obtenez ''Fail'', contactez le [[Technical_support/fr | soutien technique]] pour de l'assistance.
Si vous obtenez encore ''Fail'', vérifiez si une variable d'environnement définit GUROBI dans vos fichiers <i>~/.bashrc</i> or <i>~/.bash_profile</I>; si c'est le cas, supprimez la ou les lignes ou mettez-les en commentaire, déconnectez-vous et connectez-vous de nouveau, chargez le module Gurobi de nouveau et refaites le test.
</div>
Si vous obtenez toujours ''Fail'', contactez le [[Technical_support/fr | soutien technique]] pour de l'assistance.


===Minimizing License Checkouts===
===Minimizing License Checkouts===

Revision as of 21:07, 23 November 2022

Other languages:

Gurobi est une suite logicielle commerciale qui permet de résoudre des problèmes complexes d'optimisation. Nous abordons ici son utilisation pour la recherche sur nos grappes.

Limites de la licence

Nous dispensons 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 Alliance username is "_______" and I am a member of the academic institution "_____________________". This message confirms that I will only use the Gurobi license provided on Digital Research Alliance of 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 notre licence Gurobi 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

Si vous obtenez Success, vous pouvez utiliser Gurobi immédiatement. Si vous obtenez Fail, vérifiez s'il existe un fichier nommé ~/.license/gurobi; si c'est le cas, supprimez ou renommez ce fichier, chargez le module Gurobi de nouveau et refaites le test. Si vous obtenez encore Fail, vérifiez si une variable d'environnement définit GUROBI dans vos fichiers ~/.bashrc or ~/.bash_profile; si c'est le cas, supprimez la ou les lignes ou mettez-les en commentaire, déconnectez-vous et connectez-vous de nouveau, chargez le module Gurobi de nouveau et refaites le test. Si vous obtenez toujours Fail, contactez le soutien technique pour de l'assistance.

Minimizing License Checkouts

Note that all Gurobi license checkouts are handled by a single license server located in Ontario; it is therefore important for you to make sure that your use of Gurobi limits as much as possible license checkout attempts. Rather than checking out a license for each invocation of Gurobi in a job--which may occur dozens or even hundreds of times--you should ensure that your program, whatever the language or computing environment used, only makes a single license checkout and then reuses this license token throughout the lifetime of the job. This will improve your job's performance since contacting a remote license server is very costly in time and will also improve the responsiveness of our license server for everyone who is using Gurobi. Failure to use Gurobi carefully in this regard may ultimately result in random intermittent license checkout failures for all users. If this happens, you will be contacted and asked to kill all your jobs until your program is fixed and tested to ensure the problem is gone. Some documentation on this subject for C++ programs may be found here, explaining how to create a single Gurobi environment which can then be used for all your models. Python users can consult this page, which discusses how to implement this same idea of using a single environment and thus a single license token with multiple models. Other programs when run in parallel that call Gurobi such as R can also easily trigger the problem especially when many simultaneous jobs are submitted and/or run in parallel.

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

[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

Une fois que votre script Slurm est prêt, vous pouvez le soumettre à la queue avec la commande sbatch script-name.sh. Vous pouvez vérifier l'état de vos tâches dans la queue avec la commande sq. Les scripts suivants solutionnent deux problèmes qui se trouvent dans le répertoire examples de chaque module Gurobi.

Exemple de données

Le script Slurm suivant utilise l' interface ligne de commande pour résoudre un modèle simple pour produire des pièces de monnaie écrit en format LP. La dernière ligne montre comment des paramètres peuvent être passés directement à l'outil ligne de commande gurobi_cl avec des arguments simples. Pour sélectionner les meilleurs paramètres pour un problème particulier et pour choisir les valeurs optimales, voyez les sections Performance and Parameters et Algorithms and Search dans la page Knowledge Base et dans la documentation Gurobi.

File : script-lp_coins.sh

#!/bin/bash
#SBATCH --account=def-group   # some account
#SBATCH --time=0-00:30        # specify time limit (D-HH:MM)
#SBATCH --cpus-per-task=8     # specify number threads
#SBATCH --mem=4G              # specify total memory
#SBATCH --nodes=1             # do not change

#module load StdEnv/2016      # for versions < 9.0.3 
module load StdEnv/2020       # for versions > 9.0.2

module load gurobi/9.5.0

rm -f coins.sol
gurobi_cl Threads=$SLURM_CPUS_ON_NODE Method=2 ResultFile=coins.sol ${GUROBI_HOME}/examples/data/coins.lp


Exemple avec Python

Le script Slurm suivant solutionne un modèle simple de l'emplacement de divers sites avec Gurobi Python. L'exemple montre comment paramétrer les fils avec un fichier gurobi.env créé dynamiquement quand vous utilisez l'interface Gurobi Python. Ceci doit être fait dans le répertoire de travail pour chaque tâche soumise, autrement Gurobi lancera par défaut autant de fils d'exécution qu'il y a de cœurs physiques dans le nœud de calcul plutôt que d'utiliser le nombre de cœurs physiques alloués à la tâche par l'ordonnanceur, ce qui risque de ralentir la tâche et nuire aux tâches exécutées sur le même nœud par les autres utilisateurs.

File : script-py_facility.sh

#!/bin/bash
#SBATCH --account=def-group   # some account
#SBATCH --time=0-00:30        # specify time limit (D-HH:MM)
#SBATCH --cpus-per-task=4     # specify number threads
#SBATCH --mem=4G              # specify total memory
#SBATCH --nodes=1             # do not change

#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. Notez que quand vous utilisez Gurobi avec Python, il est important de minimiser le nombre de fois que votre code Python tente d'obtenir une licence sur le seul serveur de licence Gurobi de Calcul Canada, car ceci crée une surcharge et peut nuire à vos tâches Gurobi et à celles des autres utilisateurs. Pour cette raison, votre code Python devrait autant que possible travailler dans un seul environnement et créer les nouveaux modèles à l'intérieur de cet environnement, au besoin. Puisqu'un jeton de licence est alloué à la création d'un nouvel environnement, il est très important de ne pas créer un nouvel environnement dans une boucle. Pour plus de détails, consultez la documentation Gurobi.

Avant de commencer, il faut déterminer la combinaison des versions de Gurobi et de Python à utiliser. Par exemple, comparez les versions Python prises en charge par les modules 8.11 et 9.0.1.

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


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

echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env   # set number of threads

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 :

File : gurobi-java.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=4096M           # memory per CPU (in MB)

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.

Voir aussi cette démonstration, à 38min 28sec de la vidéo.

Comment citer Gurobi

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