Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Šiame straipsnyje aptariamas atvejis, kaip pagreitinti naršyklės taikomąją programą pakeičiant JavaScript skaičiavimus į WebAssembly.

WebAssembly – kas tai?

Trumpai tariant, tai dvejetainis instrukcijų formatas, skirtas kamino pagrindu veikiančiai virtualiai mašinai. Wasm (trumpasis pavadinimas) dažnai vadinamas programavimo kalba, bet taip nėra. Instrukcijos formatas vykdomas naršyklėje kartu su JavaScript.

Svarbu, kad WebAssembly būtų galima gauti sudarant šaltinius tokiomis kalbomis kaip C/C++, Rust, Go. Čia naudojamas statistinis tipavimas ir vadinamasis plokščiosios atminties modelis. Kodas, kaip minėta pirmiau, yra saugomas kompaktišku dvejetainiu formatu, todėl jis beveik toks pat greitas, kaip programos paleidimas naudojant komandinę eilutę. Šios galimybės lėmė WebAssembly populiarumo augimą.

Primename: visiems „Habr“ skaitytojams – 10 000 rublių nuolaida užsiregistravus į bet kurį „Skillbox“ kursą naudojant „Habr“ reklamos kodą.

„Skillbox“ rekomenduoja: Praktinis kursas „Mobile Developer PRO“.

Šiuo metu „Wasm“ naudojama daugelyje programų, pradedant žaidimais, tokiais kaip „Doom 3“, baigiant žiniatinkliu perkeliamomis programomis, tokiomis kaip „Autocad“ ir „Figma“. Wasm taip pat naudojamas tokiose srityse kaip kompiuterija be serverio.

Šiame straipsnyje pateikiamas Wasm naudojimo pavyzdys, kaip pagreitinti analizės žiniatinklio paslaugą. Aiškumo dėlei paėmėme veikiančią programą, parašytą C kalba, kuri yra sukompiliuota į WebAssembly. Rezultatas bus naudojamas blogo našumo JS skyriams pakeisti.

Programos transformacija

Pavyzdyje bus naudojama „fastq.bio“ naršyklės paslauga, skirta genetikams. Priemonė leidžia įvertinti DNR sekos nustatymo (iššifravimo) kokybę.

Čia yra veikiančios programos pavyzdys:

Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Neverta gilintis į proceso detales, nes ne specialistams jos yra gana sudėtingos, tačiau trumpai tariant, mokslininkai gali pasinaudoti aukščiau pateikta infografika, kad suprastų, ar DNR sekos nustatymo procesas vyko sklandžiai ir kokios problemos kilo.

Ši paslauga turi alternatyvų, darbalaukio programų. Tačiau fastq.bio leidžia paspartinti darbą vizualizuojant duomenis. Daugeliu kitų atvejų reikia mokėti dirbti su komandine eilute, tačiau ne visi genetikai turi reikiamos patirties.

Viskas veikia paprastai. Įvestis yra duomenys, pateikti tekstinio failo forma. Šis failas generuojamas naudojant specializuotus sekos nustatymo įrankius. Faile yra DNR sekų sąrašas ir kiekvieno nukleotido kokybės balas. Failo formatas yra .fastq, todėl paslauga gavo savo pavadinimą.

Diegimas JavaScript

Pirmasis vartotojo veiksmas dirbant su fastq.bio yra pasirinkti tinkamą failą. Naudodama objektą Failas, programa nuskaito atsitiktinį duomenų pavyzdį iš failo ir apdoroja tą paketą. „JavaScript“ užduotis yra atlikti paprastas eilutės operacijas ir apskaičiuoti metriką. Vienas iš jų yra nukleotidų A, C, G ir T skaičius skirtinguose DNR fragmentuose.

Apskaičiavus reikiamus rodiklius, jie vizualizuojami naudojant Plotly.js ir paslauga pradeda dirbti su nauju duomenų pavyzdžiu. Suskirstymas atliekamas siekiant pagerinti UX kokybę. Jei dirbate su visais duomenimis iš karto, procesas kurį laiką užstos, nes failai su sekos rezultatais užima šimtus gigabaitų failo vietos. Paslauga paima nuo 0,5 iki 1 MB dydžio duomenų gabalus ir su jais dirba žingsnis po žingsnio, kurdama grafinius duomenis.

Tai veikia taip:

Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Raudoname stačiakampyje yra eilučių transformacijos algoritmas vizualizacijai gauti. Tai yra daugiausiai skaičiavimo reikalaujanti paslaugos dalis. Verta pabandyti jį pakeisti Wasm.

WebAssembly testavimas

