campusgpt-uganda / docs /learning_roadmap.md
SsemuliJoseph's picture
Update with advanced RAG features and optimized app.py
3f8ea29 verified
|
Raw
History Blame Contribute Delete
13.5 kB

A newer version of the Gradio SDK is available: 6.22.0

Upgrade

CampusGPT Uganda β€” Learning Roadmap & One-Day Mastery Checklist

Complete Unsloth Fine-Tuning Ecosystem in One Project


Your Learning Journey

By building CampusGPT Uganda, you have touched every major concept in the Unsloth ecosystem. This document is your personal mastery checklist and study guide.


Phase 1: Foundations (Morning β€” 2 hours)

βœ… Concept 1: What is Unsloth?

You learned:

  • Unsloth is a Python library for faster LLM fine-tuning
  • It achieves 2Γ— speed + 80% memory reduction through:
    • Custom CUDA kernels (C-level code for attention + FFN)
    • Manual backpropagation (no storing redundant activations)
    • Smart memory layout (packed data, minimal fragmentation)
  • Same accuracy as HuggingFace β€” just faster

Key file: training/finetune.py β€” top docstring + load_model_and_tokenizer()

Self-test: Can you explain why Unsloth is faster to a classmate?


βœ… Concept 2: LoRA β€” Low-Rank Adaptation

You learned:

  • Full fine-tuning modifies all 8 billion parameters β†’ impractical
  • LoRA adds two small matrices A (mΓ—r) and B (rΓ—n) to each weight
  • Only A and B are trained (1–5% of total parameters)
  • The adapted weight: W' = W + (A Γ— B) Γ— (alpha/r)
  • r=16 is the recommended default for instruction tuning

Key file: training/finetune.py β€” add_lora_adapters()

Formula to remember:

W' = W_frozen + (A_trainable Γ— B_trainable) Γ— scaling_factor

Self-test: Why does LoRA use TWO matrices (A and B) instead of one?

Answer: A single low-rank update matrix is the product of two smaller matrices. The product AΓ—B has rank ≀ r, achieving compression. A single matrix of rank r cannot be parameterised as efficiently.


βœ… Concept 3: QLoRA β€” Quantised LoRA

You learned:

  • Quantisation stores weights in fewer bits: float32 (4 bytes) β†’ int4 (0.5 bytes)
  • QLoRA = 4-bit quantised base model + full-precision LoRA adapters
  • Llama-3 8B: 32 GB (fp32) β†’ ~5 GB (QLoRA) β€” fits on a T4 GPU!
  • NF4 (NormalFloat4) is used β€” better distribution for neural network weights
  • ~1-2% quality loss vs full fine-tuning β€” totally acceptable for most tasks

Key file: training/finetune.py β€” load_in_4bit=True parameter

Memory calculation:

Model size (GB) β‰ˆ (parameters Γ— bits) / (8 Γ— 1024Β³)
Llama 8B in 4-bit β‰ˆ (8 Γ— 10⁹ Γ— 4) / (8 Γ— 1024Β³) β‰ˆ 4 GB

βœ… Concept 4: PEFT β€” Parameter-Efficient Fine-Tuning

You learned:

  • PEFT is the HuggingFace library managing adapters
  • get_peft_model() attaches LoRA to the base model
  • After calling it: base weights FROZEN, only adapter weights trainable
  • Adapter weights are ~10–100 MB (vs full model ~6–16 GB)

Key file: training/finetune.py β€” add_lora_adapters()


Phase 2: Data Engineering (Mid-Morning β€” 2 hours)

βœ… Concept 5: Dataset Formats

You learned the 4 major formats:

Format Fields Use Case
JSONL question, answer Simple storage
Alpaca instruction, input, output General instruction tuning
OpenAI Messages [{role, content}] Chat models (MOST COMMON)
ShareGPT conversations:[{from, value}] Multi-turn chat

Key file: data/generate_dataset.py β€” all to_*_format() functions

Self-test: Convert this Q&A to all 4 formats by hand:

  • Q: "What is the attendance policy?"
  • A: "Students must attend 75% of lectures."

βœ… Concept 6: Tokenisation

You learned:

  • Text β†’ Tokens β†’ Input IDs (integers)
  • "MUST university" β†’ ["MUST", " university"] β†’ [123, 456]
  • Every model has its OWN vocabulary β€” ALWAYS use the model's tokeniser
  • Chat templates format conversations with model-specific special tokens
  • apply_chat_template() handles this automatically

Key file: training/finetune.py β€” load_and_prepare_dataset()

Qwen chat template example:

<|im_start|>system
You are CampusGPT...<|im_end|>
<|im_start|>user
What are the fees?<|im_end|>
<|im_start|>assistant
The fees are...<|im_end|>

βœ… Concept 7: Synthetic Data Generation

