Hyppää sisältöön

Welcome to our weekly research support coffee hour on Zoom! Click here for more information.

Warning!

Puhti scratch disk is becoming very full (80+ % ) resulting in performance degradation. Everybody is advised to only keep actively processed data on scratch, all other data should be deleted, transferred to host institute or stored in Lumi-O. No new quota will be granted. Click here for a tool for examining your disk usage.

MATLAB

MATLAB on korkean tason teknisen laskennan kieli ja interaktiivinen ympäristö algoritmien kehittämiseen, datan visualisointiin, data-analyysiin ja numeeriseen laskentaan.

Lisenssi

MATLAB on suljettu ohjelmisto, jonka käyttö edellyttää voimassa olevaa lisenssiä. Lisäksi jokainen toolbox vaatii oman erillisen lisenssinsä, jotta sen toiminnallisuuksia voi käyttää.

Vaikka supertietokoneiden MATLAB-asennukset sisältävät kaikki saatavilla olevat toolboxit, pelkkä asennus ei anna käyttöoikeutta. Sinulla täytyy olla voimassa oleva lisenssi jokaiseen toolboxiin, jota haluat käyttää.

Lisenssivaihtoehdot käsitellään seuraavissa osioissa.

Yleiskatsaus

Tarjoamme kolme tapaa käyttää MATLABia CSC:n supertietokoneilla. Paras vaihtoehto riippuu tarpeistasi.

  1. MATLAB-selainsovellus sopii parhaiten interaktiiviseen käyttöön. Se toimii kuten työpöytäversio ja antaa sinun käyttää omaa lisenssiäsi (home, individual, student tai campus-wide) kaikkien toolboxiesi kanssa. Voit käyttää myös verkkolisenssiä. Saatavilla Puhdissa, Mahdissa ja LUMIssa.

  2. MATLAB-komentorivikäyttöliittymä sopii hyvin perusinteraktiiviseen käyttöön ja eräajoihin. Edellyttää verkkolisenssiä. Saatavilla Puhdissa, Mahdissa ja LUMIssa.

  3. MATLAB Parallel Server sopii parhaiten eräajolaskentaan. Voit lähettää töitä paikallisesta MATLABistasi supertietokoneelle. Paikalliset toolboxisi toimivat myös supertietokoneella. Supertietokoneen workerit käyttävät CSC:n verkkolisenssiä. Saatavilla vain Puhdissa.

Kaikki vaihtoehdot tukevat MATLAB-versioita R2023b–R2025a. Parallel Server tukee myös vanhempia versioita aina versioon R2021a asti.

CSC tarjoaa seuraavat lisenssit, jotka ovat kaikkien käyttäjien yhteiskäytössä, akateemiseen käyttöön:

Verkkolisenssi 1766@license4.csc.fi tarjoaa seuraavat akateemiset lisenssit Puhtiin ja Mahtiin: 5 MATLAB, 2 Parallel Computing Toolbox, 500 MATLAB Parallel Server. Akateeminen lisenssi sallii käytön vain suomalaisten korkeakoulujen affilioituneille käyttäjille eli henkilökunnalle ja opiskelijoille.

Verkkolisenssi 1766@license10.csc.fi tarjoaa seuraavat akateemiset lisenssit LUMIin: 25 MATLAB, 25 Simulink, 25 Control System Toolbox, 25 Curve Fitting Toolbox, 25 Deep Learning Toolbox, 25 Global Optimization Toolbox, 25 Image Processing Toolbox, 25 Optimization Toolbox, 25 Parallel Computing Toolbox, 25 Signal Processing Toolbox, 25 Statistics and Machine Learning Toolbox, 25 Wavelet Toolbox. Akateeminen lisenssi sallii käytön vain opetukseen ja akateemiseen tutkimukseen tutkintoja myöntävissä oppilaitoksissa.

Info

Jos olet käyttäjä kaupallisesta yrityksestä tai tutkimuslaitoksesta, sinun täytyy tuoda ja käyttää omaa kaupallista lisenssiäsi. Ota yhteyttä CSC:n asiakastukeen saadaksesi lisäohjeita.

MATLAB-selainsovellus

MATLAB web application

