Pyradiomics: Multihilo no funciona correctamente

Creado en 4 ene. 2020  ·  7Comentarios  ·  Fuente: AIM-Harvard/pyradiomics

Queridos todos, gracias por esta buena herramienta, realmente la aprecio.

Te planteo mis dudas, ya que no encuentro respuesta en otro lado:

Estoy trabajando con un lote de aproximadamente 400 combinaciones de imagen + máscara (en un archivo csv) y estoy usando una computadora pequeña para el cálculo. Como quiero escanear alrededor de 50 binWidth/binCounts, estoy tratando de optimizar la extracción en paralelo.

Específicamente, escribí un script bash para escanear las diferentes configuraciones y lo ejecuto con el parámetro -j 24 (para 24 trabajadores). Tengo 2x Xeon 6Core HT (núcleo lógico total = 24) y unos 200 GB de RAM.

Sin embargo, noté que la CPU funciona al 100% solo una fracción del tiempo... ¿es normal? ¿Existe un cuello de botella en el uso de algunos scripts que no se pueden ejecutar en paralelo?

Obviamente empiezo el cómputo con diferentes parámetros NO en paralelo, es decir, empiezo el cómputo con el siguiente parámetro solo cuando finaliza el primer lote.
Ejemplo:

bC="8 12 16 22 32 64 43 128 171 256 341 512 682 1024"
for i in $bC
do
  pyradiomics ./input/input_dyn.csv --param ./json/RadiomicsLogicParams_all.json --setting 
  "binCount:${i}" --setting "normalize:false" -o ./output/all_stackedOut.csv -f csv -j 24 -v 4
done

Pantalla
Screenshot 2020-01-04 at 13 20 14

¡¡Gracias por su atención!!

Todos 7 comentarios

Sin embargo, noté que la CPU funciona al 100% solo una fracción del tiempo... ¿es normal? ¿Existe un cuello de botella en el uso de algunos scripts que no se pueden ejecutar en paralelo?

Sí, es normal. Esto no está relacionado con PyRadiomics.

Sí, es normal. Esto no está relacionado con PyRadiomics.

Gracias por la respuesta críptica. ¿Hay alguna manera de resolverlo? ¿Hay una razón?
¿Es común?

Sí a las tres preguntas. ¿Cómo es eso de críptico?

Estoy usando ubuntu 19.4. ¿Está relacionado con el sistema operativo? En este caso puedo cerrar el hilo.
Ya revisé el UEFI para buscar configuraciones de ahorro de energía para deshabilitar....

¿Qué puedo hacer? Gracias y feliz nuevo año críptico.

Está relacionado con cómo funcionan las CPU y el software en general.

La utilización del 100% del núcleo de la CPU es poco común porque los procesos generalmente deben esperarse unos a otros. Si tuviera una máquina de un solo núcleo, probablemente no alcanzaría un 100% persistente, porque el código debe esperar el acceso a la memoria, la red, etc. el núcleo (o su pantalla se congelaría, etc.).

En resumen: el hecho de que no vea una utilización del 100 % no significa que el código no se esté ejecutando en paralelo. Por último, según el código y el problema, los beneficios de la paralelización rara vez tienen una relación lineal con el número de subprocesos.

Entonces me estás diciendo que si empiezo 24 instancias de piradiómica diferentes con -j 1 obtendré el mismo efecto, ¿no es así?
No estoy tan seguro de eso, supongo que es algo relacionado con el acceso al disco para lectura/escritura o algo más...

Al final, decidí usar una verificación manual para iniciar una nueva extracción de piradiómica cada vez que la CPU cae por debajo del 70%.
Ahora siempre tengo un uso de CPU razonable (>50 % con todas las unidades lógicas, es decir, siempre 100 % de uso)

wait4CpuReady () {
  cpuUsed=5 #debouncer
  while  [ ${cpuUsed} -gt 0 ] || [ $(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}') -ge 70 ]
  do
    sleep 5
    if [ ${cpuUsed} -gt 0 ] && [ $(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}') -ge 70 ]
    then
      cpuUsed=5
    else
      ((cpuUsed--))
      echo "CPU not used, debouncer = ${cpuUsed}"
    fi
  done
}

bW="$(seq -s ' ' 1 1 9) $(seq -s ' ' 10 2 28) $(seq -s ' ' 30 3 60)"


for i in $bW
do
  wait4CpuReady

  echo -e "\e[41m#########################################################################################\e[0m"
  echo -e "\e[41m#### Starting computing all features for all_times and SUB - NONnorm and binWidth $i ####\e[0m"
  echo -e "\e[41m#########################################################################################\e[0m"

  pyradiomics ./input/input_all_msub.csv --param ./json/RadiomicsLogicParams_all_noWarningGLCM.json --setting "binWidth:${i}.0" --setting "normalize:false" -o ./output/manualOut/all_allTmSub_stackedOut_bw${i}.csv -f csv -j 3 -v 4 &
done

Screenshot 2020-01-05 at 21 12 25

¿Fue útil esta página
0 / 5 - 0 calificaciones