Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Reproducibilidad en computaciones estadísticas paralelas

Problemas y consideraciones en la reproducción de cálculos paralelos

Un cálculo es uno que da los mismos resultados cada vez que se ejecuta.Reproducibles La reproducibilidad es importante para:

  • Depuración: para corregir un resultado anómala, debe reproducir el resultado.

  • Confianza: cuando puede reproducir los resultados, puede investigarlos y entenderlos.

  • Modificación del código existente: cuando se cambia el código existente, se desea asegurarse de que no se rompe nada.

Por lo general, no es necesario garantizar la reproducibilidad para el cálculo. A menudo, cuando se desea reproducibilidad, la técnica más sencilla es ejecutar en serie en lugar de en paralelo. En el cómputo en serie se puede simplemente llamar a la función de la siguiente manera:rng

s = rng % Obtain the current state of the random stream % run the statistical function rng(s) % Reset the stream to the previous state % run the statistical function again, obtain identical results

En esta sección se aborda el caso cuando la función utiliza números aleatorios y desea resultados reproducibles en paralelo. Esta sección también aborda el caso cuando usted quiere los mismos resultados en paralelo que en el serial.

Ejecución de cálculos paralelos reproducibles

Para ejecutar una función reproduciblemente:Statistics and Machine Learning Toolbox™

  1. Establezca la opción en.UseSubstreamstrue

  2. Establezca la opción en un tipo que admita subsecuencias: o.Streams'mlfg6331_64''mrg32k3a' Para obtener información sobre estas secuencias, consulte.Elegir un generador de números aleatorios (MATLAB)

  3. Para calcular en paralelo, establezca la opción en.UseParalleltrue

  4. Llame a la función con la estructura de opciones.

  5. Para reproducir el cálculo, restablezca la secuencia y, a continuación, vuelva a llamar a la función.

Para entender por qué esta técnica da reproducibilidad, ver.Cómo los subflujos habilitan los cálculos paralelos reproducibles

Por ejemplo, para utilizar la secuencia para el cálculo reproducible:'mlfg6331_64'

  1. Cree una estructura de opciones adecuada:

    s = RandStream('mlfg6331_64'); options = statset('UseParallel',true, ...     'Streams',s,'UseSubstreams',true);
  2. Ejecute el cálculo paralelo. Para obtener instrucciones, consulte Computación paralela de inicio rápido paraStatistics and Machine Learning Toolbox.

  3. Restablece el flujo aleatorio:

    reset(s);
  4. Vuelva a ejecutar el cálculo paralelo. Obtiene resultados idénticos.

Para obtener un ejemplo de una ejecución de cálculo paralela de esta manera reproducible, vea.Reproducible Parallel bootstrap

Computación estadística paralela utilizando números aleatorios

¿Qué son las Subtransmisiones?

A es una porción de una secuencia aleatoria que puede acceder rápidamente.substreamRandStream Hay un número tal que para cualquier entero positivo, puede ir al número de magnitudes pseudoaleatorias TH en la secuencia.MkRandStreamkM Desde ese punto, puede generar las entradas subsiguientes en la secuencia.RandStream Actualmente, tiene = 2RandStreamM72, aproximadamente 5e21, o más.

Las entradas en diferentes subsecuencias tienen buenas propiedades estadísticas, similares a las propiedades de las entradas en una sola secuencia: independencia, y la falta de correlación de vía en varios retrasos.k Las subsecuencias son tan largas que puede ver las subsecuencias como secuencias independientes, como en la siguiente imagen.

Dos tipos de secuencia admiten subsecuencias: y.RandStream'mlfg6331_64''mrg32k3a'

Cómo los subflujos habilitan los cálculos paralelos reproducibles

Cuando realiza cálculos en paralelo con, cada trabajador recibe iteraciones de bucle en un orden impredecible.MATLAB®parfor Por lo tanto, no puede predecir qué trabajador obtiene qué iteración, por lo que no puede determinar los números aleatorios asociados a cada iteración.

