Parallélisation d’une fonction python sur un cluster utilisant SLURM
La parallélisation des données en python peut potentiellement se faire avec Dask, mais il faut apprendre à l’utiliser. Ci-dessous, nous vous proposons une méthode alternative extrêmement simple que vous pouvez mettre en oeuvre en quelques minutes !
Les conditions préalables sont de :
– supprimer les mots de passe dans les 2 sens entre votre ordinateur et le cluster (https://superuser.com/questions/8077/how-do-i-set-up-ssh-so-i-dont-have-to-type-my-password)
– créer un environnement conda sur le cluster, conda_env, compatible avec un environnement en local, en particulier au niveau de la version des pickles.
– créer un répertoire /home/{user_name}/modules sur le cluster
Ensuite, la première étape est de copier le répertoire XXXX à l’aide de la commande:
git clone git@github.com:XXXX.git
Dans votre notebook, il faut ajouter la ligne suivante pour accéder aux fonctions du module cluster.
sys.path.insert(0, f"/home/krezel/Documents/Programmes/Github")
from tools_PKL.cluster import *
Vous disposez maintenant du décorateur do_on_cluster permettant de transformer une fonction f0 en une fonction f0_on_cluster réalisant une parallélisation des données appliquées à f0 sur cluster.
Afin de travailler avec les mêmes versions sur votre ordinateur et sur le cluster, vous devez également indiquer le chemin des modules que vous souhaitez mettre à jour.
Exemple 1: Création d’une fonction get_Lmol_3D_from_Lsmile_on_cluster
à partir d’une fonction get_mol_3D_from_smile
permettant de transformer un smiles (représentation 1D d’un molécule) en un objet molécule en 3D.
@do_on_cluster(
f0=get_mol_3D_from_smile,
user_cluster="krezel",
IP_cluster="192.168.11.17",
conda_env="py_3_9",
Lmodule_to_update=[
f"/home/pkrezel/Documents/Programmes/Github/tools_PKL",
f"/home/pkrezel/Documents/Programmes/Gitlab/tools_SBC",
f"/home/pkrezel/Documents/Programmes/Gitlab/F2D",
f"/home/pkrezel/Documents/Programmes/Gitlab/xScav"
],
)
def get_Lmol_3D_from_Lsmile_on_cluster(Lmol):
pass
Vous pouvez maintenant lancer sur le cluster la transformation d’une liste de SMILES, Lsmile, en une liste de molécules 3D:
Lmol = get_Lmol_3D_from_Lsmile_on_cluster(Lsmile)
Exemple 2: Optimisation d’une molécule au sein d’un site d’une proteine.
@do_on_cluster(
s1_py = f"""
import os, sys
# =============================================================================
from tools_SBC.logging_SBC import (set_log, logger)
from tools_PKL.basic import (dump_var, get_line_n_in_file, move_file, touch,
remove_file, remove_Lfile, ya, yapa)
# =============================================================================
from tools_SBC.rdkit_SBC import (create_sdf_from_Lmol, load_Lmol)
from tools_SBC.smina_SBC import minimize_sdf_with_smina_core
# =============================================================================
i_line = int(sys.argv[1])
file = get_line_n_in_file("Ls.txt", i_line)
Lmol = load_var(file)
sdf = file.replace(".p", ".sdf")
sdf_out = sdf.replace(".sdf", "_minimized.sdf")
sdf = create_sdf_from_Lmol(Lmol,sdf)
# ------------------------------------------------------------------------------
minimize_sdf_with_smina_core(
sdf,
sdf_out=sdf_out,
dmax_from_Mp_site=4,
protein="protein",
cmd_smina="smina.static",
)
Lmol_min = load_Lmol(sdf_out)
remove_Lfile([sdf, sdf_out, file])
dump_var(Lmol_min, f"dir_Lres/{{file}}")
""",
Dcluster=Dcluster,
with_GNU_parallel=True,
ref="minimize_with_smina",
level="INFO", # the logging level on the cluster
nLmin_by_job=40, # Number min of cases to treat by job
ncore_max=80, # number max of core to use
njob_max=1000,
Lmodule_to_update=[
f"/home/{user_local}/Documents/Programmes/Github/tools_PKL",
f"/home/{user_local}/Documents/Programmes/Gitlab/tools_SBC",
f"/home/{user_local}/Documents/Programmes/Gitlab/F2D",
f"/home/{user_local}/Documents/Programmes/Gitlab/xScav"
],
LTvar_to_copy=["protein.pdb"],
)
def get_Lmol_minimized_with_smina_on_cluster(
Lmol
):
logger.info("get_Lmol_minimized_with_smina_on_cluster")
Ici, on suppose que la fonction permettant de minimisation une liste de molécules n’existe pas. Il faut donc écrire le code python qui va être appliqué en parallèle sur le cluster. Contrairement au cas précédent, nous devons copier des fichiers (où des variables dans d’autres cas) et on l’indique dans LTvar_to_copy.
Ainsi en se mettant dans le répertoire contenant le bon fichier “protein.pdb”, il est possible de minimiser une liste de molécules sur le cluster de la façon suivante:
Lmol_minimized = get_Lmol_minimized_with_smina_on_cluster(Lmol)