llm-tuner 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.es.md +202 -125
- package/README.md +197 -120
- package/electron/launch.js +1 -0
- package/electron/main.js +50 -3
- package/electron/preload.cjs +8 -0
- package/electron/server-controls.js +69 -0
- package/package.json +1 -1
- package/src/cli/commands/help.js +1 -0
- package/src/cli/commands/load.js +82 -32
- package/src/cli/commands/mcp.js +16 -2
- package/src/cli/commands/presets.js +12 -2
- package/src/cli/commands/serve.js +59 -0
- package/src/cli/commands/settings.js +60 -5
- package/src/cli/router.js +32 -0
- package/src/cli/server-login.js +47 -0
- package/src/core/client.js +127 -0
- package/src/core/engines/ollama-service.js +158 -0
- package/src/core/engines/ollama.js +16 -23
- package/src/core/index.js +3 -2
- package/src/core/settings.js +50 -2
- package/src/core/tuner.js +2 -2
- package/src/core/util.js +26 -0
- package/src/i18n/en.js +59 -1
- package/src/i18n/es.js +59 -1
- package/src/platform/ollama-authorize.js +79 -0
- package/src/platform/server-autostart.js +187 -0
- package/src/web/public/app.js +149 -3
- package/src/web/public/index.html +57 -0
- package/src/web/public/server-settings.js +127 -0
- package/src/web/server.js +207 -17
package/README.es.md
CHANGED
|
@@ -6,89 +6,98 @@
|
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](package.json)
|
|
8
8
|
|
|
9
|
-
Carga un LLM local con la
|
|
9
|
+
Carga un LLM local con la configuración más rápida para el contexto que necesitas, en LM Studio u Ollama, en Windows, macOS y Linux. Tú eliges qué significa «mejor» mediante perfiles de carga deterministas: velocidad pura (`speed`), equilibrio (`balanced`) o máxima calidad de respuestas (`quality`).
|
|
10
10
|
|
|
11
|
-
Ningún LLM decide la configuración. LLM Tuner lee la topología de tu hardware y los metadatos GGUF del modelo, calcula matemáticamente qué cabe en la VRAM, mide empíricamente las mejores configuraciones candidatas en hardware real y guarda la ganadora como un **preset** persistente. La próxima vez que cargues ese modelo con
|
|
11
|
+
Ningún LLM decide la configuración. LLM Tuner lee la topología de tu hardware y los metadatos GGUF del modelo, calcula matemáticamente qué cabe en la VRAM, mide empíricamente las mejores configuraciones candidatas en hardware real y guarda la ganadora como un **preset** persistente. La próxima vez que cargues ese modelo con el mismo contexto y perfil, el preset se aplica de inmediato (~20 s) sin volver a medir.
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
## Tabla de contenidos
|
|
16
16
|
|
|
17
|
-
- [Características](#características)
|
|
17
|
+
- [Características principales](#características-principales)
|
|
18
18
|
- [Cómo funciona](#cómo-funciona)
|
|
19
19
|
- [Perfiles de carga](#perfiles-de-carga)
|
|
20
20
|
- [Instalación](#instalación)
|
|
21
21
|
- [Uso](#uso)
|
|
22
|
-
- [
|
|
22
|
+
- [CLI interactiva y comandos slash](#cli-interactiva-y-comandos-slash)
|
|
23
23
|
- [Aplicación de escritorio](#aplicación-de-escritorio)
|
|
24
|
+
- [Modo servidor remoto y daemon](#modo-servidor-remoto-y-daemon)
|
|
25
|
+
- [Integración MCP para agentes de IA](#integración-mcp-para-agentes-de-ia)
|
|
24
26
|
- [Modo CLI no interactivo](#modo-cli-no-interactivo)
|
|
25
|
-
- [Referencia de opciones CLI](#referencia-de-opciones-cli)
|
|
26
|
-
- [
|
|
27
|
-
- [
|
|
28
|
-
- [
|
|
29
|
-
- [Arquitectura del proyecto](#arquitectura-del-proyecto)
|
|
27
|
+
- [Referencia de opciones y banderas CLI](#referencia-de-opciones-y-banderas-cli)
|
|
28
|
+
- [Flujo de ajuste y medición](#flujo-de-ajuste-y-medición)
|
|
29
|
+
- [Arquitectura y rutas de almacenamiento](#arquitectura-y-rutas-de-almacenamiento)
|
|
30
|
+
- [Soporte por plataforma](#soporte-por-plataforma)
|
|
30
31
|
- [Desarrollo y pruebas](#desarrollo-y-pruebas)
|
|
31
|
-
- [
|
|
32
|
+
- [Solución de problemas y notas de plataforma](#solución-de-problemas-y-notas-de-plataforma)
|
|
32
33
|
- [Licencia](#licencia)
|
|
33
34
|
|
|
34
35
|
---
|
|
35
36
|
|
|
36
|
-
## Características
|
|
37
|
+
## Características principales
|
|
37
38
|
|
|
38
|
-
- **Optimización determinista**: Basada en metadatos
|
|
39
|
-
- **Detección
|
|
40
|
-
- **Perfiles de carga a medida**: Optimiza para velocidad
|
|
41
|
-
- **Soporte de motores locales**: Compatibilidad directa con LM Studio (
|
|
42
|
-
- **Presets persistentes**: Mide una
|
|
43
|
-
- **Doble interfaz**: Asistente en
|
|
44
|
-
- **
|
|
45
|
-
- **
|
|
39
|
+
- **Optimización determinista**: Basada en metadatos de tensores GGUF, mediciones de ancho de banda PCIe y pruebas reales de generación de tokens, sin que ninguna IA adivine parámetros.
|
|
40
|
+
- **Detección multi-GPU y topología**: Reparte capas inteligentemente entre múltiples GPUs, priorizando las tarjetas con mayor enlace PCIe y sin monitor conectado.
|
|
41
|
+
- **Perfiles de carga a medida**: Optimiza para velocidad máxima (`speed`), velocidad ponderada por calidad (`balanced`) o retención íntegra en GPU sin pérdidas (`quality`).
|
|
42
|
+
- **Soporte de motores locales**: Compatibilidad directa con LM Studio (gestión de `llama-server`) y Ollama (servidores de prueba aislados e integración con servicios del sistema).
|
|
43
|
+
- **Presets persistentes**: Mide una sola vez por huella de hardware, modelo, contexto y perfil. Invalida automáticamente el preset si cambia el hardware o el archivo del modelo.
|
|
44
|
+
- **Doble interfaz**: Asistente interactivo en terminal (`llm-tuner`) e interfaz gráfica multiplataforma (`llm-tuner-desktop`).
|
|
45
|
+
- **Modo servidor remoto y daemon**: Ejecuta `llm-tuner /serve` en un servidor con GPUs dedicadas con autenticación Bearer segura (`timingSafeEqual`) y telemetría sanitizada, y contrólalo desde cualquier cliente CLI o de escritorio.
|
|
46
|
+
- **Integración MCP para agentes de IA**: Conecta tus motores locales o remotos (LM Studio, Ollama) como servidores Model Context Protocol (MCP) en Claude Desktop, Claude Code, OpenCode, Antigravity, VS Code y ChatGPT/Codex.
|
|
47
|
+
- **Bilingüe**: Localización completa en inglés (`en`) y español (`es`) tanto en terminal como en escritorio.
|
|
46
48
|
|
|
47
49
|
---
|
|
48
50
|
|
|
49
51
|
## Cómo funciona
|
|
50
52
|
|
|
51
|
-
1. **
|
|
52
|
-
2. **Modelo y contexto**:
|
|
53
|
-
3. **Perfil de carga**: Eliges
|
|
54
|
-
4. **
|
|
55
|
-
- **
|
|
56
|
-
- **Sin preset**: Descarga modelos previos para liberar VRAM,
|
|
53
|
+
1. **Selección de motor**: Eliges LM Studio u Ollama. Si ninguno está instalado, LLM Tuner ofrece planes de instalación oficiales.
|
|
54
|
+
2. **Modelo y contexto**: Seleccionas cualquiera de tus modelos descargados y defines la ventana de contexto deseada (entre `512` y el límite de entrenamiento del modelo, p. ej. `16384` tokens).
|
|
55
|
+
3. **Perfil de carga**: Eliges entre `speed`, `balanced` (predeterminado) o `quality`. El planificador recomienda el perfil de mayor calidad que cabe íntegramente en la VRAM libre.
|
|
56
|
+
4. **Carga y medición**:
|
|
57
|
+
- **Con preset existente**: Si ya existe un preset válido para ese modelo, contexto, perfil y huella de hardware, se aplica y carga de inmediato (~20 s).
|
|
58
|
+
- **Sin preset**: Descarga modelos previos para liberar VRAM, evalúa las configuraciones candidatas más prometedoras (2–3 min), mide la velocidad con contexto corto y profundo, guarda el preset ganador y carga el modelo.
|
|
57
59
|
|
|
58
|
-
Solo se vuelve a medir cuando cambias el contexto o el perfil, cambia el hardware (GPU, VRAM, PCIe), cambia el archivo del modelo o
|
|
60
|
+
Solo se vuelve a medir cuando cambias el contexto o el perfil, cambia el hardware (GPU, VRAM, enlace PCIe), cambia el archivo del modelo o cambian las variantes descargadas (en `speed` y `quality`). También puedes forzar la medición en cualquier momento con `--force`.
|
|
59
61
|
|
|
60
62
|
---
|
|
61
63
|
|
|
62
64
|
## Perfiles de carga
|
|
63
65
|
|
|
64
|
-
Más tokens por segundo no siempre
|
|
66
|
+
Más tokens por segundo no siempre equivale a mejores respuestas. Los perfiles de carga permiten decidir cuándo ceder calidad a cambio de velocidad o ahorro de memoria:
|
|
65
67
|
|
|
66
|
-
| Perfil |
|
|
67
|
-
|
|
68
|
-
| `speed`
|
|
69
|
-
| `balanced`
|
|
70
|
-
| `quality`
|
|
68
|
+
| Perfil | Objetivo de optimización | Comportamiento y compensaciones |
|
|
69
|
+
| :--- | :--- | :--- |
|
|
70
|
+
| `speed` | Máximos tokens por segundo. | Selecciona la variante descargada más ligera y permite cualquier tipo de caché KV (`f16`, `q8_0`, `q4_0`). |
|
|
71
|
+
| `balanced` | Velocidad ponderada por calidad de caché KV. *(Predeterminado)* | Utiliza la variante seleccionada y clasifica las candidatas según `tps × kvQuality`. |
|
|
72
|
+
| `quality` | Mínima pérdida ejecutándose por completo en GPU. | Elige la variante descargada más pesada que quepa al 100% en VRAM con caché KV precisa (`f16` o `q8_0`). Si ninguna cabe por completo en GPU, aplica la regla de `balanced`. |
|
|
71
73
|
|
|
72
|
-
Las optimizaciones sin pérdida (
|
|
74
|
+
Las optimizaciones sin pérdida (distribución de capas entre GPUs, orden de tarjetas, número de hilos de CPU) se aplican siempre en todos los perfiles.
|
|
73
75
|
|
|
74
76
|
### Selección de variantes
|
|
75
77
|
|
|
76
|
-
- **Ollama**:
|
|
77
|
-
- **LM Studio**:
|
|
78
|
+
- **Ollama**: Selecciona y carga automáticamente la variante (etiqueta) óptima para el perfil activo entre las etiquetas identificadas como la misma familia de modelo.
|
|
79
|
+
- **LM Studio**: Optimiza la variante activa y te avisa si otra cuantización descargada (o descargable como `Q8_0`, `Q6_K` o `Q5_K_M`) se adapta mejor al perfil elegido.
|
|
78
80
|
|
|
79
81
|
---
|
|
80
82
|
|
|
81
83
|
## Instalación
|
|
82
84
|
|
|
83
|
-
Instalación global
|
|
85
|
+
Instalación global mediante npm:
|
|
84
86
|
|
|
85
87
|
```bash
|
|
86
88
|
npm install -g llm-tuner
|
|
87
89
|
```
|
|
88
90
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
O ejecución directa sin instalación permanente mediante `npx`:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
npx llm-tuner
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Requisitos previos
|
|
98
|
+
|
|
99
|
+
- **Node.js**: `>= 22` (`engines.node` en [`package.json`](package.json)).
|
|
100
|
+
- **Motor local**: LM Studio (0.4.25+) u Ollama instalado (o instálalo mediante el asistente integrado).
|
|
92
101
|
|
|
93
102
|
---
|
|
94
103
|
|
|
@@ -96,167 +105,235 @@ Requisitos previos:
|
|
|
96
105
|
|
|
97
106
|
### CLI interactiva y comandos slash
|
|
98
107
|
|
|
99
|
-
|
|
108
|
+
Inicia el menú interactivo en la terminal:
|
|
100
109
|
|
|
101
110
|
```bash
|
|
102
111
|
llm-tuner
|
|
103
112
|
```
|
|
104
113
|
|
|
105
|
-
Ejecutar `llm-tuner` sin argumentos abre un menú interactivo
|
|
106
|
-
- `/load`: Ajustar y cargar un modelo con la configuración óptima
|
|
107
|
-
- `/mcp`: Conectar
|
|
108
|
-
- `/presets`:
|
|
109
|
-
- `/
|
|
110
|
-
- `/
|
|
111
|
-
- `/
|
|
114
|
+
Ejecutar `llm-tuner` sin argumentos abre un bucle de menú interactivo:
|
|
115
|
+
- `/load`: Ajustar y cargar un modelo con la configuración óptima de hardware.
|
|
116
|
+
- `/mcp`: Conectar el motor local con agentes de programación de IA como servidor MCP.
|
|
117
|
+
- `/presets`: Ver los presets de configuración guardados.
|
|
118
|
+
- `/serve`: Iniciar en modo servidor remoto con autenticación de API.
|
|
119
|
+
- `/settings`: Configurar el idioma (`en` / `es`) y el tema visual (`system` / `light` / `dark`).
|
|
120
|
+
- `/help`: Ver la ayuda de uso y las opciones de la CLI.
|
|
121
|
+
- `/exit`: Salir del menú interactivo.
|
|
112
122
|
|
|
113
|
-
También puedes ejecutar cualquier comando slash directamente desde
|
|
123
|
+
También puedes ejecutar cualquier comando slash (o su alias sin barra) directamente desde la terminal:
|
|
114
124
|
|
|
115
125
|
```bash
|
|
116
126
|
llm-tuner /load
|
|
117
127
|
llm-tuner /mcp
|
|
118
128
|
llm-tuner /presets
|
|
129
|
+
llm-tuner /serve
|
|
119
130
|
llm-tuner /settings
|
|
131
|
+
llm-tuner /help
|
|
120
132
|
```
|
|
121
133
|
|
|
122
134
|
### Aplicación de escritorio
|
|
123
135
|
|
|
124
|
-
|
|
136
|
+
Inicia la aplicación gráfica de escritorio:
|
|
125
137
|
|
|
126
138
|
```bash
|
|
127
139
|
llm-tuner-desktop
|
|
128
140
|
```
|
|
129
141
|
|
|
130
|
-
>
|
|
142
|
+
> [!NOTE]
|
|
143
|
+
> El entorno de ejecución de Electron se descarga en la primera ejecución si aún no está en caché. En Linux, `llm-tuner-desktop` también registra un acceso directo de escritorio en `~/.local/share/applications/llm-tuner.desktop`.
|
|
144
|
+
|
|
145
|
+
### Modo servidor remoto y daemon
|
|
146
|
+
|
|
147
|
+
Ejecuta LLM Tuner como un servicio de red en un equipo con GPUs dedicadas:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Iniciar en 0.0.0.0:7860 por defecto (genera y guarda un token hexadecimal de 32 bytes si no se indica)
|
|
151
|
+
llm-tuner /serve
|
|
152
|
+
|
|
153
|
+
# Personalizar host, puerto y token Bearer
|
|
154
|
+
llm-tuner /serve --host 0.0.0.0 --port 7860 --token mi-token-secreto
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- **Seguridad y sanitización de telemetría**: Las peticiones remotas o en modo servidor exigen el encabezado `Authorization: Bearer <token>` verificado mediante `crypto.timingSafeEqual`. Las respuestas remotas de `/api/state` omiten datos identificativos del host (distribución de SO, modelo exacto de CPU, IDs de bus PCI, UUIDs de GPU) y bloquean llamadas remotas a `/api/install` (`403 Forbidden`).
|
|
158
|
+
- **Conexión desde clientes**: Agrega el servidor remoto (Nombre, URL, Token) en la interfaz de escritorio/web desde **Configuración → Servidores**, o selecciona un servidor guardado desde la CLI con `--server <id|nombre>`.
|
|
159
|
+
|
|
160
|
+
### Integración MCP para agentes de IA
|
|
161
|
+
|
|
162
|
+
Registra LM Studio (`@mzxrai/mcp-openai`) u Ollama (`ollama-mcp-server`) en tus agentes de programación de IA:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Asistente interactivo
|
|
166
|
+
llm-tuner /mcp
|
|
167
|
+
|
|
168
|
+
# Con opciones por línea de comandos
|
|
169
|
+
llm-tuner /mcp --engine lmstudio --name mi-llm-local --host http://127.0.0.1:1234/v1 --apiKey sk-lm-local
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Agentes de IA compatibles:
|
|
173
|
+
- **Claude Desktop** (`claude_desktop_config.json`)
|
|
174
|
+
- **Claude Code** (`~/.claude.json`)
|
|
175
|
+
- **OpenCode** (`opencode.json`)
|
|
176
|
+
- **Antigravity** (`~/.gemini/config/mcp_config.json`)
|
|
177
|
+
- **VS Code** (`Code/User/mcp.json`)
|
|
178
|
+
- **ChatGPT / Codex** (`~/.codex/config.toml`)
|
|
131
179
|
|
|
132
180
|
### Modo CLI no interactivo
|
|
133
181
|
|
|
134
|
-
|
|
182
|
+
Ejecución directa en scripts, automatizaciones o entornos sin interfaz:
|
|
135
183
|
|
|
136
184
|
```bash
|
|
137
|
-
#
|
|
185
|
+
# Ajustar y cargar sin confirmaciones con el perfil balanced predeterminado
|
|
138
186
|
llm-tuner --engine lmstudio --model qwen/qwen2.5-coder-32b --ctx 16384 --yes
|
|
139
187
|
|
|
140
|
-
#
|
|
141
|
-
llm-tuner --engine
|
|
188
|
+
# Optimizar para máxima calidad de respuesta con salida en JSON
|
|
189
|
+
llm-tuner --engine ollama --model qwen2.5-coder:14b --ctx 32768 --profile quality --yes --json
|
|
142
190
|
|
|
143
|
-
#
|
|
144
|
-
llm-tuner --
|
|
191
|
+
# Medir en modo simulación (--dry-run) sin modificar archivos ni guardar preset
|
|
192
|
+
llm-tuner --engine lmstudio --model qwen/qwen2.5-coder-32b --ctx 16384 --dry-run
|
|
145
193
|
|
|
146
|
-
#
|
|
147
|
-
llm-tuner
|
|
194
|
+
# Ejecutar contra un servidor remoto configurado
|
|
195
|
+
llm-tuner --server gpu-rig --engine ollama --model llama3.1:8b --ctx 16384 --yes
|
|
148
196
|
```
|
|
149
197
|
|
|
150
|
-
### Referencia de opciones CLI
|
|
151
|
-
|
|
152
|
-
| Opción | Descripción | Valor predeterminado |
|
|
153
|
-
|
|
198
|
+
### Referencia de opciones y banderas CLI
|
|
199
|
+
|
|
200
|
+
| Opción / Comando | Descripción | Valor predeterminado |
|
|
201
|
+
| :--- | :--- | :--- |
|
|
202
|
+
| `/load`, `load` | Ajustar y cargar un modelo con la configuración óptima. | Predeterminado al pasar opciones de ajuste |
|
|
203
|
+
| `/mcp`, `mcp` | Configurar LM Studio u Ollama como servidor MCP en agentes de IA. | — |
|
|
204
|
+
| `/presets`, `presets`, `--presets` | Listar los presets guardados (filtrable con `--engine` y `--model`). | — |
|
|
205
|
+
| `/serve`, `serve`, `--serve` | Iniciar el modo daemon de servidor remoto con autenticación Bearer. | — |
|
|
206
|
+
| `/settings`, `settings`, `--settings` | Abrir el menú interactivo de configuración (idioma y tema). | — |
|
|
207
|
+
| `/help`, `help`, `-h`, `--help` | Mostrar la ayuda de uso y la ruta del directorio de presets. | — |
|
|
208
|
+
| `-v`, `--version` | Mostrar la versión instalada (`0.4.4`). | — |
|
|
154
209
|
| `--engine <lmstudio\|ollama>` | Motor local objetivo. | Preguntado interactivamente |
|
|
155
|
-
| `--model <
|
|
156
|
-
| `--ctx <tokens>` | Tamaño de contexto en tokens (ej. `16384`). | Preguntado interactivamente |
|
|
210
|
+
| `--model <clave>` | Clave del modelo (LM Studio) o etiqueta (Ollama). | Preguntado interactivamente |
|
|
211
|
+
| `--ctx <tokens>` | Tamaño de contexto en tokens (p. ej. `16384` o `16k`). | Preguntado interactivamente |
|
|
157
212
|
| `--profile <speed\|balanced\|quality>` | Perfil de carga a optimizar. | `balanced` |
|
|
158
|
-
| `--force` |
|
|
159
|
-
| `--candidates <n>` | Número de configuraciones candidatas a medir. | `3` |
|
|
160
|
-
| `--yes` |
|
|
161
|
-
| `--dry-run` | Medir sin aplicar
|
|
162
|
-
| `--
|
|
163
|
-
| `--
|
|
164
|
-
| `--
|
|
165
|
-
| `--
|
|
166
|
-
| `/
|
|
167
|
-
| `--
|
|
213
|
+
| `--force` | Volver a medir aunque exista un preset válido. | `false` |
|
|
214
|
+
| `--candidates <n>` | Número de configuraciones candidatas a probar al medir. | `3` |
|
|
215
|
+
| `--yes` | No pedir confirmación interactiva. | `false` |
|
|
216
|
+
| `--dry-run` | Medir y mostrar cambios sin aplicar nada ni guardar preset. | `false` |
|
|
217
|
+
| `--json` | Emitir el resultado final en formato JSON. | `false` |
|
|
218
|
+
| `--lang <en\|es>` | Establecer y guardar el idioma de la interfaz. | Configuración guardada / `en` |
|
|
219
|
+
| `--theme <system\|light\|dark>` | Establecer y guardar el tema visual. | `system` |
|
|
220
|
+
| `--server <id\|nombre>` | Seleccionar el servidor activo desde la configuración guardada. | `local` |
|
|
221
|
+
| `--host <host>` | Dirección de escucha para `/serve` o URL de host para `/mcp`. | `0.0.0.0` (`/serve`) |
|
|
222
|
+
| `--port <puerto>` | Puerto TCP para `/serve`. | `7860` |
|
|
223
|
+
| `--token <token>` | Token Bearer de autenticación para `/serve`. | Hexadecimal autogenerado de 32 bytes |
|
|
224
|
+
| `--name <nombre>` | Nombre personalizado del servidor MCP al usar `/mcp`. | ID del motor (`lmstudio` / `ollama`) |
|
|
225
|
+
| `--apiKey <clave>` | Clave API personalizada para LM Studio al usar `/mcp`. | `sk-lm-local` |
|
|
168
226
|
|
|
169
227
|
---
|
|
170
228
|
|
|
171
|
-
##
|
|
229
|
+
## Flujo de ajuste y medición
|
|
172
230
|
|
|
173
|
-
Para cada tipo de caché KV
|
|
231
|
+
Para cada tipo de caché KV permitido por el perfil activo (`f16`, `q8_0`, `q4_0`):
|
|
174
232
|
|
|
175
|
-
1. **Inspección de tensores GGUF**:
|
|
176
|
-
2. **Modelado de memoria de contexto**:
|
|
177
|
-
3. **Reparto
|
|
178
|
-
4. **Descarga
|
|
179
|
-
5. **Medición empírica**:
|
|
180
|
-
6. **Aplicación de
|
|
233
|
+
1. **Inspección de tensores GGUF**: Lee directamente las cabeceras de tensores GGUF para obtener el tamaño exacto en bytes por capa, embeddings y cabezal de salida.
|
|
234
|
+
2. **Modelado de memoria de contexto**: Calcula el consumo de caché KV considerando cabezas de atención, dimensiones y capas de ventana deslizante (SWA).
|
|
235
|
+
3. **Reparto de capas multi-GPU**: Distribuye las capas proporcionalmente al margen de VRAM disponible, ordenando las GPUs por generación/ancho PCIe y penalizando las tarjetas con pantalla conectada.
|
|
236
|
+
4. **Descarga de expertos MoE**: En arquitecturas Mixture-of-Experts (MoE) que superan la VRAM, calcula cuántas capas de expertos pueden alojarse en la RAM del sistema (`cpuMoeLayers` / `--n-cpu-moe`).
|
|
237
|
+
5. **Medición empírica**: Mide la velocidad de generación con un prompt corto y un prompt profundo (~50% del contexto objetivo), registrando uso de CPU y pico de VRAM.
|
|
238
|
+
6. **Aplicación atómica y copias de seguridad**:
|
|
181
239
|
- **LM Studio**: Escribe la configuración por modelo en `~/.lmstudio/.internal/user-concrete-model-default-config/` y actualiza `hardware-config.json`.
|
|
182
|
-
- **Ollama**:
|
|
240
|
+
- **Ollama**: Crea un modelo ajustado (`<modelo>-tuned-<ctx>`) con `num_ctx`, `num_gpu` y `num_thread` fijados, y configura las variables de entorno del servicio (`OLLAMA_FLASH_ATTENTION`, `OLLAMA_KV_CACHE_TYPE`). Siempre se crea un respaldo con marca de tiempo (`*.bak-llm-tuner-*`) antes de modificar archivos.
|
|
183
241
|
|
|
184
242
|
---
|
|
185
243
|
|
|
186
|
-
##
|
|
244
|
+
## Arquitectura y rutas de almacenamiento
|
|
187
245
|
|
|
188
|
-
|
|
246
|
+
### Estructura del repositorio
|
|
189
247
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
248
|
+
```text
|
|
249
|
+
llmtuner/
|
|
250
|
+
├── src/
|
|
251
|
+
│ ├── cli/ # Enrutador CLI, asistente interactivo y comandos slash
|
|
252
|
+
│ │ ├── commands/ # /load, /mcp, /presets, /serve, /settings, /help
|
|
253
|
+
│ │ ├── animation.js # Animación de progreso y telemetría en vivo en terminal
|
|
254
|
+
│ │ ├── colors.js # Estilos ANSI adaptados al tema
|
|
255
|
+
│ │ ├── index.js # Punto de entrada del binario CLI (llm-tuner)
|
|
256
|
+
│ │ ├── nav.js # Navegación hacia atrás con Backspace/Escape
|
|
257
|
+
│ │ ├── profile.js # Utilidades de selección de perfil en CLI
|
|
258
|
+
│ │ └── router.js # Parser de argumentos y bucle del menú interactivo
|
|
259
|
+
│ ├── core/ # Detección de hardware, parser GGUF, estimador, presets y MCP
|
|
260
|
+
│ │ ├── engines/ # Adaptadores para LM Studio y Ollama
|
|
261
|
+
│ │ ├── mcp/ # Registro multiagente MCP y adaptadores JSON/TOML
|
|
262
|
+
│ │ ├── benchmark.js # Ejecutor de pruebas de contexto corto y profundo
|
|
263
|
+
│ │ ├── client.js # Cliente HTTP/SSE unificado (TunerApiClient)
|
|
264
|
+
│ │ ├── estimator.js # Modelado matemático de VRAM y caché KV
|
|
265
|
+
│ │ ├── gguf.js # Lector binario de cabeceras y tensores GGUF
|
|
266
|
+
│ │ ├── hardware.js # Detección de topología de GPU, PCIe, RAM y CPU
|
|
267
|
+
│ │ ├── installer.js # Planes de instalación multiplataforma de motores
|
|
268
|
+
│ │ ├── llama-server.js # Arnés directo de llama-server para pruebas de LM Studio
|
|
269
|
+
│ │ ├── presets.js # Almacenamiento de presets con huella de hardware
|
|
270
|
+
│ │ ├── profiles.js # Reglas de los perfiles speed, balanced y quality
|
|
271
|
+
│ │ ├── settings.js # Preferencias persistentes y perfiles de servidores
|
|
272
|
+
│ │ ├── telemetry.js # Muestreo en vivo de CPU, RAM y VRAM de GPU
|
|
273
|
+
│ │ ├── tuner.js # Clase orquestadora principal (Tuner)
|
|
274
|
+
│ │ └── updater.js # Comprobación de actualizaciones en el registro npm
|
|
275
|
+
│ ├── i18n/ # Catálogos de localización en inglés (en.js) y español (es.js)
|
|
276
|
+
│ ├── platform/ # Autorización privilegiada del servicio Ollama (sudo/polkit)
|
|
277
|
+
│ └── web/ # Servidor HTTP + SSE embebido e interfaz gráfica web/escritorio
|
|
278
|
+
├── electron/ # Lanzador de escritorio (launch.js) y proceso principal de Electron
|
|
279
|
+
├── scripts/ # Scripts locales de utilidad y evaluación
|
|
280
|
+
├── test/ # Suite de pruebas nativas de Node.js (test/*.test.js)
|
|
281
|
+
└── docs/ # Especificaciones de diseño, historias de usuario e informes de evaluación
|
|
282
|
+
```
|
|
193
283
|
|
|
194
|
-
|
|
284
|
+
### Rutas de configuración y presets
|
|
195
285
|
|
|
196
|
-
|
|
286
|
+
Por defecto, las preferencias (`settings.json`), la configuración del servidor (`server.json`) y los presets (`presets/*.json`) se guardan en el directorio de configuración del usuario (modificable mediante la variable de entorno `LLM_TUNER_CONFIG_DIR`):
|
|
197
287
|
|
|
198
|
-
|
|
|
199
|
-
|
|
200
|
-
| **Linux
|
|
201
|
-
| **
|
|
202
|
-
| **Windows
|
|
203
|
-
| **AMD ROCm / Apple Silicon / Intel Arc** | 🧪 Soportado | Detección de VRAM activa; ancho de banda estimado por tabla de especificaciones. |
|
|
288
|
+
| Sistema operativo | Directorio base de configuración | Directorio de presets |
|
|
289
|
+
| :--- | :--- | :--- |
|
|
290
|
+
| **Linux** | `~/.config/llm-tuner/` (o `$XDG_CONFIG_HOME/llm-tuner/`) | `~/.config/llm-tuner/presets/` |
|
|
291
|
+
| **macOS** | `~/Library/Application Support/llm-tuner/` | `~/Library/Application Support/llm-tuner/presets/` |
|
|
292
|
+
| **Windows** | `%APPDATA%\llm-tuner\` | `%APPDATA%\llm-tuner\presets\` |
|
|
204
293
|
|
|
205
294
|
---
|
|
206
295
|
|
|
207
|
-
##
|
|
296
|
+
## Soporte por plataforma
|
|
208
297
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
│ │ ├── gguf.js # Parser de tensores GGUF
|
|
216
|
-
│ │ ├── hardware.js # Detección de GPU, enlaces PCIe y estado de VRAM
|
|
217
|
-
│ │ ├── presets.js # Lógica de guardado e invalidación de presets
|
|
218
|
-
│ │ └── profiles.js # Reglas de perfiles speed, balanced y quality
|
|
219
|
-
│ ├── cli/ # Asistente interactivo y análisis de argumentos CLI
|
|
220
|
-
│ ├── i18n/ # Catálogos de internacionalización en español e inglés
|
|
221
|
-
│ └── web/ # Servidor HTTP/SSE embebido que alimenta la interfaz gráfica
|
|
222
|
-
├── electron/ # Lanzador y proceso principal de Electron
|
|
223
|
-
├── test/ # Suite de pruebas unitarias de Node.js
|
|
224
|
-
└── docs/ # Especificaciones técnicas, mediciones reales y notas
|
|
225
|
-
```
|
|
298
|
+
| Plataforma y Motor | Estado | Notas |
|
|
299
|
+
| :--- | :--- | :--- |
|
|
300
|
+
| **Linux + NVIDIA + LM Studio** | Verificado | Calibrado con mediciones en hardware real (2× RTX 5070, Ryzen 7 5800X). |
|
|
301
|
+
| **Linux + Ollama** | Verificado | Probado con instancias aisladas de medición, overrides de systemd y pruebas unitarias. |
|
|
302
|
+
| **Windows / macOS** | Soportado | Rutas oficiales, planes de instalación, variables `setx`/`launchctl` y detección de GPU implementados. |
|
|
303
|
+
| **AMD ROCm / Apple Silicon / Intel Arc** | Soportado | Detección de VRAM y memoria unificada activa; ancho de banda estimado por tablas de arquitectura. |
|
|
226
304
|
|
|
227
305
|
---
|
|
228
306
|
|
|
229
307
|
## Desarrollo y pruebas
|
|
230
308
|
|
|
231
|
-
|
|
309
|
+
Clona el repositorio e instala las dependencias:
|
|
232
310
|
|
|
233
311
|
```bash
|
|
234
312
|
git clone https://github.com/ronald32acunadev/llmtuner.git
|
|
235
313
|
cd llmtuner
|
|
236
314
|
npm install
|
|
237
315
|
|
|
238
|
-
# Iniciar asistente CLI
|
|
316
|
+
# Iniciar el asistente CLI
|
|
239
317
|
npm start
|
|
240
318
|
|
|
241
|
-
# Iniciar aplicación de escritorio
|
|
319
|
+
# Iniciar la aplicación de escritorio con Electron
|
|
242
320
|
npm run desktop
|
|
243
321
|
|
|
244
|
-
# Ejecutar suite de pruebas
|
|
322
|
+
# Ejecutar la suite de pruebas automatizadas de Node.js
|
|
245
323
|
npm test
|
|
246
324
|
```
|
|
247
325
|
|
|
248
|
-
La suite incluye pruebas de regresión que verifican los resultados reales de doble RTX 5070 con Qwen2.5-Coder-32B.
|
|
249
|
-
|
|
250
326
|
---
|
|
251
327
|
|
|
252
|
-
##
|
|
328
|
+
## Solución de problemas y notas de plataforma
|
|
253
329
|
|
|
254
|
-
- **
|
|
255
|
-
- **
|
|
256
|
-
- **
|
|
330
|
+
- **Primera ejecución de escritorio (`llm-tuner-desktop`)**: El binario de Electron se descarga en la primera instalación/ejecución. Si la interfaz de escritorio no puede iniciarse, ejecuta `llm-tuner` en la terminal (funciona sin Electron).
|
|
331
|
+
- **Sandbox de Linux en particiones NTFS/exFAT o sin permisos SUID**: `electron/launch.js` comprueba automáticamente los permisos de `chrome-sandbox` en Linux y activa `ELECTRON_DISABLE_SANDBOX=1` cuando el binario no pertenece a root con modo `04755`.
|
|
332
|
+
- **Autorización del servicio Ollama**: Actualizar las variables de entorno del servicio Ollama (`OLLAMA_KV_CACHE_TYPE`, `OLLAMA_FLASH_ATTENTION`) en Linux puede solicitar autorización de administrador (`sudo` o `pkexec`). Si los ajustes no cambian, el servicio no se reinicia. El modo no interactivo (`--json`) nunca bloquea pidiendo contraseña.
|
|
333
|
+
- **Cerrar LM Studio antes de aplicar cambios**: LM Studio sobrescribe sus archivos de configuración al cerrarse; ciérralo antes de aplicar una nueva configuración de hardware si el asistente lo solicita.
|
|
257
334
|
|
|
258
335
|
---
|
|
259
336
|
|
|
260
337
|
## Licencia
|
|
261
338
|
|
|
262
|
-
[MIT](LICENSE)
|
|
339
|
+
Publicado bajo la [Licencia MIT](LICENSE).
|