Projects
-
sft-crm-agent
A structured business workflow can be a good fit for a small specialized model. I adapted Qwen2.5-1.5B for an auto-parts business: extract message details into a CRM record, choose the next action, and draft a reply for approval. The model can run locally.
I wrote the trainer and evaluator, then fine-tuned on 300 synthetic examples. On 330 held-out messages, it passed 97% end to end, versus 84.8% for the best larger-model baseline I tested. It invented a field on 0.3% of messages. I was surprised by how far careful task design and SFT could take a small model, including teaching it when to leave information unstated.
Fine-tuning · Task-specific evaluation -
rl-lisp-python
Can a reward steer a model toward an unusual programming style? I wrote a JAX training loop to reward a small code model for solving problems with deeply nested, Lisp-like Python expressions. Correctness was a hard gate, but the model still learned to inflate the style score with unnecessary nesting. Better average scores also hid lost coverage across tasks.
The lesson was to bound the behavior being rewarded, even when the answers are correct. GRPO also produced no learning signal from all-correct or all-wrong groups. I incorporated DAPO’s asymmetric clipping to give exploration more room; the stalled groups made the case for its dynamic sampling. Reward design and useful training signal are separate problems.
Reinforcement learning · Reward design -
thrml-bench
Following the reward-design experiment, I wanted a grader that could support both evaluation and future RL in an unfamiliar domain. thrml-bench tests models writing probabilistic-computing programs. A correct sampler can produce an unusual result, while a wrong program can produce convincing statistics. Checking the output alone is not enough.
I built layered checks for structure, reproducible execution, and statistical agreement with exact answers. Shared verifiers and generated instances make it possible to expand task families and keep testing fresh cases. Calibrating the checks meant testing the grader itself against correct samplers and deliberately broken submissions.
The benchmark also exposed a silent failure in the underlying library. Using development failures to improve a coding skill raised held-out passes from 11/32 to 18/32 in a small two-model study. The environment, instructions, and library behavior all shape what a benchmark score means.
Evaluation · Probabilistic computing · In progress -
gpt-cpp-cuda
I want a working understanding of the machinery behind an LLM, from gradients to GPU memory. I’m building a GPT training and inference engine in C++ and CUDA without an ML framework, writing forward and backward kernels and checking them against reference calculations.
Optimizing matrix multiplication against cuBLAS makes the hardware tradeoffs concrete. The point is to be able to reason below the framework when something is slow, expensive, or wrong, and to get comfortable learning the lower-level tools needed to investigate it.
C++ · CUDA · In progress
Also explored
- ml-jax-pytorch
Mixture-of-Experts routing, quantization, and measuring when smaller or sparser actually helps.
- quantum-anomaly-detection
Grover’s search for financial outliers, with a look at noise and simulation limits.