CoolFace
Datasetpublic

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.

sourceHugging Faceotherupdated 3mo agoView on Hugging Face
2likes91downloads
Dataset Card

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 …+cu128 ships 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)

bash
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

bash
uv sync

Installs unsloth + torch cu128 + trl + datasets exactly as locked.

3. Get the base model (gated)

Accept the license on the model page first, then:

bash
hf download --local-dir models/google/gemma-4-E2B-it google/gemma-4-E2B-it

Verify a real model.safetensors appears (not just config/tokenizer).

4. Put the dataset where the script expects it

bash
mkdir -p data/geocities-sft
mv dataset.jsonl data/geocities-sft/dataset.jsonl

5. Train

bash
./train-geocities-5090.sh

bf16, 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)

bash
uv run python merge_lora.py

Writes 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 system role) for chat-template portability — keep that format at inference time.