Entries tagged “numpy”

Formations Python : la fiche du débutant

written by ccomb, on Sep 29, 2010 10:58:00 PM.

alterway formation

Des formations

Pendant tout le mois de juin, et dans le cadre de mon boulot à Alter Way, j'ai eu l'occasion de donner des formations sur Python. Tout d'abord, deux sessions de trois jours au JRC (Joint Research Center), le Centre de recherche de la Commission Européenne à Ispra, en Italie. C'est au bord du Lac Majeur, la région est magnifique. Cette formation, en anglais, s'adressait à des chercheurs désireux d'apprendre Python pour des usages scientifiques très variés : analyse d'images satellites, calcul sur des procédés chimiques, nucléaires, cartographiques, etc.

Joint Research Center

Il a donc fallu en trois jours enseigner Python, depuis les bases jusqu'au calcul numérique avec NumPy, pour leur permettre d'aborder SciPy, la grosse bibliothèque de calcul scientifique, ou des outils de visualisation comme Matplotlib ou Mayavi. Pas facile, d'autant plus que les niveaux étaient très différents : certains n'avaient jamais écrit une ligne de code, d'autres faisaient couramment du Java... L'objectif était donc de les rendre autonomes, afin qu'ils sachent trouver l'information eux-mêmes, soit sur le web, soit dans l'interpréteur Python, mais aussi qu'ils comprennent l'esprit de ce langage (et notamment, message à ceux qui font du Java, qu'on est pas obligé d'écrire systématiquement des classes et de faire de la programmation objet).

J'ai également effectué une session de 9 jours pour l'équipe de l'Assemblée Nationale, dont l'objectif était de maîtriser la programmation du CMS Plone 4. Et aujourd'hui, programmer Plone, ça veut dire maîtriser une pile de technologies assez impressionnante. Plone est un outil de gestion de contenu en ligne (un CMS) qui existe depuis 10 ans, et qui a suffisamment muri et évolué pour devenir l'un des CMS open-source les plus aboutis du marché. Très convivial pour l'utilisateur, facile à installer et à personnaliser pour un intégrateur suffisamment formé, mais relativement ardu pour le développeur qui doit comprendre les principes de Zope 2, ceux de Zope 3 et de la ZCA, les vieilles couches spécifiques à Plone comme le CMF ou Archetypes, les nouvelles couches comme Dexterity ou Grok, et évidemment les notions liées au CMS lui-même comme les workflows, les techniques d'authentification ou de cache. Ça fait beaucoup, mais tout n'est pas forcément nécessaire au début. Le minimum consiste à savoir créer une skin, un portlet, et un type de contenu. Grâce aux templates Paste fournis par ZopeSkel, ceci peut se faire en 10 minutes. Une chose est sûre, il vaut mieux chercher à comprendre les notions de manière vraiment isolée : Python tout seul, Buildout tout seul, Paster tout seul, Zope 2 tout seul, la ZCA toute seule, etc. Si on apprend en mélangeant tout d'un coup, c'est ingérable. Mais au final, ces technos permettent de créer des applications extrêmement complexes et puissantes, de manière propre, et avec une bonne pérennité. On trouve pas mal de Plone en service dans des entreprises ou administrations, qui tournent depuis des années, parfois avec très peu de maintenance... Et avec la sortie récente de Plone 4, on atteint un niveau de performance excellent.

La fiche du débutant

Lac Majeur

Lors de ces formations, notamment en Italie, j'ai été confronté à des gens dont la programmation n'est pas le métier. Certains avaient du mal à comprendre même la notion de variable, ou le fonctionnement d'un terminal. Dans ces conditions, comprendre la syntaxe du langage en trois jours est possible, mais faire des exercices en retenant par coeur toutes les notions ne l'est pas. Pourtant Python est très homogène, très lisible, et certainement l'un des langages les plus faciles à apprendre. Il est donc nécessaire de disposer d'une fiche mémo qui récapitule toutes les notions de base de manière classifiée, surtout sans être exhaustif : les types de bases, leur écriture littérale, les opérateurs, les différentes notations disponibles, etc. Le simple fait de visualiser une notation permet de se rappeler les explications. Pendant les formations, je résumais tout ceci au tableau, afin que ça reste en permanence visible. À l'occasion des conférences PyCon FR 2010, pour l'atelier d'introduction à Python, j'ai trouvé utile de reproduire tout ceci sur une fiche au format A5 et de le distribuer aux participants. J'ai eu des retours globalement positifs et le résultat peut être téléchargé ci-dessous, sous licence Creative Commons By SA. La licence est donc suffisamment souple pour que vous puissiez le réutiliser à volonté selon vos besoins :

