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

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

Вычисление 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, таким образом, что для любого положительного целочисленного k, RandStream может перейти к 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'). Эта установка дает восстанавливаемые вычисления.