Parallel Assign () es lento en ciertos dispositivosHola a todos,
parece haber un problema con Parallel Assign () en combinación con ciertos sistemas.
Tengo acceso a 3 PC con Windows 10 con JMP 16.1 .:
- Computadora portátil: Core i5-8350U (4 núcleos) a 1,9 GHz, 16 GB de RAM
- Estación de trabajo antigua: Xeon E5-1660 v4 (8 núcleos) a 3,2 GHz, 256 GB de RAM
- Nueva estación de trabajo Xeon W-2145 (8 núcleos) a 3,7 GHz, 128 GB de RAM
Comparé el rendimiento de la versión paralela y secuencial de mi script de prueba usando diferentes tamaños de problemas en todos los sistemas (scipt a continuación).
El resultado fue sorprendentemente malo. Solo en mi computadora portátil, la versión paralela es un poco más rápida que la versión secuencial, pero hasta más de 2 veces más lenta en las estaciones de trabajo.
¿Alguien experimentó problemas de rendimiento similares con Parallel Assign ()? ¿O lo estoy usando mal? ¿Que esta pasando aqui?
Robar


n_different_ids = 100000;
<BR />// Just generate random data. Every 15 rows must be processed at the same time.
DT_Data = J( 15*n_different_ids, 9, 0 );
For ( i = 1, i <= n_different_ids, i++,
DT_Data[15*(i-1)+(1::15),0] = i + J( 15, 9, Random Normal() );
);
<BR />// some function
F_percentile = Function( {x , p},
x = Sort Ascending(x);
n = N Rows(x);
index = 1 + (n - 1) * p;
index_ibelow = Floor(index);
index_iabove = Ceiling(index);
h = index - index_ibelow;
result = (1 - h) * x[index_ibelow] + h * x[index_iabove];
result;
);
<BR />// parallel version
DT_Features = J( n_different_ids, 16, 0 );
start=tick seconds();
Parallel Assign( {
DT_Data = DT_Data,
F_percentile = Name Expr( F_percentile )
},
DT_Features[i,j] = (
i_same_group = Loc(DT_Data[15*(i-1)+(1::15), 1]);
data = DT_Data[15*(i-1)+i_same_group, 1+Ceiling(j/2)];
If (mod(j,2),
result = F_percentile(data, 0.95);
,
result = F_percentile(data, 0.05);
);
result;
)
);
time_parallel = tick seconds()-start;
Show(time_parallel);
Wait(0.1);
<BR />// sequential version
DT_Features = J( n_different_ids, 16, 0 );
start=tick seconds();
for(i=1,i<=n_different_ids,i++,
for(j=1,j<=16,j++,
i_same_group = Loc(DT_Data[15*(i-1)+(1::15), 1]);
data = DT_Data[15*(i-1)+i_same_group, 1+Ceiling(j/2)];
If (mod(j,2),
result = F_percentile(data, 0.95);
,
result = F_percentile(data, 0.05);
);
DT_Features[i,j] =result;
);
);
time_sequential = tick seconds()-start;
Show(time_sequential);
ScriptingRe: Parallel Assign () es lento en ciertos dispositivosEsta es una máquina JMP16 / win10 de 4 CPU 16GB ~ 3GHz bajo VirtualBox. Veo la velocidad que esperaba (no 4X, pero sigue siendo buena).
n_different_ids = 100.000;
time_parallel = 13.9833333333333;
time_sequential = 37.7333333333333;
n_diferentes_ids = 1.000.000;
time_parallel = 141.233333333333;
time_sequential = 375.016666666667;
La asignación en paralelo es copiar una matriz grande para cada CPU, pero los gráficos lineales no sugieren que sea un problema de paginación, en estos tamaños.
Mire el monitor de tareas de Windows para ver el uso de la CPU y la memoria (y el disco) y vea si explica algo. Vi el 100% durante la asignación en paralelo y el 25% durante la prueba secuencial. También vi 7GB usados durante la asignación paralela más grande.
administrador de tareas
Re: Parallel Assign () es lento en ciertos dispositivosHola Craige,
Solo estoy viendo mi estación de trabajo con el peor rendimiento ahora (abajo). No vi nada sospechoso en el Administrador de tareas. Excepto la CPU, nada se acerca a la ocupación total.
Lo que también noté es que JMP 15.2.1 siempre es más rápido en las versiones paralela y secuencial. En el caso de n = 100,000, JMP 16.1 toma alrededor de 36s / 18s (paralelo / secuencial) y JMP 15.2.1 31s / 15s, que es un poco mejor, pero aún está lejos de un buen rendimiento en paralelo. Desafortunadamente, ya no tengo una versión anterior disponible. Escribí este código usando JMP 12 y no noté problemas de rendimiento en ese entonces (y las PC que estaba usando también eran diferentes).
Robar

