Hi, my name is

Stylianos Zacharioudakis

Machine Learning Engineer

I build ML systems and I measure them honestly.

For four years I have kept the platform of a 480-doctor medical association running in production, while running my own ML experiments — including the ones that proved me wrong.

  • 480doctors on a system I keep in production
  • BSc CSNKUA · expected Jun 2026
  • Athens, Greece → Toronto, CanadaCanadian work-authorized
/about

About

I'm a final-year Computer Science student at the National and Kapodistrian University of Athens — BSc expected June 2026. For the last four years I've also been the Head Engineer of AsklepiosMed, the platform of the Paphos Medical Association: a registry of 480 doctors that I own end to end, from the Postgres schema to the systemd unit that restarts it.

Alongside that production work I run my own ML experiments and hold them to the bar I'd expect from a lab — fixed seeds, matched-budget controls, and results reported even when they contradict my hypothesis. That's the combination I care about: a system real people depend on, and experiments rigorous enough to prove me wrong.

Every number on this site links to the exact committed artifact that produced it. I'd rather show a modest measured result with its receipt than a big one I can't defend.

Athens, Greece → Toronto, CanadaCanadian work-authorized

What I work with

ML / Modelling
  • PyTorch
  • HuggingFace
  • scikit-learn
  • LightGBM
  • GNN
  • SimCLR
  • CLIP
  • LoRA / PEFT
LLM inference
  • vLLM
  • EAGLE-3
  • Speculative decoding
  • Z3 / SMT
Systems / MLOps
  • Docker
  • GitHub Actions
  • FastAPI
  • gRPC
  • Prometheus
  • Grafana
  • Redis
  • Kafka
  • PostgreSQL
Hardware / Languages
  • A100 80GB
  • CUDA
  • Python
  • SQL
  • TypeScript
Languages
  • Greek (native)
  • English (C2)
Stelios Zacharioudakis
Stelios Zacharioudakis — Athens, Greece
/production

In production

ProductionHead Engineer · Jun 2022 – present

AsklepiosMed — the platform of the Paphos Medical Association

A 480-doctor medical association runs on software I own end to end — from the Postgres schema to the systemd unit that restarts it.

480 doctors
Doctor registry
docs/PROJECT_OVERVIEW.md:5
153
Test files in the monorepo
apps/
Express · PostgreSQL · React 18 · iOS
Stack
apps/api/package.json · apps/web/package.json

Digital member ID from Stripe into Apple Wallet, automating a previously manual process; a scripted production deployment (systemd + Nginx + Let’s Encrypt with atomic build-swap and rollback). Registry of 480 doctors — not a daily-active-user count.

  • Express
  • PostgreSQL
  • React 18
  • iOS
  • Stripe
  • Apple Wallet
  • systemd
  • Nginx
asklepiosmed.orgPrivate — client-owned (holds a member registry)
ProductionFull-Stack Engineer · Jan 2025 – Present

Medihyal Clinic

Build and run the clinic’s booking and operations web app.

  • Ship a Next.js + Supabase application for reservations and clinic operations.
  • Automate manual reorder review with a Groq-hosted LLM in the operations flow.
  • Next.js
  • Supabase
  • TypeScript
  • Groq LLM

Private — client-owned

/research

Research

Four projects. Each one is reported with the result that argues against it — a control that ties, a baseline that wins, a method that came out slower. The evidence for every number is one click away.

BSc thesis · NKUAreproduces Song et al., ICLR 2022

Score-Based Diffusion Models for Undersampled MRI Reconstruction

Reimplemented an ICLR 2022 method from JAX in PyTorch to within 0.15 dB of the published results — then found the failure mode the original work did not characterise, and a 3-minute fine-tune that repairs it.

Reproduces Song et al., ICLR 2022 (arXiv:2111.08005) — a PyTorch reimplementation of a JAX-only method, with original uncertainty-quantification and failure-mode extensions on top. The pretrained NCSN++ prior is the original authors’; it was converted, not retrained.

≤ 0.15 dBReproduction of published PSNR at 4× / 8× / 24× (n = 256 slices)REPRODUCTION.md
+1.4 to +2.0 dBMMSE averaging gain over a single sample (N = 20)REPRODUCTION.md
+5.1 / +7.1 / +6.6 dBFine-tune repair on 100% of 48 images (p = 7e-15)REPRODUCTION.md
473 / 473 tensorsFlax → PyTorch weight conversionREPRODUCTION.md

Reported as a null resultUncertainty-guided k-space acquisition tied with random selection (−0.06 ± 0.20 dB SEM, winning 31% of 32 slices). An encouraging n = 4 preliminary result turned out to be noise — reported as a null.

  • PyTorch
  • Diffusion / VE-SDE
  • Inverse problems
  • Uncertainty quantification
  • Medical imaging
  • A100
Read the full write-upRepository — publishing soon
Reproduction of Table 1 (Song et al., ICLR 2022) — n = 256 slices
ROurs (PSNR / SSIM)Paper (PSNR / SSIM)Zero-filled (PSNR / SSIM)
40.03 / 0.96739.91 / 0.96528.64 / 0.759
37.75 / 0.96037.63 / 0.95826.28 / 0.748
24×29.57 / 0.88129.42 / 0.88020.79 / 0.515

Ours vs. the published values — within 0.15 dB PSNR and 0.002 SSIM at every acceleration.

8× accelerated brain-MRI reconstruction, three columns: the blurry zero-filled input on the left, the score-based reconstruction in the middle, and the ground-truth scan on the right, each annotated with its PSNR and SSIM.
8× reconstruction — zero-filled input → reconstruction → ground truth (thesis Fig. 5.1).
Independent researchTrustQueryNet

