25.8.2021

foto Petr Bravenec

Petr Bravenec
Twitter: @BravenecPetr
+420 777 566 384
petr.bravenec@hobrasoft.cz

Poprvé jsem se setkal s uchopitelným popisem umělé inteligence na začátku devadesátých let pravděpodobně v knize "Cesty moderního programování" od Petra Koubského. Kniha se mi v průběhu geologických epoch ztratila, takže nemůžu tvrdit s naprostou jistotou, že na konci knihy, na stránce 290, byl schematický náčrt neuronové sítě, vysvětlený algoritmus backpropagation a vše zkresleno autorovou představou o neuronových sítích.

Pokusy s neuronovými sitěmi u mě tehdy skončily naprostým nepochopením a debaklem. To ale neznamená, že by mě téma nezajímalo. V momentě, kdy bylo k dispozici dostatek informací a příkladů, jsem se k umělé inteligenci zase vrátil.

V dnešní době je na první pohled k dispozici množství literatury, kurzů, příkladů a možností, jak se s neuronovými sítěmi naučit pracovat (Introduction to Machine Learning). Neuronové sítě mohou být jednoduché a učební texty a příklady snadno pochopitelné. Osobně si myslím, že pochopit a prakticky zvládnout umělou inteligenci nemusí být složité, ale vyžaduje to nastudovat velké množství materiálů, vyzkoušet množství příkladů, strávit obrovské množství času neúspěšnými pokusy a nevzdat to. Na zájemce totiž čeká řada překážek.

Pojďme si tedy povědět, co dělá z neuronových sítí poměrně obtížné téma.

Co je umělá inteligence

Jednoduchá otázka, složitá odpověď. Termín "umělá inteligence" dobře prodává, do kategorie umělé inteligence se proto dneska řadí kde co. Klasickou úlohou je například antispamový filtr. Algoritmy pro třídění pošty, které mají k umělé inteligenci nejblíže, jsou založené na Bayesovské statististice. Přesto bych se takový statistický systém zdráhal označit za inteligentní (možná tak umělý).

Pro zjednodušení bych proto za umělou inteligenci v tom dnešním smyslu označil aplikace, které pro své naprogramování (naučení) používají algoritmus backpropagation. To jsou všechny moderní sítě pro rozeznávání obrazu, detekci osob, rozeznávání obličeje, autonomní řízení atd.

Algoritmus backpropagation (Andrej Karpathy: CS231n Winter 2016: Lecture 4: Backpropagation, Neural Networks 1) hledá přibližné řešení pomocí postupných aproximací. Takové aplikace se neprogramují, ale trénují.

Názvosloví

Pokud začínáte studovat neuronové sítě, vaším nepostradatelným pomocníkem se alespoň ze začátku stane malý výkladový slovník pojmů umělé inteligence. Bez toho budete hledět do libovolného textu jak husa do flašky a vůbec nebudete tušit, o čem se v textu píše. Tak schválně: trénink, tensor, shape, backpropagation, gradient, normalizace, z-score, regularizace, L1, L2, GPU, CPU, TPU, dropout, overfitting, fully-connected layer, loss, mean squared error, metric, recall, precission, f1, euclidean distance, new-york distance, cosine similarity, crossentropy, softmax, embedding, centroid, t-sne, KNN, adam, LSTM, GRU, RNN, RELU, augmenting, konvoluce, inference…

Na těchto pojmech není obvykle nic složitého, skrývají se za nimi často relativně jednoduché věci. Ale na začátek je těch pojmů mnoho a může být snadné se v nich ztratit.

Pokud jste s programováním začali už dříve a k oboru AI jste se dostali dodatečně, bude vás názvosloví nutně mást. V jiných oblastech se některé pojmy používají jinak. Embedding například nemá vůbec nic společného s nasazením neuronové sítě na embedded počítač – stejné slovo, dva naprosto odlišné významy.

Matematický základ

