GuíaStefan VaskevichStefan Vaskevich

Kimodo.cpp: ejecuta localmente el modelo de NVIDIA que genera movimiento a partir de texto, incluso sin GPU

NVIDIA Kimodo portado a C++ y GGML. Se ejecuta en Vulkan o en una CPU común, requiere menos de 2 GB y los modelos SOMA y G1 se distribuyen bajo una licencia que permite el uso comercial. Configuración completa para Windows y mis notas de retargeting.

Cuatro rigs de personajes en una llanura desértica, cada uno reproduciendo un movimiento diferente generado a partir de un prompt de texto por Kimodo

Herramientas usadas en este artículo

Escribes "una persona realiza una patada giratoria de artes marciales" y obtienes una animación utilizable, en tu propia computadora, sin entorno de Python y sin llamadas de red. Eso es Kimodo, el modelo de difusión de movimiento de NVIDIA, y alguien lo portó a C++ y GGML para que se ejecute en Vulkan o en un procesador convencional con menos de 2 GB de memoria.

Pasé un día instalándolo desde cero en Windows, generando clips y llevándolos a rigs de Mixamo y a Unreal Engine. Esta guía es todo lo que aprendí, incluidas las dos cosas que más tiempo me costaron y que no están en ningún README: qué modelos realmente tienes permitido usar y por qué todo el proceso está limitado por tu disco y no por tu tarjeta gráfica.

Todo el flujo de trabajo en una línea
Prompt de texto → kimodo.cpp en Vulkan o CPU (menos de 2 GB, ~20 s de cómputo real) → GLB → dos scripts para transferir la animación al maniquí de Unreal, o un mapeo de nombres para transferirla a un rig de Mixamo → animación terminada. Los checkpoints SOMA y G1 están bajo la NVIDIA Open Model License, por lo que el uso comercial está permitido.

1. Qué es Kimodo y qué cambió el port de C++

NVIDIA lanzó Kimodo en marzo de 2026. Es un modelo cinemático de difusión de movimiento entrenado con 700 horas de captura de movimiento óptica con licencia comercial, y convierte prompts de texto y restricciones cinemáticas dispersas en movimiento 3D de humanos y robots humanoides. Se distribuye en tres formatos de esqueleto: el cuerpo paramétrico SOMA propio de NVIDIA, el robot humanoide Unitree G1 y SMPL-X.

El lanzamiento original es un proyecto de PyTorch. Necesitabas tener configurado todo el stack de CUDA antes de poder generar un solo clip, lo cual es una verdadera barrera para cualquiera cuya computadora esté configurada para trabajo 3D en lugar de aprendizaje automático.

kimodo.cpp es un port nativo en C++ y GGML. Carga pesos GGUF, se ejecuta en Vulkan o en el procesador e incluye una pequeña interfaz web local. Sin Python al momento de generar, sin CUDA, sin red. Eso es todo, y es más importante de lo que parece, porque hace que Kimodo pase de ser "algo que ejecuta la gente de ML" a "algo que abres en tu estación de trabajo".

La interfaz web local de kimodo.cpp que muestra el selector de modelos de movimiento, el cuadro de prompt y la vista previa del esqueleto 3D
La interfaz web incluida. Selector de modelo, prompt, conteo de fotogramas, vista previa del esqueleto en vivo y un botón Download GLB, todo disponible desde localhost.

2. La situación de la licencia, que cambió el 26 de agosto

Esta es la parte en la que se equivoca la mayoría de los artículos, porque cambió hace poco y en ambas direcciones a la vez.

Originalmente, el port incluía pesos convertidos de SMPL-X. Esos fueron retirados. El autor notó que la licencia original de NVIDIA en ese checkpoint en particular prohíbe explícitamente distribuir modelos derivados, y retiró el GGUF, el manifiesto y los checksums. La model card que los reemplazó lo dice claramente en lugar de dejar atrás un misterioso error 404, lo cual agradezco más de lo que esperaba.

Casi al mismo tiempo, se publicaron otros cuatro checkpoints bajo una licencia completamente diferente y se agregó compatibilidad con ellos al port.