You learned:

  • Read PDFs β†’ Extract text β†’ Chunk β†’ LLM generates QA pairs
  • Deduplication with Jaccard similarity (n-gram overlap)
  • Quality filtering (minimum length, must be a question, no non-answers)
  • Key insight: LLMs can generate their own training data!

Key file: data/synthetic_generator.py

Pipeline:

PDF β†’ pypdf β†’ chunks of 500 words β†’ LLM prompt β†’ JSON output β†’ dedup β†’ filter β†’ JSONL

Phase 3: RAG System (Late Morning β€” 2 hours)

βœ… Concept 8: Vector Embeddings

You learned:

  • Text β†’ dense vector of floats (768–1024 dimensions)
  • Similar meaning β†’ similar vector (close in vector space)
  • Cosine similarity measures angle between vectors (1.0 = identical)
  • Models: BGE-M3 (multilingual, best for Uganda), MiniLM (fast), Qwen (highest quality)

Key file: embeddings/embedding_pipeline.py

Key formula:

cos_similarity(A, B) = (A Β· B) / (|A| Γ— |B|)
Range: 0 (different) to 1 (identical meaning)

βœ… Concept 9: RAG β€” Retrieval-Augmented Generation

You learned the complete pipeline:

Student Question
       ↓
  Embed Query β†’ [0.23, -0.11, ...]
       ↓
  ChromaDB (vector similarity search)
       ↓
  Top-3 relevant document passages
       ↓
  Prompt = System + Retrieved Context + Question
       ↓
  LLM generates grounded answer
       ↓
  Response + Source Citations

Why RAG is better than pure fine-tuning for some tasks:

  • Can handle new documents without retraining
  • Answers are grounded in retrieved text (less hallucination)
  • Can cite sources (important for academic contexts)

Key file: rag/rag_pipeline.py


βœ… Concept 10: ChromaDB

You learned:

  • ChromaDB = vector database (stores text + embeddings + metadata)
  • HNSW index: approximate nearest-neighbour in O(log n) time
  • Cosine distance space: closer = more similar
  • Persistent: data survives between sessions

Phase 4: Fine-Tuning (Afternoon β€” 3 hours)

βœ… Concept 11: SFT β€” Supervised Fine-Tuning

You learned:

  • Show the model thousands of (question, answer) pairs
  • Train it to predict the correct answer given the question
  • Loss computed ONLY on assistant tokens (not system/user tokens)
  • SFTTrainer from TRL handles everything automatically

Key file: training/trainer.py and training/finetune.py


βœ… Concept 12: Key Hyperparameters

Parameter Recommended Effect
r 16 LoRA capacity
lora_alpha 32 Update strength
learning_rate 2e-4 Step size
batch_size 2 Examples per step
grad_accum 4 Effective batch = 8
epochs 3 Dataset passes
warmup_steps 20 Gentle start
lr_scheduler cosine Decay shape

Key file: training/hyperparams.py

Diagnostic rules:

  • Loss explodes β†’ halve learning rate
  • Loss not decreasing β†’ double learning rate
  • Overfitting β†’ add dropout, reduce epochs
  • OOM β†’ reduce batch size or r

Phase 5: Model Export (Late Afternoon β€” 1 hour)

βœ… Concept 13: Three Export Options

Format Size Use Case
LoRA adapters ~50 MB Development, sharing adapters
Merged 16-bit ~6-16 GB Production, vLLM
GGUF (Q4_K_M) ~2-4 GB Ollama, local inference

Key file: training/export.py

Merge operation: W' = W + (A Γ— B) Γ— (alpha/r)


Phase 6: Deployment (Evening β€” 2 hours)

βœ… Concept 14: Ollama Deployment

You learned:

  • Ollama wraps GGUF with a clean REST API
  • Modelfile = LLM configuration (like a Dockerfile)
  • OpenAI-compatible API: change base_url, same code works
  • ollama run campusgpt to chat locally

Key files: deployment/ollama/


βœ… Concept 15: vLLM Deployment

You learned:

  • PagedAttention: allocates KV cache in pages on demand
  • Continuous batching: new requests join mid-generation
  • 10-100Γ— higher throughput than Ollama for multiple concurrent users
  • For university servers serving hundreds of students

Key file: deployment/vllm/deploy_vllm.py


βœ… Concept 16: HuggingFace Hub

You learned:

  • Upload LoRA adapter, merged model, or GGUF
  • Model Card = documentation for your model
  • HuggingFace Spaces = free Gradio demo hosting
  • Ollama can pull directly from HuggingFace: ollama pull username/campusgpt

Key file: deployment/huggingface/push_to_hub.py


βœ… Concept 17: Evaluation

You learned four metrics:

Metric What it measures Range
ROUGE-L Word overlap (recall) 0–1
BLEU N-gram precision 0–1
BERTScore Semantic similarity 0–1
Hallucination Rate Key fact recall 0–1 (lower=better)

Key file: evaluation/evaluate_model.py

The key experiment: Base model vs Fine-tuned model comparison. If fine-tuning worked, you should see:

  • Higher ROUGE-L (+0.05 to +0.2)
  • Higher BERTScore (+0.02 to +0.1)
  • Lower hallucination rate (-0.05 to -0.2)

ONE-DAY UNSLOTH MASTERY CHECKLIST

Check off each item as you complete it:

πŸŒ… Morning (Hours 1–3)

  • Read README.md and understand the full architecture
  • Run python data/generate_dataset.py β€” generate 3100 training examples
  • Run python data/synthetic_generator.py β€” understand PDF-to-QA pipeline
  • Open data/processed/combined_all_openai_messages.jsonl β€” inspect the data
  • Open data/processed/combined_all_alpaca.jsonl β€” compare formats

🌀️ Late Morning (Hours 3–5)

  • Read training/finetune.py top docstring β€” understand LoRA vs QLoRA
  • Study LORA_CONFIG in finetune.py β€” understand each parameter
  • Study TRAINING_CONFIG β€” understand each training argument
  • Run python training/hyperparams.py β€” get hardware recommendation
  • (Optional) Run python embeddings/embedding_pipeline.py β€” see semantic search

β˜€οΈ Afternoon (Hours 5–8) β€” REQUIRES GPU

  • Open Google Colab (colab.research.google.com) with T4 GPU
  • Install Unsloth: !pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
  • Copy training/finetune.py to Colab
  • Run training β€” watch the loss decrease
  • Note peak GPU memory usage
  • Run training/export.py β€” export LoRA adapters

πŸŒ† Late Afternoon (Hours 8–10)

  • Run python rag/rag_pipeline.py --build β€” build knowledge base
  • Run python rag/rag_pipeline.py β€” test RAG queries
  • Run python inference/chat.py β€” chat with your model
  • Compare base model vs fine-tuned model responses manually

πŸŒ™ Evening (Hours 10–12)

  • Run python evaluation/evaluate_model.py β€” compute metrics
  • Run python frontend/app.py β€” launch the Gradio UI
  • Try uploading a PDF in the UI
  • Run bash deployment/ollama/deploy_ollama.sh β€” deploy locally
  • (Optional) Push to HuggingFace Hub

Concepts Mastered After This Project

After completing CampusGPT Uganda, you understand:

  1. βœ… Unsloth β€” what it is and why it's faster
  2. βœ… LoRA β€” low-rank adaptation mathematics
  3. βœ… QLoRA β€” quantisation + LoRA for memory efficiency
  4. βœ… PEFT β€” parameter-efficient fine-tuning library
  5. βœ… Dataset formats β€” JSONL, Alpaca, OpenAI Messages, ShareGPT
  6. βœ… Tokenisation β€” text to tokens to input IDs
  7. βœ… Chat templates β€” model-specific conversation formatting
  8. βœ… SFT β€” supervised fine-tuning with SFTTrainer
  9. βœ… Evaluation β€” ROUGE, BERTScore, hallucination metrics
  10. βœ… Inference β€” streaming, temperature, top-p sampling
  11. βœ… RAG β€” retrieval-augmented generation end-to-end
  12. βœ… Vector embeddings β€” semantic search with BGE/Qwen
  13. βœ… ChromaDB β€” vector store, HNSW, cosine similarity
  14. βœ… Model export β€” LoRA adapters, merged model, GGUF
  15. βœ… Ollama β€” local deployment with Modelfile
  16. βœ… vLLM β€” production serving with PagedAttention
  17. βœ… HuggingFace Hub β€” model sharing and demo hosting
  18. βœ… Gradio β€” building ML web UIs
  19. βœ… Hyperparameter tuning β€” what each parameter does and how to tune it
  20. βœ… Synthetic data generation β€” PDF β†’ QA pairs with LLMs

What to Build Next

Now that you understand the full stack, here are next project ideas:

  1. Luganda-English Translation Fine-tune β€” Use your NLLB/Qwen pipeline + QLoRA
  2. Medical QA for Uganda β€” Fine-tune on Ugandan health guidelines
  3. Legal AI for Uganda β€” Fine-tune on Ugandan law documents
  4. AgriBot β€” Combine with your PotatoGuard project + LLM
  5. Multi-university CampusGPT β€” Expand to Makerere, KIU, UCU
  6. Voice CampusGPT β€” Add speech-to-text (Whisper) + text-to-speech

Resources


Built by Joseph Ssemuli, Computer Science student at MUST, during Sunbird AI internship. This project is your evidence of mastering the complete Unsloth ecosystem. πŸ‡ΊπŸ‡¬