Pick any colour. The displayed accent adjusts for readable contrast
in light or dark mode.
SOFTWARE ENGINEER, POST-SILICON VALIDATION · AMD
I test how platforms keep device memory safe.
I'm Aravind, a software engineer at AMD. I write post-silicon validation tests
for IOMMU, PCIe and power management.
Outside work, I build an IOMMU model and guide, train anime generators and run
a small homelab. The orbit shows output from my final-year-project model.
Device A network card writes 16 bytes to an address the driver gave it.
PCIe The write crosses the link tagged with Requester ID 03:00.0. The ID, not the address, decides whose rules apply.
IOMMU The ID selects a device table entry, and that entry names domain 7’s page tables.
IOMMU cache The IOMMU checks its caches first. An IOTLB hit skips the walk; a miss goes to the tables.
Page tables A four-level walk turns the address into a physical one and checks that writes are allowed.
Memory controller The physical address goes to the memory controller, which picks the DRAM channel, bank and row. CPU caches holding that line are kept coherent.
DRAM In the usual path the bytes land here. Some platforms (Intel DDIO, for one) let a coherent write sit in the CPU cache first, so what software reads is right even before DRAM is updated. Validation means checking that each of these steps really happened.
My professional focus, a public systems project, my final-year project
and a personal homelab.
Software Engineer, post-silicon validation, AMD
I develop post-silicon validation tests for IOMMU, PCIe and power
management.
SELECTED PROJECT / INDEPENDENT, PUBLIC SOURCE
dmakit: an emulated AMD IOMMU
Problem
IOMMU behaviour is easy to describe and hard to check without
something that actually faults.
My part
A software-emulated AMD IOMMU behind a model of Linux’s DMA API,
in JavaScript and header-only C++20 that must print identical
results.
Result you can inspect
A modelled bad access can be written to an event log the way hardware does it, when
logging is enabled, the log has room and no documented suppression (such as DTE[IG]) applies; fixed and seeded scenarios
check the two implementations against each other. It models the
AMD IOMMU behaviour it documents, not any one chip.
Skills and interests C++ · JavaScript · Python · Linux · PCIe · IOMMU (AMD-Vi, Arm SMMUv3) · SEV-SNP · StyleGAN2 · Podman. Independent projects and study, not a list of employer duties.
A lesson I keep Before settling on a conclusion, check every possible source, including the ones that don’t seem to contribute. Even when the issue looks obvious, the underlying cause may not be what you think, and it is often unexpected.
HOW I INVESTIGATE · EDUCATIONAL EXAMPLES
A passing test is a clue, not the conclusion.
DMA passed, but was it protected?
Symptom: a DMA check reports PASS. Possible causes: the request was correctly allowed, or protection was disabled or bypassed. Evidence: compare where the bytes landed with an allowed control and a denied probe; an empty fault log alone rules nothing out. Regression: keep the destination check, denied probe, and recovery control.
Symptom: the expected device cannot be used. Possible causes: Linux did not discover it, or it was discovered but resource setup or driver binding failed. Evidence: first check whether Linux lists the device, then follow resource assignment and driver binding separately; a missing driver does not explain a missing entry in the device list. Regression: verify enumeration, resource assignment, binding and device operation in the same boot path.
Symptom: a device fails to return to service after wake. Possible causes: the sleep request was accepted without proving it applied, or device state was not restored. Evidence: separate the request, modeled transition and observed result. Regression: suspend, wake, then verify device operation.
I curated the anime dataset with Hydrus and built a custom
classifier to keep it safe for work before training my own
StyleGAN2 model at 512 × 512. I used AnimeGANv3 as a
refinement stage to improve the output of my StyleGAN
baseline.
Documented training setup
My final-year presentation specifies Diffusion-StyleGAN2 with
DiffAugment: 512-dimensional Z/W latents, batch size 32, R1
gamma 5, and both path-length regularization and style-mixing
probability set to zero. I used an NVIDIA RTX 3060. These are
project settings, not the default recipe for every StyleGAN2
model.
Editing and extending the generator
I explored style mixing and GANSpace edits, then used
generated images as inputs to Waifu Diffusion. The
StyleGAN-NADA domain-adaptation examples used the pretrained
ThisAnimeDoesNotExist model, rather than my own full-body
model.
What the evidence supports
The presentation reports FID 7.73 and shows generated samples.
It does not supply evaluation logs, the full evaluation
protocol, or a controlled stability comparison. The browser
uses my recovered inference exports; it does not reproduce
training or rerun that benchmark. I no longer have the
original checkpoint's file hash, the conversion tool and
version, or the exact noise settings, so I cannot show that
the recovered export is byte-for-byte the checkpoint behind
the reported FID. Hydrus, the custom
safe-for-work classifier, and AnimeGANv3 refinement are additional details
from my project account.
FROM MY FINAL-YEAR PRESENTATION
The experiment, documented.
Multi-Domain Anime Image Generation and Editing · SCSE21-0664.
Selected results from the original presentation, alongside the model
you can run below.
The orbit at the top of the page is a pre-rendered latent walk through
my recovered model's outputs: twelve characters it generated at
ψ 0.6, picked by eye from 240 consecutive seeds for clean anatomy,
and 24 real latent frames between each pair. A light forward-diffusion noise, the kind
Diffusion-GAN applies to discriminator inputs
(xt = √ᾱ·x0 + √(1−ᾱ)·ε), rides on each
change. The overlay illustrates the training idea; it is not a recording of
training, and the generator draws every frame in one pass. For live
inference, type any of these seeds into the lab below with ψ 0.6
and noise off to get the same character.
Training method
Diffusion-StyleGAN2 with DiffAugment · slide 21
Reported FID
7.73 Presentation result · slide 22
Hardware
RTX 3060 Consumer GPU · slide 13
Generated for this site Sixteen of the 240 seeds my model drew at ψ 0.6 with noise off, at full 512 × 512 quality. Pick one to load its seed in the lab and generate it yourself.
Generation · slide 22Original sample grid. FID
is reported from the presentation, not independently reproduced.
Open the image for a closer look.
Editing · slide 24The presentation associates
layers 1–6 with overall style, 7–10 with clothing type, and
11–16 with colour. These are observations from this model, not
universal layer guarantees.
Try the style mixer
Keep character A and borrow some synthesis layers from character B. These are the nine real outputs from slide 24, not generated live.
Source A+=Result
Follow the research pipeline
Curate
Tag-based selection, background removal with Anime
Segmentation, and manual filtering of full-body figures
(slides 17–19).
Generate & edit
Train Diffusion-StyleGAN2, then explore style mixing and
GANSpace directions (slides 21–25).
Extend
Pass generated images into Waifu Diffusion for
image-to-image editing (slides 31–33). This experiment is
separate from the AnimeGANv3 refinement running here.
Evidence: slides 13, 17–25 and 27–33 of my final-year presentation.
The full deck is not published: the methods and settings above
come from it, and only the sample grid and style-mixing matrix
are shown here. The deck describes 1024 × 512 generation and larger models as
future improvements, not completed results. The live recovered
model outputs 512 × 512.
That includes you: this page came from a small Intel N100 box at home, not a cloud host.
Remote access
The route from the internet to this box. I keep those details off a public page.
This site
A systemd user service serves static files; there is no backend. Updates go through update-site.sh, which checks every file against its SHA-256 before copying, backs up what it replaces and tries to restore the backup if a step fails. The hash check shows the files match the manifest, not that the site works. It never needs root.
Lab models
The StyleGAN2, SD-Turbo and upscaler models behind the image lab, from about 145 MB for StyleGAN2 up to about 2.4 GB for SD-Turbo. They download to your browser only when you press Generate, and run there. Site updates leave them alone: the updater refuses to overwrite them.
Telegram
Where automations report back, so I hear about a problem without logging in.
Automations
Rootless Podman containers, started and restarted by systemd Quadlets, including n8n for automations with Telegram.
Backups
Custom restic jobs back up both the configuration and the databases, encrypted, with the keys kept on another system. I rebuilt this after a failed backup cost me most of my Docker data.
Read the project +
What I’m doing
Configuring and maintaining self-hosted services, working with
rootless Podman and systemd Quadlets, and exploring automation
with n8n and Telegram.
What matters
Making services easier to inspect, keeping backups
recoverable, and understanding what happens when networking,
storage, or startup ordering goes wrong.
My contribution
Hands-on configuration, testing, and troubleshooting using
existing open-source tools and AI assistance. This is a
personal learning project, not a claim that I authored every
component.
FOR FUN · IN YOUR BROWSER
The image lab.
Choose a tool or explore the research. Your settings and completed
images stay here as you switch.
Everything runs in your browser. Models download only when you press Generate.
StyleGAN2
InputOutput
Schematic illustrations, not model predictions.
Ready
Rotate the noise layers
INTERACTIVE LAB1024 × 1024
01 / DATASET
02 / ADDED NOISE
03 / OUTPUT GRIDStyleGAN × diffusion
Drag sideways to spin. Use the view controls below for precise
rotation.
More added noiseLess added noise
Toy noise schedule, not my recorded training run. Diffusion-GAN
adapts noise rather than following this fixed decrease.
Try a photo +
See how a training image changes as deliberately added noise
is reduced. This simulates the input-noise schedule; it does
not train a model or generate an image.
JPEG, PNG or WebP · up to 10 MB. Processed only in this
browser, never uploaded or saved by this demo.
Choose a photo to begin.
Original reference
Noised training input
The clean reference is already known. Revealing it as
noise decreases is a visualization, not evidence that a
network learned to reconstruct it.
View, layers & output +
Linked to illustrative training progress.
1,048,576 pixels · 16× the pixel count of 256².
The preview uses a test pattern or your selected photo with
added noise. Changing size resizes this canvas; it does not
change a trained model. My model was trained at 512 × 512.
Inside GANs & diffusion +
Training with diffusion
My FYP presentation documents Diffusion-StyleGAN2 with
DiffAugment. Forward diffusion adds noise to real and
generated discriminator inputs. This slider is a
simplified noise illustration, not a replay of that
adaptive training process.
Apply adaptive forward diffusion to real and generated
discriminator inputs.
Use the trained GAN generator; no reverse diffusion chain
is required.
My FYP used Diffusion-StyleGAN2 with DiffAugment (presentation,
slide 21). StyleGAN3 is a comparison reference. These animations
illustrate the model families; the decreasing-noise slider does
not reproduce Diffusion-GAN’s adaptive schedule.
MY TRAINED MODEL / OPTIONAL TRIAL
Generate with StyleGAN2
512 × 512 · ~145 MB model download · GPU or CPU
About this tool & requirements
I trained this StyleGAN2 model at 512 × 512. I
curated my dataset using Hydrus, then used a custom classifier I
built to keep it safe for work. The dataset is not redistributed
(terms). My FYP
presentation identifies the training architecture as
Diffusion-StyleGAN2 with DiffAugment.
See the project evidence ↑
01Hydrus curation
02Safe-for-work filtering
03StyleGAN2 training
04AnimeGANv3 refinement
Optional local trial · about 145 MB of model downloads, plus the
shared 22 MB runtime if needed. Supports WebGPU with WASM
fallback, or CPU-only WASM. Uses substantial memory; try a desktop
first. Nothing downloads until you press Load and generate.
Lower truncation pulls styles toward the learned average. Higher
values allow more variation. Applied equally to both exported
style groups.
Synthesis noise affects image detail. It is separate from the
input-noise strategy used during training.
Ready when you are. No photo is needed.
A new 512 × 512 sample from my model will appear here. Seed
→ mapping network → synthesis network → image.
The model generates from a random latent vector. It does not
transform your photo or retrain in the browser. The same seed and
settings are repeatable in this demo.
REAL MODEL / LOCAL INFERENCE
Style a photo
AnimeGANv3 · Local photo processing · GPU or CPU
About this tool & requirements
I used AnimeGANv3 to refine my StyleGAN baseline, as reflected in
this browser trial. My FYP slides document a separate Waifu
Diffusion image-to-image experiment. Send a generated image from
the StyleGAN2 tab, or try a photo. These AnimeGANv3 checkpoints
are pretrained third-party weights.
JPEG, PNG or WebP · up to 10 MB. Centre square crop, with no
automatic face detection. Your photo stays in this browser.
The runtime (about 22 MB) and selected model download only when
you press Run. This performs inference, not training.
Send a StyleGAN2 output or choose a photo to begin.
Your StyleGAN2 image or photo and the refined result will appear
here.
Real-ESRGAN · 4× enlargement · ~18 MB model download
About this tool & requirements
Upscale a photo from your device, a StyleGAN2 image, an AnimeGANv3
result, or an SD-Turbo illustration. Real-ESRGAN’s anime model
enlarges the image by 4× per side and estimates sharper edges and
texture. It can change details; it does not reliably fix anatomy.
Choose a photo or send a generated image from another stage. A 256
× 256 input becomes 1024 × 1024; a 512 × 512 input becomes 2048 ×
2048. This is an optional browser extension, not a claimed FYP
result.
JPEG, PNG or WebP · up to 10 MB and 25 megapixels. Prepared as a
512 × 512 square in this browser. Cropping may remove the edges;
fit preserves the full photo with light borders. Your photo is
not uploaded.
About 18 MB of model downloads, plus the shared runtime if
needed. Runs locally in small tiles to limit memory use. CPU
upscaling can take minutes; Cancel stops computation. The
StyleGAN2 model is unloaded to make room, keeping its last
image.
Choose a photo or send a generated image to begin.
Third-party model:
RealESRGAN_x4plus_anime_6B, using the ONNX export supplied for this project.
BSD-3-Clause licence.
Download saves the full result, regardless of the comparison
position.
Describe a scene and let SD-Turbo generate a new image in your
browser. This is a separate text-to-image experiment, not my
trained StyleGAN2 model or a repair pass on its output.
Requires desktop WebGPU with FP16 support and about 2.4 GB of
model downloads. The browser needs additional GPU memory. No model
loads until you choose to generate; prompts and images stay on
your device.
Compare the same prompt and seed at 1 step. Browser reference
follows Microsoft’s variable-length prompt encoding; the
previous 77-token mode is kept for comparison. This is a
diagnostic choice, not a guaranteed quality improvement.
Start with 1 step. Extra steps may change texture and contrast
without improving quality. SD-Turbo does not use a negative
prompt or guidance scale.
Ready when you are. First use is a large download.
At AMD I test how platforms keep device memory safe. At home
I train anime generators and keep an N100 running.
I got into anime through Naruto and Made in Abyss, and it stuck because the characters’ values resonated with me, while the world-building was breathtaking and meticulous.
The rest of my shelf is Star Wars, Star Trek, The Lord of the Rings, Harry Potter, Interstellar and anything cyberpunk.
I like space for the same reason I like IOMMU debugging: we don’t know what’s out there, and what we expect may not be what we find. The same goes for the laws of physics. I like the search for new laws and the push for knowledge. The background scenes in the Theme menu and the gravity playground are where I play with it.
I write these notes to turn things I have studied and built into guides: specific problems, tested steps and the limits worth knowing.