Files
semestralka-latex/prezentacia/3.tex
2026-05-06 00:21:21 +02:00

196 lines
6.1 KiB
TeX

\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<B: Backend> {
pub w1: Tensor<B, 2>, // [784, hidden]
pub b1: Tensor<B, 1>, // [hidden]
pub w2: Tensor<B, 2>, // [hidden, 10]
pub b2: Tensor<B, 1>, // [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<B, 2>})
\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<f32>, 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<T>} 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}