Popis předmětu - B0M36SPJ

Přehled studia | Přehled oborů | Všechny skupiny předmětů | Všechny předměty | Seznam rolí | Vysvětlivky               Návod
B0M36SPJ Programování vědeckých výpočtů v jazyce Julia
Role:  Rozsah výuky:2P+2C
Katedra:13136 Jazyk výuky:CS
Garanti:Pevný T., Šmídl V. Zakončení:KZ
Přednášející:Pevný T., Šmídl V. Kreditů:4
Cvičící:Franců J., Heim N., Pevný T., Šmídl V., Zorek M. Semestr:Z

Webová stránka:

https://juliateachingctu.github.io/Scientific-Programming-in-Julia/dev/

Anotace:

V rámci předmětu budou představeny unikátní vlastnosti jazyka Julia, např. jeho typový systém, návrhový vzor multiple dispatch, metaprogramování, generování a manipulace kódu. Tyto vlastnosti umožňují velmi rychlý a snadný návrh algoritmů, jejich výpočetní efektivita je srovnatelná s implementací v nízko úrovňovém jazyce (např. C nebo Fortran). Tyto koncepty a jejich efektivita budou představeny na běžných vědeckých úlohách jako je implementace obecného algoritmu gradientního sestupu a výpočet diferenciálních rovnic. Bude ukázáno, že obecně navržené základní algoritmy umožňují bez modifikace i pokročilé funkce jako je výpočet propagace neurčitosti v rámci řešení diferenciální rovnice nebo optimalizaci řešení diferenciální rovnice metodou gradientního sestupu. V rámci cvičení budou studenti tvořit vlastní implementace těchto algoritmů.

Obsah:

Návrh vědeckých výpočtů je specifickou oblastí programování, ve které je kladen důraz na: i) rychlé a snadné navržení nového algoritmu, ii) pokud možno co nejrychlejší spuštění výsledného kódu, iii) obecnost kódu umožňující snadné použití algoritmu např. s jiným typem vstupu. Splnění všech těchto požadavků je velmi náročné a proto jsou stávající prostředí pro tvorbu vědeckých programů založena na kombinaci dvou různých jazyků. V jazyce nízké úrovně (Fortran, C, C++) je napsána knihovna, jejíž funkce volá skriptovací jazyk (Matlab, Python, R). Pokud je potřeba implementovat nový algoritmus nebo modifikovat stávající, je třeba přepsat knihovnu nebo se smířit s neefektivním výpočtem kódu skriptovacího jazyka. Ačkoliv existují pokusy překlenout mezeru mezi těmito dvěma jazyky (např. projekt Cython), nejsou pro svou složitost příliš rozšířené. Jazyk Julia byl od počátku navržen jako jazyk pro vědecké výpočty s důrazem na řešení zmíněných problémů, které nejsou uspokojivě řešeny stávajícími nástroji. Obsahuje nové návrhové vzory, např. multiple-dispatch, pro snadnou rozšiřitelnost (jako zobecnění objektově orientovaného a funkcionálního programování), unikátní nástroje pro manipulaci s kódem, díky nimž je rychlost výsledného kódu srovnatelná s C a C++. Na fakultě se v současné době vyučují Matlab, Python i R jako současné standardy v daných oborech. Domníváme se, že jazyk Julia má významnou šanci pozici těchto nástrojů v budoucnu doplnit a postupně pro některé typy výpočtů nahradit. Inovace představené v jazyce Julia mohou také pronikat do ostatních jazyků a vytvořit novou třídu jazyků. V rámci předmětu seznámíme studenty se základními koncepty používanými v jazyce, z nichž některé nejsou ještě vyučovány v žádném existujícím kurzu (např. metaprogramování, automatické generování kódu, pokročilá makra, multiple dispatch). Tento předmět rozšiřuje studentům znalosti programování z předmětů zabývajících se programovacími jazyky: PRP (procedurální programování), PJV (Java), CPP (C++), PDV (paralelní programování), FUP (funkcionálních programování), ESW (efektivní software). Současně nabízí alternativní prostředí pro implementaci vědeckých projektů, které se vyučují v předmětech MTB (Matlab) a SAN (statistická analýza dat). Bakalářská forma jazyka Julia je předkládána současně s tímto předmětem. Absolvování bakalářského předmětu usnadní studentovi první tři lekce, všechny ostatní jsou nadstavba, předmět tak lze absolvovat samostatně. Vyučované koncepty programovacího jazyka budou představeny na příkladech běžných vědeckých úloh jako je implementace optimalizačních úloh (metoda gradientního sestupu) a výpočet diferenciálních rovnic. Hlavní výhody nového jazyka budou demonstrovány na tom, jak snadné je dosáhnout pokročilých algoritmů, například automatického derivování funkcí (nejen neuronových sítí), propagace neurčitosti diferenciální rovnicí a optimalizace modelu diferenciální rovnice podle měřených dat. Prvních 7 lekcí se zabývá hlavními rys y jazyka a představuje je na jednoduchých příkladech jako je implementace aritmetických operací s intervaly a optimalizační metodě gradientního sestupu. Po absolvování těchto lekcí student(ka) získá ucelenou představu o nástrojích jazyka, jeho logice a způsobu použití. Bude seznámen(a) s vhodnými návyky práce, které se odlišují od zvyků z jazyků Matlab nebo Python. Posledních šest lekcí demonstruje vlastnosti a výhody jazyka na běžných vědeckých úlohách. Implementace postupů z automatického derivování je provedena dvěma způsoby: použitím typu duální číslo pro dopředné vyhodnocení a manipulací kódu pro zpětné vyhodnocení. Bude ukázáno jak lze využít balíček intervalové aritmetiky vyvinutý v první části kurzu pro řešení úlohy propagace neurčitosti řešičem diferenciálních rovnic. Vyvinutý algoritmus gradient descent a automatická derivace budou použity na optimalizaci parametrů diferenciální rovnice z naměřených dat.