Často se lze setkat s názorem, že pro práci s umělou inteligencí je životně nutné znát matematiku schovanou za neuronovými sítěmi. Je to pravda a není to pravda. Podle mého názoru je dnes umělá inteligence skutečně spíše matematický obor s velkým přesahem do programování. Kdo se chce dneska věnovat umělé inteligenci seriózně, bez orientace v příslušných matematických oborech nemá příliš šancí.

Matematický základ schovaný za neuronovými sítěmi tvoří velikou hradbu mezi běžným programátorem a neuronovými sítěmi. Běžný vývojař nemá potřebu myslet matematicky (uvažuje spíše algoritmicky), nezná používané názvosloví a většinou jsou mu zcela cizí i statistické principy používané v oboru umělé inteligence. Vstupní val vědomostí je hodně vysoký.

Na druhou stranu, pro stažení demo příkladu z gihubu a k jeho přizpůsobení například pro rozeznávání zavřených a otevřených dveří nepotřebujete z matematiky znát téměř nic. S velikou pravděpodobností však bude mnohem snazší a hardwareově úspornější navrhnout pro takovou jednoduchou úlohu vlastní konvoluční síť, a tady už je znalost matematiky velmi užitečná.

První fungující, komerčně úspěšný produkt založený na umělé inteligenci jsme dali dohromady bez hlubších znalostí matematiky, která se za neuronovými sítěmi schovává. Tomu odpovídal i styl práce. Knihovna FANN, na které jsme aplikaci postavili, je jednoduchá a snadno použitelná, velmi dobře přizpůsobená uvažování programátora bez zkušeností s neuronovými sítěmi. Vývojář se vůbec nemusí starat o to, co se děje uvnitř, knihovna nevyžaduje žádné hlubší znalosti matematiky. Pro vyhodnocení práce neuronové sítě jsme proto museli vynalézat kolo a pracně objevit letité statistické metody (specificita, sensitivita, přesnost – záměrně používám termíny frekventovaně používané v souvislostí s pandemií covid, v oboru AI se pro tytéž metody používají názvy jiné).

Bez matematiky se nelze obejít, pokud používáte knihovnu TensorFlow (či jiné). Dokumentace k TensorFlow se hemží matematickými vzorci a výrazy, jejichž neznalost vám může pořádně zkomplikovat život. Podobné to bude s jakýmkoliv jiným frameworkem pro umělou inteligenci.

Matematika může být velmi užitečná při nasazování sítě. Z některých architektur sítí je potřeba vyříznout některé prvky, které jsou potřebné pouze pro trénování sítě. Tato potřeba může nastat třeba z výkonnostních důvodů, nebo proto, že cílová platforma vůbec nepodporuje některé operace. Pokud je takovou nepodporovanou operací dropout, je situace ještě únosná a snadno zvládnutelná. Pokud není podporovaná nějaká matematická operace, máte problém. Neočekávejte úspěchy, pokud nevíte, že "druhou mocninu lze nahradit násobením". Do uvozovek v předchozí větě si přitom můžete dosadit libovolný matematický výraz běžně používaný v oblasti AI.

Potřebná matematika není složitá, ale zahrnuje množství oborů, ve kterých je třeba mít alespoň základní přehled (podle důležitosti):

  • lineární regrese,
  • statistika,
  • pravděpodobnost,
  • konvoluce,
  • matice,
  • fourierův rozklad,
  • derivace a integrály.

S vlastní lineární regresí se v neuronových sítích nikde nesetkáte. Pomocí regrese se však práce neuronové sítě vysvětluje velmi dobře a nakonec je to přesně to, co neuronová síť obecně dělá: simuluje požadovaný funkční průběh a k jeho nalezení používá nějakou formu regrese. Když tedy začnete číst v textu o neuronových sítích o regresi, je vhodné znát souvislosti a umět si regresi zařadit. Lineární regrese je nakonec užitečná i v jiných oblastech lidské činnosti a dovolí vám chápat a řešit i jiné IT problémy, ke kterým byste jinak přistupovali z úplně jiné strany.

