Hajautettu syväoppimismallikoulutus on tulossa yhä tärkeämmäksi tietokokojen kasvaessa monilla toimialoilla. Monet tietokonenäön ja luonnollisen kielen käsittelyn sovellukset vaativat nyt syväoppimismallien koulutusta, joiden monimutkaisuus kasvaa eksponentiaalisesti ja joita koulutetaan usein satojen teratavujen datalla. Sitten on tärkeää käyttää laajaa pilviinfrastruktuuria tällaisten suurten mallien koulutuksen skaalaamiseen.
Kehittäjät voivat käyttää avoimen lähdekoodin kehyksiä, kuten PyTorchia, intuitiivisten malliarkkitehtuurien suunnitteluun. Näiden mallien koulutuksen skaalaaminen useiden solmujen välillä voi kuitenkin olla haastavaa, koska orkestrointi on monimutkaista.
Hajautettu mallikoulutus koostuu pääasiassa kahdesta paradigmasta:
- Malli yhdensuuntainen – Mallin rinnakkaiskoulutuksessa malli itsessään on niin suuri, että se ei mahdu yhden GPU:n muistiin ja mallin kouluttamiseen tarvitaan useita GPU:ita. Open AI:n GPT-3-malli 175 miljardilla koulutettavalla parametrilla (kooltaan noin 350 Gt) on tästä hyvä esimerkki.
- Data rinnakkain – Datan rinnakkaiskoulutuksessa malli voi sijaita yhdessä GPU:ssa, mutta koska data on niin suurta, mallin kouluttaminen voi kestää päiviä tai viikkoja. Tietojen jakaminen useiden GPU-solmujen kesken voi lyhentää harjoitusaikaa merkittävästi.
Tässä viestissä tarjoamme esimerkin arkkitehtuurista PyTorch-mallien kouluttamiseen käyttämällä Taskulamppu jaettu elastinen kehyksessä hajautetun datan rinnakkain käyttämällä Amazonin elastisten kuberneettien palvelu (Amazon EKS).
Edellytykset
Tässä viestissä raportoitujen tulosten toistamiseksi ainoa edellytys on AWS-tili. Tällä tilillä luomme EKS-klusterin ja Amazon FSx Lusterille tiedostojärjestelmä. Välitämme myös konttikuvat an Amazonin elastisten säiliörekisteri (Amazon ECR) arkisto tilillä. Ohjeet näiden komponenttien asettamiseen annetaan tarvittaessa koko postauksen aikana.
EKS-klusterit
Amazon EKS on hallittu konttipalvelu Kubernetes-sovellusten ajamiseen ja skaalaamiseen AWS:ssä. Amazon EKS:n avulla voit suorittaa hajautettuja koulutustöitä tehokkaasti käyttämällä viimeisintä Amazonin elastinen laskentapilvi (Amazon EC2) -esiintymiä ilman, että sinun tarvitsee asentaa, käyttää ja huoltaa omaa ohjaustasoa tai solmuja. Se on suosittu Orchestrator koneoppimiseen (ML) ja tekoälyn työnkulkuihin. Tyypillinen EKS-klusteri AWS:ssä näyttää seuraavalta kuvalta.
Olemme julkaisseet avoimen lähdekoodin projektin, AWS DevOps EKS:lle (aws-do-eks), joka tarjoaa laajan kokoelman helppokäyttöisiä ja konfiguroitavia komentosarjoja ja työkaluja EKS-klustereiden luomiseen ja hajautettujen koulutustöiden suorittamiseen. Tämä projekti on rakennettu noudattaen periaatteita Tee Framework: Yksinkertaisuus, joustavuus ja yleismaailmallisuus. Voit määrittää haluamasi klusterin käyttämällä eks.conf tiedosto ja käynnistä se sitten suorittamalla eks-create.sh käsikirjoitus. Yksityiskohtaiset ohjeet löytyvät GitHub repo.
Harjoittele PyTorch-malleja käyttämällä Torch Distributed Elasticia
Torch Distributed Elastic (TDE) on natiivi PyTorch-kirjasto, jolla opetetaan laajamittaisia syväoppimismalleja, joissa on tärkeää skaalata laskentaresurssit dynaamisesti saatavuuden mukaan. The TorchElastic-ohjain Kubernetesille on natiivi Kubernetes-toteutus TDE:lle, joka hallitsee automaattisesti TDE-koulutukseen tarvittavien podien ja palveluiden elinkaarta. Se mahdollistaa laskentaresurssien dynaamisen skaalauksen harjoittelun aikana tarpeen mukaan. Se tarjoaa myös vikasietoista koulutusta palauttamalla työt solmuvioista.
Tässä viestissä keskustelemme PyTorchin kouluttamisesta EfficientNet-B7 ja ResNet50 käyttäviä malleja IMAGEnet tietoja hajautetusti TDE:n avulla. Käytämme PyTorchia DistributedDataParallel API ja Kubernetes TorchElastic -ohjain ja suorita koulutustyömme EKS-klusterissa, joka sisältää useita GPU-solmuja. Seuraava kaavio esittää tämän mallikoulutuksen arkkitehtuurikaavion.
TorchElastic for Kubernetes koostuu pääasiassa kahdesta osasta: TorchElastic Kubernetes -ohjaimesta (TEC) ja parametripalvelimesta (etcd). Ohjain on vastuussa koulutustöiden seurannasta ja hallinnasta, ja parametripalvelin pitää kirjaa työntekijäsolmuista hajautettua synkronointia ja vertaishakua varten.
Jotta harjoituspodit voivat käyttää tietoja, tarvitsemme jaetun tietomäärän, joka voidaan asentaa jokaiseen podiin. Joitakin vaihtoehtoja jaetuille levyille Säiliön tallennusliitäntä (CSI) ajurit sisältyvät AWS DevOps EKS:lle olemme Amazonin elastinen tiedostojärjestelmä (Amazon EFS) ja FSx Lusterille.
Klusterin asetukset
Klusterikokoonpanossamme käytämme yhtä c5.2xlarge-instanssia järjestelmäkoteloille. Käytämme kolmea p4d.24xlarge-instanssia työntekijäpodeina EfficientNet-mallin kouluttamiseen. ResNet50-koulutuksessa käytämme p3.8xlarge-esiintymiä worker podeina. Lisäksi käytämme jaettua FSx-tiedostojärjestelmää harjoitustietojemme ja malliesineiden tallentamiseen.
AWS p4d.24xlarge -esiintymät on varustettu Joustava kangasadapteri (EFA) tarjoamaan verkottumista solmujen välille. Keskustelemme EFA:sta lisää myöhemmin postauksessa. Jotta kommunikointi EFA:n kautta voidaan ottaa käyttöön, meidän on määritettävä klusterin asetukset .yaml-tiedoston kautta. An esimerkkitiedosto tarjotaan GitHub-arkistossa.
Kun tämä .yaml-tiedosto on määritetty oikein, voimme käynnistää klusterin käyttämällä GitHub-varastossa olevaa komentosarjaa:
Viittaavat GitHub repo yksityiskohtaisia ohjeita.
Ei käytännössä ole eroa käynnissä olevien töiden välillä p4d.24xlarge ja p3.8xlarge. Tässä viestissä kuvatut vaiheet toimivat molemmille. Ainoa ero on EFA:n saatavuus p4d.24xlarge-esiintymissä. Pienemmissä malleissa, kuten ResNet50, tavallisella verkkoyhteydellä EFA-verkkoon verrattuna on minimaalinen vaikutus harjoituksen nopeuteen.
FSx Luster-tiedostojärjestelmälle
FSx on suunniteltu korkean suorituskyvyn laskennan työkuormille ja tarjoaa alle millisekunnin viiveen käyttämällä SSD-tallennustilaa. Valitsimme FSx:n, koska se tarjosi paremman suorituskyvyn, kun skaalauduimme suureen määrään solmuja. Tärkeä huomioitava yksityiskohta on, että FSx voi olla olemassa vain yhdellä Saatavuusvyöhykkeellä. Siksi kaikkien FSx-tiedostojärjestelmää käyttävien solmujen tulisi olla samassa Saatavuusvyöhykkeellä kuin FSx-tiedostojärjestelmä. Yksi tapa saavuttaa tämä on määrittää asianmukainen Saatavuusvyöhyke klusterin .yaml-tiedostossa tietyille solmuryhmille ennen klusterin luomista. Vaihtoehtoisesti voimme muokata näiden solmujen automaattisen skaalausryhmän verkko-osaa klusterin perustamisen jälkeen ja rajoittaa sen käyttämään yhtä aliverkkoa. Tämä voidaan tehdä helposti Amazon EC2 -konsolilla.
Olettaen, että EKS-klusteri on toiminnassa ja saatavuusvyöhykkeen aliverkon tunnus on tiedossa, voimme määrittää FSx-tiedostojärjestelmän antamalla tarvittavat tiedot fsx.conf tiedosto kuten readme ja ajaa deploy.sh käsikirjoitus FSX kansio. Tämä määrittää oikean käytännön ja suojausryhmän tiedostojärjestelmän käyttöä varten. Skripti asentaa myös CSI kuljettaja FSx:lle demonsetiksi. Lopuksi voimme luoda pysyvän FSx-taltion vaatimuksen Kubernetesissa käyttämällä yhtä .yaml-tiedostoa:
Tämä luo FSx-tiedostojärjestelmän käytettävyyden vyöhykkeelle, joka on määritetty kohdassa fsx.conf
tiedostoa ja luo myös jatkuvan volyymivaatimuksen fsx-pvc
, joka voidaan asentaa mihin tahansa klusterin podista luku-kirjoitus-monen (RWX) -tavalla.
Kokeessamme käytimme täydellisiä ImageNet-tietoja, jotka sisältävät yli 12 miljoonaa harjoituskuvaa jaettuna 1,000 luokkaan. Tiedot voi ladata osoitteesta ImageNetin verkkosivusto. Alkuperäisessä TAR-pallossa on useita hakemistoja, mutta mallikoulutuksemme vuoksi olemme vain kiinnostuneita ILSVRC/Data/CLS-LOC/
, joka sisältää train
ja val
alihakemistoja. Ennen harjoittelua meidän on järjestettävä kuvat uudelleen val
alihakemisto vastaamaan PyTorchin vaatimaa hakemistorakennetta ImageFolder luokkaa. Tämä voidaan tehdä käyttämällä yksinkertaista Python-skripti sen jälkeen, kun tiedot on kopioitu pysyvään taltioon seuraavassa vaiheessa.
Voit kopioida tiedot kohteesta Amazonin yksinkertainen tallennuspalvelu (Amazon S3) ämpäri FSx-tiedostojärjestelmään, luomme Docker-kuvan, joka sisältää komentosarjat tätä tehtävää varten. Esimerkki Docker-tiedostosta ja komentotulkkikomentosarja ovat mukana csi kansio GitHub-repon sisällä. Voimme rakentaa kuvan käyttämällä build.sh
komentosarja ja työnnä se sitten Amazon ECR:ään käyttämällä push.sh
käsikirjoitus. Ennen kuin käytät näitä komentosarjoja, meidän on annettava oikea URI ECR-tietovarastoon tiedostossa .env
tiedosto GitHub-repon juurikansiossa. Kun olemme siirtäneet Docker-kuvan Amazon ECR:ään, voimme käynnistää podin tietojen kopioimiseksi käyttämällä asianmukaista .yaml-tiedostoa:
Pod suorittaa skriptin automaattisesti data-prep.sh kopioidaksesi tiedot Amazon S3:sta jaetulle taltiolle. Koska ImageNet-tiedoissa on yli 12 miljoonaa tiedostoa, kopiointiprosessi kestää muutaman tunnin. Python-skripti imagenet_data_prep.py ajetaan myös järjestää uudelleen val
tietojoukko PyTorchin odotetulla tavalla.
Verkon kiihdytys
Voimme käyttää Elastic Fabric Adapteria (EFA) yhdessä tuetut EC2-instanssityypit nopeuttaaksesi verkkoliikennettä klusterin GPU-solmujen välillä. Tämä voi olla hyödyllistä suoritettaessa suuria hajautettuja koulutustöitä, joissa tavallinen verkkoviestintä voi olla pullonkaula. Skriptit EFA-laitelaajennuksen käyttöönottamiseksi ja testaamiseksi tässä käyttämässämme EKS-klusterissa sisältyvät efa-device-plugin kansio GitHub-varastossa. EFA-työn mahdollistamiseksi EKS-klusterissasi sen lisäksi, että klusterin solmuilla on tarvittavat laitteistot ja ohjelmistot, klusteriin on otettava käyttöön EFA-laitelaajennus ja työsäilön tulee olla yhteensopivat CUDA- ja NCCL-tiedostot. versiot asennettu.
Havainnollistaaksemme NCCL-testien suorittamista ja EFA:n suorituskyvyn arvioimista p4d.24xlarge-esiintymissä meidän on ensin otettava käyttöön Kubeflow MPI -operaattori suorittamalla vastaava deploy.sh käsikirjoitus mpi-operaattori kansio. Sitten ajamme deploy.sh skripti ja päivitä test-efa-nccl.yaml ilmentää niin rajoituksia ja resurssipyyntöjä vpc.amazonaws.com
on asetettu arvoon 4. Neljä saatavilla olevaa EFA-sovitinta p4d.24xlarge-solmuissa niputetaan yhteen maksimaalisen suorituskyvyn saavuttamiseksi.
ajaa kubectl apply -f ./test-efa-nccl.yaml
suorittaaksesi testin ja näyttää sitten testikotelon lokit. Lokitulosteen seuraava rivi vahvistaa, että EFA on käytössä:
Testitulosten pitäisi näyttää samanlaisilta kuin seuraava tulos:
Testituloksissa voidaan havaita, että suurin suoritusnopeus on noin 42 Gt/s ja keskimääräinen väylän kaistanleveys on noin 8 Gt.
Teimme myös kokeita yhdellä EFA-sovittimella ja ilman EFA-sovittimia. Kaikki tulokset on koottu seuraavassa taulukossa.
EFA-sovittimien määrä | Net/OFI Valittu palveluntarjoaja | Keskim. Kaistanleveys (GB/s) | Max. Kaistanleveys (GB/s) |
4 | efa | 8.24 | 42.04 |
1 | efa | 3.02 | 5.89 |
0 | pistorasia | 0.97 | 2.38 |
Havaitsimme myös, että suhteellisen pienissä malleissa, kuten ImageNet, nopeutetun verkkoyhteyden käyttö lyhentää harjoitusaikaa jaksoa kohti vain 5–8 %, kun eräkoko on 64. Suuremmille malleille ja pienemmille eräkokoille, kun tarvitaan lisää painojen tiedonsiirtoa verkossa. , nopeutetun verkottumisen käytöllä on suurempi vaikutus. Havaitsimme aikakauden harjoitusajan lyhenemisen 15–18 % EfficientNet-B7:n harjoitteluun eräkoon 1 kanssa. EFA:n todellinen vaikutus harjoitteluun riippuu mallisi koosta.
GPU-valvonta
Ennen koulutustyön suorittamista voimme myös perustaa amazonin pilvikello mittareita grafiikkasuorittimen käytön visualisoimiseksi harjoituksen aikana. Voi olla hyödyllistä tietää, käytetäänkö resursseja optimaalisesti, tai mahdollisesti tunnistaa resurssien nälkä ja pullonkaulat koulutusprosessissa.
Asiaankuuluvat skriptit CloudWatchin määrittämiseksi sijaitsevat osoitteessa gpu-metriikka kansio. Ensin luomme Docker-kuvan amazon-cloudwatch-agent
ja nvidia-smi
. Voimme käyttää Docker-tiedostoa gpu-metrics
kansio luodaksesi tämän kuvan. Olettaen, että ECR-rekisteri on jo asetettu .env
tiedosto edellisestä vaiheesta, voimme rakentaa ja työntää kuvan käyttämällä build.sh
ja push.sh
. Tämän jälkeen käynnissä deploy.sh
skripti suorittaa asennuksen automaattisesti loppuun. Se käynnistää demonsetin kanssa amazon-cloudwatch-agent
ja siirtää erilaisia mittareita CloudWatchiin. GPU-tiedot näkyvät alla CWAgent
nimiavaruus CloudWatch-konsolissa. Muut klusterin tiedot näkyvät alla ContainerInsights
nimitila.
Malliharjoittelu
Kaikki PyTorch-koulutukseen tarvittavat skriptit sijaitsevat osoitteessa elastinen työ kansio GitHub-varastossa. Ennen kuin aloitamme koulutustyön, meidän on suoritettava etcd
palvelin, jota TEC käyttää työntekijöiden etsintään ja parametrien vaihtoon. The deploy.sh käsikirjoitus elasticjob
kansio tekee juuri niin.
Jotta voimme hyödyntää EFA:ta p4d.24xlarge-esiintymissä, meidän on käytettävä tiettyä Docker-kuvaa, joka on saatavilla Amazon ECR Public Gallery joka tukee NCCL-viestintää EFA:n kautta. Meidän täytyy vain kopioida koulutuskoodimme tähän Docker-kuvaan. The Dockerfile alla näytteet kansio luo kuvan, jota käytetään suoritettaessa harjoitustyötä p4d-esiintymissä. Kuten aina, voimme käyttää build.sh ja push.sh skriptejä kansiossa kuvan rakentamiseksi ja työntämiseksi.
- imagenet-efa.yaml tiedosto kuvaa koulutustyötä. Tämä .yaml-tiedosto määrittää koulutustyön suorittamiseen tarvittavat resurssit ja liittää myös jatkuvan volyymin edellisessä osiossa määritetyillä harjoitustiedoilla.
Tässä kannattaa mainita pari asiaa. Replikoiden määrä tulee asettaa klusterissa käytettävissä olevien solmujen lukumäärään. Meidän tapauksessamme asetimme tämän arvoon 3, koska meillä oli kolme p4d.24xlarge-solmua. Vuonna imagenet-efa.yaml
tiedosto, nvidia.com/gpu
resurssit ja nproc_per_node
varten args
tulee asettaa GPU:iden lukumäärään solmua kohti, mikä p4d.24xlarge:n tapauksessa on 8. Python-komentosarjan työntekijä-argumentti määrittää myös suorittimien määrän prosessia kohti. Valitsimme tämän arvoksi 4, koska kokeiluissamme tämä tarjoaa optimaalisen suorituskyvyn käytettäessä p4d.24xlarge-esiintymiä. Nämä asetukset ovat välttämättömiä, jotta voidaan maksimoida kaikkien klusterin käytettävissä olevien laitteistoresurssien käyttö.
Kun työ on käynnissä, voimme tarkkailla GPU:n käyttöä CloudWatchissa kaikille klusterin GPU:ille. Seuraavassa on esimerkki yhdestä koulutustyöstämme, jossa on kolme p4d.24xlarge-solmua klusterissa. Tässä olemme valinneet yhden GPU:n kustakin solmusta. Aiemmin mainituilla asetuksilla GPU:n käyttö on lähes 100 % aikakauden harjoitusvaiheessa kaikille klusterin solmuille.
ResNet50-mallin kouluttamiseen p3.8xlarge-instanssien avulla tarvitsemme täsmälleen samat vaiheet kuin on kuvattu EfficientNet-koulutuksessa käyttämällä p4d.24xlargea. Voimme myös käyttää samaa Docker-kuvaa. Kuten aiemmin mainittiin, p3.8xlarge-esiintymissä ei ole EFA:ta. ResNet50-mallille tämä ei kuitenkaan ole merkittävä haittapuoli. The imagenet-fsx.yaml GitHub-arkistossa oleva komentosarja määrittää koulutustyön sopivilla resursseilla p3.8xlarge-solmutyypille. Työ käyttää samaa tietojoukkoa FSx-tiedostojärjestelmästä.
GPU-skaalaus
Suoritimme joitain kokeita tarkkaillaksemme kuinka EfficientNet-B7-mallin harjoitusaika skaalautuu lisäämällä grafiikkasuorittimien määrää. Tätä varten muutimme replikoiden lukumäärän yhdestä kolmeen harjoitus-.yaml-tiedostossamme jokaisessa harjoitusajossa. Tarkastimme aikaa vain yhden aikakauden aikana, kun käytimme koko ImageNet-tietojoukkoa. Seuraava kuva näyttää GPU-skaalauskokeilumme tulokset. Punainen katkoviiva ilmaisee, kuinka harjoitusajan tulisi lyhentyä 1 GPU:n käytön jälkeen lisäämällä GPU:iden määrää. Kuten näemme, skaalaus on melko lähellä odotettua.
Samoin saimme GPU-skaalauskaavion ResNet50-koulutukselle p3.8xlarge-esiintymissä. Tässä tapauksessa muutimme .yaml-tiedostomme replikoita arvosta 1 arvoon 4. Tämän kokeilun tulokset näkyvät seuraavassa kuvassa.
Puhdistaa
On tärkeää vähentää resursseja mallikoulutuksen jälkeen, jotta vältytään käyttämättömien ilmentymien käyttämiseen liittyviltä kustannuksilta. Jokaisen resursseja luovan skriptin kanssa GitHub repo tarjoaa vastaavan komentosarjan niiden poistamiseksi. Asetuksen puhdistamiseksi meidän on poistettava FSx-tiedostojärjestelmä ennen klusterin poistamista, koska se liittyy aliverkkoon klusterin VPC:ssä. FSx-tiedostojärjestelmän poistamiseksi meidän tarvitsee vain suorittaa seuraava komento (sisältä FSX kansio):
Huomaa, että tämä ei ainoastaan poista pysyvää taltiota, se poistaa myös FSx-tiedostojärjestelmän ja kaikki tiedostojärjestelmän tiedot menetetään. Kun tämä vaihe on valmis, voimme poistaa klusterin käyttämällä seuraavaa komentosarjaa EKS kansio:
Tämä poistaa kaikki olemassa olevat podit, poistaa klusterin ja poistaa alussa luodun VPC:n.
Yhteenveto
Tässä viestissä kerroimme yksityiskohtaisesti vaiheet, joita tarvitaan PyTorchin hajautetun datan rinnakkaismallikoulutuksen suorittamiseen EKS-klustereissa. Tämä tehtävä saattaa tuntua pelottavalta, mutta AWS DevOps EKS:lle AWS:n ML Frameworks -tiimin luoma projekti tarjoaa kaikki tarvittavat komentosarjat ja työkalut prosessin yksinkertaistamiseksi ja hajautetun mallikoulutuksen helpottamiseksi.
Lisätietoja tässä viestissä käytetyistä teknologioista on osoitteessa Amazon EX ja Taskulamppu jaettu elastinen. Kehotamme sinua soveltamaan tässä kuvattua lähestymistapaa omiin hajautettuihin koulutuskäyttötapauksiin.
Esittelymateriaalit
Tietoja kirjoittajista
Imran Younus on AWS:n ML Frameworks -tiimin pääratkaisuarkkitehti. Hän keskittyy laajamittaiseen koneoppimiseen ja syvään oppimiseen liittyviin työkuormiin AWS-palveluissa, kuten Amazon EKS ja AWS ParallelCluster. Hänellä on laaja kokemus Deep Leaningin sovelluksista Computer Visionissa ja teollisessa IoT:ssä. Imran valmistui tohtoriksi korkean energian hiukkasfysiikasta, jossa hän on ollut mukana analysoimassa kokeellista dataa petatavuissa.
Alex Iankoulski on täyspinon ohjelmisto- ja infrastruktuuriarkkitehti, joka haluaa tehdä syvällistä, käytännönläheistä työtä. Hän on tällä hetkellä AWS:n itsehallitun koneoppimisen pääratkaisuarkkitehti. Roolissaan hän keskittyy auttamaan asiakkaita ML- ja AI-työkuormien konteinnissa ja organisoinnissa konttikäyttöisissä AWS-palveluissa. Hän on myös avoimen lähdekoodin kirjoittaja Tee puitteet ja Docker-kapteeni, joka rakastaa konttitekniikoiden soveltamista innovaation vauhdittamiseksi ja samalla maailman suurimpien haasteiden ratkaisemiseksi. Viimeisten 10 vuoden aikana Alex on työskennellyt ilmastonmuutoksen torjumiseksi, tekoälyn ja ML:n demokratisoimiseksi, matkustamisen turvallisuuden parantamiseksi, terveydenhuollon parantamiseksi ja energian fiksummaksi.
- AI
- ai taide
- ai taiteen generaattori
- ai robotti
- Amazonin elastisten kuberneettien palvelu
- tekoäly
- tekoälyn sertifiointi
- tekoäly pankkitoiminnassa
- tekoäly robotti
- tekoälyrobotit
- tekoälyohjelmisto
- AWS-koneoppiminen
- blockchain
- blockchain-konferenssi ai
- coingenius
- keskustelullinen tekoäly
- kryptokonferenssi ai
- dall's
- syvä oppiminen
- google ai
- Keskitaso (200)
- koneoppiminen
- Platon
- plato ai
- Platonin tietotieto
- Platon peli
- PlatonData
- platopeliä
- mittakaava ai
- syntaksi
- zephyrnet