TrustQueryNet — trustworthy classification under label noise

A 5-seed study on medical images where my own matched-budget control beat the method — and I published the table.

0.8350 ± 0.0059HAM10000 accuracy (5 seeds)random-repair control: 0.8319 ± 0.0051 — statistically a tieartifacts/paper_tables/noisy_anchor/ablation_table.json
0.0445 ± 0.0090Calibration error (ECE)artifacts/paper_tables/noisy_anchor/ablation_table.json
0.5692 ± 0.0145External shift, ISIC-2019 accuracyECE rises to 0.20 — distribution shift is the real obstacle, and it was measuredartifacts/paper_tables/external_main/ablation_table.csv

What didn’t workThe matched-budget random-repair control matched the method within noise. The manuscript states plainly that the internal comparison does not support a "repair wins everywhere" story.

  • PyTorch
  • ConvNeXt-Tiny
  • Label noise
  • Calibration
  • Selective prediction
CodeNo live demo by design: a skin-image endpoint open to the internet would hand strangers a silent "medical" answer. The committed reliability diagram, risk–coverage curves and ablation table stand in for it.
Independent researchllm-smt-verifiable-reasoning

Counterexample-Guided Verifiable Reasoning — LLM + SMT solver in the loop

An LLM proposes, Z3 disposes: conflict-directed search over SMT counterexamples, evaluated against compute-matched retry baselines.

7,500Evaluation runs (500 problems × 3 seeds × 5 arms)data/linear/problems.jsonl + scripts/run_all.sh
5Ablation arms compared, one-shot → conflict-directedscripts/run_all.sh
  • LLM
  • Z3 / SMT
  • Verification
  • Qwen3-30B-A3B
  • A100 80GB
CodeA Z3-only verifier demo (no live LLM generation, so no unbounded per-click cost) is planned; the repo already carries the full evaluation harness.

Speculative decoding on an A100 — what actually got faster

The headline is 1.39×. The finding worth reading is that the other method I tested was three times slower.

1.387×Aggregate latency speedup — vLLM + EAGLE-3, Qwen3-8B, A100 80 GBpaper/data/phase3_results.csv
up to 1.46× latencyPeak on math-reasoning promptsone category; a latency speedup, not throughputextracted_metrics.json:147
110.93 tok/sGlobal throughputextracted_metrics.json:146

What didn’t workTransformers-assisted decoding came out ~3× slower than the baseline. The README says so outright; the study reports the confound rather than hiding it.

  • vLLM
  • EAGLE-3
  • Speculative decoding
  • Qwen3-8B
  • A100 80GB
CodeLive decoding needs 80 GB of VRAM; the site shows a dashboard built from the committed extracted_metrics.json plus the notebook as read-only HTML.
/engineering

Engineering

Systems work, framed as systems work: an online detector that retrains itself with zero labels, and a redaction studio. No ML accuracy claim appears where none was measured.

Systems / ML

MTA-Scan — online anomaly detection on live transit feeds

Seven live GTFS-Realtime feeds, an online model that retrains itself with zero labels, and a published table where it loses on false-alarm rate.

1.00Recall@20 on the replay set (216 rows, 16 positives, 3 incidents)a sanity evaluation, not a benchmark — the set size is stated beside the numberdocs/generated/replay/metrics.json
6.67 minAverage lead timedocs/generated/replay/metrics.json

What didn’t workOn false-alarm rate the online model loses to the simple baselines. That is in the same published table.

  • River
  • HalfSpaceTrees
  • ADWIN
  • TimescaleDB
  • Next.js
  • MapLibre

Also on GitHub

  • limitforge-rls92.57% line coverage (536 / 579) behind a real CI gate at 90%.coverage.xml · .github/workflows/ci.yml:75
  • graph-fraud-command-centerReproducible local load test: 457 req/s, p95 3.27 ms, 2,500 / 2,500 requests, 0 errors — single container, in-memory graph.benchmarks/benchmark_2026-02-28.json
  • aml-graph-investigatorTopology-feature AML scoring on a synthetic graph (ROC-AUC 0.87) — 14 NetworkX features.README.md
/education

Education

Degree · in progressOct 2022 – expected Jun 2026

BSc Computer Science

National and Kapodistrian University of Athens (NKUA)Athens, Greece

expected Jun 2026

Relevant coursework

  • Deep Learning
  • Reinforcement Learning
  • Algorithms & Complexity
  • Databases
  • Operating Systems
Coursework

EuroSAT transfer-learning benchmark

A 7-paradigm comparison on satellite imagery: LoRA matches full fine-tuning at 0.36% of the trainable parameters and 3.7× faster.

98.37%Best overall — EfficientNet-B0, full fine-tuneeurosat_benchmark.ipynb (cell 100)
98.22%LoRA — ViT-B/16, r = 8eurosat_benchmark.ipynb (cell 94)

What didn’t workSimCLR burned 490 minutes of A100 time to reach 89.0% — roughly 133× the compute for a worse result than a short transfer-learning run.

  • PyTorch
  • LoRA / PEFT
  • ViT-B/16
  • CLIP
  • SimCLR
  • Transfer learning
/contact

Get in touch

I’m finishing my BSc Computer Science at NKUA (expected Jun 2026) and looking for junior ML / MLE roles. If you’re hiring, want to compare notes on a result, or just want to talk shop, my inbox is open — I read every message.

Toronto-boundCanadian work-authorized