Od lineární regrese se dostáváme do jejího širšího matematického okolí – ke statistice. Jakýkoli text na téma umělé inteligence, pokud zrovna nejde o text, který vzniknul v marketingovém oddělení firmy, bude obsahovat spoustu statistických pojmů. Neuronová síť je totiž jedno velikánské statistické monstrum. Z neuronové sítě totiž nikdy nedostanete jednoznačnou odpověď typu Ano/Ne. A pokud ano, pak to stejně bude jednou ano a jednou ne. Neuronová síť ve skutečnosti výsledky pouze odhaduje! I velice dobře natrénovaná síť se chová jako Kryton: "Je to póó… je to póó… je to póóm… je to banán!" Statistiku budete potřebovat na to, abyste byli schopni odhadnout, jestli můžete takovou neuronovou síť nasadit do praxe.

Se statistikou úzce souvisí pravděpodobnost. Správná neuronová síť vám totiž nikdy nepoví "Je to banán", ale "S pravděpodobnosti 81% je to banán". Pravděpodobnost a statistika jsou často jen dva různé pohledy na jeden problém.

Pro rozeznávání obrazu se používají konvoluční sítě. Opět – hotových a natrénovaných příkladů je plný internet, nic vám nebrání stáhnout natrénovanou síť typu YOLO nebo SSD a začít ji používat pro rozeznávání susedky na hrušce maslove. Druhou stranou konvoluce je Fourierův rozklad. Okrajově je dobré o něm vědět.

Drtivá většina dat v neuronových sítích vystupuje jako matice. O maticích nevím prakticky nic a vůbec to nevadí. Přístup data = matice je pro vývojáře přirozený (pole) a velmi intuitivní.

Z matematiky jsem si nechal nakonec derivace a integrály. Zatímco s integrály se při práci s neuronovými sítěmi setkáte vyjímečně, pojem derivace se vyskytuje poměrně často. Derivace totiž v matematice slouží jako nástroj pro hledání extrémů na funkčním průběhu. A to je přesně to, co dělá neuronová síť. Nikdy se vám nestane, že byste museli v souvislosti s neuronovou sítí něco derivovat. Ale je dobré vědět, jak je derivace definovaná, jak je používaná v neuronových sítích a jak má vypadat derivovatelná funkce.

S derivacemi se dostáváme v kruhu zpět k lineární regresi. Oboje spolu tak trochu souvisí. Lineární regrese je totiž skvělý a názorný nástroj, jak práci neuronové sítě vysvětlit. Ale zatímco u lineární regrese stačí pochopit několik jednoduchých vzorců, s přibývajícími rozměry a nelinearitami se celý problém komplikuje. A pak už je velmi užitečné o derivacích něco vědět (ano, i ve statistice je někdy potřeba něco zderivovat).

Příklady

Ve světě AI je velké množství frameworků dostupných jako opensource. Stejně tak je k dispozici velké množství příkladů na githubu, které stačí jen stáhnout, nainstalovat, spustit…

Ne, takhle jednoduché to není. Většina AI software dostupného na githubu nefunguje. Není to však chyba aplikaci na githubu, ale důsledek rychlého vývoje celé oblasti AI. S tím je spojená řada potíží:

  • různé frameworky (TensorFlow, PyTorch...),
  • různé verze frameworků (TensorFlow 1, TensorFlow 2),
  • různé verze Pythonu (2.7, 3.6, 3.7, 3.8, 3.9, 3.10…),
  • různé verze dalších balíků…

Různé frameworky by se daly tiše přejít, kdyby hotová řešení některých úloh neexistovala pouze pro některé typy frameworků. Typicky jde třeba o rozeznávání obrazu. Když se budete pokoušet rozběhat v počítači typu Jetson detekci objektů, pravděpodobně vám nezbyde, než sáhnout po TensorFlow. Čas, věnovaný jiným frameworkům se může ukázat jako ztracený, záleží na kombinaci použitého HW a SW. Neuronové sítě nejsou tak univerzální a hardwarově nezávislé, jako je tomu u jiného software.