ModeloEsqueletoLicenciaUso comercial
SOMA RP v1.1SOMA, 30 articulacionesNVIDIA Open ModelPermitido
SOMA SEED v1.1SOMA, 30 articulacionesNVIDIA Open ModelPermitido
G1 RP v1Unitree G1, 34 articulacionesNVIDIA Open ModelPermitido
G1 SEED v1Unitree G1, 34 articulacionesNVIDIA Open ModelPermitido
SMPL-X RP v1SMPL-X, 22 articulacionesNVIDIA Internal Scientific R&DSolo investigación
Si planeas lanzar algo, usa SOMA o G1
El checkpoint de SMPL-X está restringido a investigación interna no destinada a producción y no se puede redistribuir. Aún puedes usarlo aceptando tú mismo la licencia de NVIDIA en Hugging Face y convirtiendo los pesos localmente con el convertidor del repositorio, pero eso no te otorga derechos comerciales. Los checkpoints SOMA y G1 son los que puedes incluir en un producto.

La interfaz es honesta al respecto, lo cual no esperaba de un port de fin de semana. Eliges un modelo y te dice qué licencia se aplica antes de generar cualquier cosa.

El selector de modelos en kimodo.cpp que muestra la descripción del esqueleto SOMA y su línea de licencia para uso comercial
El selector de modelos muestra el esqueleto, el checkpoint original y los términos de la licencia. Los modelos no comerciales reciben una advertencia en lugar de esta línea.

3. Qué hardware necesitas realmente

Los requisitos son bajos, pero vale la pena entender por qué son bajos en vez de limitarse a leer una tabla.

RecursoMínimoCómodo
Espacio libre en disco25 GB35 GB, en una unidad NVMe
RAM del sistema4 GB32 GB, y consulta la sección 5
VRAM, ejecución con GPU1.2 GB2 GB
CPU2 núcleos6 núcleos

El uso máximo de memoria se mantiene por debajo de 2 GB en todas las configuraciones, ya sea con GPU o con procesador. El parámetro es KIMODO_TEXT_LAYER_CHUNK, y el número que acepta indica capas, no gigabytes: el chunk 2 usa 1.2 GB de VRAM, el chunk 4 usa 1.8 GB y el chunk 8 predeterminado usa 3.5 GB. Aumentarlo no acelera nada, porque el encoder se lee una vez por ejecución, sin importar el tamaño del chunk.

Hay un límite mínimo estricto en torno a 1.3 GB. La tabla de embeddings es una única asignación de 1.05 GB que no se puede dividir con ningún tamaño de chunk, por lo que por debajo de eso el programa no puede iniciarse en absoluto.

Una tarjeta gráfica ayuda menos de lo que imaginas
En las pruebas del autor, una RTX 5090 Laptop terminó un clip de tres segundos en 25.9 s, un procesador de 16 núcleos tardó 33.7 s y los gráficos integrados Intel Arc tardaron 32.5 s. Eso equivale a una diferencia de 1.3x entre una tarjeta de gama alta y una CPU. La mayor parte del trabajo consiste en transmitir el encoder de texto de 15.2 GB, no en hacer cálculos. Una tarjeta vale la pena cuando se usan muchos pasos de denoising, no cuando aumenta la duración del clip.

4. Cómo instalarlo en Windows

El proyecto documenta Linux. Windows funciona y el archivo CMake tiene una rama específica para MSVC, pero hay cuatro puntos donde puedes perder una hora. Aquí está la versión corta; puedes descargar la guía completa paso a paso al final de esta sección.

1

Instala el toolchain y luego abre una terminal nueva

Git, Visual Studio Build Tools con la carga de trabajo de C++, el Vulkan SDK y Go si quieres la interfaz web.

winget install Git.Git
winget install Microsoft.VisualStudio.2022.BuildTools --override "--quiet --wait --norestart --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --includeRecommended"
winget install KhronosGroup.VulkanSDK
winget install GoLang.Go

