Folding@Home sur CentOS/RHEL 8.x

Le projet

Le principe de Folding@Home est de distribuer des calculs scientifiques sur plusieurs milliers de machines personnelles ou professionnelles dans le monde, de manière décentralisée, afin de fournir une capacité de calculs peu cher et surtout très importante.

Les calculs servent à traiter des modélisations de protéines, de génomes en vue de comprendre, développer des traitements ou vaccins de maladies comme les cancers, les maladies neurologiques, les virus… Ces traitements demandent des capacités démentielles et cette capacité décentralisée est très recherchée.

En ce moment, la capacité de calcul a considérablement augmentée pour faciliter la recherche sur le SARS-Cov-v2, le coronavirus chinois qui provoque le COVID-19. Les gamers ont des ordinateurs très puissants et la capacité GPU obtenue à partir des cartes graphiques est particulièrement recherchée. Participer au projet uniquement avec du calcul CPU ou les deux est possible également.

La puissance cumulée de ces PC reliés entre eux correspond à la somme des premiers plus gros ordinateurs au monde! Regardez par vous même!

L'actualité sur le COVID-19

Statistiques

https://stats.foldingathome.org/os

https://stats.foldingathome.org/teams-monthly

Pré-requis

passkey

Commencer par renseigner les informations suivantes pour recevoir une passkey par mail.

Obtenir une passkey

Cette passkey sert à s'assurer que votre nom d'utilisateur ne soit pas usurpé pour que vos statistiques de contributions soient bien les vôtres.

Nvidia GPU

Pour le moment nvidia n'affiche pas le support de RHEL 8 (uniquement RHEL 7). Ce qui suit fonctionne pour l'installation du driver nvidia mais pas du support complet du GPU pour le folding

Pour utiliser le GPU d'une carte nvidia : https://github.com/yurinnick/folding-at-home-docker/blob/master/docs/gpu_support.md

Installer le driver graphique nvidia pour utiliser le GPU : https://access.redhat.com/solutions/4134401

Idem pour Centos 8 : https://linuxconfig.org/redhat-8-nvidia-driver-install-guide

Installer Nvidia Container Toolkit

Methode d'installation : https://github.com/NVIDIA/nvidia-docker

Repo docker nvidia officiel : https://nvidia.github.io/nvidia-docker/

podman/systemd/rootless

Installation

Il est possible d'installer les outils directement dans votre OS en rpm.

Le concept distribué de folding at home est de déclencher depuis Internet des exécutions sur votre poste. D'un point de vue sécurité c'est un énorme problème si jamais des attaques malicieuses sont exécutées.

Pour s'assurer d'exécuter les chantiers sur votre PC en sécurité, c'est à dire le plus isolé possible de votre système, voici quelques bonnes pratiques que nous allons suivre

limiter au maximum le périmètre d'exécution dans l'OS par l'usage de l'application folding-at-home en container

le container permet aussi de ne pas installer des vieilles dépendances python2 qui ne sont plus supportées sur toutes les distributions récentes Ubuntu 20.04 ou CentOS/RHEL 8.x

usage d'un utilisateur simple non-root pour exécuter le container avec podman et dédié à cet usage (pas le même que votre utilisateur usuel). La portée des données accessible de cet utilisateur en cas de compromission sera uniquement son dossier personnel, pas le votre

Installation compatible d'un usage SELinux en enforced (activé pleinement)

Créer le container

Cette documentation se concentre sur la mise en oeuvre du container mais pas à la base de l'image officielle qui est très basique et pas simple à configurer. La communauté utilise massivement les images de containers de ce contributeur beaucoup plus simple à utiliser et mieux documentées.

Commande simple (à ne pas exécuter telle quelle) avec la liste des options possibles.

podman run \
--name folding-at-home \
-p 7396:7396 \
-p 36330:36330 \
-e USER=<your_user> \
-e TEAM=51 \
-e ENABLE_GPU=[true|false] \
-e ENABLE_SMP=true \
-e PASSKEY=<passkey> \
-e POWER=[full|medium|light] \
--detach=true \
--restart=on-failure \
yurinnick/folding-at-home:[latest|latest-nvidia]

Création du container initial. Options concrètes pour mon usage.

podman run \
--name folding-at-home \
-p 7396:7396 \
-p 36330:36330 \
-e USER=<your_user> \
-e TEAM=51 \
-e ENABLE_GPU=false \
-e ENABLE_SMP=true \
-e PASSKEY=<your_passkey> \
-e POWER=medium \
--detach=true \
--restart=on-failure \
yurinnick/folding-at-home:latest-nvidia

Par défaut podman est en rootless ce qui signifie exécution en environnement utilisateur. En conséquence, même root ne voit pas les containers exécutés depuis un simple user.

Exécution automatique systemd

La bonne approche est de créer une unit systemd utilisateur (pas root) générée par podman qui va permettre de lancer automatiquement le container au démarrage du système et l'arrêter à l'arrêt de l'OS.

La doc officielle :

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/using-systemd-with-containers_building-running-and-managing-containers

https://www.redhat.com/sysadmin/podman-shareable-systemd-services

Toutes les commandes suivantes sont à exécuter en utilisateur simple, pas root

Création du dossier initial de l'unit systemd

mkdir -p ~/.config/systemd/user

Vérifier que le container est démarré.

podman ps

Générer le fichier unit systemd avec la commande podman prévue à cet effet

podman generate systemd --name folding-at-home > ~/.config/systemd/user/folding-at-home.service

cat ~/.config/systemd/user/folding-at-home.service

# container-folding-at-home.service
# autogenerated by Podman 1.6.4
# Sun Apr 26 17:30:07 CEST 2020
[Unit]
Description=Podman container-folding-at-home.service
Documentation=man:podman-generate-systemd(1)
[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start folding-at-home
ExecStop=/usr/bin/podman stop -t 10 folding-at-home
KillMode=none
Type=forking
PIDFile=/run/user/1000/overlay-containers/b4e479b9ecc9bca287e6e42e9ab5cdf2441e9958eea530cc8aefa110628097fb/userdata/conmon.pid
[Install]
WantedBy=default.target

Attention, il faut modifier WantedBy=multi-user.target généré par défaut par WantedBy=default.target. Sinon, le container ne sera pas démarré parce qu'un utilisateur simple ne peut pas accéder à la target multi-user par defaut (root uniquement).

Stopper le container

podman stop folding-at-home

Recharger la configuration systemd utilisateur pour prise en compte du nouveau fichier d'unit

systemctl --user daemon-reload
systemctl --user status folding-at-home.service

Démarrer le container par systemd

systemctl --user start folding-at-home.service
systemctl --user status folding-at-home.service

Arrêter le container par systemd

systemctl --user stop folding-at-home.service
systemctl --user status folding-at-home.service

Vérifier que le container est bien stoppé

podman ps

Activer l'exécution de la unit systemd au démarrage

systemctl --user enable folding-at-home.service
systemctl --user status folding-at-home.service

Pour voir le traitement en cours

podman logs -f folding-at-home