Další potíž jsou dvě různé verze TensorFlow. Obě verze se od sebe hodně liší v přístupu k zápisu neuronové sítě. Když se budete chtít naučit TensorFlow 2, velmi rychle zjistíte, že hotový příklad existuje jen pro TensorFlow 1 a ani tam příliš dobře nefunguje, protože je pro příliš starou verzi TF1.

Klasickou úlohou používanou v oblasti AI je rozeznávání obrazu. Pro tuto úlohu existuje řada různých architektur a hotové, natrénované sítě lze stáhnout z internetu. TensorFlow existuje ve dvou různých verzích: 1 a 2. Verze se od sebe dost zásadním způsobem liší: pro TF1 je typická spíše práce s matematickým zápisem neuronové sítě, v TF2 je výchozím prostředím pro návrh sítě Keras. TF2 umožňuje celou síť zapsat způsobem, který je bližší uvažování běžného vývojáře.

Python je kapitola sama pro sebe. Pro zájemce o AI je Python prostředkem, který by nejraději neřešil, ale rozdíly mezi verzemi 2.7 a 3.x jsou propastné (pokud se má zprovoznit příklad stažený odkudsi z internetu). Rozdíly mezi desetinkami u verzí 3.x už tak podstatné nejsou, ale dokáží pěkně otrávit život, pokud jsou v příkladu použity finesy z verze novější, než jakou máte nainstalovanou v počítači.

Software často potřebuje množství dalších pomocných knihoven. A tady začíná hotové peklo. Python má vlastní balíčkovací systém PIP, kde jednotlivé balíky závisí na jiných balících, často na konkrétních verzích, takže někdy zabere nainstalování "hotového" příkladu z internetu obrovskou spoustu času a pro běh takového balíku musíte vytvořit vlastní prostředí s pečlivě vybranými verzemi potřebných knihoven. U x86 je to ještě únosné, ale na platformě ARM (Jetson) balíky věšinou nejsou předem přeložené a je nutné je překládat na cílové platformě. Ke vší smůle je PIP magor a překládá jednovláknově, takže ve výsledku může instalace jednoduchého kódu z Githubu zabrat celý den.

S vytvořením a udržováním provozního prostředí pro umělou inteligenci může hodně pomoci Docker. Takže abyste zprovoznili jednoduchý příklad z internetu, měli byste se stát ještě odborníky na virtualizaci…

Dostupnost dat

Dnešním lídrem v oblasti umělé inteligence jsou velké společnosti jako je Google. Ten neuvádím náhodou – framework TensorFlow, se kterým se učím pracovat, vzniknul právě v dílnách Googlu. Veškeré programové vybavení, které má k dispozici Google, mají k dispozici i ostatní. Proč je tedy Google lídrem, proč ne někdo jiný?

Odpovědí jsou data. Velké IT společnosti disponují obrovským množství dat, které tvoří nejpodstatnější část firemního know-how. Facebook může natrénovat rozeznávání obličejů doslova na miliardách fotografií. Nejenže má Facebook k dispozici ony fotografie, lidé mu dokonce sami označí, kdo na fotografiích je!

NVidia ve své DeepStream technologii umí rozeznávat registrační značky automobilů. Neuronová síť se naučila na základě označených fotografií najít na obrázku registrační značku a přečíst text na značce. Nvidia uvádí, že síť trénovali na zruba třech stech tisících obrázku registračních značek z USA. To je objem dat, který jednotlivec nebo malá firma nemá možnost připravit.

A i když už data máte, práce s nimi může být náročná na matematické znalosti. Pro neuronové sítě je nutné data normalizovat a normalizační postupy se liší v závislosti na distribuci.

Trénování sítě

Trénování sítě je radostný proces, kdy sledujete, jak se z totálního retarda stává inteligentní entita. Tedy… někdy. V tomto bodě je nutno přiznat, že neuronové sítě se obvykle učí velmi ochotně, ale celý proces vidíte jen jako několik křivek na grafech v TensorBoard. To vám však nic nepoví, co skutečně síť umí.

