Tiedon tallennus koneoppimiseen
Tämä opas selittää, kuinka tallentaa tietosi tehokkaasti koneoppimissovelluksia varten CSC:n supertietokoneilla. Se on osa meidän Koneoppimisopasta.
Minne tallentaa dataa?
CSC:n supertietokoneilta löytyy kolme erilaista jaettua levyaluetta: home, projappl ja scratch. Voit lukea lisää levyalueista täältä. LUMI-tietokoneelle löydät tietojen tallennusosion täältä. Yleisesti, pidä koodi ja ohjelmistot projappl-alueella ja datat, lokit ja laskentatulokset scratch-alueella. Home-hakemistoa ei ole tarkoitettu tietojen analysointiin ja laskentaan, ja siellä pitäisi säilyttää vain pieniä henkilökohtaisia tiedostoja.
Lisäksi LUMI:lla on jaettu flash-tallennusalue, joka on nopeampi päästä käsiksi kuin scratch. Flash on tarkoitettu vain väliaikaiseen tietojen tallentamiseen käsittelyä varten, ja flash-alueella on korkeampi kustannus kuin normaalilla scratch-tallennuksella.
On suositeltavaa tallentaa suuria datakokonaisuuksia Allas-objektivarastoon ja ladata ne projektiisi scratch-hakemistoon ennen laskennan aloittamista. Esimerkiksi:
module load allas
allas-conf
cd /scratch/<your-project>
swift download <bucket-name> your-dataset.tar
Kaikki, mikä on säilytettävä pidemmän aikaa (projektin eliniän ajan), pitäisi kopioida takaisin Allas-palveluun. Scratch-levyalue puhdistetaan säännöllisesti vanhoista tiedostoista, eikä sitä pitäisi käyttää pitkäaikaisesti tärkeiden asioiden säilyttämiseen.
Jotkin CPU-solmut ja kaikki GPU-solmut Puhti- ja Mahti-supertietokoneilla (mutta ei LUMI:lla) sisältävät myös nopeat paikalliset NVMe-asemat, joiden kapasiteetti on vähintään 3,6 TB. Tämä tila on käytössä vain Slurm-jobin suorituksen aikana ja puhdistuu sen jälkeen. Tiedonintensiivisille töille on usein kannattavaa kopioida tiedot NVMe-asemalle työn alussa ja tallentaa lopulliset tulokset scratch-asemalle työn lopussa. Lue alta lisää, kuinka käyttää nopeaa paikallista NVMe-asemaa.
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 /scratch
-, /projappl
- ja käyttäjien kotihakemistoissa, ei suoriudu hyvin satunnaispääsystä moniin tiedostoihin tai monien pienten lukujen suorittamisessa. Tämän lisäksi se voi hidastaa laskentaa ja äärimmäisissä tapauksissa aiheuttaa huomattavia hidastuksia kaikille supertietokoneen käyttäjille, tehden koko supertietokoneen käyttökelvottomaksi tuntikausiksi.
Huomio
Ole hyvä ja älä lue valtavasti tiedostoja jaetusta tiedostojärjestelmästä. Käytä nopeita paikallisia asemia tai pakkaa datasi suuremmiksi tiedostoiksi sarjallista pääsyä varten sen sijaan!
Lisätietoa saat CSC:n Lustre-tiedostojärjestelmän teknisestä kuvauksesta ja yleisestä tutoriaalistamme miten saavutetaan parempi I/O-suorituskyky Lustre-ympäristössä.
Tehokkaampi tiedostoformaatti
Monet koneoppimisympäristöt tukevat formaatteja, jotka tekevät datan pakkaamisesta tehokkaampaa. Yleisiä formaatteja ovat TensorFlow'n TFRecord ja WebDataset PyTorchille. Muita esimerkkejä ovat HDF5- tai LMDB-formaatit, tai jopa yksinkertaiset ZIP-tiedostot, esimerkiksi Pythonin zipfile-kirjastoa käyttäen.
LUMI AI opas sisältää mukavan vertailun eri formaateista käytettäväksi PyTorchin kanssa. Katso myös esimerkki TFRecord-tiedostojen luomisesta kuvatietokannasta.
Kaikkien näiden formaattien pääasiallinen tarkoitus on, että useiden tuhansien pienten tiedostojen sijaan sinulla on yksi tai muutamia isompia tiedostoja, jotka ovat paljon tehokkaampia käyttää ja lukea sarjallisesti. Älä epäröi ottaa yhteyttä palvelupisteeseemme, jos tarvitset neuvoja tehokkaampaan datan pääsyyn.
Nopea paikallinen asema (vain Puhti ja Mahti)
Jos todella tarvitset päästä käsiksi yksittäisiin pieniin tiedostoihin, voit hyödyntää nopeaa NVMe-paikallisasemaa, joka on käytössä GPU-solmuissa Puhdilla ja Mahtilla. Yksinkertaisesti lisää nvme:<gigatavujen määrä>
--gres
-lippuun lähetystiedostossasi, jonka jälkeen nopea paikallinen tallennus on käytettävissä sijainnissa, jonka ympäristömuuttuja $LOCAL_SCRATCH
määrittää. Tässä on esimerkki ajosta, joka varaa 100 GB nopeaa paikallisasemaa ja purkaa datasetin tar-paketin tuolle asemalle ennen laskennan aloitusta:
#!/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ää ohjelmallesi tieto siitä, mistä löytää datasetti, esimerkiksi komentoriviparametrilla. Katso myös meidän yleiset ohjeet, kuinka hyödyntää nopeaa paikallista varastoa.
Jos ajat monen solmun työtä, sinun täytyy muuttaa tar
-riviä niin, että se suoritetaan jokaisella solmulla erikseen: