multitarea - Python: ¿Cómo evitas el entumecimiento de multiproceso?
multitarea en python (5)
En caso de que desee establecer el número de subprocesos de forma dinámica, y no globalmente a través de una variable de entorno, también puede hacer:
import mkl
mkl.set_num_threads(2)
Sé que esto puede parecer una pregunta ridícula, pero tengo que ejecutar trabajos regularmente en servidores informáticos que comparto con otros en el departamento y cuando comienzo 10 trabajos, me gustaría que solo tomara 10 núcleos y no Más; No me importa si toma un poco más de tiempo con un solo núcleo por ejecución: simplemente no quiero que invada el territorio de los demás, lo que me obligaría a cambiar los puestos de trabajo, etc. Solo quiero tener 10 núcleos sólidos y eso es todo.
Más específicamente, estoy usando Enthought 7.3-1 en Redhat, que se basa en Python 2.7.3 y numpy 1.6.1, pero la pregunta es más general. He estado buscando en Google alguna clase de respuesta a esta pregunta durante horas sin éxito, así que si alguien sabe de un cambio en el número que podría desactivar el multihilo, por favor avíseme.
Establezca la variable de entorno MKL_NUM_THREADS
en 1. Como puede haber adivinado, esta variable de entorno controla el comportamiento de la biblioteca del núcleo matemático que se incluye como parte de la compilación numpy de numpy
.
Simplemente hago esto en mi archivo de inicio, .bash_profile, con export MKL_NUM_THREADS=1
. También debe poder hacerlo desde el interior de su script para que sea específico del proceso.
Habría dejado esto como un comentario en la respuesta de Bi Rico, pero no tengo el privilegio requerido. En versiones más recientes de numpy he encontrado que es necesario configurar NUMEXPR_NUM_THREADS = 1
En mis manos, esto es suficiente sin configurar MKL_NUM_THREADS = 1, pero en algunas circunstancias es posible que necesite configurar ambos.
Para mí, la solución fue simple ya que dejé de usar numpy.dot
:
import numpy as np
a = np.random.rand(1e6)
b = np.random.rand(1e6, 10)
# potentially uses multiple threads
dotted = np.dot(a, b)
# single-thread
summed = np.sum(a[:, np.newaxis] * b, axis=0)
assert np.all(dotted == summed)
Solo con suerte, esto soluciona todos los escenarios y el sistema en el que puede estar.
- Use
numpy.__config__.show()
para ver si está usando OpenBLAS o MKL
Desde este punto en adelante, hay algunas maneras en que puedes hacer esto.
2.1. La ruta de la terminal export OPENBLAS_NUM_THREADS=1
o export MKL_NUM_THREADS=1
2.2 (Esta es mi forma preferida) En su secuencia de comandos de Python, import os
y agregue la línea os.environ[''OPENBLAS_NUM_THREADS''] = ''1''
o os.environ[''MKL_NUM_THREADS''] = ''1''
.
¡NOTA al configurar os.environ[VAR]
el número de subprocesos debe ser una cadena! Además, es posible que deba establecer esta variable de entorno antes de importar numpy / scipy.
Probablemente hay otras opciones además de openBLAS o MKL, pero el paso 1 te ayudará a descubrirlo.