133 lines
5.1 KiB
Markdown
133 lines
5.1 KiB
Markdown
---
|
||
license: llama3.2
|
||
base_model: unsloth/Llama-3.2-3B-Instruct-bnb-4bit
|
||
library_name: transformers
|
||
tags:
|
||
- sft
|
||
- trl
|
||
- unsloth
|
||
- fitness
|
||
- nutrition
|
||
- coaching
|
||
- conversational
|
||
- merged
|
||
datasets:
|
||
- Harsh-k-007/fitcoach-conversations
|
||
pipeline_tag: text-generation
|
||
---
|
||
|
||
# FitCoach 3B (Merged, fp16)
|
||
|
||
A fully merged, full-precision (fp16) fine-tune of Llama 3.2 3B Instruct, acting as
|
||
**FitCoach** — a conversational fitness and nutrition intake coach. This is the
|
||
lightweight option in the FitCoach model family, alongside the
|
||
[8B LoRA adapter](https://huggingface.co/Harsh-k-007/fitcoach-8b-adapter).
|
||
|
||
Try it live: [FitCoach Space](https://huggingface.co/spaces/Harsh-k-007/fitcoach)
|
||
|
||
## Model Details
|
||
|
||
- **Base model:** `unsloth/Llama-3.2-3B-Instruct-bnb-4bit` (loaded in 4-bit for
|
||
training via Unsloth, then merged to 16-bit for deployment)
|
||
- **Format:** merged weights, fp16 — no adapter required, load directly
|
||
- **Adapter (during training):** LoRA, rank 16, alpha 16, dropout 0, targeting all
|
||
attention and MLP projection layers (`q/k/v/o_proj`, `gate/up/down_proj`)
|
||
- **Training framework:** Unsloth `FastLanguageModel` + TRL `SFTTrainer`
|
||
- **Training data:** [`Harsh-k-007/fitcoach-conversations`](https://huggingface.co/datasets/Harsh-k-007/fitcoach-conversations)
|
||
— 1,407 synthetic coaching conversations (95/5 train/eval split for this run)
|
||
- **Sequence length:** 2048 tokens, with sequence packing (`bfd` strategy)
|
||
- **Precision:** bf16 training on a single T4 GPU (Google Colab free tier)
|
||
- **Epochs:** 2, effective batch size 8 (2 × 4 grad accumulation), cosine LR
|
||
schedule, peak LR 2e-4
|
||
|
||
## Intended Use
|
||
|
||
FitCoach is a **conversational intake coach** for fitness and nutrition. Given a
|
||
user's goal, it asks **one question at a time** to gather the relevant context, then
|
||
generates a structured plan.
|
||
|
||
Scope is intentionally narrow:
|
||
- **Meal plans** (~60% of training data): collects goal, age/height/weight, dietary
|
||
restrictions, activity level
|
||
- **Workout plans** (~40% of training data): collects goal, experience level, days
|
||
per week, equipment access
|
||
|
||
The 3B model is intended as a **lighter, faster** alternative to the 8B adapter —
|
||
useful where latency or memory matters more than maximum response quality.
|
||
|
||
### Out of scope
|
||
|
||
- Injuries, medical conditions, or any medical advice
|
||
- Macro/calorie arithmetic — the model can *describe* macro targets conceptually but
|
||
is **not reliable at computing them**; treat any numeric macro breakdown as
|
||
approximate, not verified
|
||
- Unprompted macro generation — the model does not currently generate macros unless
|
||
explicitly asked (known dataset gap, planned for v2)
|
||
|
||
## How to Use
|
||
|
||
```python
|
||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||
import torch
|
||
|
||
model_id = "Harsh-k-007/fitcoach-3b"
|
||
|
||
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
||
tokenizer.pad_token = "<|finetune_right_pad_id|>"
|
||
|
||
model = AutoModelForCausalLM.from_pretrained(
|
||
model_id,
|
||
dtype=torch.float16,
|
||
device_map="auto",
|
||
)
|
||
model.eval()
|
||
|
||
messages = [
|
||
{"role": "system", "content": "You are FitCoach, a friendly fitness and nutrition coach."},
|
||
{"role": "user", "content": "Create a simple fat-loss meal plan with Indian food options."},
|
||
]
|
||
|
||
encoded = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt")
|
||
input_ids = encoded["input_ids"] if hasattr(encoded, "keys") else encoded
|
||
input_ids = input_ids.to(model.device)
|
||
|
||
output = model.generate(
|
||
input_ids,
|
||
max_new_tokens=512,
|
||
do_sample=True,
|
||
temperature=0.7,
|
||
top_p=0.9,
|
||
pad_token_id=128004,
|
||
)
|
||
print(tokenizer.decode(output[0][input_ids.shape[-1]:], skip_special_tokens=True))
|
||
```
|
||
|
||
## Training Procedure
|
||
|
||
- **Method:** Supervised fine-tuning (SFT) with TRL `SFTTrainer`, using Unsloth's
|
||
`FastLanguageModel` for memory-efficient LoRA training (gradient checkpointing via
|
||
`use_gradient_checkpointing="unsloth"`), then merged to full precision via
|
||
`save_pretrained_merged(..., save_method="merged_16bit")`
|
||
- **Loss:** full-conversation loss (`train_on_responses_only` / assistant-only
|
||
masking was not applied in this run — a documented future optimization once
|
||
reliably supported for the Llama 3 chat template)
|
||
- **Chat template:** Llama 3.2 (`unsloth.chat_templates.get_chat_template`)
|
||
- **Optimizer:** `adamw_8bit`, weight decay 0.01, cosine schedule, 17 warmup steps
|
||
- **Hardware:** Google Colab T4 (free tier), with Drive checkpointing for
|
||
resumability across the 90-minute idle / 12-hour session limits
|
||
|
||
## Known Limitations
|
||
|
||
- **Macro arithmetic is hallucinated.** The model isn't reliable at computing
|
||
calorie/macro numbers. A v2 release plans to add a calculator/tool layer for this.
|
||
- **Macros aren't generated unprompted.** The dataset under-represents this, so the
|
||
model needs to be asked explicitly. Planned fix for v2 via dataset augmentation.
|
||
- **No assistant-only loss** in this training run (see above).
|
||
- As the smaller model in the family, expect slightly less consistent intake
|
||
behavior and plan structure compared to the 8B adapter.
|
||
|
||
## Citation
|
||
|
||
If you use this model, please link back to this repo and the
|
||
[training dataset](https://huggingface.co/datasets/Harsh-k-007/fitcoach-conversations).
|