mirror of
https://github.com/MartinGia/lora-analyzer.git
synced 2026-06-13 10:45:16 +02:00
385 lines
9.7 KiB
Markdown
385 lines
9.7 KiB
Markdown
# 🔍 LoRA Analyzer
|
|
|
|
Herramienta completa para analizar archivos LoRA (Low-Rank Adaptation) y descubrir cómo fueron entrenados.
|
|
|
|
## 🌟 Características
|
|
|
|
- ✅ **Análisis completo** de arquitectura LoRA (rank, alpha, capas)
|
|
- ✅ **Extracción de metadatos** de entrenamiento
|
|
- ✅ **Estadísticas de pesos** y distribuciones
|
|
- ✅ **Comparación** de múltiples LoRAs
|
|
- ✅ **Recomendaciones** para optimización
|
|
- ✅ **3 interfaces diferentes**: CLI, Web App y API REST
|
|
|
|
## 📁 Formatos Soportados
|
|
|
|
- `.safetensors` (recomendado)
|
|
- `.pt` / `.pth` (PyTorch)
|
|
- `.ckpt` (Checkpoints)
|
|
|
|
## 🚀 Instalación Rápida
|
|
|
|
```bash
|
|
# Clonar o descargar los archivos
|
|
cd lora-analyzer
|
|
|
|
# Instalar dependencias
|
|
pip install -r requirements.txt
|
|
|
|
# ¡Listo para usar!
|
|
```
|
|
|
|
### Instalación opcional de PyTorch
|
|
|
|
Si no tienes PyTorch instalado, usa:
|
|
|
|
```bash
|
|
# CPU only
|
|
pip install torch --index-url https://download.pytorch.org/whl/cpu
|
|
|
|
# CUDA (GPU)
|
|
pip install torch --index-url https://download.pytorch.org/whl/cu118
|
|
```
|
|
|
|
## 💻 Uso
|
|
|
|
### 1️⃣ CLI (Línea de Comandos)
|
|
|
|
La forma más rápida para análisis desde terminal:
|
|
|
|
```bash
|
|
# Analizar un archivo
|
|
python lora_cli.py mi_lora.safetensors
|
|
|
|
# Analizar múltiples archivos
|
|
python lora_cli.py lora1.safetensors lora2.pt lora3.ckpt
|
|
|
|
# Guardar resultado en JSON
|
|
python lora_cli.py mi_lora.safetensors --output resultado.json
|
|
|
|
# Comparar múltiples LoRAs
|
|
python lora_cli.py lora1.safetensors lora2.safetensors --compare
|
|
|
|
# Modo verbose
|
|
python lora_cli.py mi_lora.safetensors --verbose
|
|
|
|
# Ver ayuda
|
|
python lora_cli.py --help
|
|
```
|
|
|
|
**Ejemplo de salida:**
|
|
```
|
|
🔍 Analizando: my_style_lora.safetensors
|
|
======================================================================
|
|
REPORTE DE ANÁLISIS LORA
|
|
======================================================================
|
|
|
|
📁 INFORMACIÓN DEL ARCHIVO:
|
|
Nombre: my_style_lora.safetensors
|
|
Tamaño: 144.2 MB
|
|
Formato: .safetensors
|
|
|
|
🏗️ ARQUITECTURA:
|
|
Total de capas: 192
|
|
Rank más común: 32
|
|
Rango de ranks: 32 - 32
|
|
|
|
⚙️ METADATOS DE ENTRENAMIENTO:
|
|
Modelo base: sd_xl_base_1.0.safetensors
|
|
Network dim (rank): 32
|
|
Alpha: 32
|
|
Learning rate: 0.0001
|
|
Épocas: 10
|
|
Imágenes de entrenamiento: 45
|
|
Batch size: 1
|
|
Resolución: 1024
|
|
|
|
💡 RECOMENDACIONES:
|
|
1. Rank óptimo (32): Buen balance entre detalle y eficiencia.
|
|
2. Dataset mediano (45 imágenes): Bueno para conceptos específicos.
|
|
```
|
|
|
|
### 2️⃣ Web App (Interfaz Gráfica)
|
|
|
|
Interfaz visual con Gradio - ideal para uso interactivo:
|
|
|
|
```bash
|
|
# Iniciar la aplicación web
|
|
python lora_webapp.py
|
|
```
|
|
|
|
Luego abre tu navegador en: **http://localhost:7860**
|
|
|
|
**Funcionalidades:**
|
|
- 📤 Arrastrar y soltar archivos
|
|
- 📊 Vista de análisis con resumen visual
|
|
- 📈 Datos JSON completos
|
|
- ⚖️ Comparación lado a lado
|
|
- 💾 Exportar resultados
|
|
|
|

