exponenta event banner

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

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

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

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

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

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

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

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

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

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

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

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

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

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, смотрите раздел Что такое хранилище данных?

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

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

Если данные помещаются в память локального компьютера, можно использовать распределенные массивы для разделения данных между работниками. Используйте 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 заявление. При создании совместно распределенного массива в spmd , вы можете получить доступ к нему как к распределенному массиву в клиенте. Только spmd операторы позволяют получать доступ к одним и тем же данным массива с двух разных точек зрения.

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

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

  • Используйте любую из coddistributed функций, чтобы непосредственно создать codistributed массив на рабочих. Этот метод не требует, чтобы массив уже существовал в рабочих элементах. Функции включают 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

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

См. также

| | | | | | |

Связанные примеры

Подробнее