| # Website Approve/Reject Classifier - Mistral-7B Fine-Tuning | |
| Fine-tuned Mistral-7B model for classifying websites as "Approved" or "Rejected" using MLX-LM on Apple Silicon. | |
| ## Dataset | |
| - **Source**: Airtable database (292 records) | |
| - **Training Examples**: 225 websites with scraped content | |
| - **Validation Examples**: 25 websites | |
| - **Format**: Mistral instruction format with `<s>[INST]...[/INST]...</s>` | |
| ## Files | |
| ### Data Pipeline | |
| - `build_dataset.py` - Scrapes Airtable + websites, creates training dataset | |
| - `prepare_mlx_dataset.py` - Splits data into train/valid for MLX-LM | |
| - `mistral_training_dataset.jsonl` - Raw training data (250 examples) | |
| - `data/train.jsonl` - Training set (225 examples) | |
| - `data/valid.jsonl` - Validation set (25 examples) | |
| ### Model | |
| - `download_mistral.py` - Downloads Mistral-7B-v0.1 from HuggingFace | |
| - `mistral-7b-model/` - Downloaded model files (27GB) | |
| ### Fine-Tuning | |
| - `finetune_mistral.py` - Python script for LoRA fine-tuning | |
| - `finetune_mistral.sh` - Bash script for LoRA fine-tuning | |
| - `adapters/` - LoRA adapter weights (created during training) | |
| ### Testing | |
| - `test_finetuned_model.py` - Test the fine-tuned model | |
| ## Training Configuration | |
| ```bash | |
| Model: mistralai/Mistral-7B-v0.1 | |
| Fine-tune method: LoRA | |
| Trainable parameters: 0.145% (10.5M / 7.2B) | |
| Batch size: 2 | |
| Iterations: 1000 | |
| Learning rate: 1e-5 | |
| LoRA layers: 16 | |
| ``` | |
| ## Usage | |
| ### 1. Build Dataset (if needed) | |
| ```bash | |
| python3 build_dataset.py | |
| python3 prepare_mlx_dataset.py | |
| ``` | |
| ### 2. Download Model (if needed) | |
| ```bash | |
| python3 download_mistral.py | |
| ``` | |
| ### 3. Fine-Tune Model | |
| ```bash | |
| python3 finetune_mistral.py | |
| # OR | |
| ./finetune_mistral.sh | |
| ``` | |
| ### 4. Test Model | |
| ```bash | |
| python3 test_finetuned_model.py | |
| ``` | |
| ### 5. Manual Inference | |
| ```bash | |
| python3 -m mlx_lm.generate \ | |
| --model mistralai/Mistral-7B-v0.1 \ | |
| --adapter-path ./adapters \ | |
| --prompt "<s>[INST] Analyze the following website text and classify it as 'Approved' or 'Rejected'. Website text: [YOUR TEXT HERE] [/INST]" \ | |
| --max-tokens 10 | |
| ``` | |
| ## Requirements | |
| ```bash | |
| pip3 install mlx mlx-lm requests beautifulsoup4 huggingface-hub | |
| ``` | |
| ## Notes | |
| - Training runs on Apple Silicon using MLX framework | |
| - Some website texts are very long (up to 11K tokens) and get truncated to 2048 tokens | |
| - Model checkpoints are saved every 100 iterations to `./adapters/` | |
| - Initial validation loss: 1.826 | |