Transformers.js prueba Cross-Origin Storage para acelerar modelos | Keryc
Transformers.js ahora te permite experimentar con una idea sencilla pero potente: compartir en el navegador los archivos grandes de modelos y runtimes entre orígenes distintos usando hashes criptográficos. ¿Por qué importa? Porque evita descargas duplicadas, ahorra espacio en disco y hace tus apps Web más rápidas sin cambios drásticos en tu código.
Qué problema resuelve
Imagina que visitas dos sitios distintos que usan el mismo modelo Whisper y el mismo runtime Wasm. Aunque las URL apunten al mismo CDN, los navegadores modernos aislan las caches por origen (por seguridad) usando una clave llamada Network Isolation Key. El resultado: descargas idénticas repetidas y almacenamiento duplicado.
En el ejemplo de Transformers.js del artículo, esto se traduce en 177 MB de duplicado solo por probar dos orígenes con el mismo modelo. Pequeño para una app, gigante si sumas muchas visitas y muchas apps.
Cómo funciona Cross-Origin Storage (COS)
La propuesta Cross-Origin Storage introduce navigator.crossOriginStorage, una API que identifica archivos no por URL sino por su hash criptográfico (por ejemplo, SHA-256). El flujo básico es:
Pides un FileHandle por hash con requestFileHandle().
Si ya existe en COS, obtienes el archivo instantáneamente como File/Blob.
Si no existe, lo descargas y lo escribes en COS con create: true y la opción origins adecuada.
El hash garantiza integridad: el navegador verifica que los bytes escritos coincidan con el hash declarado. Si no coinciden, la escritura falla.
La visibilidad se controla con la opción origins: '*' para global, lista de orígenes para privado entre sitios controlados, o ausencia para same-site.
Visibilidad puede aumentar pero nunca disminuir: si un archivo ya es público, no puede volverse privado por reescritura.
Privacidad y riesgos considerados
Sí, compartir por hash abre la posibilidad de sondear si un recurso está en el dispositivo. COS mitiga esto con dos mecanismos:
Recomendación de que recursos sensibles no se almacenen con origins: '*'.
Availability gating: el navegador puede ocultar la existencia de recursos poco comunes hasta que estén presentes en suficientes orígenes distintos. En la práctica, un error en requestFileHandle() no distingue entre "no está" y "está, pero no te lo digo"; por eso la app debe siempre caer en la descarga por red si no obtiene el recurso.
Integración práctica en Transformers.js
Transformers.js ya trae un backend COS experimental: activa una línea antes de crear pipelines y listo:
La librería resuelve el SHA-256 de cada archivo grande (pesos ONNX, etc.) a partir del puntero Xet y usa ese hash con navigator.crossOriginStorage. Si otro sitio ya guardó el mismo archivo, Transformers.js lo recibe desde COS sin RTT. Si no, lo descarga y lo escribe en COS para los siguientes usuarios.
Beneficio real: el runtime Wasm compartido (por ejemplo ort-wasm-simd-threaded.asyncify.wasm) y los pesos de modelos solo se descargan una vez en el dispositivo del usuario, sin importar cuántos orígenes distintos los soliciten.
Cómo probarlo hoy
La API COS todavía no está implementada de forma nativa en navegadores, pero puedes probarla ya con la extensión Cross-Origin Storage que inyecta un polyfill para navigator.crossOriginStorage en las páginas. Pasos rápidos:
Instala la extensión (es para desarrolladores y power users).
Activa env.experimental_useCrossOriginStorage = true en tu app Transformers.js antes del primer pipeline().
Abre el mismo demo en dos orígenes diferentes con la extensión activa y observa que la segunda carga obtiene el modelo desde COS en milisegundos en lugar de re-descargar 177 MB.
La extensión también muestra un panel con los recursos por hash y los orígenes que lo comparten, útil para depuración.
Estado del ecosistema y llamado a desarrolladores
Transformers.js no es la única librería interesada: proyectos como WebLLM y wllama ya están experimentando con COS. El equipo de Chrome está valorando una implementación nativa y la propuesta está en evolución. Si te interesa influir en el diseño o reportar problemas, el repositorio Cross-Origin Storage acepta issues y PRs.
Si construyes apps con modelos en el navegador, opt-in a la experimentación ahora acelera la Web para todos: cada sitio que habilita COS reduce latencia y consumo de datos para los demás. Y lo mejor: si el navegador no soporta COS, el código regresa a la caché tradicional sin fallos.
Hoy COS es una propuesta con trabajo por delante, pero práctica para probar y con beneficios concretos: menos descargas duplicadas, verificación automática de integridad y un uso más eficiente del almacenamiento local.