Gurobi/fr: Difference between revisions

From Alliance Doc
Jump to navigation Jump to search
(Created page with "Calcul Canada dispense le soutien technique pour la licence gratuite disponible sur Graham, Cedar, Béluga et Niagara. The lic...")
(Updating to match new version of source page)
 
(210 intermediate revisions by 3 users not shown)
Line 2: Line 2:
[[Category:Software]]
[[Category:Software]]


[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 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==
==Limites de la licence==


Calcul Canada dispense le soutien technique pour la licence gratuite disponible sur [[Graham/fr|Graham]], [[Cedar/fr|Cedar]], [[Béluga]] et [[Niagara/fr|Niagara]].
Nous dispensons 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é.
Vous devez cependant accepter certaines conditions. Faites parvenir un courriel au [[Technical_support/fr | soutien technique]] avec l'entente (<i>Academic Usage Agreement</i>) dûment complétée; vous pourrez ensuite utiliser les applications après un délai de quelques jours.


  The license provides a total number of 4096 simultaneous uses (tokens in use) and permits distributed optimization with up to 100 nodes. A single user can run multiple simultaneous jobs. In order to use Gurobi you must agree to certain conditions. Please [[Technical_support | contact support]] and include a copy of the following completed Academic Usage Agreement. You will then be added into the Compute Canada license file as a permitted user within a few days:
===Academic Usage Agreement===
 
<div class="mw-translate-fuzzy">
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).
</div>
 
===Configurer votre compte===
Il n'est pas nécessaire de créer le fichier <code>~/.licenses/gurobi.lic</code>. 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.


===Academic Usage Agreement===
$ module load gurobi
$ 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.<br>
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 correspondantes ou mettez-les en commentaire, déconnectez-vous et connectez-vous de nouveau, chargez le module Gurobi de nouveau et refaites le test.
<br>
Si vous obtenez toujours ''Fail'', contactez le [[Technical_support/fr | soutien technique]] pour de l'assistance.
</div>
 
