Open Vayel opened 6 years ago
Tout mettre dans un seul script :
# On a réservé MAX_N_SLAVES+1 machines et on connait leurs addresses via $OAR_FILE_NODES
MAX_N_SLAVES = ...
MIN_N_SLAVES = 15 # à vérifier, marqué dans le sujet
master = OAR_FILE_NODES[0]
slaves = OAR_FILE_NODES[1:]
configure_slaves(slaves) # Install Go and compile the sources for slave
configure_master(master) # Install Go and compile the sources for master
machines = {}
# Récupère la description des machines
for addr in chain(master, slaves):
machines[addr] = get_machine_infos(addr) # distrib linux, version du kernel... cf. premier message
# Nombre d'expérience faites pour un nombre d'esclaves fixé
N_REP = ...
measures = {}
# Sequential time
seq_machine = 'addr'
measures[0] = {
'master': seq_machine,
'measures': [parse_measure(run_seq(seq_machine)) for _ in range(N_REP)]
}
# Distributed times
N_SLAVES_STEP = ...
for n_slaves in range(MIN_N_SLAVES, MAX_N_SLAVES + 1, N_SLAVES_STEP):
measures[n_slaves] = {
'master': master,
'slaves': slaves[:n_slaves],
'master_exec_times': [parse_measure(run_para(master, slaves[:n_slaves])) for _ in range(N_REP)]
# TODO: stocker les autres mesures prises sur les esclaves
}
import json
with open('machines.json', 'w') as f:
json.dump(machines, f)
with open('measures.json', 'w') as f:
json.dump(measures, f)
On mesure :
main
tournemaster
Effectivement le temps total slave
ne sert pas forcément, ça dépend de ce qu'on veut plot.
@Vayel Pour les temps incohérents, le mieux serait d'en réserver 50 au départ, et de mesurer avec les 10 premiers, puis les 20 premiers... Car je suis pas sûr qu'on puisse choisir quels noeuds on veut réserver
@Mean-Street oui, c'est ce que je dis au tout début :
Démarrer le maximum de noeuds dont on aura besoin (N+1) et les configurer
Par contre, je ne compris pas ce que tu veux dire par "mesurer avec les 10 premiers, puis les 20 premiers...". Pour moi, si on fait nos expériences avec au plus 20 esclaves, on réserve 21 noeuds, on fixe le maître puis on lance une expérience avec le premier esclave seulement, puis les deux premiers, puis les trois premiers... jusqu'à avoir les 20.
@Vayel Oui c'est ce que je voulais dire, mais de 10 en 10 au lieu de 1 en 1 (en fait le prof impose un minimum de 15 machines dans le sujet, donc on peut partir de 15 et augmenter de 5 en 5 ou de 10 en 10)
@Mean-Street ouep, t'as raison. Du coup, dans le script Python au-dessus, measures
n'est plus un tableau mais un dictionnaire dont les clés sont le nombre d'esclaves.
@PiggyGenius j'ai commencé le script (test.py
à la racine). Pourras-tu le compléter avec tes scripts shell ? Jette un oeil au module Python subprocess
pour exécuter du bash depuis Python.
@Vayel Pourquoi tu as besoin de connaître les adresses des machines master et slave dans ton script Python ? On pas juste laisser ça dans les scripts de Ludo et les appeler en l'état ? Sinon, c'est quoi l'intérêt de faire du Python en fait ? Pourquoi pas un script shell simplement ?
@Vayel De plus, pourquoi t'as différencié le séquentiel du parallèle ? Le séquentiel, c'est juste parallèle avec un seul slave, non ?
@Mean-Street
Pourquoi tu as besoin de connaître les adresses des machines master et slave dans ton script Python ? On pas juste laisser ça dans les scripts de Ludo et les appeler en l'état ?
Si tu ne connais pas les adresses, comment tu récupères les caractéristiques des machines et détermine à l'expérience N quels noeuds tu utilises ?
Sinon, c'est quoi l'intérêt de faire du Python en fait ? Pourquoi pas un script shell simplement ?
Bonne chance pour générer du JSON en bash. Mais je n'ai rien contre si tu veux le réécrire en shell. :)
De plus, pourquoi t'as différencié le séquentiel du parallèle ? Le séquentiel, c'est juste parallèle avec un seul slave, non ?
Non, en séquentiel tu as une seule machine.
@Vayel
Si tu ne connais pas les adresses, comment tu récupères les caractéristiques des machines et détermine à l'expérience N quels noeuds tu utilises ?
On s'en fout, on veut juste le nombre de noeuds non ? Si on veut les specs des machines, on va refaire un taktuk dessus au pire.
Non, en séquentiel tu as une seule machine.
La même machine joue le rôle du master et du slave alors ? Si oui, ça change toujours pas la compilation, on va juste mettre la même machine et un port différent lors du launch_slave.
Bonne chance pour générer du JSON en bash. Mais je n'ai rien contre si tu veux le réécrire en shell. :)
Je galère avec subprocess à ne pas être bloqué par launch_master mais à attendre qu'il finisse pour lire mes fichiers de logs.
On peut faire un appel Skype si t'es dispo, Piggy est partant
Il nous faut trois scripts :
Configuration : Démarrer le maximum de noeuds dont on aura besoin (N+1) et les configurer
Exécution : Pour n de 1 à N :
plot_types.sh
)Attention : il est possible d'avoir des temps incohérents si on ne fait pas attention au type des machines. Par exemple, si on fait nos mesures avec n=3 machines très puissantes et proches sur le réseau, on risque d'obtenir un temps d'exécution moindre qu'avec n=4 machines peu puissantes et sur des sites différents. Il faut donc, quand on passe de n à n+1 machines, toujours conserver les n utilisées précédemment et en ajouter une à l'ensemble, plutôt que d'en retirer n+1 au sort.
Structure du dossier de mesures
Il contiendra deux fichiers :
machines.json
measures.json
machines.json
measures.json
Question : stocke-t-on que le temps d'exécution total dans les mesures ? @Mean-Street que mesures-tu ?
L'indice dans le tableau correspond au nombre d'esclaves. Quand il vaut 0, le temps est celui du programme séquentiel.