11°

~/blog/articulo

Artículos

Análisis y mediciones propias: redes, bajo nivel, hardware y sistemas.

Todos los escritos

Portada: Un modelo que no escribe, solo decide: puse a Intern-Decision a predecir la lluvia sin entrenarloArtículoUn modelo que no escribe, solo decide: puse a Intern-Decision a predecir la lluvia sin entrenarloIntern-Decision salió el 26 de septiembre de 2026: modelos de 0,8B a 4B que no generan texto y devuelven una probabilidad por pregunta en una sola pasada. Lo instalé el mismo día, tropecé con tres fallos al instalarlo, uno de los cuales lo hacía entre 2 y 3,2 veces más lento, y lo puse a predecir la lluvia de mañana en 27.256 días de siete ciudades chilenas sin entrenarlo. El 2B llega a un AUC de 0,823, casi lo mismo que un Naive Bayes entrenado con 74.145 filas, y queda bajo la regresión logística.#Modelos#Benchmarks#GPUPortada: AWS dice que su harness de agentes ahorra 28% de tokens. Medí 1,82x más caro en local, 88% más barato en la nubeArtículoAWS dice que su harness de agentes ahorra 28% de tokens. Medí 1,82x más caro en local, 88% más barato en la nubeProbé Strands Harness, el runtime de agentes de AWS, contra un LangGraph pelado, mismos 3 tools, mismo gatekeeper, misma conversación de 20 turnos. Contra un Qwen3.8-27B local de 16k de contexto gastó 1,82 veces más tokens. Contra el mismo trabajo en un modelo cloud, con la temperatura por fin igualada entre los dos, gastó un 88,8% menos. Y tres auditorías adversariales tuvieron que corregir mis propios errores en el camino: 11 herramientas de más, un límite de turnos que mentía, y un doble conteo de caché que inflaba el primer número 4 veces.#Agentes#LangGraph#AWSPortada: Cómo funciona hoy la compresión de archivos (y cómo le gané 2,86% a zlib con teoría de grafos)ArtículoCómo funciona hoy la compresión de archivos (y cómo le gané 2,86% a zlib con teoría de grafos)Traduje zlib de C a Rust con c2rust, probé que la traducción es bit exacta en más de 15.000 casos, y después reemplacé la heurística de zlib por un camino mínimo en grafo. Resultado: 2,86% más chico que zlib -9, verificado byte a byte contra la C real. En el camino, cómo funciona la compresión sin pérdida hoy: LZ77, Huffman, y por qué zopfli y PPMd tampoco rompen el límite de Shannon.#Compresión#Rust#CPortada: Rust Coreutils 0.12 contra GNU 9.12: casi todo funciona igual, arrancar cuesta casi el triple y mv entre discos pierde las fechasArtículoRust Coreutils 0.12 contra GNU 9.12: casi todo funciona igual, arrancar cuesta casi el triple y mv entre discos pierde las fechasMedí Rust Coreutils (uutils) 0.12 contra GNU coreutils 9.12 en contenedores con límites: la suite de pruebas de GNU, 157 comandos con la salida comparada y el arranque de proceso. uutils es más lento en 91 de 157 celdas, tarda 2,8 veces más en lanzar 5.000 procesos, y mv entre sistemas de archivos pierde las fechas.#Rust#Coreutils#GNUPortada: Dragonfly 2.0 contra Redis 8 y Valkey 9: con 2 CPU gana por mucho, con 4 depende de cómo configures a los otrosArtículoDragonfly 2.0 contra Redis 8 y Valkey 9: con 2 CPU gana por mucho, con 4 depende de cómo configures a los otrosMedí Dragonfly 2.0, Redis 8.10 y Valkey 9.1 en contenedores con 2 y 4 CPU. Con io-threads activados, Redis y Valkey alcanzan a Dragonfly sin pipeline y lo superan con pipeline 16; con 2 CPU y sin pipeline, Dragonfly gana entre 59 % y 99 % sobre Redis por defecto. Usa 8 a 15 % menos memoria por clave.#Dragonfly#Redis#ValkeyPortada: CUDA en Rust contra CUDA C++: Rust gana por 3,2 % hasta que compruebas que no calculan lo mismoArtículoCUDA en Rust contra CUDA C++: Rust gana por 3,2 % hasta que compruebas que no calculan lo mismoCompilé cuda-oxide, el backend de NVIDIA para escribir kernels CUDA en Rust, y medí el mismo kernel contra CUDA C++. En Mandelbrot Rust sale 3,2 % más rápido, pero los dos programas difieren en 27.510 píxeles; con la aritmética igualada bit a bit, Rust queda 7 % más lento.#Rust#CUDA#GPUPortada: Wild le gana a mold enlazando Rust en 20 de 20, y en release el enlazador ya no es el cuello de botellaArtículoWild le gana a mold enlazando Rust en 20 de 20, y en release el enlazador ya no es el cuello de botellaMedí Wild 0.10.0, mold 2.42.1, rust-lld y GNU ld enlazando ripgrep y cargo. Wild ganó las 20 repeticiones de cada proyecto, por 1,9 ms y unos 8 ms. Con cualquiera de los dos el enlace es cerca del 1 % del rebuild. Y por el camino casi publico números falsos dos veces.#Rust#Enlazadores#BenchmarksPortada: ExLlamaV3 contra llama.cpp con Qwen3.8-27B en 16 GB: decodifica más rápido, pero no siempre ganaArtículoExLlamaV3 contra llama.cpp con Qwen3.8-27B en 16 GB: decodifica más rápido, pero no siempre ganaLes di a los dos motores exactamente los mismos tokens de entrada dentro de un contenedor con límites de pod. ExLlamaV3 decodifica más rápido y procesó 131 mil tokens de contexto; en archivos de 13 GB pierde menos calidad, en los de 15 GB pierde contra el GGUF. En un turno agéntico, el prefill se come casi toda la ventaja.#ExLlamaV3#llama.cpp#CuantizaciónPortada: Un chat en Amazon Bedrock AgentCore para mi blog: lo rompí con 64 mensajes y lo rearmé con reglas fuera del promptArtículoUn chat en Amazon Bedrock AgentCore para mi blog: lo rompí con 64 mensajes y lo rearmé con reglas fuera del promptTutorial: chat LangGraph en Amazon Bedrock AgentCore con Knowledge Base S3 y guardrails, probado con una conversación de 64 mensajes. Costos y opción local.#IA#AWS#SeguridadPortada: Medí Pingora 0.9.0 seis veces más lento que nginx. El culpable era una línea de mi códigoArtículoMedí Pingora 0.9.0 seis veces más lento que nginx. El culpable era una línea de mi códigoEscribí un reverse proxy mínimo con Pingora 0.9.0 y en un contenedor de 2 vCPU medía 21 mil peticiones por segundo contra las 126 mil de nginx: seis veces más lento. El culpable no era Pingora sino un getaddrinfo bloqueante que mi upstream_peer ejecutaba en cada petición. Corregido, la brecha real es 1,70x, y perf la cuantifica: 1,70x en ciclos por petición, 119,4 mil contra 70,4 mil, sin decir dónde se gastan.#Rust#Benchmarks#RedesPortada: Reglas duras contra Random Cut Forest sobre el mismo stream: el modelo aporta 13 puntos de recall y cuesta 7 veces el throughputArtículoReglas duras contra Random Cut Forest sobre el mismo stream: el modelo aporta 13 puntos de recall y cuesta 7 veces el throughputMonté Apache Flink con Kafka y medí tres reglas deterministas contra el Random Cut Forest de Amazon sobre exactamente el mismo flujo de pagos, en un servidor de cuatro núcleos sin GPU. Las reglas alcanzan 0,814 de recall a 173 mil eventos por segundo; el modelo llega a 0,943 pero baja el pipeline a 23 mil; juntos suben a 0,982.#Streaming#Benchmarks#DatosPortada: Medí 320 sitios chilenos: la mitad ya usa criptografía post-cuántica, y casi ninguno lo decidióArtículoMedí 320 sitios chilenos: la mitad ya usa criptografía post-cuántica, y casi ninguno lo decidióSondeé los 320 dominios .cl más visitados: 145 negocian X25519MLKEM768 (47,7 %), pero solo 9 de los 128 con infraestructura propia. Coste medido: 0 ms.#Criptografía post-cuántica#TLS#ChilePortada: Armé un handshake completamente post-cuántico, y después fui a ver cuál de mis servidores podía hacerloArtículoArmé un handshake completamente post-cuántico, y después fui a ver cuál de mis servidores podía hacerloRustls activó los certificados ML-DSA por defecto, solo para jerarquías privadas. Armé un mTLS donde el intercambio de claves, la firma del servidor y la identidad del cliente son post-cuánticos. Medí cuánto pesa la cadena, qué versión de cada servidor lo soporta, y corregí un número que había dado mal: la clave no es 19 veces más grande, son 128 bytes.#Criptografía post-cuántica#TLS#mTLSPortada: pg_anon encontró los emails de mi base, pero no los RUTArtículopg_anon encontró los emails de mi base, pero no los RUTProbé pg_anon, la herramienta rusa que enmascara datos personales en Postgres. Con las reglas de fábrica detectó 1 de 8 columnas con PII en una base chilena; con reglas propias, las 8. Medí recall, integridad y velocidad contra pg_dump.#PostgreSQL#Datos personales#AnonimizaciónPortada: Más bits donde duele: cuanticé un Qwen3.8-27B a la medida de mi 4070 TiArtículoMás bits donde duele: cuanticé un Qwen3.8-27B a la medida de mi 4070 TiEl Q4 se pasa de 16 GB y el Q3 pierde calidad. Un parche de llama.cpp reparte los bits capa por capa: medí un Qwen3.8-27B al 94 % de una referencia de 8 bits que sí entra en una 4070 Ti.#Cuantización#llama.cpp#GGUFPortada: Bun se reescribió de Zig a Rust en once días. Medí lo que publicaron, y lo que noArtículoBun se reescribió de Zig a Rust en once días. Medí lo que publicaron, y lo que noBun portó 535.000 líneas de Zig a Rust y publicó tres cifras concretas: arranque, peticiones por segundo y tamaño de binario. La versión 1.3.14 fue la última en Zig y la 1.4.0 la primera en Rust, así que se descargan las dos y se mide lo mismo cambiando solo el binario. El arranque la supera con holgura, el binario se queda corto, y de memoria y CPU en reposo el anuncio no da ningún número: esas dos las mido sin nada oficial con qué contrastarlas.#Rust#ArquitecturaPortada: Monté un sandbox público del Sistema de Finanzas Abiertas de Chile, y Keycloak solo no alcanzabaArtículoMonté un sandbox público del Sistema de Finanzas Abiertas de Chile, y Keycloak solo no alcanzabaChile tiene norma de finanzas abiertas y no tiene un sandbox público donde probarla. Monté uno completo y no oficial, fiel al Anexo Técnico: directorio de participantes, banco, servidor de autorización y aplicación solicitante, con PAR obligatorio, objeto de petición cifrado, mTLS y RAR en el token. Keycloak 26 cubre buena parte por configuración, pero el modelo de consentimiento que Chile eligió no existe en el producto: hubo que escribirlo entero.#Seguridad#Arquitectura#ChilePortada: Los siete consejos de GEO: reproduje la única prueba que existe y después audité mis 72 páginasArtículoLos siete consejos de GEO: reproduje la única prueba que existe y después audité mis 72 páginasUn estudio ruso probó los siete consejos que repite la industria del GEO sobre 73 páginas que seis motores citaron y ninguno sobrevivió. Reconstruí sus conteos y reproduje los siete valores de p exactos. Después llevé el detector a mis 72 páginas, y ahí apareció lo que ningún consejo mira: cuatro páginas distintas declarando la misma entidad.#SEO#GEO#EstadísticaPortada: Traduje DOOM de C a Rust sin escribir una línea, y después usé el modelo para lo que sí sirveArtículoTraduje DOOM de C a Rust sin escribir una línea, y después usé el modelo para lo que sí sirveNecesitaba pasar un programa de C a Rust y mi primera idea fue pedírselo a un modelo. Existía una herramienta que lo hace en 23 segundos. La traducción coincidió bit a bit con el original en las 11.113 tramas comparadas, salvo una que se explica por un fallo de memoria sin inicializar ya presente en el DOOM de 1993, y el modelo terminó sirviendo para otra cosa: texturas, relieve por píxel y luz continua sobre el motor original.#Rust#C#Traducción de códigoPortada: Go 1.27 trae SIMD portátil: empata con NumPy fuera de caché y pierde dentroArtículoGo 1.27 trae SIMD portátil: empata con NumPy fuera de caché y pierde dentroMedí el paquete simd experimental de Go 1.27 contra NumPy en una tarea real. Empatan cuando el corpus no cabe en caché, y NumPy gana 2.4 veces cuando sí cabe. Por el camino casi publico dos comparaciones falsas, y esas son la parte útil.#Go#Benchmarks#PythonPortada: TabPFN y TabICL contra XGBoost ajustado: el modelo que no entrena ganó en catorce de catorce tablasArtículoTabPFN y TabICL contra XGBoost ajustado: el modelo que no entrena ganó en catorce de catorce tablasLa promesa de TabPFN y TabICL es que predicen sobre una tabla sin entrenar en ella y aun así superan al boosting ajustado. La medí en catorce datasets del banco de Grinsztajn, con la misma partición y el mismo reloj para todos. Gana el que no entrena, la ventaja aguanta hasta 32 000 filas en vez de romperse, y el modelo más citado ya no se puede descargar sin cuenta.#Modelos#Benchmarks#GPUPortada: Puse el mismo agente a resolver bugs reales con tres motores locales: 284B, 27B y 27B en dos bitsArtículoPuse el mismo agente a resolver bugs reales con tres motores locales: 284B, 27B y 27B en dos bitsEl DeepSeek Harness solo se ha probado con la API oficial. Lo conecté a tres motores locales y les di instancias reales de SWE-bench Verified. Dos empatan en aciertos, uno es once veces más rápido, y el que tiene 284 mil millones de parámetros no llega ni a la salida.#Agentes#Modelos#GPUPortada: Tu diagrama de arquitectura miente: probé las dos formas de escribirlo como códigoArtículoTu diagrama de arquitectura miente: probé las dos formas de escribirlo como códigoUn editor visual de C4 apareció en Habr y no se puede autoalojar. Probé las dos alternativas que sí: el CLI de Structurizr genera los tres niveles de un sistema real en 1 segundo desde un solo archivo; C4-PlantUML llega al mismo resultado sin instalar nada, a costa de triplicar el modelo.#Arquitectura#HerramientasPortada: El chip que guarda tus claves está roto: audité las cuatro máquinas de mi enjambreArtículoEl chip que guarda tus claves está roto: audité las cuatro máquinas de mi enjambreDos fallos de CVSS 8.5 y 8.3 en el TPM por firmware afectan de Ryzen 3000 a Ryzen 9000 y a Intel hasta Ultra 200. Revisé mis cuatro máquinas: dos están afectadas, una tiene parche desde julio y la otra fue abandonada por el fabricante en 2022.#Seguridad#Hardware#LinuxPortada: PhantomRelay: por qué tu automatización se delata antes del primer byte HTTPArtículoPhantomRelay: por qué tu automatización se delata antes del primer byte HTTPUn cliente HTTP de Node es distinguible de Chrome real en el handshake TLS, antes de enviar una sola cabecera. Cómo construí un relay de navegador con un addon Rust sobre BoringSSL, escalación por costo y casi 900 tests.#Sistemas#RedesPortada: ¿Entra Qwen3.8-27B en 16 GB de VRAM? Lo medí, y de paso descubrí que mi banco de pruebas mentíaArtículo¿Entra Qwen3.8-27B en 16 GB de VRAM? Lo medí, y de paso descubrí que mi banco de pruebas mentíaTodos repiten que el nuevo modelo de Alibaba necesita unos 15 GB en 4 bits. Mi GPU tiene 16 y el archivo pesa 17. Medí tokens por segundo, VRAM real y reparto CPU/GPU en tres contextos, y el modelo terminó corrigiéndome a mí.#Modelos#GPU#BenchmarksPortada: El modelo OSI explicado: las 7 capas y la encapsulaciónArtículoEl modelo OSI explicado: las 7 capas y la encapsulaciónQué es el modelo OSI, para qué sirve cada una de sus 7 capas y cómo un dato se encapsula en segmentos, paquetes, tramas y bits al viajar por la red.#Redes#Bajo nivel