Vayel / go-make

0 stars 1 forks source link

Automatiser les tests #12

Open Vayel opened 6 years ago

Vayel commented 6 years ago

Il nous faut trois scripts :

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

{
  "<id_machine1>": {
    "inux_version": "...",
    "kernel_version": "...",
    "compiler_version": "..." // C'est marqué sur Teide mais je ne sais pas à quoi ça correspond
  },
  "<id_machine2>": {
    // ... 
  },
  // ...
}

measures.json

Question : stocke-t-on que le temps d'exécution total dans les mesures ? @Mean-Street que mesures-tu ?

[
  {
    "master": "id_fichier_machines.json",
    "slaves": [], // Liste d'id du fichier machines.json
    "measures": [<temps_execution_total1>, <temps_execution_total2>, ...]
  },
  // ...
]

L'indice dans le tableau correspond au nombre d'esclaves. Quand il vaut 0, le temps est celui du programme séquentiel.

Vayel commented 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)
mean-street commented 6 years ago

On mesure :

Effectivement le temps total slave ne sert pas forcément, ça dépend de ce qu'on veut plot.

mean-street commented 6 years ago

@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

Vayel commented 6 years ago

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

mean-street commented 6 years ago

@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)

Vayel commented 6 years ago

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

Vayel commented 6 years ago

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

mean-street commented 6 years ago

@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 ?

mean-street commented 6 years ago

@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 ?

Vayel commented 6 years ago

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

mean-street commented 6 years ago

@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