-
Datan tallennus koneoppimista varten
Datan tallennus koneoppimista varten
Tässä oppaassa kerrotaan, miten datasi kannattaa tallentaa tehokkaasti koneoppimissovelluksia varten CSC:n supertietokoneilla. Se on osa koneoppimisen opasta.
Minne data kannattaa tallentaa?
CSC:n supertietokoneissa on kolmenlaisia jaettuja levyalueita: home, projappl ja scratch. Voit lukea levyalueista lisää täältä. Katso LUMIn osalta datan tallennuksen osio täältä. Yleisesti ottaen säilytä koodisi ja ohjelmistosi projappl-alueella ja aineistot, lokit ja laskennan tulokset scratch-alueella. home-hakemistoa ei ole tarkoitettu data-analyysiin ja laskentaan, ja sinne tulisi tallentaa vain pieniä henkilökohtaisia tiedostoja.
Lisäksi LUMIssa on jaettu flash-tallennusalue, johon pääsee käsiksi nopeammin kuin scratch-alueeseen. Flash on tarkoitettu vain datan väliaikaiseen tallentamiseen käsittelyä varten, ja flash-alueen käyttö maksaa enemmän kuin tavallisen scratch-tallennuksen käyttö.
On suositeltavaa tallentaa suuret aineistot Allas-objektitallennukseen ja ladata ne projektisi scratch-hakemistoon ennen laskennan aloittamista. Esimerkiksi:
module load allas
allas-conf
cd /scratch/<your-project>
swift download <bucket-name> your-dataset.tar
Kaikki, mitä täytyy säilyttää pidempään (projektin elinkaaren ajan), tulisi kopioida takaisin Altaaseen. scratch-levyalueelta poistetaan säännöllisesti vanhoja tiedostoja, eikä sitä tule käyttää tärkeän datan pitkäaikaiseen säilytykseen.
Joissakin CPU-solmuissa sekä kaikissa Puhtin ja Mahdin GPU-solmuissa (mutta ei LUMIssa) on myös nopeat paikalliset NVMe-asemat, joilla on vähintään 3,6 Tt levytilaa. Tämä tila on käytettävissä vain Slurm-työn suorituksen aikana, ja se siivotaan työn päätyttyä. Dataintensiivisissä töissä on usein kannattavaa kopioida data NVMe-asemalle työn alussa ja tallentaa sitten lopulliset tulokset scratch-levylle työn lopussa. Katso alta lisätietoja nopean paikallisen NVMe-aseman käytöstä.
Jaetun tiedostojärjestelmän tehokas käyttö
Koneoppimismallien opetusdata koostuu usein valtavasta määrästä
tiedostoja. Tyypillinen esimerkki on neuroverkon opettaminen kymmenillä tuhansilla
suhteellisen pienillä JPEG-kuvatiedostoilla. Valitettavasti Lustre-tiedostojärjestelmä, jota käytetään
hakemistoissa /scratch, /projappl ja käyttäjien kotihakemistoissa, ei toimi
hyvin, kun käytetään satunnaishakua suureen määrään tiedostoja tai tehdään paljon
pieniä lukuoperaatioita. Laskennan hidastumisen lisäksi tämä voi myös
äärimmäisissä tapauksissa aiheuttaa huomattavia hidastumisia kaikille
supertietokoneen käyttäjille ja joskus tehdä koko supertietokoneesta käyttökelvottoman
tunneiksi.
Note
Älä lue valtavaa määrää tiedostoja jaetusta tiedostojärjestelmästä. Käytä sen sijaan nopeita paikallisia asemia tai paketoi datasi suurempiin tiedostoihin peräkkäistä käyttöä varten!
Lisälukemiseksi katso CSC:n Lustre-tiedostojärjestelmän tekninen kuvaus sekä yleinen opastuksemme siitä, miten Lustrella saavutetaan parempi I/O-suorituskyky.
Tehokkaampi datamuoto
Monet koneoppimiskehykset tukevat tiedostomuotoja, joilla datasi voidaan paketoida tehokkaammin. Yleisiä muotoja ovat TensorFlown TFRecord ja WebDataset PyTorchille. Muita esimerkkejä ovat HDF5- tai LMDB-muotojen käyttö tai jopa tavalliset ZIP-tiedostot, esimerkiksi Pythonin zipfile-kirjaston kautta.
LUMI AI -oppaassa on hyvä vertailu eri muodoista PyTorchin kanssa käytettäväksi. Katso myös esimerkki TFRecord-tiedostojen luomisesta kuva-aineistosta.
Kaikkien näiden muotojen pääajatus on se, että monien tuhansien pienten tiedostojen sijaan käytössäsi on yksi tai muutama suurempi tiedosto, joita on paljon tehokkaampaa käyttää ja lukea peräkkäisesti. Älä epäröi ottaa yhteyttä asiakastukeemme, jos tarvitset neuvoja siitä, miten voit käyttää dataasi tehokkaammin.
Nopea paikallinen levy (vain Puhti ja Mahti)
Jos sinun todella täytyy käyttää yksittäisiä pieniä tiedostoja, voit käyttää
nopeaa paikallista NVMe-asemaa, joka on Puhtin ja
Mahdin GPU-solmuissa. Lyhyesti sanottuna sinun tarvitsee vain lisätä nvme:<number-of-GB>
--gres-valitsimeen julkaisuskriptissäsi, jolloin nopea paikallinen
tallennustila on käytettävissä ympäristömuuttujan $LOCAL_SCRATCH
määrittämässä sijainnissa. Tässä on esimerkkiajo, joka varaa 100 Gt
nopeaa paikallista levytilaa ja purkaa aineiston tar-paketin tälle
asemalle ennen laskennan käynnistämistä:
#!/bin/bash
#SBATCH --account=<project>
#SBATCH --partition=gpu
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=10
#SBATCH --mem=64G
#SBATCH --time=1:00:00
#SBATCH --gres=gpu:v100:1,nvme:100
tar xf /scratch/<your-project>/your-dataset.tar -C $LOCAL_SCRATCH
srun python3 myprog.py --input_data=$LOCAL_SCRATCH <options>
Huomaa, että sinun täytyy välittää omalle ohjelmallesi jollakin tavalla tieto siitä, mistä aineisto löytyy, esimerkiksi komentoriviargumentilla. Katso myös yleiset ohjeemme nopean paikallisen tallennustilan käyttöönotosta.
Jos ajat monisolmutyötä, sinun täytyy muokata tar-riviä
niin, että se suoritetaan erikseen jokaisella solmulla: