Hyppää sisältöön

Rinnakkaislaskenta MATLABilla Roihu-HPC-klusterissa

Tässä dokumentissa kuvataan vaiheet, joilla MATLAB määritetään lähettämään ajoja klusteriin, noutamaan tulokset ja selvittämään virheitä.

Lisenssi

Lisensoinnista kerrotaan kohdassa MATLAB-lisenssi

Alkumääritykset

Tämä määritys on tarkoitettu töiden lähettämiseen silloin, kun MATLAB on asennettu omalle koneellesi ja ajot suoritetaan etänä klusterissa. Tämä määritys täytyy tehdä kerran kutakin klusteria ja koneellesi asennettua MATLAB-versiota kohden.

Käynnistä MATLAB ja suorita userpath

userpath

Lataa MATLAB-liitännäisen skriptit täältä. ZIP-tiedoston sisältö tulee purkaa kansioon, jonka userpath-kutsu palauttaa.

Luo uusi klusteriprofiili

configCluster

Ajojen lähettäminen klusteriin edellyttää SSH-kirjautumistietoja. Sinulta pyydetään käyttäjätunnusta. SSH-agentin on oltava käynnissä, jotta se voi tarjota yksityisen avaimen ja varmenteen. Tunnistetiedostolle luotu varmenne vanhenee 24 tunnin kuluttua, ja se täytyy luoda uudelleen sen jälkeen. Katso täydelliset ohjeet CSC:n SSH-varmenneohjeista.

Ajot suoritetaan nyt klusterissa paikallisen koneesi sijaan.

HUOMAA: Jos haluat suorittaa ajot paikallisella koneellasi klusterin sijaan, käytä profiilia Processes tai Threads.

% Get a handle to the local resources
c = parcluster('Processes');

Ajojen määrittäminen

Ennen työn lähettämistä voidaan asettaa erilaisia ajastimen valitsimia, kuten jono, sähköposti, seinäkelloaika jne. Vain AccountName ja WallTime ovat pakollisia.

% Get a handle to the cluster
c = parcluster;

Pakolliset valitsimet:

% Specify an account
c.AdditionalProperties.AccountName = '<project>';


% Specify the wall time (e.g., 1 day, 5 hours, 30 minutes)
c.AdditionalProperties.WallTime = '1-05:30';

Valinnaiset valitsimet:

% Specify memory to use, per core (default: 4GB)
c.AdditionalProperties.MemPerCPU = '6GB';


% Specify the partition
c.AdditionalProperties.Partition = 'partition-name';


% Specify a constraint
c.AdditionalProperties.Constraint = 'feature-name';


% Request email notification of job status
c.AdditionalProperties.EmailAddress = 'user-id@university.fi';


% Specify number of GPUs per node (default: 0)
c.AdditionalProperties.GPUsPerNode = 1;


% Specify a particular GPU card
c.AdditionalProperties.GPUCard = 'gh200';


% Specify number of nodes (default: 1)
c.AdditionalProperties.NumNodes = 2;

% Specify cores per node
c.AdditionalProperties.ProcsPerNode = 4;


% Set node exclusivity (default: false)
c.AdditionalProperties.RequireExclusiveNode = true;


% Specify a reservation
c.AdditionalProperties.Reservation = 'reservation-name';

Jotta AdditionalProperties-asetuksiin tehdyt muutokset säilyvät MATLAB-istuntojen välillä, tallenna profiili

c.saveProfile

Jos haluat nähdä nykyisten määritysasetusten arvot, näytä AdditionalProperties.

c.AdditionalProperties

Poista asetus, kun sitä ei enää tarvita.

% Turn off email notifications
c.AdditionalProperties.EmailAddress = '';


% Don't request an entire node
c.AdditionalProperties.RequireExclusiveNode = false;

Riippumaton eräajo

Käytä batch-komentoa asynkronisten ajojen lähettämiseen klusteriin. batch-komento palauttaa työolion, jota käytetään lähetetyn työn tulosteiden käsittelyyn. Katso lisätietoja MATLABin dokumentaatiosta kohdasta batch.

% Get a handle to the cluster
c = parcluster;


% Submit job to query where MATLAB is running on the cluster
job = c.batch(@pwd, 1, {}, CurrentFolder='.');


% Query job for state
job.State


% Wait for job to finish
job.wait


% If job is finished, fetch the results
job.fetchOutputs{1}


% Delete the job after results are no longer needed
job.delete

Jos haluat hakea luettelon käynnissä olevista tai valmistuneista töistä, kutsu parcluster, joka palauttaa klusteriolion. Klusteriolio tallentaa työtaulukon, jossa työt on merkitty tiloihin queued, running, finished tai failed. Hae ja tarkastele työluetteloa alla olevan esimerkin mukaisesti.

c = parcluster;
jobs = c.Jobs


