mirror of
https://github.com/MartinGia/lora-analyzer.git
synced 2026-05-06 13:32:56 +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 ⭐!
|