220 likes | 356 Views
Analyse distribuée. Une plongée dans PyROOT et l’accès aux données : CPU et réseau. Plan :. Contexte Comment fonctionne PyROOT Ouverture et lecture des fichiers Différents environnements de travail Interactif : lappsl4 Données sur lapp_data Données sur le SE (SAM et DAS)
E N D
Analyse distribuée Une plongée dans PyROOT et l’accès aux données : CPU et réseau
Plan : • Contexte • Comment fonctionne PyROOT • Ouverture et lecture des fichiers • Différents environnements de travail • Interactif : lappsl4 • Données sur lapp_data • Données sur le SE (SAM et DAS) • Sur la grille • Jobs sur différents WN • Jobs sur même WN
Contexte : But : - Comparer CPU / réseau - Pour : - différentes localisations des données - différentes façons de travailler ( série / parallèle ) - jobs sur WN ou UI ? ROOT : • PyROOT (interface Python) • - chainage des fichiers à analyser • ( fichiers concaténés lors de leur ouverture ) • lecture de l’ensemble des fichiers • merger les fichiers pour n’en avoir que un seul • CPU mesuré = CPU utilisé pour remplir des histogrammes / données
Setup PyRoot (http://root.cern.ch/root/HowtoPyROOT.html) • Versions de ROOT: • /grid_sw/lhcb/lib/lcg/external/root • Versions de python: • /grid_sw/lhcb/lib/lcg/external/python setenv ROOTSYS /grid_sw/lhcb/lib/lcg/external/root/5.18.00d/slc4_ia32_gcc34/root setenv PYTHONDIR /grid_sw/lhcb/lib/lcg/external/Python/2.5/slc4_ia32_gcc34/ setenv PATH ${ROOTSYS}/bin:${PYTHONDIR}/bin:${PATH} setenv LD_LIBRARY_PATH ${ROOTSYS}/lib:${PYTHONDIR}/lib:${LD_LIBRARY_PATH} setenv PYTHONPATH ${ROOTSYS}/lib:${PYTHONPATH} #librairie castor ln -s ${LCG_LOCATION}/lib/libdpm.so libshift.so.2.1 setenv LD_LIBRARY_PATH ${PWD}:${LD_LIBRARY_PATH}
PyROOT • Module(s) à importer • import ROOT • from ROOT import **** (Tfile, TH1F,…) • Ouverture de fichiers • Les uns à la suite des autres • input = TFile.Open(“Name.root”) • mytree=input.Get('n1') • pas plus de 30Mo de fichiers • Chainer les fichiers et les ouvrir tous en même temps • chain = TChain('n1') • chain.Add(“Name.root”) • entries=chain.GetEntries() => Mélanger les fichiers ou autre méthode ROOT
Création d’un arbre avec une branche contenant des feuilles fNewFile = TFile("Name","Create,Recreate,…") fNewTree=TTree("Name", "Name") sBranch_struct="structcluster_t{\ Int_t size;\ Float_teX[SIZE];\ };" sClusters_struct=sClusters_struct.replace("SIZE",str()) gROOT.ProcessLine(sClusters_struct); self.Views.Branch('clusters',cluster_t,'@size/I:clusters.eX['+str(self.nPoints)+']/F') clusters.eX=array('f',range(self.nPoints)) for j in range(0,self.nPoints): clusters.eX[j]=float(self.Variables[0][0][j]) self.Views.Fill() Crée new file and new tree Crée structure branche avec feuilles Accrocher structure sur arbre Rempli variables de la branche
Script utilisé for File in sFileList: sRootName = '/lapp_data/lhcb/rospabe/Bs_JPsiEta/Prod/'+File chain.Add(sRootName) #get the entries entries=chain.GetEntries() #declaration of the variables R = array( 'l' , [0] ) chain.SetBranchAddress("R",R) BsM = defineArray( 'd' , 20000 ) chain.SetBranchAddress("BsM",BsM) nEvt=nEvt+chain.GetEntriesFast() for jentry in xrange(0,nEvt ): nb=chain.GetEntry(jentry) #loop over reconstructed Bd for j in range(0,R[0]): nBs+=1 mBs.Fill(BsM[j]/1000.) file.write("MeanHisto = "+str(mBs.GetMean())+"\n") Liste de fichiers à ouvrir concaténation dans chain Matcher les entrées Variables Remplissage histo Maximum histo
PyROOT au niveau réseau et CPU • Import ROOT et dépendances (depuis Lappsl) : • Exemple de plots que l’on va voir • CPU utilisé • Network CPU(kb) Transfert (∆b) Sleeping t(s) t(s)
Ouverture et lecture des fichiers (SE) • Ouverture fichiers a la suite : • input = TFile.Open(“rfio:…..root”) (0.4’’) • mytree=input.Get('n1') (0.1’’) • Pas plus de 30Mo de fichiers ⇒ memory leak ~13’’ CPU(kb) ~13’’ Transfert (∆b) t(s) t(s) Import ROOT Getting trees
Ouverture et lecture des fichiers (lapp_data) • Ouverture fichiers a la suite : • input = TFile.Open(/lapp_data/……root”) (0.1’’) • mytree=input.Get('n1') (0.1’’) • Pas plus de 30Mo de fichiers => Mélanger les fichiers et autre methode ROOT CPU(kb) 1.2’’ Transfert (∆b) Getting tree t(s) t(s) Getting trees
SE Accès depuis une UI de fichiers sur disque locaI / SE WN UI 710’’ Chainer les fichiers et les ouvrir en même temps avec PyROOT ( 200 fichiers : tot = 500Mo) Fichiers sur Data_Local (gpfs) ou sur le SE (rfio) du Lapp • Accès plus rapide vers Data_Local que SE • CPUmax 380MB • Réseaumax 17MB.s-1 • Réseaumax 2MB.s-1 60’’ <Débit> 9MB/s Protocoles ≠ <Débit> 0.9MB/s
SE Accès depuis une UI de fichiers sur disque locaI / SE WN UI 70’’ Un seul fichier de 500Mo (5int, 1 double, 115 float) • Accès plus rapide vers Data_Local que SE (rfio) (5’’ de différence) • CPUmax 530MB • Réseaumax 18MB.s-1 • Protocoles ≠ mais effet atténué car 1 seul fichier <Débit> 13MB/s
SE Accès depuis un WN de fichiers sur SE WN UI 710’’ 200 fichiers ou un seul fichier de 500Mo (5int, 1 double, 115 float) • Accès plus rapide avec un seul fichier que 200 • Temps ~ que depuis une UI • Temps < que depuis une UI • CPUmax 530MB • Réseaumax 17MB.s-1 • Réseaumax 5MB.s-1 50’’ <Débit> 15MB/s <Débit> 1MB/s
Tableau résumé d’accès à distance • Merger les fichiers diminue temps total car moins d’I/O • Pas d’effet de cache car le taux de renouvellement des fichiers contenus dans le cache est très élevé
SE Accès depuis une UI de fichiers sur disque local / SE WN UI • Trois étapes itératives : • copier n fichiers localement (rfcp parallélisés) analyser les n fichiers pendant copie des suivants effacer fichiers analysés
SE Conclusion WN UI • Temps rfcp >> rfio lorsque le nombre de fichiers augmente • Réseau utilisé plus optimal avec plusieurs fichiers copiés en même temps • Max du réseau interne Lapp de 1Gb/s
SE Accès depuis un WN de fichiers sur SE WN UI Closer to reality : fichiers de 1G0 • Essais avec N fois X fichiers de 1Go X.N=100 • tcalcul>ttransfert et tcalcul X =>ttot100’’/1Go si X<40 • Limitation vient du calcul ... ...
SE Résumé WN UI • Temps total pour transfert en // et calcul est équivalent qq soit le nombre de fichiers < 40 • Limitation vient du calcul
SE Accès depuis un WN de fichiers sur SE Jobs sur un même WN ( blade 4 cores) WN UI • Blade de 4 WN sortit spécialement pour ces tests (période calme : Atlas_P) • X jobs mêmes WN (X=1,2,3,4) • Travail en rfcp // • Réseau même dans 4 cas • Les jobs se pénalisent entre eux : la vitesse lecture/écriture des données sur le disque du blade est bloquante. • Max du réseau cluster WNSE 2*1Gb/s
Conclusions • en “normal” : • cpumax 500MB • <débit>: 17 et débitmax: 50MB/s • en // : pointminavec 60fichiers (200MB) • UI : débitmax = 70MB/s • WN : débitmax = 110MB/s • Fichiers 1Go : même effet (2Go en //) • Sur même WN • Transferts fichiers : même débit (100MB/s) • CPU partagées => compétition entre jobs • Limite d’accès aux données copiées sur disque du blade • Pas ce genre de problème avec des open rfio
Conclusions • Fichiers mergés plutôt que série de petits fichiers • “open rfio” plus performant que rfcp mais dépend de l’activité sur cluster • Capacités maximum du réseau Lapp interne et cluster atteint (1Gb/s) 1 Fichier de 1G0 100 fichiers de 1G0 en //
1/2/3/4 open rfio sur blade • Temps : • import root et dépendances : 11.6’’ et 0.4’’ • add chain 0’’ • getting entries : 180’’ • lecture données : 8320/8420/8830/9000’’ CPU(kb) Transfert (∆b) Working Working Getting entries t(s) t(s) Getting entries