El componente VC.CMake.Project no es opcional. Sin él obtienes un compilador, pero no CMake ni Ninja, y el mensaje de error no menciona nada de esto. Luego cierra todas las terminales: el instalador de Vulkan configura VULKAN_SDK para todo el sistema y una terminal que ya esté abierta nunca detectará esa variable.

2

Clona con submódulos

git clone --recurse-submodules https://github.com/localai-org/kimodo.cpp
cd kimodo.cpp

GGML es un submódulo. Si clonas el repositorio sin incluir los submódulos, GGML queda vacío, y descargar el repositorio como ZIP tampoco funciona por la misma razón.

3

Aplica dos correcciones al código fuente y luego compila

Agrega #include <stdexcept> a src/denoiser.cpp, src/generate.cpp y src/llm_tokenizer.cpp, y cambia path.c_str() por path.string().c_str() en src/llm_text_encoder.cpp. Ambas correcciones son correctas en todas las plataformas y simplemente no se han incorporado upstream. Luego, desde una terminal donde se haya ejecutado vcvars64.bat:

cmake -S . -B build-win -G Ninja -DCMAKE_BUILD_TYPE=Release -DKIMODO_ENABLE_VULKAN=ON -DKIMODO_BUILD_TESTS=OFF
cmake --build build-win
4

Descarga los pesos

El encoder de texto es compartido por todos los modelos, así que es una descarga única de 15.2 GB. Cada modelo de movimiento suma solo alrededor de 1.13 GB adicionales.

pip install huggingface_hub
hf download LocalAI-io/Llama-3-Kimodo-GGML --local-dir . --include "generated/llm2vec-text-bundle/*"
hf download LocalAI-io/Kimodo-SOMA-RP-v1.1-GGML --local-dir . --include "models/*"

Agregar los cuatro modelos con licencia abierta ocupa alrededor de 4.5 GB, y no cuatro veces 17, porque el encoder es compartido.

Un fallo silencioso que me costó una hora
Si un repositorio de Hugging Face fue vaciado en upstream, como ocurrió con el de SMPL-X, entonces hf download con --include no coincide con nada y finaliza con éxito. Sin errores, sin archivos, código de salida cero. Mi script de configuración reportó una ejecución limpia y solo me di cuenta de que faltaba el modelo cuando falló la generación. Siempre verifica que el .gguf realmente haya quedado en models\.
Descarga la guía completa de configuración para Windows

Cada comando, ambas correcciones al código fuente con los errores exactos que evitan, todas las variables de entorno y una tabla de solución de problemas que vincula cada síntoma con su causa real. Escrito después de hacer esto en una máquina sin ningún compilador instalado.

kimodo-windows-setup.md

5. Cómo generar tu primer clip

La línea de comandos es posicional y las DLL de GGML se encuentran en la carpeta bin del árbol de compilación, en lugar de estar junto al ejecutable. Si pasas eso por alto, el programa se cierra al instante sin mostrar nada. Parece un cierre inesperado, pero en realidad Windows no puede cargar una DLL.

Command Prompt
set PATH=%CD%\build-win\bin;%PATH%
build-win\kmd-generate.exe models\kimodo-soma-rp-v1.1-f32.gguf generated\llm2vec-text-bundle prompt.txt 90 20 41 out

Son 90 frames a 30 fps, es decir, tres segundos, con 20 pasos de denoising y la semilla 41. Si prefieres usar la interfaz web:

go run ./demo -addr 127.0.0.1:8094 -generator build-win/kmd-generate.exe

Dos números determinan la calidad del resultado. Con Frames, el movimiento se mantiene coherente hasta unos 300 frames, o diez segundos. A los 400 frames el clip presenta jitter y a los 600 se convierte en ruido aproximadamente después del frame 300. Aunque parezca contradictorio, los clips más cortos resultan más contundentes: el mismo prompt a 120 frames produce un movimiento más definido y atlético que a 300, porque el modelo rellena el tiempo extra en lugar de repetir la acción con más fuerza.

Steps es la cantidad de pasos de denoising, y 20 funciona tanto para borradores como para resultados finales. El costo es lineal, así que 100 pasos cuestan cinco veces más sin ninguna mejora visible. La interfaz incluida actualmente tiene el valor 100 fijado en el código de demo/index.html; vale la pena cambiarlo a 20 antes de hacer algo serio con ella.

