cv
A web rendering of my résumé. The PDF, with the same content, is behind the icon above.
Contact Information
| Name | Chenrui Gao |
| Professional Title | LLM infrastructure — inference & RL post-training systems |
| cg52638@my.utexas.edu | |
| Website | https://cr-gao.github.io |
Professional Summary
M.S. student in Computer Science at UT Austin, B.S.E. in Computer Engineering from the University of Michigan. I work on RL post-training frameworks and inference engines for LLM and diffusion models, upstream in verl-omni (committer), verl, vllm-omni and sglang-omni. Previously robotics research at CMU’s ARCS Lab (VAMP-MR, IROS 2026) and UC Irvine.
Experience
-
2024 - 2025 Pittsburgh, PA (remote)
Research Intern
Carnegie Mellon University, ARCS Lab
Advised by Prof. Jiaoyang Li. Basis of the VAMP-MR publication.
- Built the planner’s throughput-critical core in C++: batched forward-kinematics and collision checks across robot configurations into CPU SIMD lanes with a struct-of-arrays layout, removing motion validation as the bottleneck. 10–100× faster, with millisecond-scale multi-arm motion generation.
- Implemented the CBS-MP multi-robot motion planning framework on top of the vectorized primitives.
-
2025 - 2025 Irvine, CA
Research Intern
University of California, Irvine
Advised by Prof. Sven Koenig. Topological pathfinding with Ray-Cut CBS.
- Proposed a hierarchical approach for constrained multi-agent routing: computing homotopy classes over 2D space to guide Conflict-Based Search (CBS).
Education
-
2026 - 2028 Austin, TX
-
2024 - 2026 Ann Arbor, MI
-
2022 - 2026 Shanghai, China
Publications
-
2026 VAMP-MR: Vector-Accelerated Motion Planning and Execution for Multi-Robot-Arms
IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS) 2026
Philip Huang, Chenrui Gao, Jiaoyang Li
Open Source Projects
-
verl-omni — omni RL post-training (committer with merge access, 17 PRs merged, Jul 2026 – present)
- Implemented On-Policy Distillation for diffusion RL: teacher-anchored KL and flow-matching losses plus a frozen-teacher runtime that runs as a third forward-only worker beside actor and ref, with fit-loop hooks and fail-closed config validation (#300, #325).
- Verified it end to end on SD3.5-Medium with an OCR reward and saw student reward rise from 0.23 to 0.62–0.71, matching the FlowGRPO RL teacher about 5× faster than GRPO while distillation KL fell monotonically from 4.2e-4 to 1.8e-5; covered by 150+ mutation-tested unit tests, GPU smoke runs and a 40-step training-curve reproduction.
- Extended OPD to multi-teacher distillation that routes each sample by a configurable batch column to teachers either co-located with the actor or in standalone per-teacher resource pools scored concurrently (#427), then ported the runtime to the v1 sync trainer (#493).
- Shipped an asynchronous one-step-off teacher scheduler for the v1 separate-async trainer that overlaps teacher scoring of batch k with the actor update of batch k−1: teacher-phase wait fell from 3.6s to 0.02s, two-teacher step time from 22.1s to 19.0s, and single-teacher step time by 16.7–23.7% at full load, while training curves matched inline scheduling within 0.004 PickScore (RFC #498, #495).
- Fixed a Ray rendezvous port collision across worker groups by slicing ports per group, which unblocked standalone multi-teacher pools (#482); two teacher-config corrections, bf16 weights and the inference micro-batch, cut the teacher phase from 7.76s to 3.13s.
- Found and fixed a v1-trainer bug in which co-located reward outputs overwrote the whole batch (#513).
- Adapted verl’s hybrid rollout switching to the diffusion v1 separate-async trainer, lending actor-co-located rollout replicas to generation at step end when the replay buffer runs short and reclaiming them once sampling reaches threshold: on a Wan2.2-TI2V-5B DanceGRPO recipe with 2 hybrid and 1 standalone GPU, median step time fell from 377.9s to 307.8s, throughput rose from 0.340 to 0.414 videos/s, per-GPU throughput beat a 4-GPU standalone baseline by about 8%, and reward was unchanged; also the first video pipeline to run on the v1 trainer (#575).
- Verified the lend–reclaim lifecycle with per-process event probes across 1+1 and 2+2 GPU layouts, including synchronized FSDP two-rank switching, with no hangs or collective errors and 15.85–21.24 GiB of rollout memory freed per reclaim; confirmed training-bound SD3.5-Medium runs make zero lends and match main’s step time.
- Fixed three issues found along the way: moved the lend decision after standalone weight sync to remove a phantom-deficit regression of 9–11% in training-bound runs, replaced the register-then-queue assumption with a sync-then-register path because vLLM-Omni rejects requests while sleeping, and closed a startup race that routed warmup requests to a replica about to be reclaimed and had added 4–6s per step in 7 of 8 runs.
- Consolidated the diffusion OPD end-to-end smoke suite from 7 runs to 2 on the v1 trainer while keeping coverage of both teacher routings, co-located and standalone teacher pools, and inline and one-step-off scheduling, cutting CI groups from 15 to 10 (#588).
- Measured rollout–training numerical consistency across three diffusion pipelines, SD3.5-Medium, Qwen-Image-20B and BAGEL-7B, over 8 experiment arms (RFC #280), and shipped the resulting per-timestep monitoring as default (#291).
- Traced a replay crash and one-directional log-prob drift to a stale BAGEL step-count mapping and fixed it (#279), cutting mean log-prob drift 157× to bf16 noise in line with an analytical prediction.
- Wired the torch profiler into both trainer fit paths and the reward-model rollout server (#252, #256), bringing profiled-step time from 616s to 70s and trace size from 163MB to 32MB.
- Leading bitwise on-policy RL for the Qwen3-Omni thinker, whose trainer and sampler are separate HF and vLLM-Omni implementations: compared them op by op and traced every log-prob difference to RMSNorm cast order, fused residual-norm, RoPE, attention kernels and MoE routing, with weights, GEMMs and the log-prob formula already identical (RFC #637).
- Split the fix by owner into an opt-in HF-numerics mode in vLLM-Omni built from custom ops that work under torch.compile and CUDA graphs (vllm-omni #8186), a batch-invariant mode for verl’s FSDP engine (verl #8026) and a raw log-prob mismatch metric (verl #8025): the full 48-layer MoE model reached 0 mismatched tokens over two closed-loop RL steps with expert weights frozen, against 818 and 468 without it, at a 41% rollout-throughput cost, so the mode is documented as RL-only; in review.
-
verl — LLM RL post-training (2 PRs merged, Sep 2026 – present)
- Implemented score centering, an additive, hyperparameter-free correction for training–inference mismatch, in verl’s policy-gradient loss: the vLLM rollout stores the sampler’s top-128 log-probs per token, the tail is modeled from the trainer’s tail rescaled to the sampler’s tail mass, and a chunked, vocab-parallel autograd function applies the correction across all three trainer modes (#8010).
- Reproduced the paper’s fp8-sampler experiment on Qwen3-0.6B over 400 steps with one seed per arm: plain policy gradient collapsed at step 72 and token-level importance sampling peaked at 0.52 held-out accuracy before falling to 0.31, while score centering stayed stable and ended at 0.56, matching the paper’s ordering.
- Landed a reviewer-proposed flat log-prob container during review, added a bitwise-equality test against vLLM’s default path and remeasured on GPU: step time fell from 19.2–29.4s to 14.1–15.9s; the same change kept the new request field away from SGLang and TensorRT-LLM backends and preserved top-k heads across partial-rollout resume so both async modes work.
- Fixed an fp8 weight-sync crash on tied-embedding models, where the quantized path skipped the alias filter and failed on the first sync, which unblocked the fp8 experiments above (#8064).
-
vllm-omni — omni-model serving: engine core & diffusion acceleration (11 PRs merged, Aug 2026 – present)
- Engine core: added a scheduler-level keep-mode pause to diffusion stages so a busy replica can be quiesced for sleep or weight sync without aborting finished work: new batches stop at the next batch boundary and an all-rank device sync acknowledges the pause, matching vLLM’s engine semantics; median pause latency was about 0.1s, verified on single- and multi-process backends and under Ulysses SP with an injected rank failure (#7685).
- Engine core: fixed wake-up and sleep calls that reported success when the worker had failed, which reopened admission on an OOM’d GPU and broke the next request; failures now raise, the recorded state stays consistent, and a retry after memory frees recovers generation (#7811).
- Engine core: fixed an orchestrator hang after a diffusion subprocess died, caused by a blocking send to a socket with no peer: with one of two replicas killed under 32 concurrent requests, hangs fell from 2 of 12 runs to 0, and eviction now finishes within a second instead of stalling shutdown (#7812).
- Engine core: made prefix caching safe under preemption in multi-stage omni pipelines by tracking a per-request delivery boundary that fills gaps and drops duplicates when a request resumes with a different cache hit: under forced preemption, the speech WER increase fell from +0.104 to +0.014, keeping the cache usable where it cuts time to first audio from 16.95s to 4.02s (#8034, in progress).
- Engine core: fixed a FlashAttention cross-attention key-padding bug that silently mixed samples within a batch and affected every padded cross-attention diffusion model, raising real-weight output cosine from 0.9157 to 0.99996 (#5866).
- Engine core: built a shadow-wrapper merge-on-load fast path for diffusion LoRA with fp32 delta fold-in and exact unload, bringing LoRA generation overhead from +122% to +4.7% while holding the PPO ratio at 1±1e-6 (#5059, in review).
- Acceleration: derived a sequence-parallel scheme for the ReLU linear attention in SANA-Video, where Ulysses and Ring do not apply: because the KV state sums over the sequence dimension, SP needs only one all-reduce of a single d×d state, so communication is O(d²) at any sequence length; measured 1.80× at SP2 and 3.57× at SP2+CFG2 on 4×A800 (#5940); now extending it to SANA-Video 2.0, which reaches 1.90× end to end at SP2 on 2×A800 with the SP1 path bit-exact, alongside TP/CFG parallelism and CUDA-graph replay bit-exact against eager (#8028, in progress).
- Acceleration: added tensor-parallel and CFG-parallel execution, measuring TP2 1.52×, CFG2 2.04× and TP2×CFG2 3.02×, with a 32-case correctness matrix and TP1 bit-exact against baseline (#5861).
- Acceleration: added Cache-DiT caching with CPU offload, 1.56× faster with peak GPU memory down 7.3 GiB (#5882).
- Acceleration: applied regional torch.compile to the MAGI-2 Preview native transformer, splitting each layer into compilable regions around the eager packed-attention and MoE-routing kernels and emulating eager bf16 rounding with precision casts; denoising step fell from 1.93s to 1.48s at SP4/272p on A800 with per-GPU peak memory down 1.1–2.2 GiB, and compiled-vs-eager differences sit at kernel reduction-order level, at a one-time compile cost of about 38s (#7174).
-
sglang-omni — Qwen3-Omni LLM serving performance (1 PR merged, Aug 2026)
- Rewrote the multimodal embedding merge on the thinker’s LLM prefill path from a per-request Python loop into one batched GPU scatter (#1161): device-to-host syncs fell from 96 to 0 per batch and the merge stage ran 2.1–4.1× faster, which cleared the path to prefill CUDA graphs.
- Verified the rewrite three ways: 6000-seed differential fuzzing with element-wise identical output, byte-identical end-to-end serving logits, and an H800 performance matrix.
Projects
-
LLM Training Systems from Scratch (Stanford CS336 Assignments)
PyTorch, Triton, NCCL · 2026
- Wrote FSDP from scratch for distributed training: backward-hook reduce-scatter, on-demand all-gather, fp32 master shards and a round-robin sharded optimizer.
- Wrote a FlashAttention Triton kernel and a KV cache inside a Transformer LM built from the ground up with RoPE and a BPE tokenizer.
Teaching
- Teaching Assistant, Intro to Computers & Programming (Prof. Jigang Wu), SJTU, Fall 2023
Honors and Awards
-
2025 Dean's Honor List
University of Michigan
Dec 2024 and May 2025
-
2023 John Wu and Jane Sun Sunshine Scholarship
Nov 2023
Skills
Languages: C++, Python, Triton, MATLAB
ML Systems: PyTorch (torch.distributed, torch.compile), NCCL, Ray, vLLM, SGLang, verl, FSDP/TP/SP, LoRA, FlashAttention, Hydra, torch profiler
Systems & Tools: Linux, Git/GitHub OSS workflow, CUDA 13/cu130, ROS, OpenCV, NumPy, Pandas
Coursework: UT CS 395T (Datacenter/Cloud Co-design, ML for Systems), Stanford CS336, MIT 6.S081 (OS)