From 491f38f511bcae370a91a6c3e7e17670b3323f58 Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 6 May 2026 00:41:09 +0200 Subject: [PATCH] removed deprecacy --- prezentacia/3.tex | 195 -------------------------------------- prezentacia/main/main.log | 9 +- prezentacia/main/main.pdf | Bin 95834 -> 95816 bytes 3 files changed, 3 insertions(+), 201 deletions(-) delete mode 100644 prezentacia/3.tex diff --git a/prezentacia/3.tex b/prezentacia/3.tex deleted file mode 100644 index e293f15..0000000 --- a/prezentacia/3.tex +++ /dev/null @@ -1,195 +0,0 @@ - - -\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} diff --git a/prezentacia/main/main.log b/prezentacia/main/main.log index 2277ad5..7a13258 100644 --- a/prezentacia/main/main.log +++ b/prezentacia/main/main.log @@ -3143,15 +3143,12 @@ L3 programming layer <2026-01-19> LaTeX Font Warning: Some font shapes were not available, defaults substituted. - -LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. - Package rerunfilecheck Info: File `main.out' has not changed. (rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. ) Here is how much of LuaTeX's memory you used: - 67066 strings out of 476078 + 67064 strings out of 476078 125031,2848258 words of node,token memory allocated 6249 words of node memory still in use: 59 hlist, 16 vlist, 9 rule, 24 disc, 8 local_par, 4 math, 137 glue, 55 kern, @@ -3160,7 +3157,7 @@ _list, 8 write, 30 pdf_literal, 2 pdf_start_link, 2 pdf_end_link, 4 pdf_dest, 2 pdf_action, 60 pdf_colorstack nodes avail lists: 1:8,2:3124,3:1867,4:377,5:299,6:44,7:1346,8:21,9:988,10:13,11:81 ,12:1 - 87632 multiletter control sequences out of 65536+600000 + 87630 multiletter control sequences out of 65536+600000 132 fonts using 28094191 bytes 128i,23n,130p,7883b,1832s stack positions out of 10000i,1000n,20000p,200000b,200000s -Output written on main.pdf (13 pages, 95834 bytes). +Output written on main.pdf (13 pages, 95816 bytes). PDF statistics: 196 PDF objects out of 1000 (max. 8388607) 115 compressed objects within 2 object streams diff --git a/prezentacia/main/main.pdf b/prezentacia/main/main.pdf index e5323f58cd2e93b78b1e856f6c22f7f0e1598055..42d96c0544e65fae0166b6420d5c239c398a68d9 100644 GIT binary patch delta 13904 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 delta 13893 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 T=a(RM0Urr7GYTaoMNdWwAwDN_