|
|
|
|
### 3️⃣ API REST
|
|
|
|
Servidor FastAPI para integración programática:
|
|
|
|
```bash
|
|
# Iniciar el servidor API
|
|
python lora_api.py
|
|
```
|
|
|
|
El servidor estará disponible en: **http://localhost:8000**
|
|
|
|
**Documentación interactiva:** http://localhost:8000/docs
|
|
|
|
#### Endpoints disponibles:
|
|
|
|
##### `POST /analyze` - Analizar un archivo
|
|
|
|
```bash
|
|
curl -X POST "http://localhost:8000/analyze" \
|
|
-H "Content-Type: multipart/form-data" \
|
|
-F "file=@mi_lora.safetensors"
|
|
```
|
|
|
|
```python
|
|
import requests
|
|
|
|
with open('mi_lora.safetensors', 'rb') as f:
|
|
response = requests.post(
|
|
'http://localhost:8000/analyze',
|
|
files={'file': f}
|
|
)
|
|
result = response.json()
|
|
print(result)
|
|
```
|
|
|
|
##### `POST /analyze/batch` - Analizar múltiples archivos
|
|
|
|
```python
|
|
import requests
|
|
|
|
files = [
|
|
('files', open('lora1.safetensors', 'rb')),
|
|
('files', open('lora2.safetensors', 'rb'))
|
|
]
|
|
response = requests.post(
|
|
'http://localhost:8000/analyze/batch',
|
|
files=files
|
|
)
|
|
print(response.json())
|
|
```
|
|
|
|
##### `POST /compare` - Comparar archivos
|
|
|
|
```bash
|
|
curl -X POST "http://localhost:8000/compare" \
|
|
-F "files=@lora1.safetensors" \
|
|
-F "files=@lora2.safetensors"
|
|
```
|
|
|
|
##### `GET /health` - Estado del servicio
|
|
|
|
```bash
|
|
curl http://localhost:8000/health
|
|
```
|
|
|
|
##### `GET /examples` - Ver más ejemplos
|
|
|
|
```bash
|
|
curl http://localhost:8000/examples
|
|
```
|
|
|
|
## 📊 Información que Puedes Extraer
|
|
|
|
### ✅ Lo que SÍ puedes obtener:
|
|
|
|
- **Arquitectura completa**
|
|
- Dimensión de rank (8, 16, 32, 64, 128, etc.)
|
|
- Factor alpha de escalado
|
|
- Capas modificadas (attention blocks, MLP, etc.)
|
|
- Total de parámetros
|
|
|
|
- **Metadatos de entrenamiento** (si están incluidos)
|
|
- Modelo base utilizado (SD 1.5, SDXL, etc.)
|
|
- Learning rate
|
|
- Número de epochs
|
|
- Batch size
|
|
- Resolución de entrenamiento
|
|
- Número de imágenes de entrenamiento
|
|
- Herramienta usada (Kohya, EveryDream, etc.)
|
|
|
|
- **Estadísticas de pesos**
|
|
- Distribución de valores
|
|
- Media y desviación estándar
|
|
- Intensidad por capa
|
|
|
|
### ❌ Lo que NO puedes recuperar:
|
|
|
|
- **Los datos de entrenamiento originales** - Técnicamente imposible
|
|
- **Imágenes específicas del dataset** - No están almacenadas en el LoRA
|
|
- **Prompts exactos usados** - Solo si están en metadatos
|
|
|
|
## 🎯 Casos de Uso
|
|
|
|
### 1. Ingeniería Inversa
|
|
```bash
|
|
# Analiza un LoRA público para aprender de él
|
|
python lora_cli.py awesome_public_lora.safetensors
|
|
|
|
# Compara con tu propio LoRA
|
|
python lora_cli.py awesome_public_lora.safetensors my_lora.safetensors --compare
|
|
```
|
|
|
|
### 2. Optimización de tus LoRAs
|
|
```bash
|
|
# Analiza diferentes versiones para encontrar la mejor configuración
|
|
python lora_cli.py lora_v1_rank16.safetensors lora_v2_rank32.safetensors \
|
|
lora_v3_rank64.safetensors --compare
|
|
```
|
|
|
|
### 3. Debugging
|
|
```bash
|
|
# Verifica que tu LoRA se entrenó correctamente
|
|
python lora_cli.py my_new_lora.safetensors --verbose
|
|
```
|
|
|
|
### 4. Investigación
|
|
```python
|
|
# Analiza múltiples LoRAs programáticamente
|
|
import requests
|
|
import os
|
|
|
|
for filename in os.listdir('loras/'):
|
|
if filename.endswith('.safetensors'):
|
|
with open(f'loras/{filename}', 'rb') as f:
|
|
response = requests.post(
|
|
'http://localhost:8000/analyze',
|
|
files={'file': f}
|
|
)
|
|
result = response.json()
|
|
# Procesar resultados...
|
|
```
|
|
|
|
## 🔧 Uso Programático
|
|
|
|
### Como módulo Python
|
|
|
|
```python
|
|
from lora_analyzer import LoRAAnalyzer, format_analysis_report
|
|
|
|
# Analizar un archivo
|
|
analyzer = LoRAAnalyzer('mi_lora.safetensors')
|
|
analysis = analyzer.analyze()
|
|
|
|
# Ver reporte formateado
|
|
print(format_analysis_report(analysis))
|
|
|
|
# Acceder a datos específicos
|
|
rank = analysis['architecture']['rank_info']['most_common_rank']
|
|
print(f"Rank detectado: {rank}")
|
|
|
|
# Extraer metadatos
|
|
metadata = analysis['metadata']
|
|
learning_rate = metadata.get('ss_learning_rate', 'N/A')
|
|
print(f"Learning rate: {learning_rate}")
|
|
```
|
|
|
|
## 📦 Estructura del Proyecto
|
|
|
|
```
|
|
lora-analyzer/
|
|
├── lora_analyzer.py # Módulo core de análisis
|
|
├── lora_cli.py # Aplicación CLI
|
|
├── lora_webapp.py # Aplicación Web (Gradio)
|
|
├── lora_api.py # API REST (FastAPI)
|
|
├── requirements.txt # Dependencias
|
|
└── README.md # Esta documentación
|
|
```
|
|
|
|
## 🛠️ Requisitos del Sistema
|
|
|
|
- Python 3.8 o superior
|
|
- 4GB RAM mínimo (8GB recomendado)
|
|
- Espacio en disco: ~2GB para dependencias
|
|
|
|
## ⚙️ Configuración Avanzada
|
|
|
|
### Cambiar puertos
|
|
|
|
**Web App:**
|
|
```python
|
|
# En lora_webapp.py, línea 249
|
|
app.launch(server_port=8080) # Cambiar de 7860 a 8080
|
|
```
|
|
|
|
**API:**
|
|
```python
|
|
# En lora_api.py, línea 360
|
|
uvicorn.run(app, host="0.0.0.0", port=9000) # Cambiar de 8000 a 9000
|
|
```
|
|
|
|
### Análisis de archivos grandes
|
|
|
|
Para LoRAs muy grandes (>1GB):
|
|
|
|
```python
|
|
# Aumentar límite de análisis de capas
|
|
analyzer = LoRAAnalyzer('huge_lora.safetensors')
|
|
# Modifica _analyze_weights para analizar más capas
|
|
```
|
|
|
|
## 🤝 Contribuciones
|
|
|
|
Las contribuciones son bienvenidas! Para reportar bugs o sugerir features, abre un issue.
|
|
|
|
## 📝 Notas Importantes
|
|
|
|
1. **Privacidad**: Todo el análisis se hace localmente. No se envía información a servidores externos.
|
|
|
|
2. **Rendimiento**: El análisis de archivos grandes puede tomar tiempo. La CLI es más rápida que la Web App.
|
|
|
|
3. **Compatibilidad**: Diseñado principalmente para LoRAs de Stable Diffusion, pero puede funcionar con otros tipos.
|
|
|
|
4. **Metadatos**: La cantidad de información disponible depende de cómo fue guardado el LoRA. LoRAs entrenados con Kohya suelen tener más metadatos.
|
|
|
|
## 🔮 Roadmap
|
|
|
|
- [ ] Soporte para análisis de LoRAs de LLMs
|
|
- [ ] Visualización de distribución de pesos
|
|
- [ ] Detección automática de estilo/concepto
|
|
- [ ] Base de datos para indexar LoRAs analizados
|
|
- [ ] Exportar reportes en PDF
|
|
- [ ] Integración con Hugging Face Hub
|
|
|
|
## 📄 Licencia
|
|
|
|
Este proyecto es de código abierto y está disponible bajo la licencia MIT.
|
|
|
|
## ❓ FAQ
|
|
|
|
**P: ¿Puedo recuperar las imágenes con las que se entrenó el LoRA?**
|
|
R: No, es técnicamente imposible. Los pesos del modelo son el resultado de la optimización, pero no contienen los datos originales.
|
|
|
|
**P: ¿Funciona con cualquier tipo de LoRA?**
|
|
R: Está optimizado para LoRAs de Stable Diffusion, pero puede analizar cualquier LoRA en formato safetensors o PyTorch.
|
|
|
|
**P: ¿Por qué algunos metadatos no aparecen?**
|
|
R: Depende de cómo fue guardado el archivo. Usa herramientas como Kohya que incluyen metadatos extensos.
|
|
|
|
**P: ¿Puedo usar esto para crear LoRAs mejores?**
|
|
R: Sí! Analiza LoRAs exitosos para aprender qué configuraciones funcionan mejor para diferentes casos de uso.
|
|
|
|
**P: ¿Es seguro analizar LoRAs de fuentes desconocidas?**
|
|
R: El análisis es seguro, pero ten cuidado al cargar pesos en un modelo. Los archivos .pt y .ckpt pueden contener código malicioso.
|
|
|
|
## 🙏 Agradecimientos
|
|
|
|
Desarrollado para la comunidad de ML y entusiastas de LoRA.
|
|
|
|
---
|
|
|
|
**¿Preguntas o problemas?** Abre un issue en el repositorio.
|
|
|
|
**¿Te resultó útil?** ¡Dale una estrella ⭐!
|