{"id":36223817,"url":"https://github.com/tzervas/peft-rs","last_synced_at":"2026-01-28T22:05:31.593Z","repository":{"id":331774311,"uuid":"1129034130","full_name":"tzervas/peft-rs","owner":"tzervas","description":"Rust PEFT adapter library: LoRA, prefix tuning, prompt tuning for LLM fine-tuning","archived":false,"fork":false,"pushed_at":"2026-01-25T13:27:18.000Z","size":129,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-25T16:53:59.124Z","etag":null,"topics":["fine-tuning","lora","machine-learning","peft","rust"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tzervas.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-06T14:11:15.000Z","updated_at":"2026-01-25T13:27:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tzervas/peft-rs","commit_stats":null,"previous_names":["tzervas/peft-rs"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/tzervas/peft-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tzervas%2Fpeft-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tzervas%2Fpeft-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tzervas%2Fpeft-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tzervas%2Fpeft-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tzervas","download_url":"https://codeload.github.com/tzervas/peft-rs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tzervas%2Fpeft-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28853196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fine-tuning","lora","machine-learning","peft","rust"],"created_at":"2026-01-11T05:02:42.487Z","updated_at":"2026-01-28T22:05:31.574Z","avatar_url":"https://github.com/tzervas.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# peft-rs\n\nComprehensive PEFT (Parameter-Efficient Fine-Tuning) adapter library for Rust.\n\n[![Crates.io](https://img.shields.io/crates/v/peft-rs.svg)](https://crates.io/crates/peft-rs)\n[![Documentation](https://docs.rs/peft-rs/badge.svg)](https://docs.rs/peft-rs)\n[![License](https://img.shields.io/crates/l/peft-rs.svg)](LICENSE-MIT)\n\n## Overview\n\n`peft-rs` provides modular implementations of various PEFT methods for fine-tuning large language models efficiently:\n\n- **LoRA** (Low-Rank Adaptation) - Decomposes weight updates into low-rank matrices\n- **DoRA** (Weight-Decomposed Low-Rank Adaptation) - Magnitude and direction decomposition\n- **AdaLoRA** (Adaptive Low-Rank Adaptation) - Dynamic rank allocation with SVD parameterization\n- **IA³** (Infused Adapter by Inhibiting and Amplifying) - Learned rescaling vectors\n- **LoHa** (Low-Rank Hadamard Product) - Hadamard product of two low-rank matrices\n- **LoKr** (Low-Rank Kronecker Product) - Kronecker product decomposition\n- **OFT** (Orthogonal Fine-Tuning) - Block-diagonal orthogonal transformations\n- **BOFT** (Butterfly Orthogonal Fine-Tuning) - Butterfly factorization for efficient orthogonal transforms\n- **VeRA** (Vector-based Random Matrix Adaptation) - Ultra-efficient with frozen random matrices\n- **Prefix Tuning** - Prepends trainable vectors to attention keys/values\n- **Prompt Tuning** - Adds learnable soft prompt embeddings\n\n## Features\n\n- 🦀 Pure Rust implementation using [candle](https://github.com/huggingface/candle)\n- 🔌 Modular adapter design with common traits\n- 📦 Easy integration with existing models\n- ⚡ Optional CUDA acceleration\n- 📊 Minimal memory overhead\n\n## Installation\n\nAdd to your `Cargo.toml`:\n\n```toml\n[dependencies]\npeft-rs = \"0.1\"\n```\n\nFor CUDA support:\n\n```toml\n[dependencies]\npeft-rs = { version = \"0.1\", features = [\"cuda\"] }\n```\n\n## Quick Start\n\n### LoRA Example\n\n```rust\nuse peft_rs::{LoraConfig, LoraLayer};\nuse candle_core::{Device, Tensor, DType};\n\nfn main() -\u003e anyhow::Result\u003c()\u003e {\n    let device = Device::Cpu;\n    \n    // Configure LoRA\n    let config = LoraConfig {\n        r: 8,           // Rank\n        alpha: 16,      // Scaling factor\n        dropout: 0.0,\n        ..Default::default()\n    };\n    \n    // Create LoRA layer for a 768-dim linear layer\n    let lora = LoraLayer::new_with_zeros(768, 768, config, \u0026device)?;\n    \n    // Forward pass\n    let input = Tensor::randn(0.0, 1.0, (1, 10, 768), \u0026device)?;\n    let base_output = Tensor::zeros(\u0026[1, 10, 768], DType::F32, \u0026device)?;\n    let output = lora.forward(\u0026input, Some(\u0026base_output))?;\n    \n    println!(\"Output shape: {:?}\", output.shape());\n    println!(\"Trainable parameters: {}\", lora.num_parameters());\n    \n    Ok(())\n}\n```\n\n### Prompt Tuning Example\n\n```rust\nuse peft_rs::{PromptTuningConfig, PromptTuningLayer};\nuse candle_core::{Device, Tensor, DType};\n\nfn main() -\u003e anyhow::Result\u003c()\u003e {\n    let device = Device::Cpu;\n    \n    let config = PromptTuningConfig {\n        num_virtual_tokens: 20,\n        hidden_size: 768,\n        ..Default::default()\n    };\n    \n    let prompt_tuning = PromptTuningLayer::new(config, \u0026device)?;\n    \n    // Prepend soft prompts to input embeddings\n    let input_embeds = Tensor::zeros(\u0026[2, 100, 768], DType::F32, \u0026device)?;\n    let output = prompt_tuning.prepend_to_input(\u0026input_embeds)?;\n    \n    // Output: [2, 120, 768] (20 virtual tokens + 100 input tokens)\n    println!(\"Output shape: {:?}\", output.shape());\n    \n    Ok(())\n}\n```\n\n## Saving and Loading Adapters\n\nAdapters can be saved and loaded using safetensors format:\n\n```rust\nuse peft_rs::{LoraLayer, save_adapter_weights, load_adapter_weights, save_adapter_config, load_adapter_config};\n\n// Save adapter weights and config\nsave_adapter_weights(\u0026lora_layer, \"adapter_weights.safetensors\")?;\nsave_adapter_config(\u0026config, \"adapter_config.json\")?;\n\n// Load adapter weights and config\nlet loaded_config = load_adapter_config(\"adapter_config.json\")?;\nlet mut loaded_layer = LoraLayer::new_with_zeros(768, 768, loaded_config, \u0026device)?;\nload_adapter_weights(\u0026mut loaded_layer, \"adapter_weights.safetensors\", \u0026device)?;\n```\n\n## Multi-Adapter Support\n\nManage multiple adapters and switch between them at runtime:\n\n```rust\nuse peft_rs::{AdapterRegistry, LoraLayer, LoraConfig};\n\n// Create registry\nlet mut registry = AdapterRegistry::new();\n\n// Register multiple adapters\nlet task1_adapter = LoraLayer::new_with_zeros(768, 768, config1, \u0026device)?;\nlet task2_adapter = LoraLayer::new_with_zeros(768, 768, config2, \u0026device)?;\n\nregistry.register_adapter(\"task1\", task1_adapter)?;\nregistry.register_adapter(\"task2\", task2_adapter)?;\n\n// Switch between adapters\nregistry.set_active_adapter(\"task1\")?;\nlet output1 = registry.forward(\u0026input, None)?;\n\nregistry.set_active_adapter(\"task2\")?;\nlet output2 = registry.forward(\u0026input, None)?;\n\n// Access specific adapters\nlet task1 = registry.get_adapter(\"task1\")?;\n```\n\n## Architecture\n\nAll adapters implement common traits for consistent usage:\n\n```rust\npub trait Adapter {\n    type Config: AdapterConfig;\n    \n    fn forward(\u0026self, input: \u0026Tensor, base_output: Option\u003c\u0026Tensor\u003e) -\u003e Result\u003cTensor\u003e;\n    fn num_parameters(\u0026self) -\u003e usize;\n    fn config(\u0026self) -\u003e \u0026Self::Config;\n}\n\npub trait Mergeable: Adapter {\n    fn merge(\u0026self, base_weight: \u0026Tensor) -\u003e Result\u003cTensor\u003e;\n    fn unmerge(\u0026self, merged_weight: \u0026Tensor) -\u003e Result\u003cTensor\u003e;\n}\n```\n\n## Comparison with Python PEFT\n\n| Feature | peft-rs | HuggingFace PEFT |\n|---------|---------|------------------|\n| LoRA | ✅ | ✅ |\n| DoRA | ✅ | ✅ |\n| AdaLoRA | ✅ | ✅ |\n| IA³ | ✅ | ✅ |\n| LoHa | ✅ | ✅ |\n| LoKr | ✅ | ✅ |\n| OFT | ✅ | ✅ |\n| BOFT | ✅ | ✅ |\n| VeRA | ✅ | ✅ |\n| Prefix Tuning | ✅ | ✅ |\n| Prompt Tuning | ✅ | ✅ |\n| Weight merging | ✅ | ✅ |\n| Weight saving/loading | ✅ | ✅ |\n| Multi-adapter support | ✅ | ✅ |\n| CUDA support | ✅ | ✅ |\n| No Python runtime | ✅ | ❌ |\n\n## Contributing\n\nContributions welcome! See [docs/GAP_ANALYSIS.md](docs/GAP_ANALYSIS.md) for planned features and [docs/TASK_TRACKER.md](docs/TASK_TRACKER.md) for implementation status.\n\n## License\n\nMIT Licensed - see [LICENSE-MIT](LICENSE-MIT) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftzervas%2Fpeft-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftzervas%2Fpeft-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftzervas%2Fpeft-rs/lists"}