Skip to main content

Batteries-included toolkit for LoRA / QLoRA fine-tuning with Hugging Face Transformers

Project description

easylora

CI PyPI License Python

Batteries-included toolkit for LoRA / QLoRA fine-tuning with Hugging Face Transformers.

Fine-tune any causal language model with LoRA in under 20 lines of Python, or with a single CLI command.

Open In Colab

What is LoRA / QLoRA?

LoRA (Low-Rank Adaptation) freezes pre-trained model weights and injects small trainable rank-decomposition matrices, reducing trainable parameters by orders of magnitude.

QLoRA adds 4-bit quantisation on top of LoRA, enabling fine-tuning of large models on consumer GPUs.

easylora wraps transformers + peft with safe defaults, reproducibility, and a clean config-driven API.

Installation

pip install easylora

Optional extras:

pip install "easylora[qlora]"   # adds bitsandbytes for 4-bit/8-bit quantisation
pip install "easylora[wandb]"   # adds Weights & Biases logging
pip install "easylora[dev]"     # adds ruff, pyright, pytest, mkdocs, pre-commit
pip install "easylora[all]"     # everything

For development from source:

git clone https://github.com/alexsuw/easylora.git
cd easylora
pip install -e ".[dev]"

Quickstart (Python)

from easylora import train, TrainConfig
from easylora.config import ModelConfig, DataConfig

config = TrainConfig(
    model=ModelConfig(base_model="meta-llama/Llama-3.2-1B"),
    data=DataConfig(
        dataset_name="tatsu-lab/alpaca",
        format="alpaca",
        max_seq_len=2048,
    ),
)
artifacts = train(config)
print(f"Adapter saved to: {artifacts.adapter_dir}")

QLoRA (4-bit)

config = TrainConfig(
    model=ModelConfig(base_model="meta-llama/Llama-3.2-1B", load_in_4bit=True),
    data=DataConfig(dataset_name="tatsu-lab/alpaca", format="alpaca"),
)
artifacts = train(config)

Quickstart (CLI)

# Generate a starter config
easylora init-config --template sft-lora

# Train
easylora train --config easylora_config.yaml

# Validate config without training
easylora train --config config.yaml --dry-run

# Evaluate
easylora eval --base-model meta-llama/Llama-3.2-1B --adapter-dir ./output/adapter --dataset eval.jsonl

# Merge adapter into base model
easylora merge --base-model meta-llama/Llama-3.2-1B --adapter-dir ./output/adapter --output-dir ./merged

# Check environment
easylora doctor

Config Reference

Config files use YAML or JSON. See the full reference.

model:
  base_model: "meta-llama/Llama-3.2-1B"
  torch_dtype: "auto"
data:
  dataset_name: "tatsu-lab/alpaca"
  format: "alpaca"
  max_seq_len: 2048
lora:
  r: 16
  alpha: 32
  target_modules: "auto"
training:
  epochs: 3
  batch_size: 4
  grad_accum: 4
  gradient_checkpointing: true
output:
  output_dir: "./output"
repro:
  seed: 42

Model Compatibility

easylora auto-detects LoRA target modules for 16+ architectures:

Family Models
LLaMA LLaMA 1/2/3, Code Llama, Vicuna
Mistral Mistral, Mixtral
Qwen Qwen, Qwen2
Google Gemma, Gemma 2
Microsoft Phi-2, Phi-3
Others Falcon, GPT-NeoX, Pythia, MPT, Bloom, OPT, GPT-2, StarCoder

For unknown architectures, easylora scans the model for nn.Linear layers and selects attention-like modules automatically. Use easylora inspect-targets --model <id> to preview what would be selected.

Merging Adapters

from easylora import merge_adapter

merge_adapter(
    base_model_name_or_path="meta-llama/Llama-3.2-1B",
    adapter_dir="./output/adapter",
    output_dir="./merged_model",
)

The merged model loads with AutoModelForCausalLM.from_pretrained without PEFT.

Dataset Formats

Format Columns Description
raw text Single text field for language modelling
alpaca instruction, input (optional), output Instruction-following with prompt masking
chatml messages Chat messages with role/content dicts

Output Artifacts

output/
  adapter/           # LoRA adapter weights
  train_config.json  # Config used for this run
  train_log.jsonl    # Step-by-step training metrics
  summary.json       # Final loss, steps, runtime
  metadata.json      # Base model, versions, timestamp
  logs.jsonl         # Application logs

Troubleshooting

Issue Solution
bitsandbytes not installed pip install bitsandbytes (CUDA required)
CUDA OOM Reduce batch_size, increase grad_accum, enable gradient_checkpointing, use QLoRA
pad_token was None Handled automatically (set to eos_token)
Output dir exists Use --force or allow_overwrite: true

Run easylora doctor for environment diagnostics.

Running Tests

pip install -e ".[dev]"
make test          # fast tests
make test-slow     # includes smoke training

Contributing

Contributions are welcome. See CONTRIBUTING.md for dev setup, code style, and the PR process.

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

easylora-0.1.1.tar.gz (35.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

easylora-0.1.1-py3-none-any.whl (40.8 kB view details)

Uploaded Python 3

File details

Details for the file easylora-0.1.1.tar.gz.

File metadata

  • Download URL: easylora-0.1.1.tar.gz
  • Upload date:
  • Size: 35.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for easylora-0.1.1.tar.gz
Algorithm Hash digest
SHA256 d858cbdc161f74b4f1e30b30ee214fce0cba819c68e420bbb41ee2c64c466495
MD5 5e4d613788d77d285aa25a6affbb764c
BLAKE2b-256 9ca3dfbb25322bfa528934541ec2f98bb4b6c29cb32fa99a009450821c49c31b

See more details on using hashes here.

Provenance

The following attestation bundles were made for easylora-0.1.1.tar.gz:

Publisher: release.yml on alexsuw/easylora

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easylora-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: easylora-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 40.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for easylora-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6afe98f404643482bbc9ece98e3f773901bbe7d7ca8954095fb9aa5a78e896cf
MD5 9347cb3b559ac0d31b5ea793862de06b
BLAKE2b-256 ec6f43c6b95c0e606be375033e8dff1ce34e788bd70c60a4d7e9139f128b9483

See more details on using hashes here.

Provenance

The following attestation bundles were made for easylora-0.1.1-py3-none-any.whl:

Publisher: release.yml on alexsuw/easylora

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page