Osnovy přednášek:

1. Úvod do Julie, syntax, funkce, základní konstrukty
2. Typový systém a koncept multiple dispatch
3. Balíčkovací systém, prostředí, testy, integrace
4. Návrhové vzory, scope, closure, interface
5. Ladění výpočetní efektivity, benchmarks, profilování
6. Introspekce jazyka, abstract syntax tree, základní modifikace kódu
7. Makra, rozdíl oproti funkcím, implementace doménových jazyků
8. Úvod do automatického derivování
9. Manipulace s reprezentací kódu, automatické generování kódu
10. Různé úrovně paralelního programování
11. Programování na grafické kartě
12. Propagace neurčitosti diferenciální rovnicí
13. Optimalizace ODE z měřených dat

Osnovy cvičení:

1. Seznámení s prostředím, základní úlohy
2. Typový systém čísel, návrh typu pro intervalovou aritmetiku včetně operací
3. Vytvoření balíčku pro intervalovou aritmetiku
4. Návrhové vzory v implementaci gradientního sestupu (minibatching, ukládání mezivýsledků, atd.)
5. Odladění neefektivně napsaných příkladů
6. Výpis abstract syntax tree funkce jako stromové struktury
7. Tvorba makra pro zápis řetězení funkcí
8. Implementace metody forwarddiff s duálními čísly
9. Implementace reverse diff manipulací kódu
10. Paralelizace výpočtů lineární algebry
11. Implementace intervalové aritmetiky na GPU
12. Propagace neurčitosti modelem Lotka-Volterra
13. Učení parametrů Lotka-Voltera modelu z dat

Literatura:

Povinná literatura:
1. Tom Kwong , Hands-On Design Patterns and Best Practices with Julia, 2019
Doporučená literatura:
2. Bezanson, Jeff, et al. Julia: A fresh approach to numerical computing. SIAM review 59.1 (2017): 65-98.
3. Lauwens, Ben, and Allen B. Downey. Think Julia: how to think like a computer scientist. O'Reilly Media, 2019.
4. Julia Documentation. https://docs.julialang.org/en/v1/manual/documentation/index.html

Požadavky:

Předmět předpokládá pouze základy programování, základy optimalizace a diferenciálních rovnic. Výhodou je absolvování předmětu Funkcionální programování, případně bakalářského kurzu jazyka Julia.

Předmět je zahrnut do těchto studijních plánů:

Plán Obor Role Dop. semestr


Stránka vytvořena 29.3.2024 09:50:14, semestry: Z,L/2023-4, Z/2024-5, připomínky k informační náplni zasílejte správci studijních plánů Návrh a realizace: I. Halaška (K336), J. Novák (K336)