Por qué la primera ejecución tarda minutos y el modelo no tiene la culpa
En cada generación se lee el encoder de 15.2 GB desde el disco. Si la caché de archivos no puede retenerlo, esa lectura se repite cada vez.

En mi computadora, con un Ryzen 7 7800X3D, 31 GB de RAM y los pesos en un SSD SATA, un clip de tres segundos tardó 399 segundos. De ese tiempo, aproximadamente 380 segundos fueron de lectura del disco y 10 segundos de uso de CPU. La RTX 4070 SUPER estuvo inactiva todo el tiempo. La unidad entregaba 40 MB/s, y 15.2 GB a 40 MB/s son 380 segundos. La cuenta cierra exactamente.

Dos soluciones, en orden de efectividad: pon los pesos en una unidad NVMe y libera RAM antes de generar. El encoder necesita aproximadamente 16 GB libres en la caché de archivos para permanecer en ella, y una computadora de 32 GB con un navegador y un cliente de chat abiertos solo tiene unos 7 GB disponibles para esa caché, por lo que se comporta como una computadora de 16 GB.

6. Cómo llevar el movimiento a un rig real

Generar es la parte fácil. Este port resulta interesante para un artista 3D, más que para un investigador, porque el resultado se puede aplicar a un rig de personaje común sin demasiadas complicaciones.

La interfaz web tiene un botón Download GLB. El servidor de demostración genera el archivo glTF, así que obtienes un archivo que se abre en Blender con una jerarquía de huesos y keyframes ya configurados. Para la mayoría de los trabajos, eso es todo lo que necesitas y puedes saltarte los detalles de formato que vienen a continuación.

Cinco personajes diferentes de Mixamo, cada uno reproduciendo un movimiento distinto generado por Kimodo
Cinco rigs de Mixamo, cinco prompts, un modelo. Nada aquí fue animado a mano.

Aquí es donde SOMA resulta ser un golpe de suerte. No utiliza para nada la convención de nomenclatura de SMPL-X. Sus 30 articulaciones se llaman Hips, Spine1, LeftShoulder, LeftForeArm y así sucesivamente, lo cual sigue casi exactamente la convención de Mixamo. La mayoría de los huesos se mapean agregando el prefijo mixamorig: y nada más.

Las piernas son una trampa, y los nombres colisionan
El LeftLeg de SOMA es el muslo. El mixamorig:LeftLeg de Mixamo es la espinilla. El mapeo correcto es de LeftLeg de SOMA a mixamorig:LeftUpLeg, y de LeftShin de SOMA a mixamorig:LeftLeg. Un mapeo solo con prefijos te da un personaje cuyas rodillas se doblan desde la cadera, y es lo primero que debes revisar cuando una transferencia se ve mal.

Para Unreal dejé de hacerlo a mano. Más abajo hay una herramienta de dos scripts que toma una carpeta de clips y te deja una Anim Sequence horneada en el maniquí. Maneja los tres esqueletos sin ninguna configuración porque la cantidad de articulaciones permite identificar de cuál se trata.

1

De clip a archivo, en tu escritorio

Python 3.8 o una versión más reciente, sin nada más. Sin Blender, sin paquetes. Indícale la carpeta que creó Kimodo y obtienes un .glb.