Python Fiche Débutant

Cliquez simplement sur l'image pour télécharger le PDF. Si vous souhaitez modifier la fiche, vous pouvez aussi télécharger le fichier source au format SVG.

Benchmark filesystem dedibox v1, v2, v3, sur Ubuntu et Debian

written by ccomb, on Aug 14, 2010 11:00:00 PM.

Debian

update : voir aussi la 2ème partie de cet article

J'ai commandé récemment trois dedibox v3 : deux pour l'AFPY, une pour Gorfou, afin de remplacer les anciennes. Cette dedibox v3 est sortie il y a peu, et semble à première vue être intéressante : pour deux fois moins cher, on a plus de mémoire vive, plus d'espace disque, un CPU plus rapide, avec 64bits et virtualisation, et plus de bande passante. J'ai réalisé que j'avais accès aux trois générations de dedibox : les deux serveurs principaux AFPY et Gorfou sont des dedibox v1, et le serveur secondaire de l'AFPY, qui servait pour les buildbots, est une dedibox v2 (mise à disposition par Toonux).

J'en ai profité pour lancer un test de filesystem en utilisant iozone.

Voici les machines utilisées :

nom génération système archi syst. fichiers
py dedibox v1 Debian Lenny 5.0 32 buts ext3
cody dedibox v1 Ubuntu 10.04 Lucid 32 bits ext3
boa dedibox v2 Debian 5.0 Lenny 32 bits ext3
nouvelle cody dedibox v3 Ubuntu 10.04 Lucid 64 bits ext3
nouvelle boa dedibox v3 Ubuntu 10.04 Lucid 64 bits ext3
nouvelle py dedibox v3 Debian 6.0 Squeeze 64 bits ext3

J'ai juste lancé « iozone -a » (mode automatique) deux fois sur chaque serveur (1 seule fois sur cody).

Le résultat de iozone est un grand tableau de nombres illisible. Plutôt que d'ouvrir le résultat dans OpenOffice, j'ai trouvé que c'était une bonne occasion de jouer avec NumPy et Matplotlib pour extraire les données et tracer des résultats comparatifs en 3D.

Je tiens à signaler que les mesures n'ont pas été faites dans des conditions idéales, et que je n'ai pas cherché à modifier les options d'iozone. Si vous voulez comprendre les valeurs, reportez-vous à la doc d'iozone.

Voici les résultats :

Comparatif Dedibox V1 / V2 / V3

Lecture

En lecture, la dedibox v3 est la plus rapide des trois, il n'y a aucun doute.

/static/bench1/read.png /static/bench1/reread.png /static/bench1/random_read.png /static/bench1/bkwd_read.png /static/bench1/stride_read.png /static/bench1/fread.png
/static/bench1/freread.png

Écriture

En écriture, c'est un peu moins clair : la dedibox v3 est plus rapide dans 4 tests sur 6.

/static/bench1/write.png /static/bench1/rewrite.png /static/bench1/random_write.png /static/bench1/record_rewrite.png /static/bench1/fwrite.png
/static/bench1/frewrite.png

Comparatif Ubuntu / Debian

Voyons maintenant la différence entre Debian et Ubuntu. Ici les machines sont censées être les mêmes, sont toutes les deux vides et non utilisées, et sont installées avec les dernières versions de Debian 6.0 et Ubuntu 10.04. Les noyaux sont tous les deux des 2.6.32.

On note une très forte différence entre les deux : la machine sous Debian est beaucoup plus rapide.

Lecture

/static/bench2/read.png /static/bench2/reread.png /static/bench2/random_read.png /static/bench2/bkwd_read.png /static/bench2/stride_read.png /static/bench2/fread.png
/static/bench2/freread.png

Écriture

Bizzare, mais même constat, la dedibox sous Debian est en moyenne une fois et demi plus rapide que celle avec Ubuntu.