V tento okamžik mohu jako skvělou ilustraci vzpomenout příklad, kdy se nejmenování armádní odborníci na AI snažili naučit počítač rozeznávat letecké snímky s tanky a letecké snímky bez tanků. Neuronové síti předložili k naučení tisíce snímků a všechny mektriky při trénování vykazovaly skvělé hodnoty. V praxi přišla studená sprcha. Kdyby si vojáci házeli korunou, došli by ke stejným výsledků. Jak je to možné? Snímky s tanky byly pořízené za hezkého počasí. Neuronová síť se tak skvěle naučila rozeznávat hezké počasí od nehezkého, tanky ji nezajímaly.

Stejným způsobem může neuronové síti naletět kdokoliv.

Trénování je časově náročný proces. Spolu s výše uvedeným případem můžete strávit obrovské množství času zcela zbytečně.

Někdy je však velmi obtížné neuronovou síť k učení donutit. V současné době experimentuji s Attention OCR. Pokud trénuji na množině do 33 znaků, je vše v pořádku. Pokud přidám ke trénovací množině jediný další znak navíc, Attention OCR se přestává učit a místo minimalizace chyby funguje přesně naopak – chyba exponenciálně roste a s každým dalším krokem je síť pitomější a pitomější. Pokud se vám takto začne chovat neuronová síť v pátek odpoledne: "spustím trénink přes víkend", můžete přijít o veliké množství času.

Hodně času zabere také hledání takové chyby. Jeden cyklus může zabrat deset až patnáct minut. Dříve se o chybě nedozvíte. Pokud se nedaří chybu objevit, je taková práce na mnoho dní a celá situace je velice frustrující.

Potřebný hardware

Hlavním výpočetním prostředkem pro trénování neuronových sítí je grafická karta. Existují sice úlohy, kde je grafická karta spíše přítěží a je lépe trénovat na CPU, ale takových úloh je rozhodně menšina.

Úlohy z oblasti umělé inteligence dnes umějí magické věci: dokážou číst, mluvit, rozeznají babičku od veliké řepy, neúnavně mohou kontrolovat svým ostřížím pohledem produkci na výrobní lince… ale něco to stojí. Jednoduchá Pásovcova síť obsahuje přes 6 miliónů proměnných a při zpracování jediného obrázku konvoluční neuronovou sítí se provádějí miliardy matematických operací (sčítání a násobení). Vstupní množina dat obsahuje necelých deset tisíc obrázků (to je zatraceně málo!) a jediný trénovací cyklus zabere několik dní. Množství výpočtů je i u malých úloh prostě ohromné a vyžaduje co nejvýkonnější hardware.

Při výpočtech v grafické kartě je poměrně limitujícím faktorem množství dat přenášené do grafické karty. Při trénování se musí do GPU přenést každý obrázek, provést s ním určité operace a poté se vše opakuje s dalším obrázkem. Vše se dá trochu urychlit tím, že se do GPU přenese několik obrázků najednou a neuronová síť se trénuje dávkově. Na větším množství obrázků se dá provést o cosi více práce, než na obrázku jediném – výpočetní hardware je tak lépe vytížen, není tolik zdržovaný přenosem dat po PCIe sběrnici. Na druhou stranu to zase klade vyšší nároky na množství paměti v grafické kartě. Na druhou stranu je však často možné trénovat ve více GPU najednou.

Spolu s množstvím paměti v GPU rostou i paměťové nároky v počítači. Velmi rychle jsem zjistil, že pro práci s 16GB GPU je 32GB operační paměti v počítači málo. Paměť jsem rozšiřoval na dvojnásobek už po týdnu.

