Traitement distribué Python Spartan

Cet article s'adresse à ceux qui souhaitent un traitement distribué avec Python.

Je pense que beaucoup de gens disent que les images python sont lentes.

Des bibliothèques telles que cython ont été publiées pour dissiper cette image, mais cette fois, je présenterai le traitement distribué comme l'une des méthodes pour accélérer python.

Parlant de représentant du traitement distribué.

・ Hadoop ・ Étincelle

est.

Cette fois, je voulais simplement appliquer Spark à python ... Dans l'article ci-dessous, il a été indiqué que la conversion des structures de données JVM et Python se produirait plusieurs fois et que la latence augmenterait, donc ce ne serait pas trop rapide.

http://codezine.jp/article/detail/8484

python spark.png

En regardant la structure de la figure ci-dessus, j'ai l'impression qu'il existe de nombreuses parties qui acheminent les données avec Spark Worker, et qui peuvent devenir un goulot d'étranglement si un traitement distribué est effectué.

Spartan

https://github.com/spartan-array/spartan

Par conséquent, cette fois, le traitement des données en Python peut être accéléré en utilisant une structure de données matricielle appelée NumPy, donc une bibliothèque créée par un projet appelé Spartan, qui est une tentative de distribuer des matrices Numpy comme le RDD de Spark, est utilisée. J'ai décidé de l'utiliser.

Cela ne fonctionnait pas bien sauf s'il s'agissait de la série spython2 en raison de la bibliothèque de dépendances. La prise en charge de la série python3 est souhaitée.

Si vous êtes une personne de type python3, vous pouvez utiliser virtualenv ou pyenv, veuillez donc utiliser un environnement de type 2.

Présentation de la bibliothèque

Ensuite, c'est une procédure de construction d'environnement. (Je ne l'ai essayé que sur Mac)

Préparez required.txt comme indiqué ci-dessous et installez-le avec pip install -r requirements.txt.

numpy
chainer==1.1.2
ipython==4.0.0
notebook==4.0.4
jinja2==2.8
pyzmq==14.7.0
tornado==4.1
scipy
dsltools
cython
parakeet
scikit-learn
traits
psutil

Installation

git clone https://github.com/spartan-array/spartan.git
cd spartan
python setup.py develop

L'installation est terminée ci-dessus.

Cependant, des paramètres supplémentaires étaient nécessaires pour l'utiliser sur un Mac.

spartan/worker.py

Vous devez modifier le fichier python ci-dessus.

Dans l'état par défaut

psutil.TOTAL_PHYMEM
psutil.NUM_CPUS

2 ne sont pas définis et une erreur se produira, donc

    ret = psutil.virtual_memory()
    num_cpus = psutil.cpu_percent()
    psutil.TOTAL_PHYMEM = ret.total
    psutil.NUM_CPUS = num_cpus

Il peut être défini en ajoutant ce qui précède avant la ligne du programme ci-dessous. Ce qui est défini est la quantité de mémoire virtuelle et de CPU utilisées. psutil est un programme qui peut ajuster et gérer l'utilisation de la mémoire et du processeur, donc si vous voulez en savoir plus, veuillez voir ci-dessous.

https://github.com/giampaolo/psutil

De plus, si les paramètres d'environnement sont définis pour n'utiliser qu'un seul, veuillez les définir à partir du site suivant.

http://jesperrasmussen.com/2013/03/07/limiting-cpu-cores-on-the-fly-in-os-x/

    self.worker_status = core.WorkerStatus(psutil.TOTAL_PHYMEM, 
                                           psutil.NUM_CPUS,
                                           psutil.virtual_memory().percent,
                                           psutil.cpu_percent(),
                                           time.time(),
                                           [], [])

Faisons en sorte que cela fonctionne.

Écrivez le programme de régression linéaire suivant avec le nom «lreg.py».

import spartan as sp
sp.initialize()

N_DIM = 10
N_EXAMPLES = 1000 * 1000
EPSILON = 1e-6

x = 100 * sp.ones((N_EXAMPLES, N_DIM)) + sp.rand(N_EXAMPLES, N_DIM)
y = sp.ones((N_EXAMPLES, 1))

# put weights on one server
w = sp.rand(N_DIM, 1)

for i in range(50):
    yp = sp.dot(x, w)
    diff = x * (yp - y)
    grad = sp.sum(diff, axis=0).reshape((N_DIM, 1))
    w = w - (grad / N_EXAMPLES * EPSILON)
    print grad.sum().glom()

Utilisez la commande suivante.

python lreg.py --log_level=WARN

Lorsqu'il est exécuté, il est plein et consomme du processeur et de la mémoire, il se fige donc. C'est mal de forcer un PC à faire quelque chose de spartiate.

Cette fois, je ne suis pas arrivé au point où cela fonctionne avec un cluster essentiel, donc je prévois de l'essayer à l'avenir.

Utilisez-le systématiquement! !!

Cliquez ici pour ce référentiel

https://github.com/SnowMasaya/Spartan-Study

Matériel de référence

http://codezine.jp/article/detail/8484

https://github.com/spartan-array/spartan

https://www.cs.nyu.edu/web/Research/Theses/power_russell.pdf

Recommended Posts

Traitement distribué Python Spartan
traitement d'image python
Traitement de fichiers Python
Traitement de fichiers en Python
Python: traitement du langage naturel
Traitement de la communication par Python
Traitement multithread en python
Premier traitement d'image Python
Traitement de texte avec Python
Traitement des requêtes en Python
Traitement d'image avec Python
Illustration de traitement de chaîne Python
Divers traitements de Python
Introduction au traitement parallèle distribué Python par Ray
Traitement d'image avec Python (partie 2)
100 coups de traitement du langage avec Python 2015
Traitement de texte UTF8 avec python
python3 Mesurez la vitesse de traitement.
"Traitement Apple" avec OpenCV3 + Python3
Traitement du signal acoustique avec Python (2)
Traitement du signal acoustique avec Python
Traitement asynchrone (threading) en python
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
Traitement d'image par python (Pillow)
Post-traitement de python (NG)
Collection de traitement d'image en Python
Utilisation du mode Python dans le traitement
[Python] Traitement itératif (for, while)
[Python] Traitement d'image avec scicit-image
Traitement des arguments de ligne de commande (docopt Python)
[Python] Traitement aléatoire (créer, sélectionner, trier)
Laissez le traitement gênant à Python
Traitement du signal en Python (1): transformée de Fourier
[Python] Traitement parallèle facile avec Joblib
Traitement parallèle Python (multitraitement et Joblib)
Python
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
Paiza Python Primer 3: Apprendre le traitement des boucles
100 traitements de langage avec Python (chapitre 3)
python> Quitter le traitement> importer sys / sys.exit ()
Notes personnelles pour le traitement d'images python
Traitement d'image avec la binarisation Python 100 knocks # 3
Stupid (traitement parallèle distribué) par cluster IPython
Résumé de l'exemple de code de traitement parallèle / parallèle Python
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
mappe de traitement de chaîne python et lambda
100 traitement d'image par Python Knock # 2 Échelle de gris
100 Language Processing Knock Chapitre 1 par Python
python> Traitement de la mesure du temps> time.time () --start_time
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (00 ~ 04)
Traitement d'image par Python 100 knock # 10 filtre médian
Traitement d'exécution périodique lors de l'utilisation de tkinter [Python3]
Communication socket et traitement multi-thread par Python
[Python] Accélération du traitement à l'aide des outils de cache
Traitement d'image par le remplacement du canal Python 100 Knock # 1
[Python] Temps de traitement de la multiplication de la matrice avec NumPy