% Get a handle to the second job in the list
job2 = c.Jobs(2);

Kun työ on valittu, hae tulokset kuten aiemmin.

fetchOutputs-metodi hakee tulosargumentit; jos kutsut batch-komentoa skriptillä, käytä sen sijaan komentoa load. Klusterissa levylle kirjoitettu data täytyy hakea suoraan tiedostojärjestelmästä (esimerkiksi sftp:llä), tai se voidaan tuoda takaisin FileStore -toiminnolla.

% Fetch all results from the second job in the list
job2.fetchOutputs{:}


% Alternate: Load results if job was a script instead of a function
job2.load

Rinnakkainen eräajo

batch-komento tukee myös rinnakkaisia työnkulkuja. Käytetään seuraavaa esimerkkiä rinnakkaisesta työstä, joka kannattaa tallentaa erilliseen tiedostoon nimellä parallel_example.m.

function [sim_t, A] = parallel_example(iter)


if nargin==0
    iter = 8;
end


disp('Start sim')


A = nan(iter,1);
t0 = tic;
parfor idx = 1:iter
    A(idx) = idx;
    pause(2)
    idx
end
sim_t = toc(t0);


disp('Sim completed')


save RESULTS A


end

Tällä kertaa batch-komentoa käytettäessä määritä myös Pool-argumentti.

% Get a handle to the cluster
c = parcluster;


% Submit a batch pool job using 4 workers for 16 simulations
job = c.batch(@parallel_example, 1, {16}, CurrentFolder='.', Pool=4);


% View current job status
job.State


% Wait for job to finish
job.wait


% Fetch the results after a finished state is retrieved
job.fetchOutputs{1}
ans =
    8.8872

Työ suoritettiin 8,89 sekunnissa käyttäen neljää työntekijää. Huomaa, että nämä työt pyytävät aina N+1 CPU-ydintä, koska yksi työntekijä tarvitaan hallitsemaan eräajoa ja työntekijäjoukkoa. Esimerkiksi työ, joka tarvitsee kahdeksan työntekijää, vaatii yhdeksän CPU-ydintä.

Suorita sama simulointi uudelleen, mutta kasvata Pool-kokoa. Tällä kertaa pidä työn tunniste tallessa, jotta voit hakea tulokset myöhemmin.

HUOMAA: Joissakin sovelluksissa liian suuren työntekijämäärän varaamisesta saatava hyöty pienenee, koska yleiskustannus voi ylittää laskenta-ajan.

% Get a handle to the cluster
c = parcluster;


% Submit a batch pool job using 8 workers for 16 simulations
job = c.batch(@parallel_example, 1, {16}, CurrentFolder='.', Pool=8);


% Get the job ID
id = job.ID
id =
    4


% Clear job from workspace (as though MATLAB exited)
clear job

Kun käytössä on viite klusteriin, findJob-metodi etsii työn annetulla työn tunnisteella.

% Get a handle to the cluster
c = parcluster;


% Find the old job
job = c.findJob('ID', 4);


% Retrieve the state of the job
job.State
ans =
    finished


% Fetch the results
job.fetchOutputs{1};
ans =
    4.7270

Työ suoritetaan nyt 4,73 sekunnissa käyttäen kahdeksaa työntekijää. Kokeile koodia eri työntekijämäärillä löytääksesi sopivimman määrän.

Vaihtoehtoisesti voit hakea työn tulokset graafisen käyttöliittymän kautta käyttämällä Job Monitoria (Parallel > Monitor Jobs).

Virheiden selvittäminen

Jos sarjatyö tuottaa virheen, kutsu getDebugLog-metodia nähdäksesi virhelokitiedoston.

Kun lähetät riippumattoman työn, määritä tehtävä.

c.getDebugLog(job.Tasks)

Pool-töissä määritä vain työolio.

c.getDebugLog(job)

Työn ongelmatilanteita selvitettäessä klusterin ylläpito voi pyytää työn ajastintunnistetta. Sen saa kutsumalla getTaskSchedulerIDs.

job.getTaskSchedulerIDs()
ans =
    25539

Aputoiminnot

Funktio
Kuvaus
clusterFeatures
Luettelee klusterin ominaisuudet/rajoitteet
clusterGpuCards
Luettelee klusterin GPU-kortit
clusterPartitionNames
Luettelee klusterin osioiden nimet
cscTools
Työkalukokoelma (print_affinity, projects, workspaces, seff jne.)
willRun
Selittää, miksi työ on jonossa

Lisätietoja

Jos haluat oppia lisää MATLAB Parallel Computing Toolboxista, tutustu seuraaviin aineistoihin:

Onko tämä sivu hyödyllinen?
Kiitos palautteestasi!
Kiitos! Arvostamme palautettasi.

Kerro meille miten voisimme parantaa tätä sivua ottamalla meihin yhteyttä .