Výsledný efekt je dost nepříjemný – pro neuronové sítě potřebujeme co nejvýkonnější grafickou kartu s co největším množstvím paměti, a pokud budeme mít takových karet více, tím lépe. Zároveň s tím je třeba mít adekvátně výkonný zbytek počítače. Zapomeňte na to, že byste mohli trénovat neuronovou síť na svém obvyklém desktopu nebo notebooku. Když se rozjedou výpočty, obrazovka se prakticky zastaví. Pro trénování neuronových sítí je nutný dedikovaný počítač. Pohled na současné ceny je však frustrující.

Stejné požadavky na hardware mají totiž kryptoměny. O velmi drahé a nedostupné grafické karty se tak přetahují neuronové sítě s těžaři a s hráči a vítězně z toho vycházejí pouze výrobci grafických karet.

Mým nedostižným ideálem jsou karty jako je MI100. Cena za takovou kartu je ale úplně mimo a mohla by vést i k tak zoufalým činům, jako je dotace.

Výpočetní výkon není jediný zdržující faktor. Neuronové sítě pracují s ohromnými objemy dat. Zvláště ve spojení se zpracováním obrázků se můžete velmi rychle dostat do situace, kdy se objem jediného projektu dostane do desítek či stovek GB.

Časová náročnost

Množství času, které strávíte trénováním sítí, je ohromné. Výmluvná je tabulka s časovou náročností stránek thispersondoesnotexist.com. S osmi grafickými kartami Nvidia Tesla V100 trval trénink sítě zhruba 10 dní. Zkuste odhadnout, jak dlouho by trval trénink na jedné kartě… na té vaší kartě.

Právě množství času, které neuronové sítě vyžadují, je velice frustrující při jakémkoliv ladění neuronové sítě.

Při práci s neuronovými sítěmi vše trvá dlouho. Python je interpreter a chybu nahlásí až když na ni narazí. Když se tato vlastnost Pythonu smíchá s rychlostí neuronových sítí, pak i triviální chyby, které normálně najde překladač během sekund (mým mateřským jazykem je C++), odhalíte v nejlepším případě po několika minutách.

Když už se nakonec trénink úspěšně rozjede, zpětnou vazbu dostanete nejdříve po několika hodinách. Do té doby máte k dispozici jen málo indicií, jestli probíhá trénink v pořádku.

Python

Python osobně považuji za poměrně obskurní jazyk. Pro příchozí odjinud má Python jednu speciální věc, kterou jsem nezaznamenal v žádném jiném prostředí, nebo alespoň ne v takové míře: při programování v Pythonu byste měli používat "Správný Pythoní Způsob" (anglicky The Right Pythonic Way). Python se prostě liší a je na to hrdý.

Pro zájemce o umělou inteligenci má Python ještě jednu záludnost. Původně je Python navržený pro výuku programování. Díky tomu se Python dobře ujal ve školství a v akademickém prostředí. Protože celý obor umělé inteligence jen velmi pomalu přechází z výzkumu do praxe, dost velká část příkladů a knihoven pochází z akademického prostředí. U mnoha příkladů naleznete odkazy na arxiv.org do vědeckých prací.

Akademičtí pracovníci mají rádi matematiku. Matematika je skvělý nástroj pro popis světa okolo nás. Matematika používá symbolický zápis, ten má ale zásadní nedostatek – bez znalosti kontextu je matematický zápis nečitelný. Poznáte, že následující rovnice popisuje aritmetický průměr?

x = 1 n i = 1 n a i

Tato symbolika se pak často objevuje i v zápisu programu, kde se kontext získává ještě hůře a příklady tak bývají často naprosto nečitelné:

x = s / n

 

versus

prumer = soucet_hodnot / pocet_hodnot

 

Akademický Pythoní kód proto často obsahuje všechna písmenka latinské abecedy a fonetický přepis řecké abecedy, ale méně už narazíte na popisné názvy jako iterator_over_images, number_of_images nebo input_shape.

Inference

Inference je proces, kdy neuronové síti předhodíte ostrá produkční data a od sítě požadujete jejich zpracování – nasazení sítě v reálné úloze. Překvapivě je právě tento krok jedním z nejnáročnějších.

