
Selles artiklis uuritakse juhtumit veebirakenduse kiirusel põhineva JavaScripti arvutuste asendamise kaudu WebAssemblyga.
WebAssembly — mis see on?
Lühidalt öeldes on see binaarsete käskude formaat virutaalses masinas. Tihti nimetatakse Wasm'i (lühendatud nimetus) programmeerimiskeeleks, kuid see pole tõsi. Käskude formaat käivitatakse brauseris koos JavaScriptiga.
Oluline on see, et WebAssemblyt saab genereerida, kompileerides lähtekoodi sellistes keeltes nagu C/C++, Rust, Go. Siin rakendatakse staatilist tüpiseerimist ja nii-öelda lamedat mälumudelit. Kood, nagu juba mainitud, salvestatakse kompaktse binaarfailina, mistõttu täidetakse see peaaegu sama kiiresti, nagu kui rakendus käivitatakse käsurealt. Need võimalused tõid kaasa WebAssembly populaarsuse kasvu.
Tuletame meelde: kõigile «Habra» lugejatele — 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi «Habr» abil.
Skillbox soovitab: Praktiline kursus .
Praegu kasutatakse Wasm mitmetes rakendustes, alates mängudest nagu Doom 3 kuni veebipõhiste rakendusteni nagu Autocad ja Figma. Wasm-i rakendatakse ka serverless arvutustes.
Selles artiklis tuuakse näide Wasm-i kasutamisest analüütilise veebiteenuse kiirendamiseks. Visuaalsuse huvides oleme valinud töötava rakenduse, mis on kirjutatud C-s ja mis kompileeritakse WebAssembly-ks. Tulemuse eesmärk on asendada madala jõudlusega JS-i osi.
Rakenduse transformatsioon
Näites kasutatakse veebiteenust fastq.bio, mis on mõeldud geneetikutele. See tööriist võimaldab hinnata DNA järjestamise (dekodeerimise) kvaliteeti.
Siin on näide rakendusest töös:

Protsessi üksikasju ei ole vaja tuua, kuna need on mittespetsialistide jaoks üsna keerulised, kuid lühidalt öeldes saavad teadlased ülaltoodud infograafikut jälgides aru, kas DNA järjestamise protsess sujus ja millised probleemid tekkisid.
Sellel teenusel on alternatiive, lauaarvutiprogramme. Kuid fastq.bio võimaldab tööprotsesside kiirendamist, visualiseerides andmeid. Enamikul teistel juhtudel on vaja osata töötada käsureaga, kuid mitte kõigil geneetikutel ei ole selleks vajalikke oskusi.
Kõik toimib lihtsalt. Sisendiks on andmed, mis esitatakse tekstifailina. See fail genereeritakse spetsialiseeritud sekveneerimise tööriistade abil. Fail sisaldab DNA järjestuste loendit ja kvaliteedi hindamist iga nukleotiidi jaoks. Faili formaat on .fastq, mistõttu teenus sai sellise nime.
Teostus JavaScriptis
Kasutaja esimene samm fastq.bio kasutamisel on sobiva faili valimine. Faili objekti kasutades loeb rakendus failist juhusliku andmeproovi ja töötleb selle paketi. JavaScripti ülesanne siin on lihtsate stringioperatsioonide teostamine ning näitajate arvutamine. Üks nendest on nukleotiidide A, C, G ja T hulk erinevates DNA fragmentides.
Pärast vajalike näitajate arvutamist visualiseeritakse need Plotly.js abil ning teenus hakkab tööle uue andmevalimikuga. Fragmenteerimine on tehtud kasutajakogemuse kvaliteedi parandamiseks. Kui töötada kõigi andmetega korraga, jääb protsess mõneks ajaks seisma, kuna sekveneeringu tulemuse failid võtavad sadu gigabaites failiruumi. Teenus aga võtab andmeosad suurusega 0,5 kuni 1 MB ja töötab nendega samm-sammult, luues graafilisi andmeid.
Nii see töötab:

Punases ristkülikus asub stringide teisendusalgoritm visualiseerimise saamiseks. See on teenuse kõige arvutusmahukam osa. Tasub proovida seda asendada Wasm-iga.
Testime WebAssembly't
Wasm-i kasutamise võimaluse hindamiseks hakkas projekti meeskond otsima valmis lahendusi QC-mõõdikute (QC — kvaliteedikontroll) loomiseks fastq-failide põhjal. Otsing toimus C, C++ või Rust keeles kirjutatud tööriistade seas, et oleks võimalik koodi portida WebAssembly-le. Lisaks ei tohi tööriist olla 'toores', vajalik oli teenus, mida teadlased olid juba testinud.
Lõppkokkuvõttes tehti valik . Rakendus on üsna populaarne, see on avatud koodiga, algkeel on C.
Enne Wasmi muutmist tasub tutvuda seqtk kompileerimise põhimõttega lauaarvutis. Vastavalt Makefile'ile, siin on see, mida vaja:
# Compile to binary
$ gcc seqtk.c
-o seqtk
-O2
-lm
-lzPõhimõtteliselt saab seqtk komileerida Emscripteni abil. Kui seda pole, siis saame hakkama .
$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26Soovi korral , kuid selleks on vajalik aega.
Konteineri sees on probleemideta võimalik võtta emcc gcc alternatiivina:
# Compile to WebAssembly
$ emcc seqtk.c
-o seqtk.js
-O2
-lm
-s USE_ZLIB=1
-s FORCE_FILESYSTEM=1Muutusi on minimaalselt:
Binaarfaili väljundi asemel genereeritakse Emscripteni abil failid .wasm ja .js, mida kasutatakse WebAssembly mooduli käivitamiseks.
Zlibi teegi toetamiseks kasutatakse lippu USE_ZLIB. See teek on laialdaselt levinud ja porteeritud WebAssembly'le ning Emscripten lisab selle projekti.
Aktiveeritakse Emscripteni virtuaalne failisüsteem. See on , mis töötab brauseri sees mälus. Kui lehte värskendatakse, tühjendatakse mälu.
Kuna aru saada, miks on vajalik virtuaalne failisüsteem, tasub võrrelda, kuidas käivitada seqtk käsurealt ja kuidas käivitada kompileeritud WebAssembly moodulit.
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])Virtuaalsele failisüsteemile pääsemine on vajalik, et mitte kirjutada seqtk-d ümber stringi, mitte faili sisendi jaoks. Sel juhul kuvatakse andmefragment failina data.fastq virtuaalses FS-is, tehes sellele main() seqtk-kutset.
Siin on uus arhitektuur:

Joonis näitab, et arvutuste asemel peamise brauseritõi käigus kasutatakse . See lähenemine võimaldab teostada arvutusi taustprotsessis, mõjutamata brauseri vastupidavust. Ja WebWorkeri kontroller käivitab Worker'i, hallates selle suhtlemist peamise vooga.
seqtk käivitatakse Worker'i abil monteeritud failiga. Worker'i töö lõpetamisel antakse tulemus välja Promise'ina. Kui sõnum on saadud peavoolus, kasutatakse tulemust diagrammide värskendamiseks. Ja nii mitmes iteratsioonis.
Mis on WebAssembly jõudlusega?
Selleks, et hinnata jõudluse muutust, kasutas projekti meeskond lugemisoperatsioonide arvu sekundis. Interaktiivsete graafikute koostamise aega ei arvestata, kuna mõlemas rakenduses kasutatakse JavaScripti.
Kasutades 'välja pakutud' lahendust, kasvas jõudlus üheksa korda.

See on suurepärane tulemus, kuid nagu selgus, on võimalik seda veelgi optimeerida. Asi on selles, et suur hulk QC-analüüsi tulemusi ei kasuta seqtk'i, seetõttu saab need eemaldada. Kui see teha, paraneb tulemus võrreldes JS-iga 13 korda.

Selle saavutamiseks piisab lihtsast printf() käskude kommenteerimisest.
Kuid see pole veel kõik. Asi on selles, et sel etapil fastq.bio saab analüüsi tulemusi, kutsudes esile erinevaid C-funktsioone. Igaüks neist arvutab oma omaduste komplekti, nii et iga faili fragment loeti kaks korda.
Selle probleemi vältimiseks otsustati kombineerida kaks funktsiooni üheks. Selle tulemusel suurenes jõudlus 20 korda.

Oluline on märkida, et sellist silmapaistvat tulemust ei ole alati võimalik saavutada. Mõnes juhtumis võib jõudlus langeda, mistõttu tasub hinnata iga konkreetset juhtumit.
Kokkuvõtteks võib öelda, et Wasm tõepoolest pakub võimalust rakenduse jõudluse parandamiseks, kuid selle kasutamine peab olema kaalutletud.
Skillbox soovitab:
- Kaheaastane praktiline kursus .
- Veebikursus .
- Praktiline aastakursus .
Allikas: habr.com
