Funcionamiento multitreaded en un grupo de depresión
Tengo alguna función que utiliza funciones de procesamiento de imágenes que son en sí multiteleadas. Dirijo muchas de esas llamadas de función en un grupo de destellos.
Primero, empecé un programador en un host: dask-scheduler
. Empecé con los trabajadores: dask-worker --nthreads 1 --memory-limit 0.9 tcp://scheduler:8786
.
El código de pitón parece similar a esto:
import SimpleITK as sitk
def func(filename):
sitk.ProcessObject.SetGlobalDefaultNumberOfThreads(4) # limit to four threads
img = sitk.ReadImage(filename)
# Do more stuff and store resulting image
# SimpleITK is already multithreaded
return 'someresult'
# [...]
from distributed import Client
client = Client('tcp://scheduler:8786')
futures = client.map(func, ['somefile', 'someotherfile'])
for result in client.gather(futures):
print(result)
Ahora mismo, tengo que fijar el número de hilos para cada trabajador a uno, para no sobrecomprometer la CPU en el nodo de trabajadores. Pero en algunos casos tiene sentido limitar el número de núcleos utilizados por SimpleITK, porque la ganancia no es tan alta. En cambio, podría ejecutar múltiples llamadas de función en paralelo en el mismo anfitrión. Pero en ese caso tendría que calcular todos los usos básicos a mano. Idealmente, me gustaría establecer un número arbitrario de núcleos que cada función puede usar y desbordar debe decidir cuántas funciones paralelas se inician en cada nodo, dado el número de hilos disponibles. Es decir, ¿es posible especificar el número de hilos que usará una función?
Pregunta hecha hace 3 años, 4 meses, 28 días - Por nodenomad
3 Respuestas:
-
No, Dask no es capaz de limitar el número de hilos generados por alguna función, y tampoco intenta medir esto.
Lo único que podría pensar que querrías hacer es usar Dask abstract rsources, donde usted controla cuánto de cada cantidad etiquetada está disponible por trabajador y cuánto cada tarea necesita correr.
futures = client.map(func, ['somefile', 'someotherfile'], resources=...)
No veo una manera obvia de asignar recursos a los trabajadores usando
Cluster()
(es decir, el defectoLocalCluster
Puede que necesites usar el CLI.Respondida el Dec 18, 2020 a las 08:20 - por codealchemyf00f
Votos positivos: 0 | Votos negativos: 0 -
En el código que proporcionaste, estás configurando el número de hilos utilizados por SimpleITK en la función
func
usandositk.ProcessObject.SetGlobalDefaultNumberOfThreads(4)
para limitarlo a cuatro hilos. Sin embargo, si deseas poder especificar el número de hilos utilizados por cada función de manera dinámica, puedes modificar tu código para incluir un parámetro adicional en la función que represente el número de hilos que deseas utilizar en esa llamada específica. Aquí te muestro cómo podrías hacerlo:python import SimpleITK as sitk def func(filename, num_threads=4):
Añade un parámetro para el número de hilos
sitk.ProcessObject.SetGlobalDefaultNumberOfThreads(num_threads)Configura el número de hilos para SimpleITK
img = sitk.ReadImage(filename)Realiza más procesamiento de la imagen
return 'someresult'[...]
from distributed import Client client = Client('tcp://scheduler:8786')Ejemplo de cómo llamar a la función con un número específico de hilos
futures = client.map(func, ['somefile', 'someotherfile'], [4, 2])Se especifica el número de hilos para cada llamada
for result in client.gather(futures): print(result)En este caso, al llamar a la función
client.map
, pasamos una lista adicional que contiene el número de hilos que deseamos utilizar en cada llamada a la función. En el ejemplo, se especifica el uso de 4 hilos para la primera llamada y 2 hilos para la segunda.De esta forma, puedes controlar de manera dinámica el número de hilos utilizados por cada función en paralelo. Esto te permitirá ajustar la utilización de recursos de manera más flexible según tus necesidades en cada momento.
Respondida el Dec 19, 2020 a las 08:20 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
añadir
Respondida el Dec 19, 2020 a las 08:31 - por Gemini
Votos positivos: 0 | Votos negativos: 0