Suosittelemme käyttämään selainkäyttöliittymää MATLABin interaktiiviseen käyttöön.

  1. Aloita kirjautumalla sen klusterin selainkäyttöliittymään, jota haluat käyttää: www.puhti.csc.fi, www.mahti.csc.fi tai www.lumi.csc.fi.

  2. Paina sitten MATLAB-kuvaketta valitaksesi MATLAB-selainsovelluksen.

    • MATLAB OOD pinned apps
  3. Valitse lähetyslomakkeessa istunnollesi sopivat resurssit. Suosittelemme vähintään 8 Gt muistia ennen MATLAB-sovelluksen käynnistämistä. MATLAB-selainsovellus itsessään kuluttaa noin 4 Gt muistia.

    • MATLAB OOD form
  4. Näkyviin tulee MATLAB-selainsovelluksen lisenssi-GUI. Valitse Online License Manager kirjautuaksesi sisään MathWorks-tunnuksillasi. Jos sinulla ei ole MathWorks-tiliä, sinun täytyy luoda MathWorks-tili yliopistosi tai organisaatiosi sähköpostiosoitteella. Vaihtoehtoisesti voit valita Network License Managerin käyttääksesi verkkolisenssiä.

    • MATLAB license GUI
  5. MATLAB-sovelluksen latautuminen kestää muutaman minuutin. Paina sitten Connect to MATLAB, ja selainsovellus avautuu.

Error

Jos yrität kirjautua sisään MathWorks-tunnuksilla, mutta MATLABin lisenssi-GUI lataa automaattisesti CSC:n lisenssipalvelimen, sinun täytyy ensin tyhjentää välimuistiin tallennetut tunnistetiedot. Toimi näin:

  1. Avaa selainkäyttöliittymässä sovellus Login node shell.
  2. Suorita seuraava komento poistaaksesi välimuistiin tallennetut tunnistetiedot:
    rm -rf "$HOME/.matlab/MWI"
    

MATLAB-komentorivikäyttöliittymä

Puhdissa ja Mahdissa voimme ladata MATLAB-moduulin seuraavasti:

module load matlab

LUMIssa meidän täytyy lisätä CSC:n paikallisen hakemiston moduulitiedostot moduulipolkuun ennen moduulin lataamista seuraavasti:

module use /appl/local/csc/modulefiles
module load matlab

Voimme avata MATLAB-komentorivikäyttöliittymän seuraavasti:

matlab -nodisplay

Voimme myös suorittaa MATLAB-skriptejä erätilassa seuraavasti:

matlab -batch <script>

Voit käyttää eri lisenssiä asettamalla seuraavan ympäristömuuttujan ennen MATLABin käynnistämistä:

export MLM_LICENSE_FILE="port@mylicenseserver.com"

Laskentasäikeet ja Parallel Computing Toolbox

MATLABin lineaarialgebraoperaatioissa, suurten taulukoiden alkioittaisissa operaatioissa ja sisäänrakennetuissa matemaattisissa operaatioissa on sisäänrakennettu säikeistys, jota ohjaa maxNumCompThreads. MATLAB asettaa sen yleensä automaattisesti oikeaan arvoon myös Slurm-töissä. Voit vertailla yhden ja kahden säikeen vaikutusta matriisikertolaskuun suorittamalla seuraavan MATLAB-skriptin:

compthreads.m
A = rand(1000, 1000);

% One thread
maxNumCompThreads(1);
t0 = tic;
B = A*A;
t1 = toc(t0);

% Two threads
maxNumCompThreads(2);
t2 = tic;
C = A*A;
t3 = toc(t2);

% Compare times
fprintf("One thread : %d\nTwo threads: %d\n", t1, t3);

Voimme myös rinnakkaistaa koodia MATLABissa käyttämällä korkean tason rakenteita Parallel Computing Toolboxista. Tarkastellaan seuraavaa sarjallista koodia, joka pysähtyy yhdeksi sekunniksi n kertaa ja mittaa suoritusaikaa:

funcSerial.m
function t = funcSerial(n)
t0 = tic;
for idx = 1:n
    pause(1);
end
t = toc(t0);
end

Seuraavan sarjallisen suorituksen pitäisi kestää noin kaksi sekuntia:

t_serial = funcSerial(2)

Voimme rinnakkaistaa funktion käyttämällä rinnakkaista for-silmukkarakennetta parfor seuraavasti:

funcParallel.m
function t = funcParallel(n)
t0 = tic;
parfor idx = 1:n
    pause(1);
end
t = toc(t0);
end

Rinnakkaiskoodin suorittamiseksi meidän täytyy luoda rinnakkaisallas prosesseilla tai säikeillä ja suorittaa sitten rinnakkaiskoodi. Voimme luoda rinnakkaisaltaan kahdella prosessilla ja suorittaa rinnakkaiskoodin samalla argumentilla kuin sarjallisessa versiossa, mutta sen pitäisi kestää vain noin yksi sekunti:

funcProcesses.m
function t = funcProcesses(n)
pool = parpool('Processes', n);
t = funcParallel(n);
delete(pool);
end
t_processes = funcProcesses(2)

Tässä sama käyttäen säikeisiin perustuvaa rinnakkaisallasta:

funcThreads.m
function t = funcThreads(n)
pool = parpool('Threads', n);
t = funcParallel(n);
delete(pool);
end
t_threads = funcProcesses(2)

