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
Lataa MATLAB-liitännäisen skriptit täältä. ZIP-tiedoston sisältö tulee purkaa kansioon, jonka userpath-kutsu palauttaa.
Luo uusi klusteriprofiili
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.
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.
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
Jos haluat nähdä nykyisten määritysasetusten arvot, näytä 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.
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ä.
Pool-töissä määritä vain työolio.
Työn ongelmatilanteita selvitettäessä klusterin ylläpito voi pyytää työn ajastintunnistetta. Sen saa kutsumalla getTaskSchedulerIDs.
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:
- Parallel Computing Overview
- Parallel Computing Documentation
- Parallel Computing Coding Examples
- Parallel Computing Tutorials
- Parallel Computing Videos
- Parallel Computing Webinars