Re: Parallel Assign () es lento en ciertos dispositivosPuedo confirmar ese comportamiento en mi computadora portátil (Win 10, JMP 16.1):
time_parallel = 158,7;
time_sequential = 157.766666666667;
n = 1000000
Re: Parallel Assign () es lento en ciertos dispositivosNo estoy seguro. Envié una nota sobre este hilo a JMP; es posible que también desee hablar con el soporte técnico.
Supongo (¡y eso es todo!) Es que JMP necesitará cambiar algo para recuperar el rendimiento en el nuevo hardware. Con solo 4 CPU virtuales, no puedo ver lo mismo que tú ves.
Re: Parallel Assign () es lento en ciertos dispositivosTambién limité la cantidad de núcleos en el administrador de tareas que están disponibles para JMP a 2, 4 y 8 en la nueva estación de trabajo. La versión paralela sigue siendo más lenta que la secuencial. Supongo que JMP está utilizando bibliotecas obsoletas en segundo plano que funcionan mal en nuevas arquitecturas de hardware.
Gracias Craige, me pondré en contacto con el soporte técnico al respecto.
Re: Parallel Assign () es lento en ciertos dispositivosPara mi máquina de 4 núcleos a 3.6 GHz y N = 100k:
Obtengo una aceleración de 1.4X usando el código paralelo sobre secuencial (12.8s paralelo vs 17.8s secuencial). Esto no es tan bueno como la aceleración 2.7X que Craige estaba viendo, pero es mejor que el comportamiento de desaceleración que estaba viendo en las estaciones de trabajo. Sin embargo, quería ver si podía obtener un poco más de rendimiento de esto, así que hice algunas ediciones.
Eliminé la sobrecarga de llamadas a la función (copias de argumentos de matriz, etc.) usando expresiones en su lugar. Esto me llevó a una aceleración de 2.5X (4.5s en paralelo frente a 11.3s en secuencia) y un poco más rápido que el original. Y finalmente, intenté reorganizar un poco los bucles y bajé la versión secuencial a 4 segundos. Esto es más rápido que la versión paralela, pero la reorganización no es tan fácil de hacer con Parallel Assign. Probé algunos N diferentes y estos patrones parecieron mantenerse, pero no hice un barrido completo como en su tabla anterior. Encuentra el código adjunto.
Paralelo: 12,78
Secuencial: 17.80
Paralel_Expr: 4.50
Expr_secuencial: 11,27
Sequential_Expr_Opt: 3.98
Re: Parallel Assign () es lento en ciertos dispositivos¡Oh, gracias! Ejecutando su script en mi estación de trabajo más nueva, obtengo
Paralelo: 37.0833333333139
Secuencial: 19.7166666666453
Paralel_Expr: 6.93333333331975
Sequential_Expr: 12.5333333333256
Sequential_Expr_Opt: 4.54999999998836
No consideremos el Sequential_Expr_Opt uno porque es una comparación injusta. 
¿Acabas de reemplazar la función por una expresión y obtengo una aceleración de aproximadamente 1.5 para la secuencial y más de 5 (!!!) para la versión paralela. Esa es una gran solución. Entonces, ¿qué aprendo de esto? ¿Nunca utilizas funciones en JSL? Eso es un poco desagradable porque las funciones hacen que el código sea más legible y más fácil y seguro de usar y modificar para otros. Sin embargo, creo que todavía hay un problema en algún lugar detrás de escena porque mi versión paralela original todavía toma el doble de tiempo que la secuencial original y este no es el caso en la máquina virtual de Craige.
Actualización: aquí está el escaneo completo en la nueva estación de trabajo:


