<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on jdcsen</title><link>https://jdcsen.com/projects/</link><description>Recent content in Projects on jdcsen</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 01 Jan 1970 00:33:46 +0000</lastBuildDate><atom:link href="https://jdcsen.com/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>Self-Hosted Multi-Modal Inference on One GPU</title><link>https://jdcsen.com/projects/llama-swap-stack/</link><pubDate>Thu, 01 Jan 1970 00:33:46 +0000</pubDate><guid>https://jdcsen.com/projects/llama-swap-stack/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;One OpenAI- and Anthropic-compatible endpoint fronting 36 model keys on a single RTX 5090 (32 GB): 14 LLM keys (Qwen3 coder, thinking and instruct tiers, a vision model, a captioner), 4 Whisper variants, 11 image generators (Flux, SDXL, Chroma, Qwen-Image), 4 Wan video models and 3 GPU feature-extraction sidecars.&lt;/li&gt;&#10;&lt;li&gt;Built on &lt;a href="https://github.com/mostlygeek/llama-swap" target="_blank"&gt;llama-swap&lt;/a&gt;, a Go router that starts and stops upstream inference processes on demand. Anything that speaks HTTP can be an upstream, which is what lets llama.cpp, whisper.cpp, a &lt;a href="https://jdcsen.com/projects/sdcpp-identity-server/"&gt;patched stable-diffusion.cpp&lt;/a&gt; and three PyTorch services share one card behind one API.&lt;/li&gt;&#10;&lt;li&gt;Co-residency is declared with set-algebra rules and eviction costs, but llama-swap does not measure VRAM, so I did: a sweep script that measures resident and peak footprints per model and per combination, which turned up a 6.7 GB transient VAE-decode spike as the binding constraint.&lt;/li&gt;&#10;&lt;li&gt;Every workhorse LLM has two keys: an exclusive full-context key and a co-resident &amp;ldquo;lite&amp;rdquo; twin, so a 256k-context 30B model and an image generator never fight for the card.&lt;/li&gt;&#10;&lt;li&gt;Heavy upstreams run as sibling containers launched on demand, so the router image rebuilds in seconds instead of recompiling sd-server and three multi-gigabyte venvs.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>stable-diffusion.cpp: Identity Conditioning in sd-server</title><link>https://jdcsen.com/projects/sdcpp-identity-server/</link><pubDate>Thu, 01 Jan 1970 00:33:46 +0000</pubDate><guid>https://jdcsen.com/projects/sdcpp-identity-server/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Fork of &lt;a href="https://github.com/leejet/stable-diffusion.cpp" target="_blank"&gt;stable-diffusion.cpp&lt;/a&gt; adding per-request reference-image identity conditioning (PhotoMaker v2 on SDXL bases, PuLID on Flux) to the &lt;code&gt;sd-server&lt;/code&gt; HTTP surface. Upstream registered the flags but only the CLI ever populated them.&lt;/li&gt;&#10;&lt;li&gt;Eleven commits, about 1,900 lines added over 19 files. Roughly 89% lives in &lt;code&gt;examples/server/&lt;/code&gt;; the core engine changes total 87 lines. &lt;code&gt;sd-cli&lt;/code&gt; and the core library stay Python-free.&lt;/li&gt;&#10;&lt;li&gt;Reference-image encoding runs in-process through an embedded CPython interpreter (pybind11), behind two CMake flags that default to OFF so the vanilla build is unchanged.&lt;/li&gt;&#10;&lt;li&gt;Identity embeddings can be extracted once and re-injected: the round trip reproduces the image-path generation byte for byte at a fixed seed.&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;No identity images&amp;rdquo; is proven to mean &amp;ldquo;no effect&amp;rdquo;: generations are md5-identical to the bare base model.&lt;/li&gt;&#10;&lt;li&gt;One upstream-worthy bug fix in core: an off-by-one in &lt;code&gt;clip_preprocess&lt;/code&gt; center-cropping that crashed any CLIP-vision path on odd input dimensions.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Paralinguistic Signals from a Speech LLM</title><link>https://jdcsen.com/projects/paralinguistic-features/</link><pubDate>Thu, 01 Jan 1970 00:33:45 +0000</pubDate><guid>https://jdcsen.com/projects/paralinguistic-features/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;NVIDIA Triton Python backend fronting a vLLM-served speech LLM, taken from prototype to production.&lt;/li&gt;&#10;&lt;li&gt;Derives confidence, sentiment and spoken-language ID from the model&amp;rsquo;s own token-level outputs. No additional models to train or serve.&lt;/li&gt;&#10;&lt;li&gt;Orchestrates per-signal LLM queries over gRPC alongside ONNX Runtime inference for confidence calibration and forced alignment.&lt;/li&gt;&#10;&lt;li&gt;p50 latency of approximately 5 to 10 ms per signal.&lt;/li&gt;&#10;&lt;li&gt;Technical lead for a three-engineer team. A later &lt;a href="https://jdcsen.com/projects/triton-throughput-refactor/"&gt;concurrency refactor&lt;/a&gt; took sustained throughput from roughly 8 to 80 requests per second.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>RAG Personalization for Speech Recognition</title><link>https://jdcsen.com/projects/rag-asr-personalization/</link><pubDate>Thu, 01 Jan 1970 00:33:45 +0000</pubDate><guid>https://jdcsen.com/projects/rag-asr-personalization/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Retrieval-augmented personalization for the same speech LLM behind the &lt;a href="https://jdcsen.com/projects/paralinguistic-features/"&gt;paralinguistic backend&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;A user&amp;rsquo;s contacts, device names and music library are retrieved from their catalogs with approximate-nearest-neighbor search.&lt;/li&gt;&#10;&lt;li&gt;Retrieved entries are injected into the LLM&amp;rsquo;s prefill context, so the model transcribes the user&amp;rsquo;s own vocabulary instead of guessing at it.&lt;/li&gt;&#10;&lt;li&gt;The original design needed three round trips through the LLM per request. Working with the applied science team, we replaced LLM-generated query embeddings with an index keyed on voice features, eliminating one of them, a roughly 20 ms LLM round trip per request.&lt;/li&gt;&#10;&lt;li&gt;Keying retrieval on voice features also decoupled the lookup from the LLM&amp;rsquo;s context request, so retrieval runs speculatively, in parallel with the model, instead of waiting on it.&lt;/li&gt;&#10;&lt;li&gt;Led the effort end to end, from retrieval design to serving.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Triton Backend Throughput Refactor</title><link>https://jdcsen.com/projects/triton-throughput-refactor/</link><pubDate>Thu, 01 Jan 1970 00:33:45 +0000</pubDate><guid>https://jdcsen.com/projects/triton-throughput-refactor/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Load testing showed latency growing linearly with concurrency: the server was serializing, capping throughput at about 8 requests per second.&lt;/li&gt;&#10;&lt;li&gt;Three structural fixes: parallelize independent ONNX inference calls, replace a reference-counted five-thread dispatcher with single-threaded cooperative multitasking, and run several independent backend instances.&lt;/li&gt;&#10;&lt;li&gt;Latency curve went from linear to roughly square-root in concurrency; sustained throughput reached 64 to 80 requests per second on the same hardware, an 8 to 10x improvement.&lt;/li&gt;&#10;&lt;li&gt;Single-request latency barely moved (about 90 to 70 ms). This was a contention fix, not a per-request speedup.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>gRPC Bidirectional Streaming for a C++ Node-Graph Framework</title><link>https://jdcsen.com/projects/grpc-pipe-wrapper/</link><pubDate>Thu, 01 Jan 1970 00:33:44 +0000</pubDate><guid>https://jdcsen.com/projects/grpc-pipe-wrapper/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Nova Sonic needed the speech framework&amp;rsquo;s pipelines delivered as a containerized gRPC service: audio and system prompts streaming in, inference requests streaming out. The team&amp;rsquo;s code had only ever been called through JNI.&lt;/li&gt;&#10;&lt;li&gt;Mapped gRPC C++&amp;rsquo;s bidirectional-streaming reactor onto the framework&amp;rsquo;s pipe abstraction once, as a reusable layer covering session setup and teardown, signal handling, graceful error handling and logging.&lt;/li&gt;&#10;&lt;li&gt;A new service needs under 300 lines of integration code: which pipe input receives request messages, and which pipe outputs become response messages. Adopted org-wide as the standard way to deploy a pipeline.&lt;/li&gt;&#10;&lt;li&gt;Established Protobuf and gRPC generated code as first-class CMake libraries in the framework&amp;rsquo;s build, so the same generated types are consumed by the pipeline&amp;rsquo;s nodes and by the server without duplicate-symbol conflicts.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>One-Command Nova Sonic Dev Environments</title><link>https://jdcsen.com/projects/nova-sonic-dev-provisioning/</link><pubDate>Thu, 01 Jan 1970 00:33:44 +0000</pubDate><guid>https://jdcsen.com/projects/nova-sonic-dev-provisioning/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Python provisioning system that stands up the complete Nova Sonic inference stack on one developer machine.&lt;/li&gt;&#10;&lt;li&gt;Deploys several Triton model containers plus the C++ node-graph orchestrator, wired together and ready to take speech-to-speech traffic.&lt;/li&gt;&#10;&lt;li&gt;Took a fifteen-person team from sharing a couple of hand-built demo environments to every engineer having their own.&lt;/li&gt;&#10;&lt;li&gt;Same pattern as &lt;a href="https://jdcsen.com/projects/l3dockerize/"&gt;L3Dockerize&lt;/a&gt;: make the right environment the cheap one.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Static Service Registry for a C++ Node-Graph Framework</title><link>https://jdcsen.com/projects/static-service-registry/</link><pubDate>Thu, 01 Jan 1970 00:33:43 +0000</pubDate><guid>https://jdcsen.com/projects/static-service-registry/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Nodes in the C++ stream-processing framework behind Nova Sonic register themselves in a global registry through static initialization. No central list to edit, no explicit dependency from tools on the nodes they might load.&lt;/li&gt;&#10;&lt;li&gt;Registry is a thread-safe, function-local static constructed on first use, so registration is safe regardless of static initialization order across translation units.&lt;/li&gt;&#10;&lt;li&gt;Registration works by linking a node library or by &lt;code&gt;LD_PRELOAD&lt;/code&gt;ing it. The development CLI can assemble a graph from a JSON definition using nodes it was never compiled against.&lt;/li&gt;&#10;&lt;li&gt;Pulled double duty as a dependency-inversion mechanism: consumers depend on the node interface, not on implementing libraries. Adopted across the organization and later picked up for embedded speech processing.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>One Build for Cloud and Device: Consolidating a 500k-Line C++ Engine</title><link>https://jdcsen.com/projects/build-system-consolidation/</link><pubDate>Thu, 01 Jan 1970 00:33:42 +0000</pubDate><guid>https://jdcsen.com/projects/build-system-consolidation/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;The legacy ASR engine, roughly 500k lines of C++, was built by its owners with GCC and plain CMake for the cloud. The on-device team consumed it as a library across about 7 ARM toolchains from the Android NDK plus 4 x86 gcc/clang variants, through a Conan-based build layer.&lt;/li&gt;&#10;&lt;li&gt;Before: on-device releases were hand-curated snapshots of the upstream engine, maintained in forks of every ASR package and re-merged periodically. Each release took days at minimum and often weeks, as toolchain-specific breakage surfaced and needed patches.&lt;/li&gt;&#10;&lt;li&gt;Fix: point all engine code at a single virtual build-system package. In the cloud dependency universe it resolves to bare CMake; in the device universe it resolves to the Conan layer, which drives the same CMake underneath. About 40 packages converted; one source tree builds for all 12 toolchains.&lt;/li&gt;&#10;&lt;li&gt;Kept it that way with a pre-merge analyzer that compiles every pull request against the device toolchains before it can land, so device compatibility is checked at merge time rather than discovered at release time.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>DMCTS: Distributed Monte Carlo Tree Search</title><link>https://jdcsen.com/projects/dmcts/</link><pubDate>Thu, 01 Jan 1970 00:33:41 +0000</pubDate><guid>https://jdcsen.com/projects/dmcts/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Haskell library for distributing Monte Carlo Tree sampling among AWS Lambda instances.&lt;/li&gt;&#10;&lt;li&gt;Demonstrates the graceful manner with which functional paradigms align with a distributed and serverless model.&lt;/li&gt;&#10;&lt;li&gt;Deployed with ECR, API Gateway and AWS Lambda, making use of CloudFormation for simple deployment&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>L3Dockerize: Python-based containerization tool</title><link>https://jdcsen.com/projects/l3dockerize/</link><pubDate>Thu, 01 Jan 1970 00:33:40 +0000</pubDate><guid>https://jdcsen.com/projects/l3dockerize/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Python-based Docker container builder.&lt;/li&gt;&#10;&lt;li&gt;Dynamically resolves and fetches software component dependencies to build Docker images.&lt;/li&gt;&#10;&lt;li&gt;Intended to serve as a low/zero cost tool for developers to convert existing software installs to more easily monitorable, scalable, and extensible docker-based installations.&lt;/li&gt;&#10;&lt;li&gt;Concept evaluated in a system-wide CIT test of an L3Harris hardware product.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>BUPDATE: Batch Updating tool</title><link>https://jdcsen.com/projects/bupdate/</link><pubDate>Thu, 01 Jan 1970 00:33:39 +0000</pubDate><guid>https://jdcsen.com/projects/bupdate/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Python/Bash Scripting Toolkit for cross-project refactoring.&lt;/li&gt;&#10;&lt;li&gt;Uninvasive, agile solution to deal with problem of poorly-isolated dependencies impacting many components.&lt;/li&gt;&#10;&lt;li&gt;Core application written in Python, per-project scripts writable in any language.&lt;/li&gt;&#10;&lt;li&gt;Designed according to Unix ”simple, clear, modular, extensible” philosophy to facilitate integration into existing toolchains and processes.&lt;/li&gt;&#10;&lt;li&gt;Successfully deployed to automatically upgrade the dependencies of approx. 60 components without user intervention.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>DRAGLINE: Dynamic RAcinG LINE</title><link>https://jdcsen.com/projects/dragline/</link><pubDate>Thu, 01 Jan 1970 00:33:39 +0000</pubDate><guid>https://jdcsen.com/projects/dragline/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Augmented Reality Racing Line System running on an NVidia Jetson TX2.&lt;/li&gt;&#10;&lt;li&gt;Microservice-based architecture comprised of Python, C++, Javascript, and MySQL components.&lt;/li&gt;&#10;&lt;li&gt;Winner of 2019 Graduating Class Senior Design Competition.&lt;/li&gt;&#10;&lt;li&gt;Honors Thesis was an attempt at replacing L-BFGS-B Gradient Descent optimizer with a more reliable, machine-learning based approach.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Honors Undergraduate Thesis</title><link>https://jdcsen.com/projects/honors-thesis/</link><pubDate>Thu, 01 Jan 1970 00:33:39 +0000</pubDate><guid>https://jdcsen.com/projects/honors-thesis/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Intended to provide a machine-learning based replacement for the L-BFGS-B gradient descent approach used by &lt;a href="https://jdcsen.com/projects/dragline/"&gt;DRAGLINE&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Evaluated the performance of simple feed-forward neural networks when tasked with predicting optimal paths through racecourses.&lt;/li&gt;&#10;&lt;li&gt;Provided the author an excuse to naively apply newly acquired machine-learning knowledge to a completely inappropriate problem.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Safety-Critical Power Control for a Fielded RF Front End</title><link>https://jdcsen.com/projects/rf-power-control/</link><pubDate>Thu, 01 Jan 1970 00:33:39 +0000</pubDate><guid>https://jdcsen.com/projects/rf-power-control/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;A new L3Harris radio needed far more output dynamic range than the fielded RF front end it had to work with was designed to give.&lt;/li&gt;&#10;&lt;li&gt;The front end&amp;rsquo;s transmit chain had two gain stages: a coarse driver with three setpoints (low, medium, high) and a downstream fine stage adjustable in dB. The radio commanded a single power level. I designed and implemented the control software that turns that level into a safe setpoint pair for both stages.&lt;/li&gt;&#10;&lt;li&gt;Reaching the required range meant disabling the equipment&amp;rsquo;s built-in protection interlocks, so the software became the only thing standing between a command and hardware damage. Both stages maxed, or either past its limit, could destroy the amplifier and drop a pilot&amp;rsquo;s radio link.&lt;/li&gt;&#10;&lt;li&gt;Acted as de-facto software lead: direction for a small team, and project status reporting to organization management.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Formula SAE Controls Team Lead</title><link>https://jdcsen.com/projects/controls-team-lead/</link><pubDate>Thu, 01 Jan 1970 00:33:38 +0000</pubDate><guid>https://jdcsen.com/projects/controls-team-lead/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Led engineering teams to complete critical systems of a year-long engineering effort to develop an electric Formula race car.&lt;/li&gt;&#10;&lt;li&gt;Participated in and led design reviews for critical vehicle components.&lt;/li&gt;&#10;&lt;li&gt;Architected and implemented vehicle low-voltage systems, including safety circuits, vehicle networks, telemetry, and control.&lt;/li&gt;&#10;&lt;li&gt;Designed and built vehicle CCAs, working with EDA software (Eagle/KiCAD), from requirement collection to delivery.&lt;/li&gt;&#10;&lt;li&gt;Worked in close-knit, cross-functional teams to ensure effective and efficient concurrent development.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item></channel></rss>