Los subflujos permiten vincular cada iteración a una secuencia concreta de números aleatorios. da a cada iteración un índice.MATLABparfor La iteración utiliza el índice como el número de subsecuencia. Dado que los números aleatorios están asociados con las iteraciones, no con los trabajadores, todo el cálculo es reproducible.

Para obtener resultados reproducibles, simplemente restablezca la secuencia, y todas las subsecuencias generan números aleatorios idénticos cuando se vuelve a llamar. Este método se realiza correctamente cuando todos los trabajadores utilizan la misma secuencia y la secuencia admite subsecuencias. Esto concluye la discusión de cómo el procedimiento en da resultados paralelos reproducibles.Ejecución de cálculos paralelos reproducibles

Números aleatorios en el cliente o los trabajadores

Algunas funciones generan números aleatorios en el cliente antes de distribuirlos a los trabajadores paralelos. Los trabajadores no utilizan números aleatorios, por lo que operan de manera puramente determinista. Para estas funciones, puede ejecutar un cálculo paralelo reproduciblemente utilizando cualquier tipo de secuencia aleatoria.

Las funciones que operan de esta manera incluyen:

Para obtener resultados idénticos, restablezca la secuencia aleatoria en el cliente o la secuencia aleatoria que pase al cliente. Por ejemplo:

s = rng % Obtain the current state of the random stream % run the statistical function rng(s) % Reset the stream to the previous state % run the statistical function again, obtain identical results

Aunque este método permite ejecutar reproduciblemente en paralelo, los resultados pueden diferir de un cálculo en serie. El motivo de la diferencia es que los bucles se ejecutan en orden inverso desde bucles.parforfor Por lo tanto, un cálculo en serie puede generar números aleatorios en un orden diferente al de un cálculo paralelo. Para una reproducibilidad inequívoca, utilice la técnica en.Ejecución de cálculos paralelos reproducibles

Distribución de transmisiones explícitamente

Para realizar pruebas o comparaciones con algoritmos de números aleatorios concretos, debe establecer los generadores de números aleatorios. ¿Cómo se configuran estos generadores en paralelo o se inicializan transmisiones en cada trabajador de una forma determinada? O es posible que desee ejecutar un cálculo con una secuencia diferente de números aleatorios que cualquier otro que haya ejecutado. ¿Cómo puede asegurarse de que la secuencia que utiliza es estadísticamente independiente?

Las funciones paralelas permiten establecer secuencias aleatorias en cada trabajador de forma explícita.Statistics and Machine Learning Toolbox Para obtener información sobre varias secuencias, escriba en la línea de comandos.creatinghelp RandStream/create Para crear cuatro secuencias independientes utilizando el generador:'mrg32k3a'

s = RandStream.create('mrg32k3a','NumStreams',4,...     'CellOutput',true);

Pase estas secuencias a una función estadística utilizando la opción.Streams Por ejemplo:

parpool(4) % if you have at least 4 cores s = RandStream.create('mrg32k3a','NumStreams',4,...     'CellOutput',true); % create 4 independent streams paroptions = statset('UseParallel',true,...     'Streams',s); % set the 4 different streams x = [randn(700,1); 4 + 2*randn(300,1)]; latt = -4:0.01:12; myfun = @(X) ksdensity(X,latt);  pdfestimate = myfun(x); B = bootstrp(200,myfun,x,'Options',paroptions);

Este método de distribución de secuencias proporciona a cada trabajador una secuencia diferente para el cálculo. Sin embargo, no permite un cálculo reproducible, ya que los trabajadores realizan los arranca 200 en un orden impredecible. Si desea realizar un cálculo reproducible, utilice subsecuencias como se describe en.Ejecución de cálculos paralelos reproducibles

Si establece la opción en, a continuación, establezca la opción en una única secuencia aleatoria del tipo que admite subsecuencias (o).UseSubstreamstrueStreams'mlfg6331_64''mrg32k3a' Esta configuración proporciona cálculos reproducibles.