Siekdama įvertinti Wasm naudojimo galimybę, projekto komanda pradėjo ieškoti paruoštų sprendimų, kaip sukurti QC metriką (QC – kokybės kontrolę), pagrįstą fastq failais. Paieška buvo atlikta tarp įrankių, parašytų C, C++ arba Rust, kad būtų galima perkelti kodą į WebAssembly. Be to, įrankis neturėtų būti „neapdorotas“, reikalinga paslauga, kurią jau išbandė mokslininkai.

Dėl to buvo pasirinkta nauda seqtk. Programa yra gana populiari, ji yra atvirojo kodo, šaltinio kalba yra C.

Prieš konvertuojant į Wasm, verta pažvelgti į seqtk kompiliavimo principą darbalaukiui. Pagal Makefile, štai ko jums reikia:

# Compile to binary
$ gcc seqtk.c 
   -o seqtk 
   -O2 
   -lm 
   -lz

Iš esmės seqtk galite sudaryti naudodami Emscripten. Jei jo nėra, tai padarysime. Docker vaizdas.

$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26

Jei nori Galite surinkti patys, bet tam reikia laiko.

Konteinerio viduje galite lengvai naudoti emcc kaip alternatyvą gcc:

# Compile to WebAssembly
$ emcc seqtk.c 
    -o seqtk.js 
    -O2 
    -lm 
    -s USE_ZLIB=1 
    -s FORCE_FILESYSTEM=1

Minimalūs pakeitimai:

Vietoj išvesties į dvejetainį failą, Emscripten naudoja .wasm ir .js failams generuoti, kurie naudojami WebAssemby moduliui paleisti.

USE_ZLIB vėliavėlė naudojama zlib bibliotekai palaikyti. Biblioteka buvo platinama ir perkelta į WebAssembly, o Emscripten įtraukė ją į projektą.

Suaktyvinta virtualioji failų sistema Emscrippten. Tai POSIX tipo FS, veikia RAM naršyklėje. Kai puslapis atnaujinamas, atmintis išvaloma.

Norint suprasti, kodėl reikalinga virtuali failų sistema, verta palyginti, kaip paleidžiate seqtk iš komandinės eilutės su tuo, kaip paleidžiate kompiliuotą WebAssembly modulį.

# On the command line
$ ./seqtk fqchk data.fastq
 
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])

Būtina gauti prieigą prie virtualios failų sistemos, kad nebūtų perrašoma seqtk eilutės, o ne failo įvesties. Šiuo atveju duomenų fragmentas rodomas kaip data.fastq failas virtualioje FS su iškvietimu į main() seqtk.

Štai nauja architektūra:

Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Paveikslėlyje parodyta, kad vietoj skaičiavimų pagrindinėje naršyklės gijoje, WebWorkers. Šis metodas leidžia atlikti skaičiavimus fono gijoje, nedarant įtakos naršyklės reagavimui. Na, WebWorker valdiklis paleidžia darbuotoją, valdydamas jo sąveiką su pagrindine gija.

Komanda seqtk paleidžiama naudojant Worker prijungtame faile. Baigęs vykdymą, darbuotojas pateikia rezultatą pažado forma. Kai pranešimą gauna pagrindinė gija, rezultatas naudojamas diagramoms atnaujinti. Ir taip keliomis iteracijomis.

Ką apie „WebAssembly“ našumą?

Siekdama įvertinti našumo pokytį, projekto komanda naudojo skaitymo operacijų per sekundę parametrą. Neatsižvelgiama į laiką, kurio reikia interaktyvių grafikų kūrimui, nes abu diegimai naudoja „JavaScript“.

Naudojant „out-of-the-box“ sprendimą, našumas padidėjo devynis kartus.

Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Tai puikus rezultatas, tačiau, kaip paaiškėjo, yra galimybė jį optimizuoti. Faktas yra tas, kad seqtk nenaudoja daug QC analizės rezultatų, todėl juos galima ištrinti. Jei tai padarysite, rezultatas pagerės 13 kartų, palyginti su JS.

Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Tai buvo pasiekta tiesiog komentuojant printf () komandas.

Bet tai dar ne viskas. Faktas yra tas, kad šiame etape fastq.bio gauna analizės rezultatus iškviesdamas skirtingas C funkcijas. Kiekviena iš jų apskaičiuoja savo charakteristikų rinkinį, kad kiekvienas failo fragmentas būtų skaitomas du kartus.

Siekiant išspręsti šią problemą, buvo nuspręsta sujungti dvi funkcijas į vieną. Dėl to produktyvumas išaugo 20 kartų.

Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų

Verta paminėti, kad ne visada galima pasiekti tokį puikų rezultatą. Kai kuriais atvejais našumas sumažės, todėl verta įvertinti kiekvieną atvejį.

Apibendrinant galime pasakyti, kad „Wasm“ suteikia galimybę pagerinti programos našumą, tačiau ja naudotis reikia protingai.

„Skillbox“ rekomenduoja:

Šaltinis: www.habr.com

Добавить комментарий