Re: Parallel Assign () es lento en ciertos dispositivosSeguí los consejos de Craiges y me puse en contacto con el soporte técnico hace dos semanas. Después de algunas consultas sobre mis PC, obtuve la respuesta hoy de que los desarrolladores se han involucrado para investigar el comportamiento y solucionar problemas en una versión futura de JMP.
Sin embargo, gracias nuevamente a Evan por acelerar este guión específico.
Re: Parallel Assign () es lento en ciertos dispositivosHola @Robbb , dos pensamientos:
Programación para velocidad
El objetivo de tu código puede tener un gran efecto en cómo lo escribes.Para la gran mayoría de los scripts, el tiempo adicional que se necesita para llamar a una función o copiar un símbolo no importa, así que sí, debería usar funciones y hacer que el código sea fácil de interpretar.Por otro lado, si está trabajando en un proyecto que será grande y se repetirá las veces suficientes para que le importe cuánto tiempo lleva, entonces sí, es posible que desee comenzar a intercambiar algunas sutilezas por un rendimiento en bruto.Sin embargo, te animo a que solo dediques tiempo a optimizar las cosas que realmente importan.No pierda una hora más codificando algo ahora, y luego tenga que dedicar una hora más a averiguar qué hizo después de un año porque lo hizo más complejo tratando de acelerarlo, solo para ahorrar a los usuarios 20 segundos adicionales una vez al día. .
Compensación paralela
Al decidir si ejecutar en paralelo, debe equilibrar la sobrecarga de configurar ese hilo 'secundario' con el trabajo que va a hacer.Imagine que va a ejecutar trabajos en paralelo abriendo otra copia de JMP, abriendo una tabla de datos y haciendo clic en ejecutar. Si lo deja funcionando durante una hora, entonces genial, ahorrará un montón de tiempo con solo dejar que un script haga todo, pero si ese script se ejecutará durante 20 segundos, entonces probablemente haya pasado más tiempo iniciándolo y luego lo guardó.Sí, la sobrecarga aquí es mucho menor, pero copiar símbolos y asignar memoria lleva tiempo.Asegúrese de que el trabajo que hará su script una vez configurado el entorno sea sustancial.Una forma en que puede ayudar a que esto suceda es dividir su ciclo en solo 4 partes y hacer que cada hilo trabaje en una cuarta parte de los valores a la vez.Entonces, divida su lista en cuatro partes, cada una con una cuarta parte de las filas, y luego haga que su script procese secuencialmente cada sublista. De esa manera, reduce el tiempo dedicado a configurar subprocesos secundarios de n filas () veces a 4.
Re: Parallel Assign () es lento en ciertos dispositivosHola @ih ,
de acuerdo.
La sobrecarga de preparar a un niño no importa mucho en mi caso, así que no dediqué mucho tiempo a hacer esto lo más efectivo posible. Este script no está diseñado para ejecutarse solo unos minutos. Antes de comenzar con este tema, hice exactamente lo que sugirió. Rompí mi conjunto de datos en 8 partes y terminé en 0,5 días. Por interés, también probé la versión "Sequential_Expr_Opt" de Evan más tarde, y tardó entre 1,5 y 4 días en terminar en mi conjunto de datos (comencé el jueves por la mañana, no terminó el viernes por la tarde sino el lunes por la mañana).
Este hilo fue para mostrar que hay algo mal detrás de escena en general. En el pasado, noté un mal desempeño paralelo de JMP de vez en cuando y me molestó. Me gusta JMP y me gusta probar cosas con él que otras personas dicen que no se pueden hacer con JMP. Y estoy más que feliz de que los desarrolladores lo estén investigando.
Sin embargo, debo decir que hay mejores herramientas para manejar conjuntos de datos realmente grandes que JMP. Al menos por el momento. 