MATLABissa on myös mahdollista käyttää GPU:ita, mutta vain Nvidia-GPU:t ovat tuettuja. Voimme kysyä saatavilla olevat GPU-laitteet ja suorittaa laskentaa GPU:lla seuraavasti:

funcGPU.m
function C = funcGPU(n)
gpuDevice();
A_gpu = gpuArray(rand(n, n));
B_gpu = gpuArray(rand(n, n));
C_gpu = A_gpu * B_gpu;
C = gather(C_gpu);
end

Suoritetaan funktio:

C = funcGPU(1000);

MATLAB Parallel Server

Paikallinen määritys

MATLAB Parallel Server (MPS) mahdollistaa eräajotöiden lähettämisen käyttäjän tietokoneella olevasta MATLABista Puhti-klusterin MATLAB-workereille. MPS:n käyttö edellyttää käyttäjän tietokoneella seuraavaa määritystä: MATLAB-asennus tuetulla MATLAB-versiolla, Parallel Computing Toolbox, SSH-yhteys Puhti-klusteriin sekä käyttäjäpuolen määritys. Asenna käyttäjäpuolen määritystiedostot suorittamalla seuraava MATLAB-skripti:

mps_puhti.m
% Define local MATLAB configuration directory.
if ispc()
    % Windows
    confroot = fullfile(getenv("APPDATA"), "Mathworks", "MATLAB");
elseif isunix() || ismac()
    % Unix (Linux) or MacOS
    confroot = fullfile(getenv("HOME"), ".matlab");
else
     % Operating system not supported
     exit();
end

% Path to where the ZIP file is downloaded.
confzip = fullfile(confroot, "mps_puhti.zip");

% Remove previous zipfile if exists
if exist(confzip, "file") == 2
    delete(confzip);
end

% Path to the directory where configuration files are extracted.
confdir = fullfile(confroot, "mps_puhti");

% Remove previous zipdir if exists
if exist(confdir, "dir") == 7
    rmdir(confdir, 's');
end

% Download the configuration files as a ZIP file.
websave(confzip, "https://github.com/CSCfi/csc-env-matlab/raw/refs/heads/main/config/mps_puhti.zip");

% Extract the configuration files to the configuration directory.
unzip(confzip, confdir);

% Persist path to the configuration files.
addpath(confdir);
savepath();

Seuraavaksi määritetään klusteriprofiili, jonka avulla MATLABisi voi lähettää töitä Puhtiin. Anna kehotteeseen Puhti-käyttäjätunnuksesi.

MATLAB script
configCluster();

Lopuksi voimme testata yhteyden MATLABista Puhtiin. Ensimmäisellä yhteyskerralla MATLAB pyytää valitsemaan salasana- tai SSH-avainautentikoinnin välillä. Sinun täytyy valita SSH-avainautentikointi, antaa yksityisen avaimesi polku ja syöttää yksityisen avaimen salasana, jos sellainen on. Salasana-autentikointia ei enää tueta Puhdissa. MATLAB tallentaa avaimesi polun eikä kysy sitä uudelleen tulevissa istunnoissa.

MATLAB script
c = parcluster();
cscWorkspaces(c);

Error

Jos käytät PuTTYä SSH-avainten luomiseen, sinun täytyy viedä yksityinen avain OpenSSH-avaimena ja käyttää sitä MATLAB Parallel Serverin kanssa. PuTTY Private Key -muoto (.ppk) ei toimi.

Yhden solmun sarjalliset, rinnakkaiset ja GPU-työt

Määritämme resurssivarauksen käyttämällä parcluster-funktiota ja lähetämme funktion tai skriptin klusteriin käyttämällä batch-funktiota. parcluster-olio on tilallinen, joten poistamme ominaisuuksien asetukset eksplisiittisesti silloin, kun niitä ei käytetä, kuten GPU-asetukset vain CPU:ta käyttäville töille. Voit käyttää seuraavia esimerkkejä; korvaa vain <project> projektillasi, kuten project_2001234, ja muokkaa resurssivarausta tarpeidesi mukaan.

