Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

Овај чланак говори о случају убрзавања апликације претраживача заменом ЈаваСцрипт калкулација са ВебАссембли.

ВебАссембли - шта је то?

Укратко, ово је формат бинарних инструкција за виртуелну машину засновану на стеку. Васм (кратко име) се често назива програмским језиком, али није. Формат инструкција се извршава у претраживачу заједно са ЈаваСцрипт-ом.

Важно је да се ВебАссембли може добити компајлирањем извора на језицима као што су Ц/Ц++, Руст, Го. Овде се користи статистичко куцање и такозвани модел равни меморије. Код, као што је горе поменуто, чува се у компактном бинарном формату, што га чини скоро једнако брзим као и покретање апликације помоћу командне линије. Ове могућности су довеле до раста популарности ВебАссембли-а.

Подсећамо: за све читаоце „Хабра“ – попуст од 10 рубаља при упису на било који курс Скиллбок користећи промотивни код „Хабр“.

Скиллбок препоручује: Практични курс „Програмер за мобилне уређаје“.

Тренутно се Васм користи у многим апликацијама, од игара попут Доом 3 до апликација са веб портовима као што су Аутоцад и Фигма. Васм се такође користи у областима као што је рачунарство без сервера.

Овај чланак даје пример коришћења Васм-а за убрзавање веб услуге за аналитику. Ради јасноће, узели смо радну апликацију написану у Ц, која је састављена у ВебАссембли. Резултат ће се користити за замену делова ЈС-а са лошим перформансама.

Трансформација апликација

Пример ће користити услугу претраживача фастк.био, која је намењена генетичарима. Алат вам омогућава да процените квалитет секвенцирања (дешифровања) ДНК.

Ево примера апликације у акцији:

Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

Не вреди улазити у детаље процеса јер су прилично сложени за неспецијалисте, али укратко, научници могу да користе горњу инфографику да би разумели да ли је процес секвенцирања ДНК прошао глатко и који су проблеми настали.

Ова услуга има алтернативе, десктоп програме. Али фастк.био вам омогућава да убрзате свој рад визуелизацијом података. У већини других случајева, морате бити у могућности да радите са командном линијом, али немају сви генетичари потребно искуство.

Све функционише једноставно. Улаз су подаци представљени у облику текстуалне датотеке. Ову датотеку генеришу специјализовани алати за секвенцирање. Датотека садржи листу секвенци ДНК и оцену квалитета за сваки нуклеотид. Формат датотеке је .фастк, због чега је сервис и добио име.

Имплементација у ЈаваСцрипт-у

Први корак корисника када ради са фастк.био је одабир одговарајуће датотеке. Користећи објекат Филе, апликација чита насумични узорак података из датотеке и обрађује ту групу. ЈаваСцрипт-ов посао овде је да изводи једноставне стринг операције и израчунава метрику. Један од њих је број нуклеотида А, Ц, Г и Т на различитим фрагментима ДНК.

Након израчунавања потребних индикатора, они се визуелизују помоћу Плотли.јс, а сервис почиње да ради са новим узорком података. Дељење се врши да би се побољшао квалитет корисничког искуства. Ако радите са свим подацима одједном, процес ће се замрзнути на неко време, пошто датотеке са резултатима секвенцирања заузимају стотине гигабајта простора датотеке. Услуга узима делове података величине од 0,5 до 1 МБ и ради са њима корак по корак, правећи графичке податке.

Вот как ето работает:

Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

Црвени правоугаоник садржи алгоритам трансформације стрингова за добијање визуелизације. Ово је рачунарски најинтензивнији део услуге. Вреди покушати да га замените Васм-ом.

Тестирање ВебАссембли-а

Да би проценио могућност коришћења Васм-а, пројектни тим је почео да тражи готова решења за креирање КЦ метрика (КЦ – контрола квалитета) на основу фастк фајлова. Претрага је обављена међу алатима написаним на Ц, Ц++ или Руст, тако да је било могуће пренети код на ВебАссембли. Поред тога, алат не би требало да буде „сиров” сервис који су научници већ тестирали.

Као резултат тога, избор је направљен у корист сектк. Апликација је прилично популарна, отвореног је кода, изворни језик је Ц.

Пре конверзије у Васм, вреди погледати принцип компилације сектк-а за десктоп. Према Макефиле-у, ево шта вам треба:

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

У принципу, можете саставити сектк користећи Емсцриптен. Ако га нема, сналазимо се. Доцкер слика.

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

По жељи Можете га сами саставити, али је потребно време.

Унутар контејнера можете лако да користите емцц као алтернативу гцц-у:

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

Минималне промене:

Уместо излаза у бинарну датотеку, Емсцриптен користи .васм и .јс да генерише датотеке, који се користе за покретање ВебАссемби модула.

Ознака УСЕ_ЗЛИБ се користи за подршку злиб библиотеци. Библиотека је дистрибуирана и портована на ВебАссембли, а Емсцриптен је укључује у пројекат.

Виртуелни систем датотека Емсцрипптен је активиран. Ово ФС сличан ПОСИКС-у, ради у РАМ-у унутар претраживача. Када се страница освежи, меморија се брише.

Да бисте разумели зашто је потребан виртуелни систем датотека, вреди упоредити начин на који покрећете сектк из командне линије са начином на који покрећете компајлирани ВебАссембли модул.

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

Добијање приступа виртуелном систему датотека је неопходно како се не би преписивало сектк за стринг уместо за унос датотеке. У овом случају, фрагмент података се приказује као дата.фастк датотека у виртуелном ФС са позивом на маин() сектк на њему.

Ево нове архитектуре:

Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

Слика показује да уместо прорачуна у главној нити претраживача, ВебВоркерс. Овај метод вам омогућава да извршите прорачуне у позадинској нити без утицаја на одзив прегледача. Па, ВебВоркер контролер покреће Воркер, управљајући његовом интеракцијом са главном нити.

Команда сектк се покреће помоћу Воркер-а на монтираној датотеци. Након завршетка извршења, Радник производи резултат у облику Обећања. Када главна нит прими поруку, резултат се користи за ажурирање графикона. И тако даље у неколико итерација.

Шта је са перформансама ВебАссембли-а?

Да би проценио промену перформанси, пројектни тим је користио параметар операција читања у секунди. Време које је потребно за прављење интерактивних графикона се не узима у обзир пошто обе имплементације користе ЈаваСцрипт.

Када се користи решење које се добија из кутије, повећање перформанси је било девет пута.

Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

Ово је одличан резултат, али, како се испоставило, постоји прилика да се и он оптимизује. Чињеница је да велики број резултата КЦ анализе не користи сектк, тако да се могу избрисати. Ако то урадите, резултат се побољшава 13 пута у поређењу са ЈС.

Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

То је постигнуто једноставним коментарисањем принтф() команди.

Али то није све. Чињеница је да у овој фази фастк.био добија резултате анализе позивањем различитих Ц функција. Свака од њих израчунава свој скуп карактеристика, тако да се сваки фрагмент датотеке чита два пута.

Да би се овај проблем решио, одлучено је да се две функције комбинују у једну. Као резултат тога, продуктивност се повећала за 20 пута.

Како смо користили ВебАссембли да убрзамо веб апликацију 20 пута

Вреди напоменути да се тако изванредан резултат не може увек постићи. У неким случајевима, перформансе ће пасти, па је вредно проценити сваки случај.

Као закључак, можемо рећи да Васм заиста пружа прилику за побољшање перформанси апликације, али морате је мудро користити.

Скиллбок препоручује:

Извор: ввв.хабр.цом

Додај коментар