Распределение массивов среди параллельных рабочих

Использование распределенных массивов для разделения данных между работниками

В зависимости от того, как ваши данные помещаются в памяти, выберите один из следующих методов:

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

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

  • Если ваши данные не помещаются в памяти вашего кластера, можно использовать datastore с tall массивы для разделения и обработки данных в фрагменты. См. также Рабочий процесс Больших данных с использованием высоких массивов и хранилищ данных.

Загрузка распределенных массивов параллельно с использованием datastore

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

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

files = repmat({'airlinesmall.csv'}, 10, 1);
ds = tabularTextDatastore(files);

Выберите переменные для примера.

ds.SelectedVariableNames = {'DepTime','DepDelay'};
ds.TreatAsMissing = 'NA';

Составьте распределенную таблицу путем параллельного чтения datastore. Разделите datastore на рабочие разделы по одному разделу. Затем каждый рабочий процесс считывает все данные из соответствующего раздела. Файлы должны находиться в общем расположении, доступном работникам.

dt = distributed(ds);
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.

Отображение сводной информации о распределенной таблице.

summary(dt) 
Variables:

    DepTime: 1,235,230×1 double
        Values:

            min          1
            max       2505
            NaNs    23,510

    DepDelay: 1,235,230×1 double
        Values:

            min      -1036
            max       1438
            NaNs    23,510

Определите размер длинная таблица.

size(dt) 
ans =

     1235230           2

Верните первые несколько строк dt.

head(dt) 
ans =

    DepTime    DepDelay
    _______    ________

     642       12      
    1021        1      
    2055       20      
    1332       12      
     629       -1      
    1446       63      
     928       -2      
     859       -1      
    1833        3      
    1041        1      

Наконец, проверьте, сколько данных загрузил каждый рабочий процесс.

spmd, dt, end
Lab 1: 
  
  This worker stores dt2(1:370569,:).
  
          LocalPart: [370569×2 table]
      Codistributor: [1×1 codistributor1d]
  
Lab 2: 
  
  This worker stores dt2(370570:617615,:).
  
          LocalPart: [247046×2 table]
      Codistributor: [1×1 codistributor1d]
  
Lab 3: 
  
  This worker stores dt2(617616:988184,:).
  
          LocalPart: [370569×2 table]
      Codistributor: [1×1 codistributor1d]
  
Lab 4: 
  
  This worker stores dt2(988185:1235230,:).
  
          LocalPart: [247046×2 table]
      Codistributor: [1×1 codistributor1d]

Обратите внимание, что данные разделены равномерно по работникам. Для получения дополнительной информации о datastore, смотрите Что такое Datastore?

Для получения дополнительной информации о рабочих процессах для больших данных смотрите Выбор решения для параллельных вычислений.

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

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

Вы можете создать распределенный массив несколькими способами:

  • Используйте distributed функция для распределения существующего массива из клиентской рабочей области среди работников параллельного пула.

  • Используйте любой из distributed функций, чтобы непосредственно создать распределенный массив для рабочих процессов. Этот метод не требует, чтобы массив уже существовал в клиенте, тем самым уменьшая требования к памяти рабочей области клиента. Функции включают eye(___, 'distributed') и rand(___, 'distributed'). Полный список см. в разделе distributed страница с описанием объекта.

  • Создайте кодовый распределенный массив внутри spmd оператор, а затем доступ к нему как к распределенному массиву за пределами spmd оператор. Этот метод позволяет вам использовать схемы распределения, отличные от схем по умолчанию.

Первые два метода не включают spmd в создании массива, но можно использовать spmd для манипулирования созданными таким образом массивами. Для примера:

Создайте массив в рабочей рабочей области клиента, а затем сделайте его распределенным массивом.

parpool('local',2) % Create pool
W = ones(6,6);
W = distributed(W); % Distribute to the workers
spmd
    T = W*2; % Calculation performed on workers, in parallel.
             % T and W are both codistributed arrays here.
end
T            % View results in client.
whos         % T and W are both distributed arrays here.
delete(gcp)  % Stop pool

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

Связь между распределенным и кодовым распределением массивов является одной из перспективных. Распределенные по коду массивы разделяются между работниками, из которых вы выполняете код, чтобы создать или манипулировать ими. Когда вы создаете распределенный массив в клиенте, вы можете получить доступ к нему как к кодовому распределенному массиву внутри spmd оператор. Когда вы создаете codistributed array в spmd оператор, вы можете получить доступ к нему как к распределенному массиву в клиенте. Только spmd операторы позволяют вам получить доступ к одним и тем же данным массива с двух разных точек зрения.

Можно создать codistributed массив несколькими способами:

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

  • Используйте любую из кодовых функций, чтобы непосредственно создать кодовый массив на рабочих местах. Этот метод не требует, чтобы массив уже существовал в рабочих местах. Функции включают eye(___, 'codistributed') и rand(___, 'codistributed'). Полный список см. в разделе codistributed страница с описанием объекта.

  • Создайте распределенный массив вне spmd оператор, затем доступ к нему как к кодовому распределенному массиву внутри spmd оператор, выполняемый в том же параллельном пуле.

Создайте кодовый распределенный массив внутри spmd оператор с использованием схемы распределения без ограничений. Сначала задайте распределение 1-D вдоль третьей размерности с 4 частями на рабочих 1 и 12 частями на рабочих 2. Тогда создайте массив нулей 3 на 3 на 16.

parpool('local',2) % Create pool
spmd
    codist = codistributor1d(3,[4,12]);
    Z = zeros(3,3,16,codist);
    Z = Z + labindex;
end
Z  % View results in client.
   % Z is a distributed array here.
delete(gcp) % Stop pool

Для получения дополнительной информации о codistributed arrays, смотрите Работа с Codistributed Arrays.

См. также

| | | | | | |

Похожие примеры

Подробнее о