Le traitement parallèle de Python joblib ne fonctionne pas dans l'environnement uWSGI. Comment traiter en parallèle sur uWSGI?

introduction

Si vous effectuez un apprentissage automatique ou une exécution approfondie avec Python, le traitement devient lourd et peut poser un problème en termes de performances.

Récemment, j'ai également un traitement intensif et j'ai décidé d'ajouter un traitement parallèle pour améliorer les performances. Une amélioration des performances a été observée en utilisant une bibliothèque de traitement parallèle appelée joblib localement.

Cependant, dans l'erreur qui a exécuté le même processus sur l'environnement de développement. .. .. Apparemment, joblib ne fonctionne pas dans l'environnement uWSGI. J'ai résumé les mesures à ce sujet.

Qu'est-ce que uWSGI

――UWSGI est un serveur d'applications permettant d'exécuter des services Web en Python.

Informations environnementales

Code Joblib qui échoue sur uWSGI

length = 1000
def sum(i, j):
  return i + j

--Parallélisation

from joblib import Parallel, delayed

sum_list = Parallel(n_jobs=-1)( [delayed(calc_sum)(i, j) for j in range(length) for i in range(length)])

-Cependant, quand je l'exécute sur uWSGI, j'obtiens une erreur comme celle-ci

exception calling callback for <Future at 0x7fbc520c7eb8 state=finished raised TerminatedWorkerError>
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/joblib/externals/loky/_base.py", line 625, in _invoke_callbacks
    callback(self)
  File "/usr/local/lib/python3.7/site-packages/joblib/parallel.py", line 309, in __call__
    self.parallel.dispatch_next()
  File "/usr/local/lib/python3.7/site-packages/joblib/parallel.py", line 731, in dispatch_next
    if not self.dispatch_one_batch(self._original_iterator):
  File "/usr/local/lib/python3.7/site-packages/joblib/parallel.py", line 759, in dispatch_one_batch
    self._dispatch(tasks)
  File "/usr/local/lib/python3.7/site-packages/joblib/parallel.py", line 716, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)
  File "/usr/local/lib/python3.7/site-packages/joblib/_parallel_backends.py", line 510, in apply_async
    future = self._workers.submit(SafeFunction(func))
  File "/usr/local/lib/python3.7/site-packages/joblib/externals/loky/reusable_executor.py", line 151, in submit
    fn, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py", line 1022, in submit
    raise self._flags.broken
joblib.externals.loky.process_executor.TerminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker. The exit codes of the workers are {EXIT(1), EXIT(1), EXIT(1), EXIT(1)}

Solution de contournement 1: les threads fonctionnent

from joblib import Parallel, delayed

sum_list = Parallel(n_jobs=-1, prefer='threads')( [delayed(calc_sum)(i, j) for j in range(length) for i in range(length)])

――Bien sûr, en fonction du traitement, cela peut être lent si vous utilisez des threads.

Méthode cible 2: multitraitement

import multiprocessing
from multiprocessing import Process

with multiprocessing.Pool() as pool:
    process = [pool.apply_async(calc_sum, (i, j)) for j in range(length) for i in range(length)]
    sum_list = [f.get() for f in process]

Solution de contournement 3: utilisez guicorn au lieu de uWSGI

Je n'ai pas fait ça cette fois. La raison en est que changer le serveur AP est risqué car il fonctionnait déjà sur uWSGI.

finalement

Comparaison de vitesse

Ordinaire joblib(multiprocess) joblib(threads) multiprocessing
32.9 µs 11 µs 40.1 µs 4.05 µs

Joblib est plus lisible et plus facile à écrire, mais le multitraitement est une fonctionnalité intégrée à Python lui-même, donc il surpasse souvent. De plus, il semble peu probable que vous fassiez une erreur comme celle-ci.

Recommended Posts

Le traitement parallèle de Python joblib ne fonctionne pas dans l'environnement uWSGI. Comment traiter en parallèle sur uWSGI?
Comment développer dans un environnement virtuel Python [Memo]
Comment utiliser BigQuery en Python
Virtualenv ne fonctionne pas sur Python 3.5 (Windows)
Comment suivre le travail avec Powershell
Comment faire un traitement parallèle multicœur avec python
Résumé de la façon d'importer des fichiers dans Python 3
Résumé de l'utilisation de MNIST avec Python
Jinja2 2.9.6 ne fonctionne pas sur la série Lambda Python 3
J'ai réussi à résoudre la situation où Python ne fonctionne pas sur Mac
Comment prendre plusieurs arguments lors d'un traitement parallèle à l'aide du multitraitement en python
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
Comment créer un environnement pour utiliser plusieurs versions de Python sur un Mac
Correctif lorsque la recherche de texte intégral ne fonctionne pas dans l'environnement local GAE / Python
Comment obtenir le nombre de chiffres en Python
Comment mesurer le temps de traitement avec Python ou Java
Comment créer un environnement Django (python) sur Docker
[Efficacité du travail] Comment changer les noms de fichiers par lots avec Python
Comment créer un environnement Python sur Amazon Linux 2
Forcer luigi à effectuer un traitement parallèle dans l'environnement Windows
Que faire si Python3 Venv ne fonctionne pas bien sur Raspberry Pi
[Linux] Comment installer un package sur un serveur qui n’a pas d’environnement Internet (autonome)
Comment créer un nouvel environnement virtuel Python sur Ubuntu
traitement python3 qui semble utilisable dans paiza
Comment utiliser VS Code dans un environnement Venv avec Windows
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
Remarques sur la façon de charger un environnement virtuel avec PyCharm
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment obtenir une liste d'exceptions intégrées pour python
Comment développer en Python
Comment traiter les images de caméra avec Teams et Zoom Volume de traitement dans le style d'animation
Vue d'ensemble de l'environnement virtuel Python et comment le créer
Comment ne pas échapper au japonais en traitant avec JSON en Python
Comment déterminer l'existence d'un élément sélénium en Python
Comment installer OpenCV sur Cloud9 et l'exécuter en Python
Comment reconstruire l'environnement python à partir de pyenv dans un environnement Mac (El Capitan)
Élément de mémo Python efficace 11 Utilisez zip pour traiter les itérateurs en parallèle
Comment connaître la structure interne d'un objet en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Pour utiliser python, mettez pyenv sur macOS avec PyCall
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment créer un environnement Python à l'aide de Virtualenv sur Ubuntu 18.04 LTS
Comment mettre à jour la version Python de Cloud Shell dans GCP
Les touches fléchées ne fonctionnent pas dans le shell zsh + python sur Mac
[Python] Comment faire PCA avec Python
[Python] Traitement parallèle facile avec Joblib
Traitement parallèle Python (multitraitement et Joblib)
Comment collecter des images en Python
Comment utiliser SQLite en Python
LocateCenterOnScreen ne fonctionne pas sur PyAutoGui
Comment utiliser Mysql avec python
Comment envelopper C en Python
Construire un environnement pour python3.8 sur Mac
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment gérer le japonais avec Python
Comment résoudre l'erreur "Aucun noyau de grammaire Python trouvé" dans Atom
Comment envoyer une image visualisée des données créées en Python à Typetalk