thekevinscott/geocities-prompt-html
GeoCities prompt → HTML — fine-tune Fine-tunes Gemma-4-E2B-it (LoRA) to generate a full, vintage-style HTML page from a plain-language description. This repo holds the dataset and the training scripts so the whole thing runs from one place. What's in here dataset.jsonl — the training data: one {"prompt": ..., "html": ...} per line. train_geocities.py — training entrypoint (loads this JSONL format). train-geocities-5090.sh — launch tuned for a 32 GB card (bf16… See the full description on the dataset page: https://huggingface.co/datasets/thekevinscott/geocities-prompt-html.
GeoCities prompt → HTML — fine-tune
Fine-tunes Gemma-4-E2B-it (LoRA) to generate a full, vintage-style HTML page from a plain-language description. This repo holds the dataset and the training scripts so the whole thing runs from one place.
What's in here
dataset.jsonl— the training data: one{"prompt": ..., "html": ...}per line.train_geocities.py— training entrypoint (loads this JSONL format).train-geocities-5090.sh— launch tuned for a 32 GB card (bf16, LoRA rank 64).merge_lora.py— merge the trained LoRA into the base → 16-bit safetensors (for GGUF).pyproject.toml/uv.lock— the exact pinned environment.
0. Hardware / driver
- 32 GB GPU recommended (RTX 5090). The 5090 is Blackwell (sm_120) and needs a recent driver (R570+). The pinned
torch …+cu128ships the CUDA runtime, so you don't install CUDA separately — but the driver must be new enough or the GPU won't init. - `uv` installed.
- A Hugging Face account, logged in (
hf auth login).
1. Get this repo (code + data)
hf download --repo-type dataset thekevinscott/geocities-prompt-html --local-dir geocities-ft
cd geocities-ft(It's private — you need access/an authed token.)
2. Reproduce the environment
uv syncInstalls unsloth + torch cu128 + trl + datasets exactly as locked.
3. Get the base model (gated)
Accept the license on the model page first, then:
hf download --local-dir models/google/gemma-4-E2B-it google/gemma-4-E2B-itVerify a real model.safetensors appears (not just config/tokenizer).
4. Put the dataset where the script expects it
mkdir -p data/geocities-sft
mv dataset.jsonl data/geocities-sft/dataset.jsonl5. Train
./train-geocities-5090.shbf16, LoRA rank 64, batch 2 × grad-accum 2, 3 epochs. The adapter lands in output-geocities/final/. Loss is logged every 10 steps and should descend.
Tunables (edit the script):
--num-epochs→ 4–6 for more passes.--lora-rank→ 128 for more style capacity (a 5090 handles it fine).--batch-size→ raise on 32 GB for speed.
6. Merge to a standalone model (for GGUF)
uv run python merge_lora.pyWrites merged-geocities/ (16-bit safetensors). Convert that to GGUF with a gemma4-aware converter — ik_llama.cpp's convert_hf_to_gguf.py works; mainline llama.cpp may not have gemma4 yet.
Notes
- Prompts are deliberately era-neutral (no "90s/retro/GeoCities"), so the model learns the visual style from the HTML, not the prompt. More data + higher rank ⇒ stronger aesthetic.
- The instruction is folded into the user turn (no
systemrole) for chat-template portability — keep that format at inference time.