V prvé řadě se na obtížnosti inference podepisují všechny ty návody a příklady na internetu, které ukazují, jak je práce s neuronovými sítěmi jednoduchá a cool:

  • nainstalujte TensorFlow,
  • opište si tenhle program,
  • stáhněte se demo dataset,
  • natrénujte,
  • koukněte na TensorBoard,
  • profit!

Drtivé většině návodů chybí ta nejdůležitější věc, kvůli které se to celé dělá. Všichni ukazují, jak je práce s AI snadná, ale jen hrstka lidí vám ukáže, jak hotovou neuronovou síť použít.

V každém textu pro začátečníky vám namalují neuronová kolečka a propojí je synaptickými čarami, ale snad nikdy jsem ještě neviděl příklad dotažený až do úplného konce. Často se vám dostane pouze informace typu "vezměte tensor se shape (1,3,320,320) a proveďte inferenci". To není příliš ilustrativní. Málokdy je v příkladech zmíněná možnost REST api, komunikace s databází a podobně.

Úspěšné nasazení hotové, natrénované sítě, je věc náročná i z jiného důvodu: obor potřebných znalostí se velmi liší od znalostí, které potřebujete pro zvládnutí AI. Umělou inteligenci chceme obvykle nasadit v nějakém složitém, organickém prostředí:

  • je detekovaná chyba (vizuálně špatný výrobek),
  • na obrazovce se chyba vyznačí i s popisem a čeká se na obsluhu,
  • po interakci s obsluhou se zjistí výrobní číslo (čtení QR kódu, čárového kódu),
  • chyba se zapíše do databáze někde v cloudu,
  • výrobní lince se předá povel pro vyřazení výrobku.

Programovací prostředí AI se navíc často diametrálně odlišuje od skutečného uživatelského prostředí. Zatímco AI bývá většinou v Pythonu, naše programy často bývají napsané v PHP (pro web) nebo v C++ a QML (pro různé embedded aplikace).

Nasazení v reálném prostředí

Neuronová síť pro vás může hlídat třeba kancelář a ukládat do databáze každého, kdo se v kanceláři vyskytne (já vím, GDPR). Nebo může ovládat závoru na vašem firemním parkovišti a vpustit dovnitř pouze auta se známou SPZ. Není pochopitelně problém spustit takovou síť na běžném PC s trochu výkonnější grafickou kartou. Ale zkuste to navrhnout zákazníkovi. Pokud chcete své řešení prodat, musíte je nabídnout co nejlevněji.

Na Raspberry Pi TensorFlow Lite jistě rozchodíte a u jednoduchých sítí bude výkon vyhovovat. Pokud připojíte k Raspberry Pi kameru a zkusíte postavit systém pro vizuální rozeznání otevřeného či zavřeného okna, bude vám výkon procesoru stačit. CPU se sice trochu zapotí, ale otevřené okno můžete v klidu detekovat jednou za minutu nebo na požádání.

Když ale budete chtít zpracovávat FullHD video, stane se z Raspberry PI obrovská brzda.

Naštěstí existují různé akcelerátory AI. Uvést můžu alespoň dva:

Edge TPU se dá koupit i jako samostatné USB zařízení, ale většinou jsou všechny AI akcelerátory osazené v počítačích typu Raspberry PI s procesory ARM (Coral, Asus Tinker Edge T)

Oba akcelerátory mají zcela odlišné vlastnosti. Edge TPU pracuje pouze celočíselně v osmi bitech. Neuronová síť pro Edge TPU se musí překonvertovat do TensorFlow Lite a přizpůsobit osmibitovému prostředí.

Nvidia Jetson Nano použíme v několika projektech:

Jetson dokáže pracovat i s desetinnými čísly v přesnosti 32 nebo 16 bitů, ale konverze vás tak jako tak nemine – chcete-li akcelerátor AI využít naplno, musíte překonvertovat síť z TensorFlow na TensorRT pro ten konkrétní stroj, na kterém chcete síť provozovat.

