\begin{frame}[fragile]{Štruktúra nášho projektu} \begin{verbatim} . ├── Cargo.toml # závislosti (burn, clap, npyz, ...) ├── mnist.npz # dataset └── src/ ├── lib.rs # modul deklarácie ├── main.rs # tréningová slučka, načítanie dát └── model.rs # parametre siete \end{verbatim} \vspace{0.5em} Celý projekt --- 3 súbory. Žiadne skripty, žiadny Python glue. \end{frame} \begin{frame}[fragile]{Definícia parametrov siete} \begin{verbatim} pub struct Parameters { pub w1: Tensor, // [784, hidden] pub b1: Tensor, // [hidden] pub w2: Tensor, // [hidden, 10] pub b2: Tensor, // [10] } \end{verbatim} \vspace{0.5em} \begin{itemize} \item Generický typ \texttt{B: Backend} --- funguje na akomkoľvek backendu \item Rozmery tenzorov sú súčasťou typu (\texttt{Tensor}) \item Kompilátor zachytí chyby v rozmeroch ešte \textbf{pred spustením} \end{itemize} \end{frame} \begin{frame}[fragile]{Inicializácia váh} \begin{verbatim} let w1 = random_tensor([784, hidden_size], 0.1, seed, device); let b1 = Tensor::zeros([hidden_size], device); \end{verbatim} \vspace{0.5em} \begin{itemize} \item Váhy: náhodné z $\mathcal{N}(0,\; 0.1)$ \item Biasy: inicializované na nulu \item \texttt{device} určuje, kde žijú dáta (CPU/GPU) \item Seed zabezpečuje \textbf{reprodukovateľnosť} \end{itemize} \end{frame} \begin{frame}[fragile]{Načítanie MNIST dát} \begin{verbatim} fn load_mnist_items(path: &str, examples: usize) -> Vec<(Vec, u8)> \end{verbatim} \vspace{0.5em} \begin{itemize} \item Otvoríme \texttt{mnist.npz} ako ZIP archív \item Načítame obrázky + labely z \texttt{.npy} súborov \item Normalizujeme pixely: $[0, 255] \rightarrow [0.0, 1.0]$ \item Výstup: vektor párov \texttt{(obrázok, číslica)} \end{itemize} \vspace{0.5em} Rustový typový systém garantuje, že dáta majú správny formát. \end{frame} \begin{frame}[fragile]{CLI parametre s Clap} \begin{verbatim} #[derive(Parser, Debug)] struct Args { #[arg(long, default_value_t = 50)] batch_size: usize, #[arg(long, default_value_t = 0.1)] learning_rate: f64, #[arg(long, default_value_t = 10)] epochs: usize, } \end{verbatim} \vspace{0.5em} Jeden derive makro --- automatický parsing, help text, validácia. \texttt{cargo run -- --epochs 20 --learning-rate 0.01} \end{frame} \begin{frame}{Tréningová slučka --- logika} Pre každú epochu: \begin{enumerate} \item Rozdeľ trénovacie dáta na \textbf{mini-batche} \item Pre každý batch: \begin{itemize} \item Forward pass: $\hat{y} = \text{softmax}((\mathbf{x} \cdot W_1 + b_1)_{\text{ReLU}} \cdot W_2 + b_2)$ \item Spočítaj cross-entropy loss \item Backpropagation: gradienty pre $W_1, b_1, W_2, b_2$ \item Update: $\theta \leftarrow \theta - \eta \cdot \nabla L$ \end{itemize} \item Vyhodnoť presnosť na dev sete \end{enumerate} \end{frame} \begin{frame}{Burn vs PyTorch --- porovnanie} \begin{center} \begin{tabular}{lcc} \hline \textbf{Vlastnosť} & \textbf{PyTorch} & \textbf{Burn} \\ \hline Jazyk & Python/C++ & Rust \\ Typová bezpečnosť & runtime & compile-time \\ Pamäťová bezpečnosť & GC/manuálna & ownership \\ Backendy & CUDA, CPU & CUDA, CPU, WebGPU \\ Binárka & $\sim$GB + Python & $\sim$MB standalone \\ Nasadenie & zložité & jeden binárny súbor \\ \hline \end{tabular} \end{center} \end{frame} \begin{frame}{Výhoda: Compile-time kontroly} V PyTorchi: \begin{itemize} \item Chyba v rozmeroch $\rightarrow$ \texttt{RuntimeError} po minútach tréningu \item Preklep v názve vrstvy $\rightarrow$ tichý bug \end{itemize} \vspace{0.5em} V Burn/Ruste: \begin{itemize} \item Nesprávne rozmery $\rightarrow$ \textbf{kompilátor to nepustí} \item Nepoužitá premenná, chýbajúci branch $\rightarrow$ warning/error \item Žiadne \texttt{None} prekvapenia --- \texttt{Option} treba ošetriť \end{itemize} \vspace{0.5em} \textbf{Menej debugovania, viac istoty.} \end{frame} \begin{frame}{Výhoda: Nasadenie do produkcie} \begin{itemize} \item \texttt{cargo build --release} $\rightarrow$ jeden statický binárny súbor \item Žiadny Python runtime, žiadne virtuálne prostredia \item Možnosť kompilácie do WebAssembly $\rightarrow$ inferencia v prehliadači \item Ideálne pre embedded, edge zariadenia, IoT \end{itemize} \vspace{0.5em} \begin{center} PyTorch model: Docker kontajner $\sim$2\,GB \\ Burn model: binárka $\sim$5\,MB \end{center} \end{frame} \begin{frame}{Výhoda: Fearless concurrency} \begin{itemize} \item Rustový ownership systém zabraňuje data races \textbf{v compile-time} \item Bezpečný multithreading pre data loading, augmentáciu \item Parameter \texttt{--threads} v našom projekte \item V Pythone: GIL (Global Interpreter Lock) blokuje paralelizmus \end{itemize} \end{frame> \begin{frame}{Kedy použiť Burn?} \textbf{Vhodné:} \begin{itemize} \item Nasadenie modelov do produkcie \item Edge/embedded inferencia \item Keď chcete maximálny výkon a bezpečnosť \item Keď už poznáte Rust \end{itemize} \vspace{0.5em} \textbf{Nevhodné (zatiaľ):} \begin{itemize} \item Rýchle prototypovanie --- Python je stále rýchlejší na experimenty \item Ekosystém --- PyTorch má tisíce hotových modelov \item Burn je stále mladý projekt (aktívny vývoj) \end{itemize} \end{frame} \begin{frame}{Zhrnutie} \begin{itemize} \item Neurónové siete = vrstvy neurónov, učenie cez gradienty \item \textbf{Burn} prináša deep learning do Rustu \item Backend-agnostický, typovo bezpečný, production-ready \item Náš projekt: MNIST klasifikátor v 3 súboroch \item Rust + Burn = bezpečnosť + výkon + jednoduchosť nasadenia \end{itemize} \vspace{1em} \begin{center} \Large Ďakujem za pozornosť! \end{center} \end{frame}