python kimodo_to_glb.py path/to/clip
python kimodo_to_glb.py clips/* --outdir glb

Verifica su propia salida antes de escribir: reconstruye la pose a partir del archivo que acaba de crear y la compara con la entrada, de modo que un eje incorrecto o un cuaternión con el orden de componentes equivocado se detecta aquí en lugar de tres pasos más adelante en Unreal. El número que imprime debería estar alrededor de 1e-08.

2

De archivo a personaje, dentro de Unreal

Abre el Output Log, cambia la casilla de entrada en la parte inferior de Cmd a Python y pega:

py "C:/path/to/unreal_retarget.py" "C:/path/to/walk_150.glb"

Eso importa el archivo, construye el IK Rig y el IK Retargeter, aplica las dos correcciones que se detallan abajo, hornea y deja una Anim Sequence en /Game/Kimodo/Retargeted/. Coloca el maniquí en tu nivel, establece Animation Mode en Use Animation Asset y selecciona la secuencia. Pasa varias rutas para procesarlas en lote, o añade al final una ruta de Skeletal Mesh para usar otro personaje como destino.

Genera un informe para cada clip para que no tengas que comprobarlo a ojo:

kick_120: SMPL-X, 22 joints
    9 chains mapped, 19 left at rest (Root, LeftThumb, ...)
    reach 102 cm to 95 cm, arms corrected by up to 48 deg
    arms match 0.998 (worst lowerarm_r), pelvis 93 cm, lowest toe -1 cm,
    travelled 123 cm over 4.0 s

arms match mide qué tan bien coincide la dirección de los brazos del personaje con la de los brazos de origen en distintos momentos del clip. Por encima de 0.95 es un buen valor. lowest toe debería estar cerca de cero: muy por encima y el personaje flota, muy por debajo y se hunde.

Las dos correcciones, y por qué un retargeter hecho a mano falla sin ellas
El rig de origen está medio hundido en el suelo. Kimodo coloca la cadera en el origen con las piernas colgando por debajo, de modo que el rig empieza hundido en el suelo y al retargeter no le queda rango vertical. El script lo eleva según el alcance de las piernas en reposo. Ojo: en reposo, no en el primer fotograma de la animación: de lo contrario, un clip que empiece agachado se hornearía de pie.

Las poses de reposo no coinciden. El maniquí reposa en una pose en A, Kimodo no. Si se deja así, el retargeter interpreta esa diferencia como movimiento y los brazos quedan mal durante todo el clip. El script mide ambas poses y compensa la diferencia en cada segmento del brazo, empezando por el padre y siguiendo con el hijo. Por lo general, la diferencia es de entre 45 y 55 grados.
G1 es al que hay que prestar atención
Se puede hacer retarget de los tres esqueletos al maniquí, pero el Unitree G1 es un robot. No tiene clavícula, cuello ni cabeza, así que esas cuatro cadenas mantienen su pose de reposo en el personaje. Además, cada cadera se divide en tres articulaciones de un solo eje donde el maniquí tiene una sola, por lo que la rotación de la cadera se pierde en parte. Los brazos y las piernas se transfieren bien. SOMA y SMPL-X se mapean por completo.
Una criatura grande no humanoide en Unreal Engine reproduciendo un movimiento generado por Kimodo, con el prompt de origen flotando arriba
El retarget no se limita a humanos. Esta criatura usa la misma salida de 30 articulaciones que los personajes de Mixamo de arriba.
Una larga fila de rigs de diferentes personajes en Unreal Engine, cada uno reproduciendo una animación generada por separado
Una ejecución por lotes. Cada personaje en esta fila recibió su propio prompt y su propio clip generado, y un solo script les hizo el retarget a todos.
Si ya tienes código de retargeting para SMPL-X, dejará de funcionar
La salida sin procesar son dos archivos float32: local_rotations_xyzw.f32 en [FRAMES, JOINTS, 4] y root_positions.f32 en [FRAMES, 3]. La tabla de formato publicada indica 22 articulaciones, y eso es solo para SMPL-X. SOMA tiene 30 y G1 tiene 34.

Un clip de SOMA de 90 fotogramas tiene exactamente 90 x 30 x 4 x 4 = 43,200 bytes. Léelo con un stride de 22 articulaciones y no obtendrás ninguna excepción ni advertencia, pero sí una animación que parece como si el rig tuviera convulsiones. Deduce la cantidad de articulaciones a partir del tamaño del archivo en lugar de dejarla fija en el código.
Descarga la herramienta y las notas de formato

Los dos scripts, un clip de ejemplo para que puedas probar la parte de Unreal sin generar nada antes, y las notas: la jerarquía completa de SOMA de 30 articulaciones con índices padre, el mapa completo de nombres de Mixamo incluyendo los huesos que no se mapean de forma directa, la trampa del orden de los cuaterniones y el procedimiento para Blender.

Mira cómo se posicionan realmente las herramientas 3D con IA
Kimodo genera movimiento, no mallas. Para la parte de modelos en el pipeline, nuestra Arena a ciegas enfrenta generadores entre sí en enfrentamientos anónimos y los clasifica según los votos en lugar del marketing, y la tabla de clasificación recopila las puntuaciones de la comunidad en calidad de malla, low poly y texturizado.

Resumen

EtapaCostoNotas
Instalación de la toolchain~30 min, ~3 GBBuild Tools, Vulkan SDK, Go
Compilación~2 minPrimero dos correcciones de una sola línea en el código fuente
Pesos15.2 GB + 1.13 GB cada unoEncoder compartido entre todos los modelos
Generación, en caliente~20 s de cómputoMás streaming desde el disco, consulta la sección 5
Retarget a MixamoMinutosMapa de nombres más la corrección de las piernas

La noticia no es que exista un modelo de texto a movimiento. Es que este ahora funciona en hardware que ya tienes, bajo una licencia que te permite publicar el resultado y se adapta a un rig de Mixamo en una tarde. Lo que más me sorprendió es que el cuello de botella es la lectura de disco, no una tarjeta gráfica, lo que significa que la mejora más económica para cualquiera que se tome esto en serio es una unidad NVMe en lugar de una mejor GPU.

Si quieres conocer el resto del pipeline que lleva hasta aquí, tenemos guías sobre el pipeline completo de personajes 3D con IA, rigging con IA para personajes no humanoides y HY-Motion, el otro modelo de texto a animación que vale la pena conocer.

Preguntas frecuentes

¿Puede funcionar Kimodo sin tarjeta gráfica?

Sí. Configura KIMODO_BACKEND=cpu y se ejecuta en el procesador. Todo el pipeline está dominado por el streaming del codificador de texto de 15.2 GB más que por la aritmética, así que en el banco de pruebas del autor una RTX 5090 fue solo alrededor de 1.3x más rápida que un procesador de 16 núcleos en un clip de tres segundos. Dos núcleos es el mínimo documentado.

¿Cuánta VRAM necesita Kimodo.cpp?

El pico de memoria se mantiene por debajo de 2 GB en todas las configuraciones. KIMODO_TEXT_LAYER_CHUNK lo controla: el chunk 2 usa 1.2 GB y es seguro en una tarjeta de 2 GB, el chunk 4 usa 1.8 GB y el chunk 8 por defecto usa 3.5 GB.

¿Puedo usar las animaciones de Kimodo comercialmente?

Depende del checkpoint. Los modelos SOMA y G1 están publicados bajo la NVIDIA Open Model License, que permite el uso comercial. El checkpoint SMPL-X está bajo la NVIDIA Internal Scientific Research and Development Model License, que lo limita a la investigación interna fuera de producción y prohíbe su redistribución. Verifica con qué modelo generaste antes de publicar cualquier cosa.

¿Por qué mi primera generación es tan lenta?

Cada ejecución hace streaming del codificador de texto de 15.2 GB desde el disco. Si tu caché de archivos no puede retenerlo, esa lectura se repite en cada generación. En un Ryzen 7 7800X3D con los pesos en un SSD SATA, un clip de tres segundos tardó 399 segundos, de los cuales unos 380 fueron de lectura de disco y solo 10 segundos fueron de CPU. Coloca los pesos en una unidad NVMe y libera RAM antes de generar.

¿Por qué mi script de retargeting produce basura después de cambiar a SOMA?

La cantidad de articulaciones cambió. SMPL-X tiene 22 articulaciones, SOMA tiene 30 y G1 tiene 34, y nada en el formato de salida sin procesar indica cuál tienes. Leer un archivo SOMA con un stride de 22 articulaciones falla de forma silenciosa. Deduce la cantidad de articulaciones a partir del tamaño del archivo en lugar de definirla de forma fija en el código.

¿Quieres comparar estas herramientas tú mismo?

Kimodo.cpp: ejecuta localmente el modelo de NVIDIA que genera movimiento a partir de texto, incluso sin GPU | Top 3D AI