ML systems engineer · GPU performance · LLM inference · AI agents whose work can be checked
Research Scientist at the Research Foundation for SUNY · San Francisco Bay Area
I make large models train and serve faster, and I build AI agents whose work can be checked.
- 🔬 Now: Research Scientist at the Research Foundation for SUNY. I profile and tune LLM fine-tuning on NVIDIA B200 (Nsight, Triton and CUDA kernels, FSDP, QLoRA) and build deep-learning models for genomics.
- 🏗️ Before: ML engineer at A5G Networks (5G traffic forecasting, Databricks and Delta Lake pipelines) and at Cloudphysician (real-time ICU alerting on Kafka, PySpark and AWS); data engineer at InxiteOut.
- 🧪 On weekends: hackathon builds on agent security, computer use, video agents, rare-disease diagnosis and cryo-EM.
- 📄 7 peer-reviewed papers and 3 patents, listed on Google Scholar.
|
Zuzu: call a number, answer plain questions in your own language, and six agents on BAND fill in a USCIS form, with every value taken from a deterministic tool. Built with Gar Walsh.
🏆 Best Use of BAND and Best Use of ElevenLabs, Prompt Driven Hackathon 2026 |
|
|
CryoClear: a real-time cryo-EM junk-triage copilot. It picks particles, flags junk as micrographs stream in, and learns from a scientist's corrections. I built the picking engine, the junk classifier and the active-learning UI.
QBI Hackathon 2026, UCSF · open source (MIT) |
|
|
Diageno: a rare-disease diagnostic recommendation prototype. From phenotype and genetic data it ranks a differential diagnosis, shows the evidence and uncertainty, and suggests the most useful next question.
Harvard Rare Disease Hackathon 2026 · team of four |
- Dao-AILab/flash-attention#3102:
mha_fwd_kvcachenow checks the length ofcache_batch_idx, so a short index raises an error instead of reading past its end (fixes #3097). Merged. The same check for FA3 is in review as #3153. - smg-project/smg#5353: Harmony chat prompts now put a leading system message in the developer message and leave out an empty one, as vLLM does (#2830). Merged. #5354, in review, makes
least_loadcount its own picks on workers that send no load report (fixes #4602). - Slicer/Slicer#9513: removes redundant variables in the GrowCut and Terminologies logic (fixes #9462 and #9463). Merged. #9515, in review, adds a test for the slice view N-layer API (#8294).
- LegalQuants/lq-ai#783: constrains the Teams install-only
id_tokenflow (D-03). Merged. - ai-dynamo/dynamo: five bugs I found in Dynamo's KV routing, runtime and request handling, each fixed in its own PR with a test that fails on main: binary extra keys in KV events (#18473), repeated block events in the standalone indexer (#18476), the QUIC response plane during a graceful drain (#18477), a 503 instead of a 500 when no worker is eligible (#18479), and stopping the worker once every choice has finished (#18481). In review.
- triton-lang/triton: bugs on Blackwell from my B200 test sweeps. Fixes in review: wrong
tl.dotresults for a transposed operand above 256 (#12672) and 8-bit dots with 8-element rows that fail to compile (#12674). Also reported: #12675 and #12678. Two earlier sweep bugs, #12606 and #12607, were fixed upstream. - linkedin/Liger-Kernel: three kernel fixes from a B200 sweep against PyTorch references: the DyT forward launch above 65535 rows (#1607), GroupNorm backward kept in fp32 so fp16 gradients stop turning into NaN (#1608), and the column stride in the fused KL and JSD gradients (#1613). In review.
- NVIDIA/TransformerEngine#3790: adds
export_components()to MXFP8 tensors, returning the FP8 values and their compact scales (#3644). In review. - llm-d/llm-d-benchmark#2149: adds demand p95 and an optional demand series to the sizing report (#2134). In review.
- Also in review: nf-core/modules#13483 keeps trailing zeros in software versions, and BristolSTA/uobtheatre-api#1044 stores emails in lower case and matches them ignoring case (fixes #834).
- NVIDIA-NeMo/Curator#2285: showed that the fuzzy-dedup tuning guidance for
num_bandsandminhashes_per_bandwas inverted under MinHash-LSH banding. The maintainers fixed the docs in #2287. - spack/spack-packages#7083: makes charliecloud 0.44 and later require squashfuse 0.4.0 or newer (fixes #5400). In review.
- promptdriven/pdd#2341: context limits are handled as a hard cutoff and provider prompt caching is never used; with an RFC on serving assumptions in #2342.
- COMPAS-Lab/cloud-manager: 15 merged pull requests to a research lab's cloud console, a fork of Linode Cloud Manager (TypeScript, React).
- high-level-design: system design notes and case studies, including ML and AI-infrastructure designs with capacity estimates
- low-level-design: 48 runnable object-oriented designs, from a parking lot to an inference server, a KV-cache pool and a GPU memory allocator
- leetcode: 935 solutions in Python, C++, Java, C, SQL and bash
- Study path: my B.Tech coursework repos, arranged as a curriculum
![]() Dune Buggy Sandbox |
![]() Orbital Defense |
![]() Beam Bender |
![]() Still Life Painter |
qgis-geospatial-projects: six QGIS and Python analyses (urban heat island, flood risk, crop health, healthcare access, forest change and solar siting). Each has QGIS layer styles, a Python pipeline and a Streamlit app, and the maps are live on the project site.
![]() Urban heat island |
![]() Flood risk |
![]() Crop health |
![]() Forest change |
Animated emoji: Microsoft Fluent Emoji (MIT).

















