Воспроизводимость в параллельных статистических расчетах

Проблемы и факторы в репродуцировании параллельных расчетов

Расчет reproducible является тем, который дает тем же результатам каждый раз, когда это запускается. Воспроизводимость важна для:

  • Отлаживая — Чтобы откорректировать аномальный результат, необходимо воспроизвести результат.

  • Уверенность — Когда можно воспроизвести результаты, можно исследовать и изучить их.

  • Изменение существующего кода — Когда вы изменяете существующий код, вы хотите гарантировать, что вы ничего не повреждаете.

Обычно вы не должны гарантировать воспроизводимость для своего расчета. Часто, когда это необходимо, воспроизводимость, самый простой метод должен запуститься в сериале вместо параллельно. В последовательном расчете можно просто вызвать 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

Этот раздел обращается к случаю, когда ваша функция использует случайные числа, и вы хотите восстанавливаемые результаты параллельно. Этот раздел также обращается к случаю, когда это необходимо, те же результаты параллельно как в сериале.

Выполнение восстанавливаемых параллельных расчетов

Чтобы запустить Statistics and Machine Learning Toolbox™ функционируют восстанавливаемо:

  1. Установите UseSubstreams опция к true.

  2. Установите Streams опция к типу, который поддерживает подпотоки: 'mlfg6331_64' или 'mrg32k3a'. Для получения информации об этих потоках смотрите Выбор Random Number Generator (MATLAB).

  3. Чтобы вычислить параллельно, установите UseParallel опция к true.

  4. Вызовите функцию со структурой опций.

  5. Чтобы воспроизвести расчет, сбросьте поток, затем вызовите функцию снова.

Чтобы изучить, почему этот метод дает воспроизводимость, смотрите, Как Подпотоки Включают Восстанавливаемые Параллельные Расчеты.

Например, чтобы использовать 'mlfg6331_64' поток для восстанавливаемого расчета:

  1. Создайте структуру подходящих вариантов:

    s = RandStream('mlfg6331_64');
    options = statset('UseParallel',true, ...
        'Streams',s,'UseSubstreams',true);
  2. Запустите свой параллельный расчет. Для инструкций смотрите Параллельные вычисления Быстрого запуска для Statistics and Machine Learning Toolbox.

  3. Сбросьте случайный поток:

    reset(s);
  4. Повторно выполните свой параллельный расчет. Вы получаете идентичные результаты.

Поскольку пример параллельного расчета запускает этот восстанавливаемый путь, смотрите Восстанавливаемую Параллельную Начальную загрузку.

Найдите что-либо подобное статистическому расчету Используя случайные числа

Что такое подпотоки?

substream является фрагментом случайного потока что RandStream может получить доступ быстро. Существует номер M таким образом это для любого положительного целочисленного kRandStream может перейти к kMпсевдослучайное число th в потоке. От той точки, RandStream может сгенерировать последующие записи в потоке. В настоящее время, RandStream имеет M = 272, о 5e21, или больше.

Записи в различных подпотоках имеют хорошие статистические свойства, похожие на свойства записей в едином потоке: независимость и отсутствие k - путь корреляция в различных задержках. Подпотоки являются такими длинными, что можно просмотреть подпотоки, как являющиеся независимыми потоками, как в следующем изображении.

Два RandStream поток вводит подпотоки поддержки: 'mlfg6331_64' и 'mrg32k3a'.

Как подпотоки включают восстанавливаемые параллельные расчеты

Когда MATLAB® выполняет расчеты параллельно с parfor, каждый рабочий получает итерации цикла в непредсказуемом порядке. Поэтому вы не можете предсказать, какой рабочий добирается, какая итерация, так не может определить случайные числа, сопоставленные с каждой итерацией.

Подпотоки позволяют MATLAB связывать каждую итерацию с конкретной последовательностью случайных чисел. parfor дает каждой итерации индекс. Итерация использует индекс в качестве подпотокового номера. Поскольку случайные числа сопоставлены с итерациями, не с рабочими, целый расчет восстанавливаем.

Чтобы получить восстанавливаемые результаты, просто сбросьте поток, и все подпотоки генерируют идентичные случайные числа, когда названо снова. Этот метод успешно выполняется, когда все рабочие используют тот же поток, и поток поддерживает подпотоки. Это завершает обсуждение того, как процедура в Выполнении Восстанавливаемых Параллельных Расчетов дает восстанавливаемые параллельные результаты.

Случайные числа на клиенте или рабочих

Несколько функций генерируют случайные числа на клиенте прежде, чем распределить их, чтобы быть параллельными рабочим. Рабочие не используют случайные числа, поэтому действуют просто детерминировано. Для этих функций можно запустить параллельный расчет восстанавливаемо с помощью любого случайного потокового типа.

Функции, которые управляют этим путем, включают:

Чтобы получить идентичные результаты, сбросьте случайный поток на клиенте или случайный поток, который вы передаете клиенту. Например:

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

В то время как этот метод позволяет вам запуститься восстанавливаемо параллельно, результаты могут отличаться от последовательного расчета. Причиной различия является parfor циклы, запущенные в обратном порядке от for циклы. Поэтому последовательный расчет может сгенерировать случайные числа в различном порядке, чем параллельный расчет. Для определенной воспроизводимости используйте метод в Выполнении Восстанавливаемых Параллельных Расчетов.

Распределительные потоки явным образом

Для тестирования или сравнения с помощью конкретных алгоритмов случайных чисел, необходимо установить генераторы случайных чисел. Как вы устанавливаете эти генераторы параллельно или инициализируете потоки на каждом рабочем конкретным способом? Или вы можете хотеть запустить расчет с помощью различной последовательности случайных чисел, чем кто-либо другой, которого вы запустили. То, как можно гарантировать последовательность, которую вы используете, статистически независимо?

Параллельные функции Statistics and Machine Learning Toolbox позволяют вам устанавливать случайные потоки на каждом рабочем явным образом. Для получения информации о создании нескольких потоков введите  help RandStream/create в командной строке. Создать четыре независимых потока с помощью 'mrg32k3a' генератор:

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

Передайте эти потоки статистической функции с помощью Streams опция. Например:

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);

Этот метод распределительных потоков дает каждому рабочему различный поток для расчета. Однако это не допускает восстанавливаемый расчет, потому что рабочие выполняют 200 начальных загрузок в непредсказуемом порядке. Если вы хотите выполнить восстанавливаемый расчет, используйте подпотоки как описано в Выполнении Восстанавливаемых Параллельных Расчетов.

Если вы устанавливаете UseSubstreams опция к true, затем установите Streams опция к одному случайному потоку типа, который поддерживает подпотоки ('mlfg6331_64' или 'mrg32k3a'). Эта установка дает восстанавливаемые расчеты.