Hyppää sisältöön

Puhdin ja Mahdin laskentapalvelut ovat poistuneet käytöstä. Puhdin ja Mahdin kirjautumisnoodit sekä tallennustila ovat saatavilla 15. lokakuuta 2026 asti, mutta ne eivät enää ole palvelusopimusten piirissä. Ryhdythän toimiin datan siirtämiseksi Roihuun välittömästi. Ohjeita löydät sivulta Roihun datan siirto-opas.

Kuinka saavuttaa parempi I/O-suorituskyky Lustressa

Tässä oppaassa käsitellään joitakin rinnakkaisen I/O:n teknisiä yksityiskohtia ja annetaan esimerkkejä paremman suorituskyvyn saavuttamiseksi. Katso myös tekninen kuvaus Lustre-tiedostojärjestelmästä, jota käytetään CSC:n supertietokoneissa.

Tätä opasta päivitetään

Tämä opas on kirjoitettu Mahdille, ja sitä päivitetään parhaillaan Roihua varten. Osa tämän oppaan tiedoista saattaa siksi olla vanhentuneita.

MPI-I/O

Kun rinnakkaista I/O:ta tehdään MPI:llä (tai kirjastoilla, jotka käyttävät taustalla MPI-IO:ta), levyä voidaan käyttää itsenäisesti tai kollektiivisesti. Itsenäisessä I/O:ssa kukin MPI-prosessi käyttää tiedostojärjestelmää suoraan, kun taas kollektiivisessa I/O:ssa MPI-ajonaikainen ympäristö kokoaa/hajauttaa dataa joukon aggregaattori-I/O-tehtävien kautta. Kollektiivinen I/O tarjoaa tyypillisesti huomattavasti suuremman kaistanleveyden kuin itsenäinen I/O.

  • Esimerkki: 8 MPI-prosessia, 4 MPI-prosessia laskentasolmua kohden, kollektiivinen I/O, kaikki prosessit kirjoittavat samaan tiedostoon.

"Kaaviomainen esimerkki 8 MPI-prosessista, 4 MPI-prosessia laskentasolmua kohden, kollektiivinen I/O, kaikki prosessit kirjoittavat samaan tiedostoon"

Esimerkki MPI-IO-aggregaattoreista

I/O:n parantaminen ROMIO-vihjeillä

Oletusarvoisesti kollektiivisessa I/O:ssa Mahdin OpenMPI käyttää yhtä MPI I/O -agregaattoria laskentasolmua kohden. Tämä tarkoittaa, että yllä olevassa esimerkissämme vain 2 MPI-prosessia tekevät varsinaisen I/O:n. Ne kokoavat datan muilta prosesseilta (vaihe 1), ja toisessa vaiheessa ne lähettävät datan tallennusjärjestelmään. Oletusarvoisten MPI-aggregaattorien käyttö voi riittää, mutta monissa tapauksissa ei riitä. Aggregaattorien määrää solmua kohden sekä joitakin muita I/O:hon vaikuttavia parametreja voidaan säätää ROMIO-vihjeillä.

Saatavilla olevat vihjeet kollektiiviseen puskurointiin (kaksivaiheinen I/O), painopisteenä Lustre:

Hint Description
cb_buffer_size Välipuskurin koko tavuina, jota käytetään kaksivaiheisessa kollektiivisessa I/O:ssa
romio_cb_read Kollektiiviset lukuoperaatiot kollektiivisen puskuroinnin aikana, arvot: enable, disable, automatic
romio_cb_write Kollektiiviset kirjoitusoperaatiot kollektiivisen puskuroinnin aikana, arvot: enable, disable, automatic
romio_no_indep_rw Määrittää, onko itsenäinen luku/kirjoitus käytössä vai ei, arvot: enable, disable, automatic
cb_config_list Määrittää, kuinka monta MPI I/O -aggregaattoria voidaan käyttää solmua kohden, arvot: *:X, missä X aggregaattoria kutakin laskentasolmua kohden
cb_nodes Käytettävien aggregaattorien enimmäismäärä

Kuinka voin muuttaa MPI I/O -vihjeitä?

Vihjeet voidaan määritellä tekstitiedostossa. Esimerkiksi MPI I/O -aggregaattorien määrä solmua kohden asetetaan kahteen:

cb_config_list *:2

Lisäksi ympäristömuuttuja ROMIO_HINTS täytyy asettaa eräajotyöskriptissäsi:

export ROMIO_HINTS=/path/to/file_with_hints

Vihjeet voidaan asettaa myös sovelluskoodissa:

...
call MPI_Info_create(info,ierror)
call MPI_Info_set(info,'romio_cb_write','enable',ierror)
...
call MPI_File_open(comm,filename,amode,info,fh,ierror)
...

Jotta voit tarkistaa, että määrityksesi todella otettiin käyttöön, käytetyt vihjeet ja niiden arvot voidaan näyttää asettamalla eräajotyöskriptiin:

export ROMIO_PRINT_HINTS=1

Jos, ja vain jos, käytössä on kollektiivinen I/O, vihjeet tulostetaan työn vakiotulosteeseen, esimerkiksi:

key = cb_buffer_size            value = 33554432
key = romio_cb_read             value = enable
key = romio_cb_write            value = enable
key = cb_nodes                  value = 64
key = romio_no_indep_rw         value = false
key = romio_cb_pfr              value = disable
...

Tiedosto prosessia kohden

