La Science Ouverte : Comment assurer la reproductibilité des traitements numériques ?
Changements de pratique
Jusqu'à 2015, utilisation de module
Mais des gênes se font sentir :
Isolation par rapport au système hôte, à l'exécution ET à la construction
Maintenance (arbre des dépendances bien géré), reproductibilité (version unique d'un paquet - src, compilation, desc, déf,...- a la même sortie où que ce soit), portabilité
Complètement fonctionnel en espace utilisateur
Workflow automatisé : paquets custom, rebuilds automatiques, du PC perso aux clusters, CI
OS-indépendant
Installation de Nix en 2015 puis GUIX en 2018.
Les gestionnaires de paquets fonctionnels :
module
Un commit précis d'un channel Guix peut être vu comme un instantané (unique) du graphe de dépendances entier des dizaines de milliers de logiciels empaquetés !
À la demande de construction d'un logiciel (e.g. guix install, guix shell)
guix install
guix shell
/gnu/store
$HOME
Les commandes lancées par les utilisateurs :
$ guix pull # équivalent d'apt update $ guix upgrade # équivalent d'apt ugrade $ guix search monpaquet $ guix install monpaquet $ guix shell monpaquet # équivalent de venv mais pour toute pile logicielle $ guix pack monpaquet # création d'une image de conteneur
Si vous connaissez l'ensemble des paquets dont vous avez besoin, vous pouvez écrire un fichier manifest.scm qui contiendra les noms des paquets :
manifest.scm
(specifications->manifest (list "gcc-toolchain" "openmpi" "hdf5-openmpi"))
Pour reproduire un env.log. il faut donc le décrire le plus complètement possible. Nous avons vu auparavant le fichier manifest.scm. Il manque une information : l'état des définitions/du graphe des dépendances (≃versions).
Nous avons vu précdemment qu'en réalité que celui-ci peut être décrit par la liste des channels Guix utilisés et leur numéro de commit courant. Guix propose une commande qui regroupe toutes ces informations :
guix describe -f channels >> channels.scm
Ailleurs et/ou plus tard :
channels.scm
guix time-machine -C channels.scm -- shell -C -m manifest.scm
guix time-machine
guix
--
Pros :
venv
Cons :
Quelques recommandations
root@guix:~# grep _guixbuilder /etc/passwd _guixbuilder0:x:996:996:Guix build user 0:/var/empty:/usr/sbin/nologin _guixbuilder1:x:995:995:Guix build user 1:/var/empty:/usr/sbin/nologin _guixbuilder2:x:994:994:Guix build user 2:/var/empty:/usr/sbin/nologin _guixbuilder3:x:993:993:Guix build user 3:/var/empty:/usr/sbin/nologin _guixbuilder4:x:992:992:Guix build user 4:/var/empty:/usr/sbin/nologin _guixbuilder5:x:991:991:Guix build user 5:/var/empty:/usr/sbin/nologin _guixbuilder6:x:990:990:Guix build user 6:/var/empty:/usr/sbin/nologin _guixbuilder7:x:989:989:Guix build user 7:/var/empty:/usr/sbin/nologin _guixbuilder8:x:988:988:Guix build user 8:/var/empty:/usr/sbin/nologin _guixbuilder9:x:987:987:Guix build user 9:/var/empty:/usr/sbin/nologin
Editer /etc/systemd/system/guix-daemon.service :
/etc/systemd/system/guix-daemon.service
ExecStart=/var/guix/profiles/per-user/root/current-guix/bin/guix-daemon \ --build-users-group=guixbuild \ --listen=/var/guix/daemon-socket/socket \ --listen=0.0.0.0 # The --listen=0.0.0.0 option will make the daemon # listen to all your networks (you may restrict to some local network interface)
/gnu/store *(ro)
/var/guix *(rw, async)
/var/log/guix *(ro)
Montage des répertories Guix :
head-node:/gnu/store /gnu/store nfs defaults,_netdev,vers=3 0 0 head-node:/var/guix /var/guix nfs defaults,_netdev,vers=3 0 0 head-node:/var/log/guix /var/log/guix nfs defaults,_netdev,vers=3 0 0
$ source /applis/site/guix.sh
export GUIX_PROFILE=$HOME/.guix-profile/ export GUIX_USER_PROFILE_DIR=/var/guix/profiles/per-user/$USER export GUIX_DAEMON_SOCKET="guix://head-node" export PATH=/var/guix/profiles/per-user/root/current-guix/bin:$PATH export GUIX_LOCPATH=/var/guix/profiles/per-user/root/guix-profile/lib/locale export USERGUIXPATH=$HOME/.config/guix/current export INFOPATH="$USERGUIXPATH/share/info:$INFOPATH" source $USERGUIXPATH/etc/profile source $USERGUIXPATH/etc/bash_completion.d/guix
The very minimal should be:
Au-delà de la reproductibilité :
virtualenv
--tune
guix-jupyter
(define-public hello (package (name "hello") (version "2.12.1") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/hello/hello-"$ ".tar.gz")) (sha256 (base32 "086vqwk2wl8zfs47sq2xpjc9k066ilmb8z6dn0q6ymwj$" (build-system gnu-build-system) (synopsis "Hello, GNU world: An example GNU package") (description "GNU Hello prints the message \"Hello, world!\" and then serves as an example of standard GNU coding practices.") (home-page "https://www.gnu.org/software/hello/") (license gpl3+)))
guix import pypi --recursive nomDuPaquetPypi
2 parties dans les systèmes de conteneurs (e.g. docker, singularity):
docker
singularity
Le garbage collector de Guix va vérifier l'ensemble des profiles pour savoir quels paquets (rép. /gnu/store) ne sont plus utilisés et les supprimer.
$ guix gc
Pour tracker les librairies compromises, par exemple, pour la glibc 2.25 avant corrections :
guix gc --referrers /gnu/store/...-glibc-2.25