A právě konverze bývá často obrovský, obrovský problém. S TensorFlow Lite mám zkušeností jen málo a to spíše dobré, zato s TensorRT mám zkušeností nepříjemně mnoho. TensorRT je určené pouze k inferenci. Funkce, které jsou v neuronové síti spojené s tréninkem, jsou v TensorRT zbytečné a nejsou podporované! Takovou typickou funkcí je Dropout – regularizační metoda, která při tréninku náhodně vypíná některé neurony. Při inferenci je tato funkce zcela zbytečná. Neuronovou síť je proto nutné po tréninku důkladně přeorganizovat. A tady jsme opět u znalostí matematiky. Bez představy, jak se pomocí maticových operací síť vytváří, může být úprava sítě hodně náročná.

Někdy jsou nepodporované i některé z mého pohledu základní funkce – například split (rozdělení tensoru na dva). Ty se pak musejí řešit jednoduchou knihovnou v C++ nebo C.

Diagnostika při konverzi je naprosto šílená. Častá chybová hláška je jen "Assert243" bez nejmenšího vysvětlení. Až několikadenní pátrání může ukázat, že 243 je číslo řádku ve zdrojovém programu někde v příkladech DeepStream. Ten ale jen tak hledat nebudete a tudíž ani nenajdete, protože na vývojářském fóru se k dané chybě od Nvidie dozvíte, že TensorRT je proprietární technologie a zdrojové kódy k dispozici nejsou.

U hotových sítí stažených z internetu je situace mnohem složitější. Například hotové, natrénované sítě pro rozeznávání obrazu mají na vstupu typicky tensor s dynamickými rozměry. S tím si TensorRT neporadí a celý graf je nutné předělat – vyhodit ze sítě vstupní vrstvy, nastavit rozměry napevno a přizpůsobit zbytek sítě chybějícím vrstvám na vstupu. Nvidia k tomu nabízí nástroj graphsurgeon, ale dokumentace je hodně strohá.

S dokumentací souvisí i příklady. Nvidia nabízí pro zpracování videa technologii DeepStream. Nápad se mi velice líbí a už jsem o něm psal. Součástí instalačního balíku je i množství příkladů. Příklady by se měly věnovat technologii DeepStream, ale jsou napsané tak kryptickým způsobem, že vývojář bez detailních znalostí Gstreameru bude vlastní jednoduchý stream dávat dohromady několik dní, aniž by se mohl věnovat umělé inteligenci.

Nvidia Jetson je šikovný počítač s velmi sympatickou cenou, ale stále je to hodně okrajová záležitost s malou uživatelskou základnou. Na tisícovku lidí se zkušenostmi s Raspberry Pi se vyskytne možná jeden či dva se zkušenostmi s Nvidia Jetson. Edge TPU na tom bude velmi podobně. Při vývoji software pro AI na daných platformách tak budete vždy sami a s vašimi problémy vám nikdo nepomůže.

Závěr

Umělá inteligence a deep learning je zajímavá oblast výpočetní techniky. Práce s umělou inteligencí se však od ostatní práce s výpočetní technikou liší.

Chcete-li jako vývojáři uchopit umělou inteligenci a používat její schopnosti ve svých projektech, budete postavení před nutnost zvládnout obrovské množství nových znalostí.

Představa, že neuronové sítě jsou jednoduché, je zcestná. Ale stejně jako dnes programátor běžně neřeší binární stromy, hash tabulky a další způsoby organizace dat v paměti, nemusí řešit ani implementační detaily v neuronových sítích. Přesto programátoři běžně disponují znalostmi o různých způsobech uložení dat a pomáhá jim to zvolit správný nástroj.

Se znalostmi neuronových sítí je to podobné. Objem potřebných dovedností nemusí být diametrálně odlišný, liší se však jejich obsah a jen málo se překrývá s obsahem znalostí běžného programátora.

Práce v IT od nepaměti znamená neustálé učení. Obor AI není vyjímkou.

Hobrasoft s.r.o. | Kontakt