Jotkin sovellukset luovat yhden tiedoston jokaista MPI-prosessia kohden. Vaikka tämä on helppo toteuttaa, se ei välttämättä ole tehokasta. Jos käytät paljon prosesseja laskentasolmua kohden, voi syntyä kilpailua sekä solmun verkosta (koska kaikkien prosessien täytyy käyttää tiedostojärjestelmää) että varsinaisista I/O-operaatioista. Joissakin tapauksissa tiedosto prosessia kohden voi olla tehokas lähestymistapa, mutta ole aina varovainen ja mieti skaalautuvuutta, sillä tämä lähestymistapa ei skaalaudu.

"Kaavio, jossa yksi tiedosto prosessia kohden"

Tiedosto prosessia kohden

Vertailutesti - NAS BTIO

Estävä I/O

Testausta varten käytämme NAS BTIO -vertailutestiä, jossa on PnetCDF-tuki, jotta voimme testata I/O-suorituskykyä Mahdin 16 laskentasolmulla.

Luomme syötetiedoston seuraavasti:

w                  # IO mode:    w for write, r for read
2                  # IO method:  0 for MPI collective I/O, 1 for MPI_independent I/O,
                   # 2 for PnetCDF blocking I/O, 3 for PnetCDF nonblocking I/O
5                  # number of time steps
2048 1024 256      # grid_points(1), grid_points(2), grid_points(3)
/scratch/project_xxxxx/BTIO/output # output filew

Tämä tarkoittaa, että teemme kirjoitusoperaatioita estävällä PnetCDF:llä, 5 aika-askeleella, ja yhteensä lähes puolella miljardilla hilapisteellä. Tulostiedosto on lähes 105 GB. Käytämme 256 prosessia, 16 prosessia laskentasolmua kohden.

Suoritettaessa oletusasetuksilla vertailutestin tulosteesta saadaan:

I/O bandwidth    :    1292.96 MiB/s

Juovitus

Tiedämme, että Lustren juovakoko on 1 MB, joten asetamme tämän tiedostoon nimeltä romio

striping_unit 1048576

ja annamme ROMIO-vihjeen:

export ROMIO_HINTS=/path/romio

Kun suoritamme vertailutestin uudelleen, saamme:

I/O bandwidth    :    2939.85 MiB/s

Suorituskyky paranee kertoimella 2,27.

MPI I/O -aggregaattorit

Oletusarvoisesti käytössä on yksi MPI I/O -aggregaattori laskentasolmua kohden, joten kasvatamme sen kahteen lisäämällä romio-tiedostoon:

cb_config_list *:2

Kun suoritamme vertailutestin uudelleen, saamme nyt:

I/O bandwidth    :    3699.31 MiB/s

Suorituskyky on parantunut kokonaisuudessaan kertoimella 2,86.

Lustren OST:iden määrän kasvattaminen

Jos käytämme kahta Lustren OST:tä ilman ROMIO-vihjeitä, suorituskyky on 3500 MiB/s, mikä on vähemmän kuin edellinen tulos.

Kun käytetään 2:ta OST:tä romio-tiedoston kanssa

striping_unit 1048576
romio_cb_write enable
romio_no_indep_rw true
romio_ds_write disable

suorituskyky kasvaa 4667 MiB/s:iin, eli 33 %. Tässä tapauksessa aggregaattorien määrän kasvattaminen ei paranna suorituskykyä.

Yleisesti ottaen ROMIO-vihjeiden vaikutus riippuu sovelluksesta ja käytetystä laitteistosta; optimaaliset parametrit eivät välttämättä ole samoja eri sovelluksissa.

Estämätön I/O

Luomme syötetiedoston estämättömälle PnetCDF:lle seuraavasti:

w                  # IO mode:    w for write, r for read
3                  # IO method:  0 for MPI collective I/O, 1 for MPI_independent I/O,
                   # 2 for PnetCDF blocking I/O, 3 for PnetCDF nonblocking I/O
5                  # number of time steps
2048 1024 256      # grid_points(1), grid_points(2), grid_points(3)
/scratch/project_xxxxx/BTIO/output # output file

ROMIO:n oletusparametreilla suorituskyky on 1820 MiB/s yhdellä OST:llä, mikä on melko alhainen 16 laskentasolmulle.

Seuraavaksi määritämme romio-tiedoston:

striping_unit 1048576
cb_config_list *:4
romio_ds_write disable

Saavutettu suorituskyky on 4565 MiB/s, mikä on 2,5-kertainen parannus.

Jos käytämme 2:ta OST:tä samalla romio-tiedostolla, suorituskyky on 9520 MiB/s, mikä on yli kaksinkertainen verrattuna yhteen OST:hen ja yli kaksinkertainen verrattuna estävään I/O:hon. Oletusparametreilla saavutettu suorituskyky olisi 7772 MiB/s, joten vihjeet parantavat suorituskykyä 22,5 %.

Yhteenveto

  • Varmista ensin, että I/O aiheuttaa ongelmia tai vie merkittävän osan kokonaisajoajastasi.
  • Kokeile sitten I/O-kirjastoja, kuten PNetCDF, HDF5, ADIOS.
  • Käytä estämätöntä I/O:ta tehokkaampaan I/O:hon
  • Lustren juovitus ja ROMIO-vihjeet voivat parantaa suorituskykyä paljon.

Suomenkielinen tekoälykäännös

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

Klikkaa tästä antaaksesi palautetta