dqntrain
Headless, config-driven fine-tuning for LLMs on cloud GPUs.
A programmatic fine-tuning toolkit inspired by Unsloth Studio's workflow, built for headless environments like Kaggle, Google Colab, and remote servers. No GUI required — just YAML/JSON recipes, clean Python APIs, and automatic GPU-aware defaults.
Quick Start (Kaggle / Colab Notebook)
1. Install
%%capture
!pip install dqntrain
2. Define a Config
from dqntrain import auto_config_for_model
config = auto_config_for_model("unsloth/Qwen2.5-7B-Instruct-bnb-4bit")
config.training.num_train_epochs = 1
config.dataset.path = "yahma/alpaca-cleaned"
config.export.formats = ["lora", "gguf"]
3. Train
from dqntrain import (
ModelLoader, DatasetBuilder, DQNTrainer,
TrainingMonitor, ModelExporter
)
loader = ModelLoader(config)
model, tokenizer = loader.load()
model = loader.apply_lora()
dataset = DatasetBuilder(config).build()
monitor = TrainingMonitor()
trainer = DQNTrainer(config, monitor=monitor)
trainer.create_trainer(model, tokenizer, dataset)
trainer.train()
monitor.plot()
ModelExporter(config).export(model, tokenizer)
That's it. The entire pipeline in ~15 lines.
Features
| Capability | Description |
|---|---|
| Model presets | auto_config_for_model() detects your GPU and sets 4-bit, batch size, seq length |
| LoRA / QLoRA | LoRAConfig dataclass or YAML recipes |
| Dataset formats | JSON, JSONL, CSV, HuggingFace datasets, conversations — auto-detected |
| Live monitoring | Loss/LR/GPU tracking with matplotlib plots + JSONL logs |
| Multi-format export | LoRA, merged 16-bit, GGUF, Ollama Modelfile — in one call |
| Headless-first | No browser, no desktop UI — built for notebooks and servers |
Project Structure
dqntrain/
├── dqntrain/
│ ├── config.py # YAML/JSON recipes + auto GPU presets
│ ├── models.py # Model loader + LoRA applier
│ ├── data.py # Dataset builder (JSON/CSV/HF/conversations)
│ ├── trainer.py # SFTTrainer wrapper with cloud paths
│ ├── observability.py # Live metrics, plots, JSONL logging
│ ├── export.py # GGUF, merged, Ollama, Hub push
│ └── utils.py # Environment detection + GPU info
├── configs/
│ ├── quick_lora.yaml # T4-optimized 4-bit recipe
│ └── full_finetune.yaml # P100+ 16-bit recipe
└── notebooks/
└── kaggle_template.ipynb # Ready-to-run Kaggle notebook
Config Recipes
Save a YAML file and pass it to load_config():
model:
name: "unsloth/Qwen2.5-7B-Instruct-bnb-4bit"
max_seq_length: 2048
load_in_4bit: true
lora:
r: 16
lora_alpha: 32
target_modules: [q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj]
training:
num_train_epochs: 1
per_device_train_batch_size: 1
gradient_accumulation_steps: 4
learning_rate: 2.0e-4
output_dir: "./outputs"
dataset:
path: "yahma/alpaca-cleaned"
instruction_column: "instruction"
response_column: "output"
export:
formats: [lora, gguf]
quantization: "q4_k_m"
Supported Dataset Formats
DatasetBuilder auto-detects:
- HuggingFace datasets (
dataset.path = "yahma/alpaca-cleaned") - JSON / JSONL files with
instruction/responseorconversationsarrays - CSV files with text columns
- In-memory lists of dicts
GPU-Aware Defaults
auto_config_for_model() inspects your GPU and adjusts:
load_in_4bit— forced on for T4 (15 GB), optional on P100/V100per_device_train_batch_size— smaller for big modelsmax_seq_length— capped to fit VRAMgradient_accumulation_steps— scaled up to maintain effective batch size
Export Formats
ModelExporter can produce any combination of:
lora— LoRA adapter (smallest, fastest to save)merged/safetensors— Full 16-bit merged modelgguf— Quantized GGUF for llama.cpp / Ollamaollama—Modelfileready forollama create
CLI Usage
# Install deps
pip install dqntrain
# Run from a config file
dqntrain --config configs/quick_lora.yaml
# Override model and dataset
dqntrain --model unsloth/Phi-4 --dataset my_data.jsonl --epochs 2
Kaggle-Specific Tips
- Enable Internet in notebook settings for
pip installand HF downloads. - Persist outputs — everything in
/kaggle/workingsurvives the session. - Save Versions — click "Save Version" → "Run" to execute headlessly. Logs still write to
/kaggle/working. - Dataset inputs — upload custom JSON/CSV via Kaggle Datasets, then reference them with
config.dataset.path = "/kaggle/input/your-dataset/file.json".
License
MIT. This package depends on Unsloth (Apache 2.0 core), TRL, and Transformers.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dqntrain-0.1.3.tar.gz.
File metadata
- Download URL: dqntrain-0.1.3.tar.gz
- Upload date:
- Size: 19.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae47bf2b24fc2035c66775effa54cbf6df44087b25b1437d22ecf9821fc69a42
|
|
| MD5 |
a3815e79dd5b024a7078174b4d999775
|
|
| BLAKE2b-256 |
8000f7d3a70f7482b68173764aaf38dd75f4e91ce9b3836435039ac158cff78b
|
File details
Details for the file dqntrain-0.1.3-py3-none-any.whl.
File metadata
- Download URL: dqntrain-0.1.3-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b6e859b430102df5b76137239b33b4c793cb2f56769c095f77b498e9a1591e0
|
|
| MD5 |
3823312a094a66069fbd30d6be057edf
|
|
| BLAKE2b-256 |
7a7e102ec82dd79b72a321e17e1cfd23808c7a01b24000754b248ed52ec60e72
|