|
| 1 | +% PyCon US 2026 academic poster |
| 2 | +% Breaking the Speed Limit: Fast Statistical Models with Python 3.14, Numba, and JAX |
| 3 | + |
| 4 | +\documentclass[final]{beamer} |
| 5 | + |
| 6 | +\usepackage[T1]{fontenc} |
| 7 | +\usepackage{lmodern} |
| 8 | +\usepackage[size=custom,width=120,height=72,scale=1.0]{beamerposter} |
| 9 | +\usetheme{gemini} |
| 10 | +\usecolortheme{imsa} |
| 11 | +\usepackage{booktabs} |
| 12 | +\usepackage{graphicx} |
| 13 | +\usepackage{tikz} |
| 14 | +\usepackage{xcolor} |
| 15 | +\usepackage{array} |
| 16 | + |
| 17 | +\usetikzlibrary{arrows.meta,positioning} |
| 18 | + |
| 19 | +\definecolor{paper}{HTML}{FFF8F2} |
| 20 | +\definecolor{ink}{HTML}{17202A} |
| 21 | +\definecolor{muted}{HTML}{5F6B74} |
| 22 | +\definecolor{line}{HTML}{E4D7C6} |
| 23 | +\definecolor{cityured}{HTML}{B01117} |
| 24 | +\definecolor{cityumaroon}{HTML}{981B49} |
| 25 | +\definecolor{cityuorange}{HTML}{E07541} |
| 26 | +\definecolor{cityugold}{HTML}{D99A1E} |
| 27 | +\definecolor{numba}{HTML}{2F7D32} |
| 28 | +\definecolor{jaxberry}{HTML}{B51E59} |
| 29 | +\definecolor{threadteal}{HTML}{1F7A8C} |
| 30 | +\definecolor{slideblue}{HTML}{2C6FB7} |
| 31 | +\definecolor{softblue}{HTML}{EAF2FB} |
| 32 | +\definecolor{softgreen}{HTML}{EAF6EA} |
| 33 | +\definecolor{softgold}{HTML}{FFF3DC} |
| 34 | +\definecolor{softberry}{HTML}{F8E7EF} |
| 35 | +\definecolor{softteal}{HTML}{E8F6F5} |
| 36 | + |
| 37 | +\setbeamercolor{background canvas}{bg=paper} |
| 38 | +\setbeamercolor{normal text}{fg=ink} |
| 39 | +\setbeamercolor{block title}{fg=cityured,bg=white} |
| 40 | +\setbeamercolor{block body}{fg=ink,bg=white} |
| 41 | +\setbeamercolor{block alerted title}{fg=cityured,bg=cityuorange!15} |
| 42 | +\setbeamercolor{block alerted body}{fg=ink,bg=cityuorange!7} |
| 43 | +\setbeamercolor{headline title}{fg=cityumaroon} |
| 44 | +\setbeamercolor{headline}{fg=ink,bg=paper} |
| 45 | +\setbeamercolor{headline rule}{bg=cityured} |
| 46 | +\setbeamerfont{block title}{size=\Large,series=\bfseries} |
| 47 | +\setbeamerfont{block body}{size=\large} |
| 48 | +\setbeamerfont{headline title}{size=\Huge,series=\bfseries} |
| 49 | + |
| 50 | +\newlength{\sepwidth} |
| 51 | +\newlength{\colwidth} |
| 52 | +\setlength{\sepwidth}{0.017\paperwidth} |
| 53 | +\setlength{\colwidth}{0.290\paperwidth} |
| 54 | +\newcommand{\separatorcolumn}{\begin{column}{\sepwidth}\end{column}} |
| 55 | + |
| 56 | +\hyphenpenalty=10000 |
| 57 | +\exhyphenpenalty=10000 |
| 58 | +\setlength{\parindent}{0pt} |
| 59 | +\setlength{\parskip}{0.15em} |
| 60 | +\linespread{0.96} |
| 61 | +\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}} |
| 62 | + |
| 63 | +\title{Breaking the Speed Limit} |
| 64 | +\subtitle{Fast statistical models with Python 3.14, Numba, and JAX} |
| 65 | +\author{Wenxin Jiang \textperiodcentered{} Jian Yin} |
| 66 | +\institute[shortinst]{Department of Biostatistics, City University of Hong Kong \textperiodcentered{} PyCon US 2026} |
| 67 | + |
| 68 | +\setbeamertemplate{headline}{ |
| 69 | + \begin{beamercolorbox}{headline} |
| 70 | + \begin{columns}[c,totalwidth=\paperwidth] |
| 71 | + \begin{column}{0.15\paperwidth} |
| 72 | + \centering |
| 73 | + \includegraphics[width=0.78\linewidth]{cityu_logo.pdf} |
| 74 | + \end{column} |
| 75 | + \begin{column}{0.66\paperwidth} |
| 76 | + \vskip0.35ex |
| 77 | + {\usebeamerfont{headline title}\usebeamercolor[fg]{headline title}\inserttitle\par} |
| 78 | + \vspace{0.25ex} |
| 79 | + {\Large\bfseries\color{ink}\insertsubtitle\par} |
| 80 | + \vspace{0.35ex} |
| 81 | + {\normalsize\bfseries\color{ink}Validate the statistical result first. Then accelerate the bottleneck.\par} |
| 82 | + \vspace{0.20ex} |
| 83 | + {\large\color{cityumaroon}\insertauthor\par} |
| 84 | + {\normalsize\color{cityured}\insertinstitute\par} |
| 85 | + \end{column} |
| 86 | + \begin{column}{0.15\paperwidth} |
| 87 | + \centering |
| 88 | + \includegraphics[width=0.46\linewidth]{assets/repo_qr.png}\\[-0.1ex] |
| 89 | + {\small\bfseries\color{ink}github.com/LucaJiang/\par FastStatisticalModels4Python} |
| 90 | + \end{column} |
| 91 | + \end{columns} |
| 92 | + \vspace{0.75ex} |
| 93 | + \begin{beamercolorbox}[wd=\paperwidth,colsep=0.45ex]{headline rule}\end{beamercolorbox} |
| 94 | + \end{beamercolorbox} |
| 95 | +} |
| 96 | + |
| 97 | +\newcommand{\smalllabel}[2]{% |
| 98 | + {\normalsize\bfseries\color{#1}#2}\par% |
| 99 | +} |
| 100 | + |
| 101 | +\newcommand{\badge}[3]{% |
| 102 | + \noindent\fcolorbox{#1!35}{#1!8}{% |
| 103 | + \begin{minipage}{0.296\linewidth} |
| 104 | + \vspace{0.38em} |
| 105 | + {\large\bfseries\color{#1}#2}\par |
| 106 | + {\normalsize\color{ink}#3} |
| 107 | + \vspace{0.38em} |
| 108 | + \end{minipage}}% |
| 109 | +} |
| 110 | + |
| 111 | +\newcommand{\evidencebox}[3]{% |
| 112 | + \noindent\fcolorbox{#1!38}{#2}{% |
| 113 | + \begin{minipage}{0.94\linewidth} |
| 114 | + \vspace{0.35em} |
| 115 | + #3 |
| 116 | + \vspace{0.35em} |
| 117 | + \end{minipage}}% |
| 118 | +} |
| 119 | + |
| 120 | +\newcommand{\toolchip}[2]{% |
| 121 | + \begingroup |
| 122 | + \setlength{\fboxsep}{0.46em} |
| 123 | + \colorbox{#1!12}{\large\bfseries\color{#1}#2}% |
| 124 | + \endgroup |
| 125 | +} |
| 126 | + |
| 127 | +\newcommand{\workflowrow}[3]{% |
| 128 | + \noindent\fcolorbox{#1!45}{#1!8}{% |
| 129 | + \begin{minipage}{0.94\linewidth} |
| 130 | + \vspace{0.18em} |
| 131 | + {\large\bfseries\color{#1}#2}\quad{\large #3} |
| 132 | + \vspace{0.18em} |
| 133 | + \end{minipage}}\par\vspace{0.18em}% |
| 134 | +} |
| 135 | + |
| 136 | +\newcommand{\practicalstep}[3]{% |
| 137 | + \begin{minipage}[c]{0.44\linewidth} |
| 138 | + \centering |
| 139 | + {\Large\bfseries\color{#1}#2}\par |
| 140 | + {\large\bfseries\color{ink}#3} |
| 141 | + \end{minipage} |
| 142 | +} |
| 143 | + |
| 144 | +\newcommand{\evidencebadge}[3]{% |
| 145 | + \noindent\fcolorbox{#1!35}{#1!7}{% |
| 146 | + \begin{minipage}{0.94\linewidth} |
| 147 | + \vspace{0.22em} |
| 148 | + {\normalsize\bfseries\color{#1}#2}\par |
| 149 | + {\normalsize\color{ink}#3} |
| 150 | + \vspace{0.22em} |
| 151 | + \end{minipage}}\par\vspace{0.18em}% |
| 152 | +} |
| 153 | + |
| 154 | +\begin{document} |
| 155 | +\begin{frame}[t] |
| 156 | +\vspace{0.45cm} |
| 157 | +\begin{columns}[t,totalwidth=0.94\paperwidth] |
| 158 | +\separatorcolumn |
| 159 | + |
| 160 | +\begin{column}{\colwidth} |
| 161 | + \begin{block}{1. Why simulation is the statistical test harness} |
| 162 | + Real biomedical data rarely comes with ground truth. Simulation lets us know what should be recovered, calibrated, or preserved. |
| 163 | + |
| 164 | + \vspace{0.38em} |
| 165 | + \workflowrow{cityured}{Define target}{recovery / calibration / estimand} |
| 166 | + \workflowrow{threadteal}{Generate scenarios}{signal, dimension, hard cases} |
| 167 | + \workflowrow{cityuorange}{Reference first}{readable Python oracle} |
| 168 | + \workflowrow{numba}{Validate}{equivalence / recovery / calibration} |
| 169 | + \workflowrow{jaxberry}{Scale}{measure bottlenecks} |
| 170 | + |
| 171 | + \vspace{0.50em} |
| 172 | + \evidencebox{cityured}{softgold}{% |
| 173 | + \smalllabel{cityumaroon}{Governing rule} |
| 174 | + {\Large\bfseries Same question. Same result. Then faster code.} |
| 175 | + } |
| 176 | + \end{block} |
| 177 | + |
| 178 | + \begin{block}{2. What a statistician has to decide} |
| 179 | + \begin{tabular}{@{}L{0.30\linewidth}L{0.62\linewidth}@{}} |
| 180 | + \toprule |
| 181 | + \textbf{Question} & \textbf{Decision before timing} \\ |
| 182 | + \midrule |
| 183 | + Scientific target & estimator, statistic, null model \\ |
| 184 | + Ground truth & simulated labels, known effect, or nominal type-I rate \\ |
| 185 | + Acceptance criterion & exact match, tolerance, calibration band \\ |
| 186 | + Scale stress & $N$, $d$, $K$, $p$, $R$, workers, batch size \\ |
| 187 | + \bottomrule |
| 188 | + \end{tabular} |
| 189 | + |
| 190 | + \vspace{0.78em} |
| 191 | + \badge{slideblue}{Reference}{readable oracle} |
| 192 | + \hfill |
| 193 | + \badge{threadteal}{Scenario grid}{property / stress / load tests} |
| 194 | + \hfill |
| 195 | + \badge{jaxberry}{Validation gate}{optimize only after checks} |
| 196 | + \end{block} |
| 197 | +\end{column} |
| 198 | + |
| 199 | +\separatorcolumn |
| 200 | + |
| 201 | +\begin{column}{\colwidth} |
| 202 | + \begin{block}{3. Two workloads, two pressure shapes} |
| 203 | + They are simple examples of two common statistical computing patterns. |
| 204 | + |
| 205 | + \vspace{0.28em} |
| 206 | + \hspace*{-0.04\linewidth}\begin{columns}[t,totalwidth=1.08\linewidth] |
| 207 | + \begin{column}{0.49\linewidth} |
| 208 | + \smalllabel{numba}{k-means} |
| 209 | + Iterative model fitting. |
| 210 | + \vspace{0.15em} |
| 211 | + \begin{center} |
| 212 | + \includegraphics[width=\linewidth]{assets/poster_v4_kmeans_iris.png} |
| 213 | + \end{center} |
| 214 | + \end{column} |
| 215 | + \begin{column}{0.49\linewidth} |
| 216 | + \smalllabel{jaxberry}{permutation test} |
| 217 | + Resampling inference. |
| 218 | + \vspace{0.15em} |
| 219 | + \begin{center} |
| 220 | + \includegraphics[width=\linewidth]{assets/poster_v6_permutation_workflow_cropped.png} |
| 221 | + \end{center} |
| 222 | + \end{column} |
| 223 | + \end{columns} |
| 224 | + |
| 225 | + \vspace{0.22em} |
| 226 | + \evidencebox{numba}{softgreen}{% |
| 227 | + \smalllabel{cityumaroon}{Validation checks} |
| 228 | + \textbf{k-means:} same data, initialization, stopping rule; compare inertia and recovery.\par |
| 229 | + \textbf{permutation:} same permutation stream and p-value definition; check null calibration before timing. |
| 230 | + } |
| 231 | + \end{block} |
| 232 | + |
| 233 | + \begin{block}{4. Evidence examples, scoped} |
| 234 | + \begin{tabular}{@{}L{0.34\linewidth}L{0.56\linewidth}@{}} |
| 235 | + \toprule |
| 236 | + \textbf{Claim} & \textbf{Committed evidence} \\ |
| 237 | + \midrule |
| 238 | + k-means equivalence & max relative inertia difference $3.1\times10^{-14}$; tolerance $10^{-8}$ \\ |
| 239 | + permutation equivalence & max p-value difference 0.0; max statistic difference $9.4\times10^{-16}$ \\ |
| 240 | + null behavior & type-I estimate at $\alpha=0.05$ was 0.051 \\ |
| 241 | + A100 boundary & first streamed-reduction win at $n=5{,}000$, $p=10{,}000$, $R=5{,}000$, batch\_R=8,192 \\ |
| 242 | + A100 scope & largest slide-level measured speedup 8.54x \\ |
| 243 | + \bottomrule |
| 244 | + \end{tabular} |
| 245 | + |
| 246 | + \vspace{0.42em} |
| 247 | + \evidencebox{cityuorange}{softgold}{% |
| 248 | + \smalllabel{cityumaroon}{Timing scope} |
| 249 | + speedup = matched CPU matrix baseline / A100 streamed full end-to-end\par |
| 250 | + compile excluded \textperiodcentered{} transfer included \textperiodcentered{} kernel-only excluded |
| 251 | + } |
| 252 | + \end{block} |
| 253 | +\end{column} |
| 254 | + |
| 255 | +\separatorcolumn |
| 256 | + |
| 257 | +\begin{column}{\colwidth} |
| 258 | + \begin{block}{5. Choose the smallest tool} |
| 259 | + \begin{tabular}{@{}L{0.37\linewidth}L{0.51\linewidth}@{}} |
| 260 | + \toprule |
| 261 | + \textbf{Signal} & \textbf{Conservative tool choice} \\ |
| 262 | + \midrule |
| 263 | + not trusted yet & fix method / reference \\ |
| 264 | + hot scalar loop & Numba \\ |
| 265 | + dense algebra & NumPy / BLAS \\ |
| 266 | + shared-array repetition & Python 3.14 / threads \\ |
| 267 | + device-resident batches & JAX / A100 \\ |
| 268 | + giant temporary & rewrite / stream \\ |
| 269 | + \bottomrule |
| 270 | + \end{tabular} |
| 271 | + |
| 272 | + \vspace{0.78em} |
| 273 | + \toolchip{cityured}{trust first} |
| 274 | + \hfill |
| 275 | + \toolchip{numba}{compile loops} |
| 276 | + \hfill |
| 277 | + \toolchip{slideblue}{use algebra} |
| 278 | + \hfill |
| 279 | + \toolchip{jaxberry}{batch for device} |
| 280 | + \end{block} |
| 281 | + |
| 282 | + \begin{block}{6. What to report with every speed claim} |
| 283 | + \begin{itemize} |
| 284 | + \item validation target and acceptance tolerance |
| 285 | + \item environment tier: local, server CPU, or A100 |
| 286 | + \item cold vs warm timing; compile excluded or included |
| 287 | + \item transfer, allocation, and collection included or excluded |
| 288 | + \end{itemize} |
| 289 | + {\footnotesize\color{muted}Unavailable/OOM cells are reported as unavailable.} |
| 290 | + \end{block} |
| 291 | + |
| 292 | + \begin{alertblock}{Takeaway} |
| 293 | + \centering |
| 294 | + \practicalstep{cityured}{1}{Simulate known behavior} |
| 295 | + \hfill |
| 296 | + \practicalstep{threadteal}{2}{Validate the result} |
| 297 | + \vspace{0.55em}\par |
| 298 | + \hfill |
| 299 | + \practicalstep{cityuorange}{3}{Measure the bottleneck} |
| 300 | + \hfill |
| 301 | + \practicalstep{jaxberry}{4}{Choose the smallest tool} |
| 302 | + \vspace{0.55em} |
| 303 | + |
| 304 | + {\Large\bfseries\color{cityumaroon}Clear enough to trust. Fast enough to scale.}\par |
| 305 | + \vspace{0.25em} |
| 306 | + {\normalsize\bfseries\color{ink}github.com/LucaJiang/FastStatisticalModels4Python} |
| 307 | + \end{alertblock} |
| 308 | +\end{column} |
| 309 | + |
| 310 | +\separatorcolumn |
| 311 | +\end{columns} |
| 312 | +\end{frame} |
| 313 | +\end{document} |
0 commit comments