# 🔍 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 ![Web App Screenshot](https://via.placeholder.com/800x400?text=Web+App+Interface) ### 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 ⭐!