serial.m
c = parcluster();
c.AdditionalProperties.ComputingProject = '<project>';  % --account=<ComputingProject>
c.AdditionalProperties.Partition = 'small';             % --partition=<Partition>
c.AdditionalProperties.WallTime = '00:15:00';           % --time=<WallTime>
c.NumThreads = 1;                                       % --cpus-per-task=<NumThreads>
c.AdditionalProperties.MemPerCPU = '4g';                % --mem-per-cpu=<MemPerCPU>
c.AdditionalProperties.GPUCard = '';                    % --gres=gpu:<GPUCard>:<GPUsPerNode>
c.AdditionalProperties.GPUsPerNode = 0;
j = batch(c, @funcSerial, 1, {2}, 'CurrentFolder', '.', 'AutoAddClientPath', false);
parallel.m
c = parcluster();
c.AdditionalProperties.ComputingProject = '<project>';  % --account=<ComputingProject>
c.AdditionalProperties.Partition = 'small';             % --partition=<Partition>
c.AdditionalProperties.WallTime = '00:15:00';           % --time=<WallTime>
c.NumThreads = 2;                                       % --cpus-per-task=<NumThreads>
c.AdditionalProperties.MemPerCPU = '4g';                % --mem-per-cpu=<MemPerCPU>
c.AdditionalProperties.GPUCard = '';                    % --gres=gpu:<GPUCard>:<GPUsPerNode>
c.AdditionalProperties.GPUsPerNode = 0;
j = batch(c, @funcThreads, 1, {2}, 'CurrentFolder', '.', 'AutoAddClientPath', false);
gpu.m
c = parcluster();
c.AdditionalProperties.ComputingProject = '<project>';  % --account=<ComputingProject>
c.AdditionalProperties.Partition = 'gpu';               % --partition=<Partition>
c.AdditionalProperties.WallTime = '00:15:00';           % --time=<WallTime>
c.NumThreads = 1;                                       % --cpus-per-task=<NumThreads>
c.AdditionalProperties.MemPerCPU = '4g';                % --mem-per-cpu=<MemPerCPU>
c.AdditionalProperties.GPUCard = 'v100';                % --gres=gpu:<GPUCard>:<GPUsPerNode>
c.AdditionalProperties.GPUsPerNode = 1;
j = batch(c, @funcGPU, 1, {1000}, 'CurrentFolder', '.', 'AutoAddClientPath', false);

Esimerkissä asetamme työhakemistoksi klusterin kotihakemiston asettamalla 'CurrentFolder' arvoksi '.'. Lisäksi meidän kannattaa estää MATLABia lisäämästä paikallista MATLAB-hakupolkua etäworkereille asettamalla 'AutoAddClientPath' arvoksi false. Nämä esimerkit varaavat klusterista 1 MATLAB Parallel Server -lisenssin työn ajaksi.

Monisolmutyöt

Warning

Monisolmutyöt eivät näytä toimivan versiossa R2025a.

Voimme myös luoda rinnakkaisaltaan workereista asettamalla 'Pool'-argumentiksi niiden workereiden määrän, jonka haluamme varata (tämä vastaa Slurm-varauksessa asetusta --ntasks=<PoolSize>). parcluster-resurssit määrittävät, kuinka paljon resursseja varataan workeria kohden. Meidän kannattaa varata allas tällä tavalla silloin, kun tarvitsemme enemmän workereita kuin yhteen solmuun mahtuu; muussa tapauksessa voimme varata rinnakkaistyön kuten edellisessä osiossa kuvattiin ja varata altaan säikeillä tai prosesseilla.

Tässä on esimerkki rinnakkaisaltaasta, jossa on 50 workeria:

pool.m
c = parcluster();
c.AdditionalProperties.ComputingProject = '<project>';  % --account=<ComputingProject>
c.AdditionalProperties.Partition = 'large';             % --partition=<Partition>
c.AdditionalProperties.WallTime = '00:15:00';           % --time=<WallTime>
c.NumThreads = 1;                                       % --cpus-per-task=<NumThreads>
c.AdditionalProperties.MemPerCPU = '4g';                % --mem-per-cpu=<MemPerCPU>
c.AdditionalProperties.GPUCard = '';                    % --gres=gpu:<GPUCard>:<GPUsPerNode>
c.AdditionalProperties.GPUsPerNode = '';
j = batch(c, @funcParallel, 1, {50}, 'Pool', 50, 'CurrentFolder', '.', 'AutoAddClientPath', false);

Huomaa, että rinnakkaisallas pyytää aina yhden ylimääräisen prosessin worker-altaan hallintaan. Tämä esimerkki varaa klusterista 51 MATLAB Parallel Server -lisenssiä työn ajaksi. Puhdissa on 500 MATLAB Parallel Server -lisenssiä kaikkien käyttäjien yhteiskäytössä.

Töiden ja tulosteen kysely

Hae viite parcluster-olioon:

c = parcluster();

Nouda viimeiset 5 työtä:

c.Jobs(end-4:end)

Nouda työ sen tunnisteen perusteella:

j = c.findJob('ID', 11);

Voimme hakea valmiin työn funktion tulosteet seuraavasti:

result = j.fetchOutputs()

Voimme lukea työn tulosteen seuraavasti:

diary(j)

Voimme myös kysyä työn tehokkuutta:

seff(j)

Data, joka on kirjoitettu tiedostoihin klusterissa, täytyy hakea suoraan tiedostojärjestelmästä, esimerkiksi käyttämällä scp:tä.

Suomenkielinen tekoälykäännös

Sisällössä voi esiintyä virheellistä tietoa tekoälykäännöksestä johtuen.

Klikkaa tästä antaaksesi palautetta