===Utiliser un minimum de licences===


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).
<div class="mw-translate-fuzzy">
Les licences peuvent être obtenues d’un seul serveur situé en Ontario; il est donc important de limiter les demandes autant que possible. Plutôt que d’obtenir une licence chaque fois que votre tâche requiert Gurobi, ce qui peut être des centaines, voire même des milliers de fois, '''faites en sorte que votre code fonctionne avec une seule licence pour toute la durée de la tâche, et ce, peu importe l’environnement que vous utilisez'''. Vous y gagnerez en performance puisque le temps de communication avec un serveur à distance est très long et de plus, notre serveur sera plus accessible aux autres utilisateurs de Gurobi.  <span style="color:red">Si votre code n’est pas adapté en conséquence, le serveur pourrait ne pas pouvoir émettre de licence de façon intermittente; si ceci se produit, nous vous demanderons de mettre fin à toutes vos tâches et de corriger votre programme.</span> Voyez comment créer un environnement pour tous vos modèles avec vos programmes en [https://www.gurobi.com/documentation/9.5/refman/cpp_env2.html C++] ou en [https://www.gurobi.com/documentation/9.5/refman/py_env_start.html Python]. Le même problème peut aussi survenir avec d’autres programmes qui fonctionnent en parallèle comme R, surtout quand plusieurs tâches simultanées sont soumises à l'ordonnanceur,
</div>


== Allocations initeractives ==
== Allocations interactives ==


===Ligne de commande===
===Ligne de commande===
Line 23: Line 43:
  [gra800:~] gurobi_cl --help
  [gra800:~] gurobi_cl --help


===Gurobi Interactive Shell ===
===Interpréteur interactif ===
   
   
  [gra-login2:~] salloc --time=1:00:0 --cpus-per-task=8 --mem=1G --account=def-xyz
  [gra-login2:~] salloc --time=1:00:0 --cpus-per-task=8 --mem=1G --account=def-xyz
Line 40: Line 60:
  gurobi> help()
  gurobi> help()


where
     * https://www.gurobi.com/documentation/8.1/refman/recording_api_calls.html
     * 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/parameter_descriptions.html
Line 46: Line 66:
  **** https://www.gurobi.com/documentation/8.1/refman/attributes.html
  **** https://www.gurobi.com/documentation/8.1/refman/attributes.html


===Replay API Call Recording===
===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
  [gra800:~] gurobi_cl recording000.grbr


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


== Tâches en lots ==
== Soumettre une tâche en lots sur une grappe ==


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


This is an example job script for an optimization model written in the [https://www.gurobi.com/documentation/8.1/refman/lp_format.html LP format].
=== Exemple de données ===
 
Le script Slurm suivant utilise l' [https://www.gurobi.com/documentation/9.5/quickstart_linux/solving_the_model_using_th.html interface ligne de commande] pour résoudre un [https://www.gurobi.com/documentation/9.5/quickstart_linux/solving_a_simple_model_the.html modèle simple pour produire des pièces de monnaie] écrit en [https://www.gurobi.com/documentation/9.5/refman/lp_format.html format LP]. La dernière ligne montre comment des [https://www.gurobi.com/documentation/9.5/refman/parameters.html paramètres] peuvent être passés directement à l'outil ligne de commande <code>gurobi_cl</code> avec des arguments simples. Pour sélectionner les meilleurs [https://www.gurobi.com/documentation/9.5/refman/parameters.html paramètres] pour un problème particulier et pour choisir les valeurs optimales, voyez les sections <i>Performance and Parameters</i> et <i>Algorithms and Search</I> dans la page [https://support.gurobi.com/hc/en-us/categories/360000840331-Knowledge-Base Knowledge Base] et dans la [https://www.gurobi.com/documentation/ documentation Gurobi].
{{File
{{File
   |name=gurobi_example.sh
   |name=script-lp_coins.sh
   |lang="sh"
   |lang="sh"
   |contents=
   |contents=
#!/bin/bash
#!/bin/bash
#SBATCH --time=0:30           # time limit (D-HH:MM)
#SBATCH --account=def-group  # some account
#SBATCH --mem-per-cpu=1000M  # memory per CPU (in MB)
#SBATCH --time=0-00:30       # specify time limit (D-HH:MM)
module purge 
#SBATCH --cpus-per-task=8    # specify number threads
module load gurobi
#SBATCH --mem=4G              # specify total memory
#SBATCH --nodes=1            # do not change


# Create environment file in current directory setting the number of threads:
#module load StdEnv/2016      # for versions < 9.0.3
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
module load StdEnv/2020      # for versions > 9.0.2
 
module load gurobi/9.5.0


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


=== Job using Gurobi Python ===  
=== Exemple avec Python ===  


This is an example jobscript for a model using [https://www.gurobi.com/documentation/8.1/refman/py_python_api_overview.html#sec:Python Gurobi-Python].
Le script Slurm suivant solutionne un [https://www.gurobi.com/documentation/9.5/examples/a_list_of_the_grb_examples.html modèle simple de l'emplacement de divers sites] avec [https://www.gurobi.com/documentation/9.5/examples/facility_py.html Gurobi Python]. L'exemple montre comment  [https://www.gurobi.com/documentation/9.5/refman/parameters.html#sec:Parameters paramétrer les fils] en nombre égal à celui des coeurs alloués à la tâche en générant un fichier  [https://www.gurobi.com/documentation/9.5/quickstart_linux/using_a_grb_env_file.html gurobi.env] dans le répertoire de travail quand vous utilisez [https://www.gurobi.com/documentation/9.5/refman/python_parameter_examples.html l'interface Gurobi Python].
Ceci doit être fait pour chaque tâche soumise, autrement Gurobi lancera par défaut autant de [https://www.gurobi.com/documentation/9.5/refman/threads.html#parameter:Threads 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
{{File
   |name=gurobi-py_example.sh
   |name=script-facility.sh
   |lang="sh"
   |lang="sh"
   |contents=
   |contents=
#!/bin/bash
#!/bin/bash
#SBATCH --time=0-00:30        # time limit (D-HH:MM)
#SBATCH --account=def-group  # indiquez le nom du compte
#SBATCH --cpus-per-task=1     # number of CPUs (threads) to use
#SBATCH --time=0-00:30        # indiquez la limite de temps (jj-hh:mm)
#SBATCH --mem-per-cpu=1000M  # memory per CPU (in MB)
#SBATCH --cpus-per-task=4     # indiquez le nombre de fils
module purge 
#SBATCH --mem=4G              # demandez toute la mémoire
module load gurobi
#SBATCH --nodes=1            # ne pas modifier
 
#module load StdEnv/2020      # versions < 10.0.3
module load StdEnv/2023      # versions > 10.0.3
 
module load gurobi/11.0.1


# Create environment file in current directory setting the number of threads:
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env


gurobi.sh ${GUROBI_HOME}/examples/python/facility.py
gurobi.sh ${GUROBI_HOME}/examples/python/facility.py
}}
}}


== Environnements virtuels Python ==
== Environnements virtuels Python ==


Gurobi brings it's own version of Python but that one does not contain any 3rd-party Python packages except Gurobi.   In order to use Gurobi together with popular Python  
<div class="mw-translate-fuzzy">
packages like NumPy, Matplotlib, Pandas and others, we need to create a [[Python#Creating_and_using_a_virtual_environment|virtual Python environment]] in which we can install both <code>gurobipy</code> and e.g. <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>.<br>
Avant de commencer, il faut décider quelle combinaison des versions Gurobi et Python nous voulons utiliser. La liste suivante montre les versions de Python supportées par les versions principales de Gurobi dans les environnements standards (StdEnv).
</div>


Nous devons d'abord déterminer la combinaison des versions de Gurobi et Python à utiliser.
[name@server ~] module load StdEnv/2016; module load gurobi/8.1.1; cd $EBROOTGUROBI/lib; ls -d python*
python2.7  python2.7_utf16  python2.7_utf32  python3.5_utf32  python3.6_utf32  python3.7_utf32
 
[name@server ~] module load StdEnv/2020; module load gurobi/9.5.2; cd $EBROOTGUROBI/lib; ls -d python*
python2.7_utf16  python2.7_utf32  python3.10_utf32  python3.7  python3.7_utf32  python3.8_utf32  python3.9_utf32
[name@server ~] module load StdEnv/2023; module load gurobi/10.0.3; cd $EBROOTGUROBI/lib; ls -d python*
python3.10_utf32  python3.11_utf32  python3.7  python3.7_utf32  python3.8_utf32  python3.9_utf32
[name@server ~] module load StdEnv/2023; module load gurobi/11.0.1; cd $EBROOTGUROBI/lib; ls -d python*
python3.11
 
=== Installer Gurobi pour Python ===
 
As mentioned near the end of this official document [http://support.gurobi.com/hc/en-us/articles/360044290292-How-do-I-install-Gurobi-for-Python How-do-I-install-Gurobi-for-Python], the previously recommended method for installing Gurobi for Python with <code>setup.py</code> has been deprecated to only be usable with Gurobi 10 versions (and older).  Therefore, a new section has been added below which shows how to simultaneously download a compatible binary wheel from [https://pypi.org/project/gurobipy/ pypi.org] and convert it into a format usable with the newly recommended command to install Gurobi for Python with Gurobi 11 versions (and newer).
 
=== Versions Gurobi 10.0.3 et moins récentes ===
 
Il faut suivre les étapes suivantes une fois sur chaque système avec StdEnv2023 et moins récents. Chargez d'abord les modules pour [[Python/fr#Créer_et_utiliser_un_environnement_virtuel|créer l'environnement virtuel]], puis activez cet environnement.


{{Commands|prompt=[name@server ~] $
{{Commands|prompt=[name@server ~] $
|module load gurobi/8.1.1
| module load gurobi/10.0.3 python
|cd $EBROOTGUROBI/lib
| virtualenv --no-download  ~/env_gurobi
|ls -dF python*
| source ~/env_gurobi/bin/activate
  python2.7/       python2.7_utf32/ python3.6_utf32/
}}
  python2.7_utf16/ python3.5_utf32/  python3.7_utf32/
Installez les paquets que vous voulez utiliser, ici <code>pandas</code>. Par exemple
     
 
|module load gurobi/9.0.1
<div class="mw-translate-fuzzy">
|cd $EBROOTGUROBI/lib
{{Commands|prompt=(env_gurobi) [name@server ~] $
|ls -dF python*
| pip install --no-index pandas
  python2.7_utf16/  python3.5_utf32/ python3.7/        python3.8_utf32/
  python2.7_utf32/  python3.6_utf32/  python3.7_utf32/
     
|cd
}}
}}
Installez maintenant gurobipy dans l'environnement. À partir de StdEnv/2023, il n'est plus possible de l'installer dans $EBROOTGUROBI avec la commande <code>python setup.py build --build-base /tmp/${USER} install</code>, ce qui causerait une erreur fatale et le message <code>error: could not create 'gurobipy.egg-info': Read-only file system</code>. Copiez les fichiers ailleurs  (par exemple dans /tmp/$USER) où l'installation sera faite, comme ci-dessous&nbsp;:


We see that <code>gurobi/8.1.1</code> brings it's own installation of <code>python2.7/</code> and Python packages for Python 2.7, 3.5, 3.6 and 3.7 (<code>pythonX.Y_utf32/</code>),
Instead the required files need to copied to elsewhere (such as /tmp/$USER) and installed from there, for example:
while <code>gurobi/9.0.1</code> by default uses <code>python3.7/</code> and brings Python packages for Python 2.7, 3.5, 3.6, 3.7 and 3.8 (<code>pythonX.Y_utf32/</code>).
</div>
 
{{Commands|prompt=(env_gurobi) [name@server ~] $
| mkdir /tmp/$USER
| cp -r $EBROOTGUROBI/{lib,setup.py} /tmp/$USER
| cd /tmp/$USER
| python setup.py install
(env_gurobi) [roberpj@gra-login1:/tmp/roberpj] python setup.py install
/home/roberpj/env_gurobi/lib/python3.11/site-packages/setuptools/_core_metadata.py:158: SetuptoolsDeprecationWarning: Invalid config.
!!


In this example we want to create a Python environment based on <code>python/3.7</code> in which we want to use <code>gurobi/9.0.1</code> and install the Pandas package.
        ********************************************************************************
        newlines are not allowed in `summary` and will break in the future
        ********************************************************************************


=== Créer un environnement virtuel Python ===
!!
  write_field('Summary', single_line(summary))
removing /tmp/roberpj/build
(env_gurobi) [roberpj@gra-login1:/tmp/roberpj]
| deactivate
[name@server ~]
}}


These steps need to be done only once per system.  
=== Versions Gurobi 11.0.0 (et plus récentes) ===


The first step is to load the modules, [[Python#Creating_and_using_a_virtual_environment|create the virtual environment]] and activate it.
Once again, the following steps need to be done once per system and are usable with StdEnv/2023 and older.  First load the modules to [[Python#Creating_and_using_a_virtual_environment|create the virtual environment]] and activate it.  Version 11.0.0 is skipped since it has been observed to seg fault in at least one example versus Version 11.0.1 which runs smoothly.


{{Commands|prompt=[name@server ~] $
{{Commands|prompt=[name@server ~] $
| module load gurobi/9.0.1 python/3.7
| module load gurobi/11.0.1 python
| virtualenv --no-download  ~/env_gurobi
| 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.
| source ~/env_gurobi/bin/activate
| source ~/env_gurobi/bin/activate
}}
}}
As before, install any needed Python packages.  Since the following matrix example requires <code>numpy</code>, we install the pandas package:


Now that the environment has been activated we can install the Python packages we want to use, in this case <code>pandas</code>.
{{Commands|prompt=(env_gurobi) [name@server ~] $
|  pip install --no-index  pandas
}}
Next install gurobipy into the environment. As mentioned above and in [[https://support.gurobi.com/hc/en-us/articles/360044290292-How-do-I-install-Gurobi-for-Python|this article]] the use of setup.py to install Gurobi for python is deprecated starting with Gurobi 11.  Both pip and conda are given as alternatives; however, since conda should not be used on alliance systems, the pip approach will be demonstrated here. The installation of gurobipy is slightly complicated since our Linux systems are set up with gentoo prefix.  As a result neither A) the recommended command to download and install the gurobipy extension from the public PyPI server <code>pip install gurobipy==11.0.1</code> mentioned in the article line or B) the offline command to install the wheel with <code>python -m pip install --find-links <wheel-dir> --no-index gurobipy</code>, will work.  Instead a script available from the alliance maybe utilized to download and simultaneously convert the existing wheel into a usable format with a new name.  There is one caveat, for each new Gurobi version the researcher must go into https://pypi.org/project/gurobipy/11.0.1/#history and click on the desired version followed by the <code>Download files</code> button located in the menu on the left. Finally, click to copy the https link for the wheel file (named gurobipy-11.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl in the case of Gurobi 11.0.1) and paste it as the --url argument as shown below :


{{Commands|prompt=(env_gurobi) [name@server ~] $
{{Commands|prompt=(env_gurobi) [name@server ~] $
| pip install --no-index  pandas
| wget https://raw.githubusercontent.com/ComputeCanada/wheels_builder/main/unmanylinuxize.sh
  Ignoring pip: markers 'python_version < "3"' don't match your environment
| chmod u+rx unmanylinuxize.sh
  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
| ./unmanylinuxize.sh --package gurobipy --version 11.0.1 --url
  Collecting pandas
https://files.pythonhosted.org/packages/1c/96/4c800e7cda4a1688d101a279087646912cf432b0f61ff5c816f0bc8503e0/gurobipy-11.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
  Collecting numpy>=1.13.3 (from pandas)
| ls
  [...]
gurobipy-11.0.1-cp311-cp311-linux_x86_64.whl  unmanylinuxize.sh
  Successfully installed numpy-1.18.4 pandas-1.0.3 python-dateutil-2.8.1 pytz-2020.1 six-1.15.0
| python -m pip install --find-links $PWD --no-index gurobipy
| deactivate
[name@server ~]}}
 
=== Travailler dans l'environnement avec Gurobi ===
 
<div class="mw-translate-fuzzy">
Nous pouvons maintenant activer notre environnement Gurobi avec
</div>
 
{{Commands|prompt=[name@server ~] $
| module load gurobi/11.0.1 scipy-stack
  source ~/env_gurobi/bin/activate
  (env_gurobi) [name@server ~]
}}
}}


The third step is to install gurobipy into the environment:
Les scripts Python comme les exemples fournis avec le module gurobi peuvent alors être exécutés dans l'environnement virtuel avec Python.


{{Commands|prompt=(env_gurobi) [name@server ~] $
{{Commands|prompt=(env_gurobi) [name@server ~] $
| cd $EBROOTGUROBI
| python $EBROOTGUROBI/examples/python/matrix1.py
| 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
| cd
}}
}}


=== Using the Gurobi-enabled virtual environment ===
<div class="mw-translate-fuzzy">
Les scripts Python peuvent maintenant importer Pandas et Gurobi.
</div>
 
{{Commands|prompt=[name@server ~] $
| cat my_gurobi_script.py
  import pandas as pd
  import numpy as np
  import gurobipy as gurobi
  from gurobipy import *
  etc
}}


Les scripts Python peuvent maintenant importer Pandas et Gurobi.
Soumettez le script dans la queue avec <code>sbatch my_slurm_script.sh</code>.
 
{{File
  |name=my_slurm_script.sh
  |lang="sh"
  |contents=
#!/bin/bash
#SBATCH --account=def-somegrp  # indiques le nom du compte
#SBATCH --time=0-00:30        # indiquez la limite de temps (jj-hh:mm)
#SBATCH --nodes=1              # utiliser un (1) nœud
#SBATCH --cpus-per-task=4      # indiquez le nombre de CPU
#SBATCH --mem=4000M            # demandez toute la mémoire


import pandas as pd
module load StdEnv/2023
import numpy as np
module load gurobi/11.0.1
import gurobipy as gurobi
# module load scipy-stack      # uncomment if needed
from gurobipy import *
# [...]


Nous pouvons maintenant activer Gurobi et l'environnement avec
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env


module load gurobi/9.0.1
source ~/env_gurobi/bin/activate
source ~/env_gurobi/bin/activate
python my_gurobi_script.py
python my_gurobi_script.py
}}


Remarquez que nous utilisons maintenant <code>python</code> plutôt que <code>gurobi.sh</code>.
Pour plus d'information sur la création et l'utilisation des environnements virtuels Python, voir  [[Python/fr#Créer_un_environnement_virtuel_dans_vos_tâches|Créer un environnement virtuel dans vos tâches]].


Voici un exemple de script pour une tâche :
== 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&nbsp;:
{{File
{{File
   |name=gurobi-py_example.sh
   |name=gurobi-java.sh
   |lang="sh"
   |lang="sh"
   |contents=
   |contents=
#!/bin/bash
#!/bin/bash
#SBATCH --time=0-00:30        # time limit (D-HH:MM)
#SBATCH --time=0-00:30        # time limit (D-HH:MM)
#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=4096M          # memory per CPU (in MB)
module purge
module load gurobi/9.0.1
source ~/env_gurobi/bin/activate


# Create environment file in current directory setting the number of threads:
module load java/14.0.2
echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env
module load gurobi/9.1.2


python  my_gurobi_script.py
java -Djava.library.path=$EBROOTGUROBI/lib -Xmx4g -jar my_java_file.jar
}}
}}


== Cite Gurobi ==
== Utiliser Gurobi avec des notebooks Jupyter ==
 
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>. 
 
Voir aussi cette [https://youtu.be/Qk3Le5HBxeg?t=2310 démonstration, à 38min 28sec de la vidéo].
 
== Comment citer Gurobi ==


Please see [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?'']

Latest revision as of 22:21, 22 July 2024

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

Utiliser un minimum de licences

Les licences peuvent être obtenues d’un seul serveur situé en Ontario; il est donc important de limiter les demandes autant que possible. Plutôt que d’obtenir une licence chaque fois que votre tâche requiert Gurobi, ce qui peut être des centaines, voire même des milliers de fois, faites en sorte que votre code fonctionne avec une seule licence pour toute la durée de la tâche, et ce, peu importe l’environnement que vous utilisez. Vous y gagnerez en performance puisque le temps de communication avec un serveur à distance est très long et de plus, notre serveur sera plus accessible aux autres utilisateurs de Gurobi. Si votre code n’est pas adapté en conséquence, le serveur pourrait ne pas pouvoir émettre de licence de façon intermittente; si ceci se produit, nous vous demanderons de mettre fin à toutes vos tâches et de corriger votre programme. Voyez comment créer un environnement pour tous vos modèles avec vos programmes en C++ ou en Python. Le même problème peut aussi survenir avec d’autres programmes qui fonctionnent en parallèle comme R, surtout quand plusieurs tâches simultanées sont soumises à l'ordonnanceur,

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 en nombre égal à celui des coeurs alloués à la tâche en générant un fichier gurobi.env dans le répertoire de travail quand vous utilisez l'interface Gurobi Python. Ceci doit être fait 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-facility.sh

#!/bin/bash
#SBATCH --account=def-group   # indiquez le nom du compte
#SBATCH --time=0-00:30        # indiquez la limite de temps (jj-hh:mm)
#SBATCH --cpus-per-task=4     # indiquez le nombre de fils
#SBATCH --mem=4G              # demandez toute la mémoire
#SBATCH --nodes=1             # ne pas modifier

#module load StdEnv/2020      # versions < 10.0.3
module load StdEnv/2023       # versions > 10.0.3

module load gurobi/11.0.1

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.
Avant de commencer, il faut décider quelle combinaison des versions Gurobi et Python nous voulons utiliser. La liste suivante montre les versions de Python supportées par les versions principales de Gurobi dans les environnements standards (StdEnv).

[name@server ~] module load StdEnv/2016; module load gurobi/8.1.1; cd $EBROOTGUROBI/lib; ls -d python*
python2.7  python2.7_utf16  python2.7_utf32  python3.5_utf32  python3.6_utf32  python3.7_utf32
 
[name@server ~] module load StdEnv/2020; module load gurobi/9.5.2; cd $EBROOTGUROBI/lib; ls -d python*
python2.7_utf16  python2.7_utf32  python3.10_utf32  python3.7  python3.7_utf32  python3.8_utf32  python3.9_utf32

[name@server ~] module load StdEnv/2023; module load gurobi/10.0.3; cd $EBROOTGUROBI/lib; ls -d python*
python3.10_utf32  python3.11_utf32  python3.7  python3.7_utf32  python3.8_utf32  python3.9_utf32

[name@server ~] module load StdEnv/2023; module load gurobi/11.0.1; cd $EBROOTGUROBI/lib; ls -d python*
python3.11

Installer Gurobi pour Python

As mentioned near the end of this official document How-do-I-install-Gurobi-for-Python, the previously recommended method for installing Gurobi for Python with setup.py has been deprecated to only be usable with Gurobi 10 versions (and older). Therefore, a new section has been added below which shows how to simultaneously download a compatible binary wheel from pypi.org and convert it into a format usable with the newly recommended command to install Gurobi for Python with Gurobi 11 versions (and newer).

Versions Gurobi 10.0.3 et moins récentes

Il faut suivre les étapes suivantes une fois sur chaque système avec StdEnv2023 et moins récents. Chargez d'abord les modules pour créer l'environnement virtuel, puis activez cet environnement.

[name@server ~] $ module load gurobi/10.0.3 python
[name@server ~] $ virtualenv --no-download  ~/env_gurobi
[name@server ~] $ source ~/env_gurobi/bin/activate

Installez les paquets que vous voulez utiliser, ici pandas. Par exemple

(env_gurobi) [name@server ~] $ pip install --no-index  pandas

Installez maintenant gurobipy dans l'environnement. À partir de StdEnv/2023, il n'est plus possible de l'installer dans $EBROOTGUROBI avec la commande python setup.py build --build-base /tmp/${USER} install, ce qui causerait une erreur fatale et le message error: could not create 'gurobipy.egg-info': Read-only file system. Copiez les fichiers ailleurs (par exemple dans /tmp/$USER) où l'installation sera faite, comme ci-dessous :

Instead the required files need to copied to elsewhere (such as /tmp/$USER) and installed from there, for example:

(env_gurobi) [name@server ~] $ mkdir /tmp/$USER
(env_gurobi) [name@server ~] $ cp -r $EBROOTGUROBI/{lib,setup.py} /tmp/$USER
(env_gurobi) [name@server ~] $ cd /tmp/$USER
(env_gurobi) [name@server ~] $ python setup.py install
(env_gurobi) [roberpj@gra-login1:/tmp/roberpj] python setup.py install
/home/roberpj/env_gurobi/lib/python3.11/site-packages/setuptools/_core_metadata.py:158: SetuptoolsDeprecationWarning: Invalid config.
!!

        ********************************************************************************
        newlines are not allowed in `summary` and will break in the future
        ********************************************************************************

!!
  write_field('Summary', single_line(summary))
removing /tmp/roberpj/build
(env_gurobi) [roberpj@gra-login1:/tmp/roberpj]
(env_gurobi) [name@server ~] $ deactivate
[name@server ~]


Versions Gurobi 11.0.0 (et plus récentes)

Once again, the following steps need to be done once per system and are usable with StdEnv/2023 and older. First load the modules to create the virtual environment and activate it. Version 11.0.0 is skipped since it has been observed to seg fault in at least one example versus Version 11.0.1 which runs smoothly.

[name@server ~] $ module load gurobi/11.0.1 python
[name@server ~] $ virtualenv --no-download  ~/env_gurobi
[name@server ~] $ source ~/env_gurobi/bin/activate

As before, install any needed Python packages. Since the following matrix example requires numpy, we install the pandas package:

(env_gurobi) [name@server ~] $ pip install --no-index  pandas

Next install gurobipy into the environment. As mentioned above and in [article] the use of setup.py to install Gurobi for python is deprecated starting with Gurobi 11. Both pip and conda are given as alternatives; however, since conda should not be used on alliance systems, the pip approach will be demonstrated here. The installation of gurobipy is slightly complicated since our Linux systems are set up with gentoo prefix. As a result neither A) the recommended command to download and install the gurobipy extension from the public PyPI server pip install gurobipy==11.0.1 mentioned in the article line or B) the offline command to install the wheel with python -m pip install --find-links <wheel-dir> --no-index gurobipy, will work. Instead a script available from the alliance maybe utilized to download and simultaneously convert the existing wheel into a usable format with a new name. There is one caveat, for each new Gurobi version the researcher must go into https://pypi.org/project/gurobipy/11.0.1/#history and click on the desired version followed by the Download files button located in the menu on the left. Finally, click to copy the https link for the wheel file (named gurobipy-11.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl in the case of Gurobi 11.0.1) and paste it as the --url argument as shown below :

(env_gurobi) [name@server ~] $ wget https://raw.githubusercontent.com/ComputeCanada/wheels_builder/main/unmanylinuxize.sh
(env_gurobi) [name@server ~] $ chmod u+rx unmanylinuxize.sh
(env_gurobi) [name@server ~] $ ./unmanylinuxize.sh --package gurobipy --version 11.0.1 --url 
https://files.pythonhosted.org/packages/1c/96/4c800e7cda4a1688d101a279087646912cf432b0f61ff5c816f0bc8503e0/gurobipy-11.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
(env_gurobi) [name@server ~] $ ls
gurobipy-11.0.1-cp311-cp311-linux_x86_64.whl  unmanylinuxize.sh
(env_gurobi) [name@server ~] $ python -m pip install --find-links $PWD --no-index gurobipy
(env_gurobi) [name@server ~] $ deactivate
[name@server ~]


Travailler dans l'environnement avec Gurobi

Nous pouvons maintenant activer notre environnement Gurobi avec

[name@server ~] $ module load gurobi/11.0.1 scipy-stack
  source ~/env_gurobi/bin/activate
  (env_gurobi) [name@server ~]


Les scripts Python comme les exemples fournis avec le module gurobi peuvent alors être exécutés dans l'environnement virtuel avec Python.

(env_gurobi) [name@server ~] $ python $EBROOTGUROBI/examples/python/matrix1.py


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


Soumettez le script dans la queue avec sbatch my_slurm_script.sh.


File : my_slurm_script.sh

#!/bin/bash
#SBATCH --account=def-somegrp  # indiques le nom du compte
#SBATCH --time=0-00:30         # indiquez la limite de temps (jj-hh:mm)
#SBATCH --nodes=1              # utiliser un (1) nœud
#SBATCH --cpus-per-task=4      # indiquez le nombre de CPU
#SBATCH --mem=4000M            # demandez toute la mémoire

module load StdEnv/2023
module load gurobi/11.0.1
# module load scipy-stack      # uncomment if needed

echo "Threads ${SLURM_CPUS_ON_NODE:-1}" > gurobi.env

source ~/env_gurobi/bin/activate
python my_gurobi_script.py


Pour plus d'information sur la création et l'utilisation des environnements virtuels Python, voir Créer un environnement virtuel dans vos tâches.

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?