git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
339 lines
9.0 KiB
Markdown
339 lines
9.0 KiB
Markdown
# HuggingFace Hub Integration for RuvLTRA
|
|
|
|
This document describes the HuggingFace Hub integration for publishing and downloading RuvLTRA models.
|
|
|
|
## Overview
|
|
|
|
The `ruvllm::hub` module provides comprehensive functionality for:
|
|
|
|
1. **Model Download**: Pull GGUF files from HuggingFace Hub with progress tracking and resume support
|
|
2. **Model Upload**: Push models to HuggingFace Hub with automatic model card generation
|
|
3. **Model Registry**: Pre-configured RuvLTRA model collection with hardware requirements
|
|
4. **Progress Tracking**: Visual progress bars with ETA and speed indicators
|
|
5. **Checksum Verification**: SHA256 validation for downloaded files
|
|
|
|
## Module Structure
|
|
|
|
```
|
|
crates/ruvllm/src/hub/
|
|
├── mod.rs # Main module with exports and common types
|
|
├── download.rs # Model download functionality
|
|
├── upload.rs # Model upload functionality
|
|
├── registry.rs # RuvLTRA model registry
|
|
├── model_card.rs # HuggingFace model card generation
|
|
└── progress.rs # Progress tracking utilities
|
|
```
|
|
|
|
## Model Registry
|
|
|
|
The registry includes pre-configured RuvLTRA models:
|
|
|
|
### Base Models
|
|
|
|
| Model ID | Size | Params | Quantization | Use Case |
|
|
|----------|------|--------|--------------|----------|
|
|
| `ruvltra-small` | 662MB | 0.5B | Q4_K_M | Edge devices, includes SONA weights |
|
|
| `ruvltra-small-q8` | 1.3GB | 0.5B | Q8_0 | High quality, small model |
|
|
| `ruvltra-medium` | 2.1GB | 3B | Q4_K_M | General purpose, extended context |
|
|
| `ruvltra-medium-q8` | 4.2GB | 3B | Q8_0 | High quality, balanced model |
|
|
|
|
### LoRA Adapters
|
|
|
|
| Adapter ID | Size | Base Model | Purpose |
|
|
|------------|------|------------|---------|
|
|
| `ruvltra-small-coder` | 50MB | ruvltra-small | Code completion specialization |
|
|
|
|
## Usage
|
|
|
|
### 1. Model Download
|
|
|
|
#### Using the CLI Example
|
|
|
|
```bash
|
|
# Download RuvLTRA Small
|
|
cargo run -p ruvllm --example hub_cli -- pull ruvltra-small
|
|
|
|
# Download to custom directory
|
|
cargo run -p ruvllm --example hub_cli -- pull ruvltra-medium --output ./models
|
|
|
|
# List all available models
|
|
cargo run -p ruvllm --example hub_cli -- list
|
|
|
|
# Show detailed model info
|
|
cargo run -p ruvllm --example hub_cli -- info ruvltra-small
|
|
```
|
|
|
|
#### Using the API
|
|
|
|
```rust
|
|
use ruvllm::hub::{ModelDownloader, RuvLtraRegistry};
|
|
|
|
// Download by model ID
|
|
let downloader = ModelDownloader::new();
|
|
let path = downloader.download_by_id("ruvltra-small")?;
|
|
|
|
// Or download with custom config
|
|
let registry = RuvLtraRegistry::new();
|
|
let model_info = registry.get("ruvltra-small").unwrap();
|
|
|
|
let config = DownloadConfig {
|
|
cache_dir: PathBuf::from("./models"),
|
|
resume: true,
|
|
show_progress: true,
|
|
verify_checksum: true,
|
|
..Default::default()
|
|
};
|
|
|
|
let downloader = ModelDownloader::with_config(config);
|
|
let path = downloader.download(model_info, None)?;
|
|
```
|
|
|
|
### 2. Model Upload
|
|
|
|
#### Using the CLI Example
|
|
|
|
```bash
|
|
# Upload a custom model (requires HF_TOKEN)
|
|
export HF_TOKEN=your_huggingface_token
|
|
|
|
cargo run -p ruvllm --example hub_cli -- push \
|
|
--model ./my-ruvltra-custom.gguf \
|
|
--repo username/my-ruvltra-custom \
|
|
--description "My custom RuvLTRA model" \
|
|
--params 0.5 \
|
|
--architecture llama \
|
|
--context 4096 \
|
|
--quant Q4_K_M
|
|
```
|
|
|
|
#### Using the API
|
|
|
|
```rust
|
|
use ruvllm::hub::{ModelUploader, ModelMetadata, UploadConfig};
|
|
|
|
// Create metadata
|
|
let metadata = ModelMetadata {
|
|
name: "My RuvLTRA Model".to_string(),
|
|
description: Some("A custom RuvLTRA variant".to_string()),
|
|
architecture: "llama".to_string(),
|
|
params_b: 0.5,
|
|
context_length: 4096,
|
|
quantization: Some("Q4_K_M".to_string()),
|
|
license: Some("MIT".to_string()),
|
|
datasets: vec!["custom-dataset".to_string()],
|
|
tags: vec!["ruvltra".to_string(), "custom".to_string()],
|
|
};
|
|
|
|
// Configure uploader
|
|
let config = UploadConfig::new(hf_token)
|
|
.private(false)
|
|
.commit_message("Upload custom RuvLTRA model");
|
|
|
|
let uploader = ModelUploader::with_config(config);
|
|
let url = uploader.upload(
|
|
"./my-model.gguf",
|
|
"username/my-ruvltra-custom",
|
|
Some(metadata),
|
|
)?;
|
|
|
|
println!("Model uploaded to: {}", url);
|
|
```
|
|
|
|
### 3. Model Registry
|
|
|
|
```rust
|
|
use ruvllm::hub::{RuvLtraRegistry, ModelSize};
|
|
|
|
let registry = RuvLtraRegistry::new();
|
|
|
|
// Get a specific model
|
|
let model = registry.get("ruvltra-small").unwrap();
|
|
println!("Model: {}", model.name);
|
|
println!("Size: {} MB", model.size_bytes / (1024 * 1024));
|
|
|
|
// List all models
|
|
for model in registry.list_all() {
|
|
println!("{}: {}", model.id, model.description);
|
|
}
|
|
|
|
// List by size category
|
|
for model in registry.list_by_size(ModelSize::Small) {
|
|
println!("Small model: {}", model.id);
|
|
}
|
|
|
|
// Get adapters for a base model
|
|
for adapter in registry.list_adapters("ruvltra-small") {
|
|
println!("Adapter: {}", adapter.id);
|
|
}
|
|
|
|
// Recommend model based on available RAM
|
|
let model = registry.recommend_for_ram(4.0).unwrap();
|
|
println!("Recommended for 4GB RAM: {}", model.id);
|
|
```
|
|
|
|
### 4. Model Card Generation
|
|
|
|
```rust
|
|
use ruvllm::hub::{
|
|
ModelCardBuilder, TaskType, Framework, License
|
|
};
|
|
|
|
let card = ModelCardBuilder::new("RuvLTRA Custom")
|
|
.description("A custom RuvLTRA variant")
|
|
.task(TaskType::TextGeneration)
|
|
.framework(Framework::Gguf)
|
|
.architecture("llama")
|
|
.parameters(500_000_000)
|
|
.context_length(4096)
|
|
.license(License::Mit)
|
|
.add_dataset("training-data", Some("Custom dataset".to_string()))
|
|
.add_metric("perplexity", 5.2, Some("test-set".to_string()))
|
|
.add_tag("ruvltra")
|
|
.add_tag("custom")
|
|
.build();
|
|
|
|
// Generate markdown for HuggingFace
|
|
let markdown = card.to_markdown();
|
|
```
|
|
|
|
### 5. Progress Tracking
|
|
|
|
```rust
|
|
use ruvllm::hub::{ProgressBar, ProgressStyle};
|
|
|
|
let mut pb = ProgressBar::new(total_bytes)
|
|
.with_style(ProgressStyle::Detailed)
|
|
.with_width(50);
|
|
|
|
// Update progress
|
|
pb.update(downloaded_bytes);
|
|
|
|
// Finish
|
|
pb.finish();
|
|
```
|
|
|
|
## Hardware Requirements
|
|
|
|
Each model in the registry includes hardware requirements:
|
|
|
|
```rust
|
|
let model = registry.get("ruvltra-small").unwrap();
|
|
|
|
println!("Minimum RAM: {:.1} GB", model.hardware.min_ram_gb);
|
|
println!("Recommended RAM: {:.1} GB", model.hardware.recommended_ram_gb);
|
|
println!("Apple Neural Engine: {}", model.hardware.supports_ane);
|
|
println!("Metal GPU: {}", model.hardware.supports_metal);
|
|
println!("CUDA: {}", model.hardware.supports_cuda);
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
- `HF_TOKEN`: HuggingFace API token (required for uploads and private repos)
|
|
- `HUGGING_FACE_HUB_TOKEN`: Alternative name for HF token
|
|
- `RUVLLM_MODELS_DIR`: Default cache directory for downloaded models
|
|
|
|
## Dependencies
|
|
|
|
The hub integration requires:
|
|
|
|
- `curl` or `wget` for downloads (uses system tools for efficiency)
|
|
- `huggingface-cli` for uploads (install with `pip install huggingface_hub[cli]`)
|
|
- SHA256 for checksum verification (built-in via `sha2` crate)
|
|
|
|
## Features
|
|
|
|
### Download Features
|
|
|
|
- ✅ Resume interrupted downloads
|
|
- ✅ Progress bar with ETA
|
|
- ✅ SHA256 checksum verification
|
|
- ✅ Automatic retry on failure
|
|
- ✅ HuggingFace token authentication
|
|
- ✅ Cache directory management
|
|
|
|
### Upload Features
|
|
|
|
- ✅ Automatic repository creation
|
|
- ✅ Model card generation
|
|
- ✅ Public/private repository support
|
|
- ✅ SONA weights upload
|
|
- ✅ Custom metadata
|
|
- ✅ Commit message customization
|
|
|
|
### Registry Features
|
|
|
|
- ✅ Pre-configured model catalog
|
|
- ✅ Hardware requirement tracking
|
|
- ✅ Quantization level support
|
|
- ✅ LoRA adapter registry
|
|
- ✅ RAM-based recommendations
|
|
- ✅ Download time estimation
|
|
|
|
## Error Handling
|
|
|
|
All hub operations return `Result<T, HubError>`:
|
|
|
|
```rust
|
|
use ruvllm::hub::{HubError, ModelDownloader};
|
|
|
|
match downloader.download_by_id("ruvltra-small") {
|
|
Ok(path) => println!("Downloaded to: {}", path.display()),
|
|
Err(HubError::NotFound(id)) => eprintln!("Model {} not found", id),
|
|
Err(HubError::ChecksumMismatch { expected, actual }) => {
|
|
eprintln!("Checksum mismatch: expected {}, got {}", expected, actual);
|
|
}
|
|
Err(HubError::Network(msg)) => eprintln!("Network error: {}", msg),
|
|
Err(e) => eprintln!("Error: {}", e),
|
|
}
|
|
```
|
|
|
|
## Testing
|
|
|
|
Run the hub integration tests:
|
|
|
|
```bash
|
|
# Test model registry
|
|
cargo test -p ruvllm --lib hub::registry
|
|
|
|
# Test download (requires network)
|
|
cargo test -p ruvllm --lib hub::download
|
|
|
|
# Test model card generation
|
|
cargo test -p ruvllm --lib hub::model_card
|
|
|
|
# Run all hub tests
|
|
cargo test -p ruvllm --lib hub
|
|
```
|
|
|
|
## Examples
|
|
|
|
See the examples for complete usage:
|
|
|
|
1. `examples/download_test_model.rs` - Legacy downloader with hub integration
|
|
2. `examples/hub_cli.rs` - Full CLI with pull/push/list/info commands
|
|
|
|
## Future Enhancements
|
|
|
|
Planned improvements:
|
|
|
|
- [ ] Direct API uploads (without huggingface-cli dependency)
|
|
- [ ] Parallel chunk downloads for faster transfers
|
|
- [ ] Delta updates for model weights
|
|
- [ ] Model versioning support
|
|
- [ ] Automatic quantization variant selection
|
|
- [ ] Multi-repo synchronization
|
|
- [ ] Offline model registry cache
|
|
|
|
## Contributing
|
|
|
|
To add a new model to the registry:
|
|
|
|
1. Add model definition to `registry.rs` in `RuvLtraRegistry::new()`
|
|
2. Include hardware requirements
|
|
3. Set checksum after first upload
|
|
4. Update this documentation
|
|
|
|
## License
|
|
|
|
MIT License - See LICENSE file for details
|