/static/bench2/write.png /static/bench2/rewrite.png /static/bench2/random_write.png /static/bench2/record_rewrite.png /static/bench2/fwrite.png
/static/bench2/frewrite.png

Je me garderai de faire des commentaires, vu les conditions dans lesquelles ces tests ont été réalisés, mais ça mériterait de creuser un peu...

Script d'extraction

Si vous voulez reproduire les grahiques, voici comment faire.

Il faut récupérer la sortie de « iozone -a » en ne gardant que le tableau, puis changer l'en-tête du tableau pour qu'il tienne sur une seule ligne, et sauver ça dans un fichier texte. Ensuite il faut installer Matplotlib 1.0. La version 0.99 fournie avec Ubuntu 10.04 ne convient pas, il faut compiler la version 1.0. Je vous laisse le doux plaisir de découvrir les dépendances à installer

$ virtualenv sandbox
$ sandbox/bin/pip install  install http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0/matplotlib-1.0.0.tar.gz/download

Ensuite voici le script qui a permis d'extraire et tracer les données, que j'appelle bench.py :

#!/usr/bin/env python
# coding: utf-8
import sys
import pylab, numpy as np
from numpy import log2
from mpl_toolkits.mplot3d import axes3d

tests = {}

files = sys.argv[1:]
pylab_colors = ('r', 'g', 'b', 'y', 'm', 'y', 'k')
assert len(files) <= len(pylab_colors)
colors = dict([(f, pylab_colors[i]) for i, f in enumerate(files)])

for k, filename in enumerate(files):
    with open(filename) as f:
        tests[filename] = {}
        tests[filename]['titles'] = f.readline().split()[2:]
    tests[filename]['raw'] = np.loadtxt(filename, dtype=int, skiprows=1)
    for i, testname in enumerate(tests[filename]['titles']):
        tests[filename][testname] = {}
        data = tests[filename][testname]['data'] = np.zeros((20, 15))
        data[:] = np.nan
        raw = tests[filename]['raw']
        data[log2(raw[:,0]).astype(int), log2(raw[:,1]).astype(int)] = raw[:, i+2]
        data /= 1024.0
        tests[filename][testname]['mean'] = data[-np.isnan(data)].mean()
        tests[filename][testname]['max'] = data[-np.isnan(data)].max()


axes = {}
X, Y = np.mgrid[0:20,0:15]
for testname in tests.values()[0]['titles']:
    ax = axes3d.Axes3D(pylab.figure())
    ax.w_xaxis.set_ticks(range(3,21,2))
    ax.w_yaxis.set_ticks(range(2,15,2))
    ax.w_xaxis.set_ticklabels(2**np.arange(3,21,2))
    ax.w_yaxis.set_ticklabels(2**np.arange(2,15,2))
    ax.set_xlabel('kB')
    ax.set_ylabel('reclen')
    ax.set_zlabel('MB/s')
    means = dict([(filename, tests[filename][testname]['mean']) for filename in files])
    maxs = max([tests[filename][testname]['max'] for filename in files])
    ax.text(X.min(), 15, maxs, 'test: ' + testname, color='k')
    for i, filename in enumerate(sorted(means, key=lambda x:-means[x])):
        i+=1
        Z = tests[filename][testname]['data']
        c = colors[filename]
        ax.plot_wireframe(X, Y, Z, color=c)
        ax.text(X.min(), 15, maxs*(1-0.07*i),
                str(int(means[filename])) + " MB/s : " + filename, color=c)
    #pylab.gcf().set_size_inches(6,4)
    pylab.savefig(testname + '.png')

pylab.show()

Pour le lancer avec la nouvelle version de matplotlib, il suffit d'utiliser le Python de la sandbox. Le script prend en paramètres les fichiers contenant les résultats iozone

$ ./sandbox/bin/python bench.py resultat1.txt resultat2.txt resultat3.txt

Il est possible d'écrire un script beaucoup plus propre, mais je voulais juste m'obliger à le faire avec Numpy et Matplotlib et sans y passer trop de temps non plus. Notez qu'une des lignes du script utilise une affectation grâce au Fancy Indexing de Numpy:

data[log2(raw[:,0]).astype(int), log2(raw[:,1]).astype(int)] = raw[:, i+2]

test