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 defecto LocalClusterPuede 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 usando sitk.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