GuiaStefan VaskevichStefan Vaskevich

Kimodo.cpp: execute a geração de movimento por texto da NVIDIA localmente, mesmo sem GPU

NVIDIA Kimodo portado para C++ e GGML. Ele roda no Vulkan ou em uma CPU comum, precisa de menos de 2 GB, e os modelos SOMA e G1 são fornecidos sob uma licença que permite uso comercial. Configuração completa para Windows e minhas notas de retargeting.

Quatro rigs de personagens em uma planície desértica, cada um reproduzindo um movimento diferente gerado a partir de um prompt de texto pelo Kimodo

Ferramentas usadas neste artigo

Você digita "uma pessoa executa um chute giratório de artes marciais" e obtém uma animação utilizável, na sua própria máquina, sem ambiente Python e sem chamadas de rede. Esse é o Kimodo, o modelo de difusão de movimento da NVIDIA, e alguém o portou para C++ e GGML para que rode no Vulkan ou em um processador comum com menos de 2 GB de memória.

Passei um dia instalando o Kimodo do zero no Windows, gerando clipes, aplicando-os a rigs do Mixamo e importando-os para a Unreal Engine. Este guia traz tudo o que aprendi, incluindo as duas coisas que mais me custaram tempo e não estão em nenhum README: quais modelos você realmente tem permissão para usar e por que tudo é limitado pelo seu disco, e não pela sua placa de vídeo.

Todo o fluxo de trabalho em uma linha
Prompt de texto → kimodo.cpp no Vulkan ou CPU (menos de 2 GB, ~20 s de computação real) → GLB → aplicação ao manequim da Unreal com dois scripts ou a um rig do Mixamo com um mapa de nomes → animação finalizada. Os checkpoints SOMA e G1 estão sob a NVIDIA Open Model License, portanto o uso comercial é permitido.

1. O que é o Kimodo e o que o port em C++ mudou

A NVIDIA lançou o Kimodo em março de 2026. Ele é um modelo cinemático de difusão de movimento treinado em 700 horas de captura de movimento óptica licenciada comercialmente, e transforma prompts de texto e restrições cinemáticas esparsas em movimento 3D de humanos e robôs humanoides. Ele é fornecido em três formatos de esqueleto: o corpo paramétrico SOMA da própria NVIDIA, o robô humanoide Unitree G1 e o SMPL-X.

A versão original é um projeto em PyTorch. Você precisava de toda a stack do CUDA funcionando antes de conseguir gerar um único clipe, o que é uma barreira real para quem tem uma máquina configurada para trabalhar com 3D, e não com aprendizado de máquina.

O kimodo.cpp é um port nativo em C++ que usa GGML. Ele carrega pesos GGUF, roda com Vulkan ou no processador e inclui uma pequena interface local acessível pelo navegador. Sem Python na hora da geração, sem CUDA, sem rede. É basicamente isso, e é mais importante do que parece, porque o Kimodo deixa de ser "uma coisa que o pessoal de aprendizado de máquina roda" e passa a ser "uma coisa que abre na sua estação de trabalho".

A interface web local do kimodo.cpp mostrando o seletor de modelos de movimento, a caixa de prompt e a pré-visualização do esqueleto em 3D
A interface web integrada. Seletor de modelos, prompt, contagem de quadros, pré-visualização do esqueleto em tempo real e um botão Download GLB, tudo disponível pelo localhost.

2. A situação da licença, que mudou em 26 de agosto

Esta é a parte que a maioria dos artigos erra, porque isso mudou recentemente e mudou em ambas as direções ao mesmo tempo.

O port originalmente incluía os pesos convertidos do SMPL-X. Eles foram retirados. O autor percebeu que a licença original da NVIDIA para aquele checkpoint específico proíbe explicitamente a distribuição de modelos derivados e removeu o GGUF, o manifesto e as somas de verificação. A ficha do modelo que os substituiu explica isso claramente em vez de deixar um 404 misterioso para trás, o que apreciei mais do que esperava.

Quase no mesmo momento, outros quatro checkpoints foram disponibilizados sob uma licença completamente diferente, e o suporte a eles chegou ao port.

ModeloEsqueletoLicençaUso comercial
SOMA RP v1.1SOMA, 30 articulaçõesNVIDIA Open ModelPermitido
SOMA SEED v1.1SOMA, 30 articulaçõesNVIDIA Open ModelPermitido
G1 RP v1Unitree G1, 34 articulaçõesNVIDIA Open ModelPermitido
G1 SEED v1Unitree G1, 34 articulaçõesNVIDIA Open ModelPermitido
SMPL-X RP v1SMPL-X, 22 articulaçõesNVIDIA Internal Scientific R&DApenas pesquisa
Se você planeja lançar algo, use SOMA ou G1
O checkpoint do SMPL-X é restrito a pesquisas internas não voltadas à produção e não pode ser redistribuído. Você ainda pode usá-lo aceitando pessoalmente a licença da NVIDIA no Hugging Face e convertendo os pesos localmente com o conversor no repositório, mas isso não lhe concede direitos comerciais. Os checkpoints SOMA e G1 são os que você pode usar em um produto.

A interface é transparente quanto a isso, o que eu não esperava de um port de fim de semana. Escolha um modelo e ela informa sob qual licença você está antes de gerar qualquer coisa.

O seletor de modelos no kimodo.cpp mostrando a descrição do esqueleto SOMA e sua linha de licença para uso comercial
O seletor de modelos exibe o esqueleto, o checkpoint original e os termos de licença. Modelos não comerciais recebem um aviso em vez dessa linha.

3. De qual hardware você realmente precisa

Os requisitos são baixos, e vale a pena entender por que são baixos em vez de apenas consultar uma tabela.

RecursoMínimoConfortável
Espaço livre em disco25 GB35 GB, em uma unidade NVMe
RAM do sistema4 GB32 GB, e veja a seção 5
VRAM, com GPU1.2 GB2 GB
CPU2 núcleos6 núcleos

O pico de memória fica abaixo de 2 GB em qualquer configuração, GPU ou processador. O ajuste é KIMODO_TEXT_LAYER_CHUNK, e o número que ele recebe corresponde a camadas, não gigabytes: o chunk 2 ocupa 1.2 GB de VRAM, o chunk 4 ocupa 1.8 GB e o chunk 8 padrão ocupa 3.5 GB. Aumentá-lo não deixa nada mais rápido, porque o encoder é lido uma vez por execução em qualquer tamanho de chunk.

Existe um limite mínimo de cerca de 1.3 GB. A tabela de embeddings ocupa um único bloco de 1.05 GB que não pode ser dividido, independentemente do tamanho do bloco de camadas. Por isso, abaixo desse limite o programa simplesmente não inicia.

Uma placa de vídeo ajuda menos do que você imagina
Nos testes do autor, uma RTX 5090 Laptop finalizou um clipe de três segundos em 25.9 s, um processador de 16 núcleos levou 33.7 s e a GPU integrada Intel Arc levou 32.5 s. Isso representa uma diferença de 1.3x entre uma placa topo de linha e uma CPU. O tempo é dominado pela leitura dos 15.2 GB do codificador de texto, não pelos cálculos. Uma placa de vídeo compensa quando há muitas etapas de denoising, não quando o clipe é mais longo.

4. Instalando no Windows

A documentação do projeto é voltada ao Linux. O Windows funciona, e o arquivo CMake tem uma ramificação explícita para MSVC, mas há quatro pontos em que você pode perder uma hora. Aqui está a versão resumida, e o passo a passo completo está disponível para download no final desta seção.

1

Instale a toolchain e depois abra um novo terminal

Git, Visual Studio Build Tools com a carga de trabalho de C++, o Vulkan SDK e Go se você quiser a interface 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

O componente VC.CMake.Project não é opcional. Sem ele, você tem um compilador, mas não tem CMake nem Ninja, e a mensagem de erro não menciona isso. Depois, feche todos os terminais: o instalador do Vulkan define VULKAN_SDK em todo o sistema, e um terminal que já estiver aberto não terá acesso à variável.

2

Clone com submódulos

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

O GGML é um submódulo. Um clone comum o deixa vazio, e baixar o repositório como ZIP não funciona de jeito nenhum pelo mesmo motivo.

3

Aplique duas correções no código-fonte e compile

Adicione #include <stdexcept> a src/denoiser.cpp, src/generate.cpp e src/llm_tokenizer.cpp, e altere path.c_str() para path.string().c_str() em src/llm_text_encoder.cpp. Ambas estão corretas em todas as plataformas e simplesmente ainda não foram mescladas upstream. Depois, a partir de um terminal onde o vcvars64.bat tenha sido executado:

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

Baixe os pesos

O text encoder é compartilhado por todos os modelos, então é um download único de 15.2 GB. Cada modelo de movimento ocupa apenas cerca de 1.13 GB a mais.

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/*"

Adicionar todos os quatro modelos de licença aberta ocupa cerca de 4.5 GB, e não quatro vezes 17, porque o encoder é compartilhado.

Uma falha silenciosa que me custou uma hora
Se um repositório do Hugging Face foi esvaziado upstream, como aconteceu com o do SMPL-X, o hf download com --include não encontra nenhuma correspondência e encerra com sucesso. Nenhum erro, nenhum arquivo, exit code zero. Meu script de setup informou uma execução limpa e eu só percebi a falta do modelo quando a geração falhou. Sempre verifique se o .gguf realmente foi parar em models\.
Baixe o guia completo de configuração para Windows

Todos os comandos, ambas as correções no código-fonte com os erros exatos que elas evitam, todas as variáveis de ambiente e uma tabela de solução de problemas que mapeia cada sintoma à sua causa real. Escrito depois de fazer isso em uma máquina sem nenhum compilador instalado.

kimodo-windows-setup.md

5. Gerando seu primeiro clipe

A linha de comando é posicional, e as DLLs do GGML ficam na pasta bin da árvore de build, em vez de ficarem ao lado do executável. Se deixar isso passar, o programa fecha instantaneamente sem nenhuma saída, o que parece exatamente um crash, mas é o Windows falhando ao carregar uma 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

Isso são 90 quadros a 30 fps, portanto três segundos, com 20 etapas de denoising e semente 41. Já para a interface web:

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

Dois números definem a qualidade do que você obtém. Com Frames até cerca de 300, ou dez segundos, o clipe permanece coerente. Com 400 frames, o clipe apresenta jitter e, com 600, se transforma em ruído por volta do frame 300. Embora pareça contraditório, clipes mais curtos saem mais impactantes: o mesmo prompt com 120 frames parece mais nítido e atlético do que com 300, porque o modelo preenche o tempo extra em vez de repetir a ação com mais força.

Steps é a contagem de denoising, e 20 funciona tanto para rascunhos quanto para versões finais. O custo é linear, portanto 100 steps custam cinco vezes mais sem nenhum ganho visível. A interface incluída atualmente traz 100 fixo no código em demo/index.html, o que vale a pena mudar para 20 antes de fazer qualquer coisa séria com ela.

Por que sua primeira execução leva minutos, e a culpa não é do modelo
A cada geração, o codificador de 15.2 GB é lido do disco. Se ele não couber no cache de arquivos, essa leitura se repete toda vez.

Na minha máquina, um Ryzen 7 7800X3D com 31 GB de RAM e os pesos em um SSD SATA, um clipe de três segundos levou 399 segundos. Desse tempo, cerca de 380 segundos foram gastos na leitura do disco e 10 segundos no processamento pela CPU. A RTX 4070 SUPER ficou ociosa o tempo todo. A unidade estava entregando 40 MB/s, e 15.2 GB a 40 MB/s dá 380 segundos. A conta fecha exatamente.

Duas soluções, em ordem de impacto: coloque os pesos em uma unidade NVMe e libere RAM antes de gerar. O codificador precisa de cerca de 16 GB de espaço livre no cache de arquivos para permanecer no cache. Uma máquina de 32 GB com um navegador e um aplicativo de chat abertos só tem cerca de 7 GB disponíveis para esse cache, então se comporta como uma máquina de 16 GB.

6. Aplicando o movimento a um rig de verdade

Gerar é a parte fácil. Esse port interessa mais a um artista 3D do que a um pesquisador porque o resultado pode ser aplicado ao rig de um personagem comum com pouquíssimo esforço.

A interface web tem um botão Download GLB. O próprio servidor de demonstração cria o glTF, então você recebe um arquivo que abre no Blender já com a hierarquia de ossos e keyframes prontos. Para a maioria dos trabalhos, isso resolve tudo e dispensa os detalhes sobre formatos apresentados abaixo.

Cinco personagens diferentes do Mixamo, cada um reproduzindo um movimento diferente gerado pelo Kimodo
Cinco rigs do Mixamo, cinco prompts, um modelo. Nada aqui foi animado manualmente.

É aqui que o SOMA se mostra uma sorte. Ele não usa a convenção de nomenclatura do SMPL-X de jeito nenhum. Suas 30 articulações são chamadas de Hips, Spine1, LeftShoulder, LeftForeArm e assim por diante, o que segue quase exatamente a convenção do Mixamo. A maioria dos ossos é mapeada apenas adicionando o prefixo mixamorig: e nada mais.

As pernas são uma armadilha, e os nomes entram em conflito
O LeftLeg do SOMA é a coxa. O mixamorig:LeftLeg do Mixamo é a canela. O mapeamento correto é o LeftLeg do SOMA para mixamorig:LeftUpLeg, e o LeftShin do SOMA para mixamorig:LeftLeg. Um mapeamento feito apenas por prefixos gera um personagem cujos joelhos dobram a partir do quadril, e essa é a primeira coisa a verificar quando uma transferência parece errada.

Para a Unreal, parei de fazer isso manualmente. Há uma ferramenta de dois scripts abaixo que recebe a pasta de um clipe e deixa uma Anim Sequence com o bake pronto no manequim, e ela lida com todos os três esqueletos sem nenhuma configuração, porque a contagem de articulações identifica qual deles você tem.

1

Do clipe para o arquivo, no seu computador

Python 3.8 puro ou mais recente. Sem Blender, sem pacotes. Indique ao script a pasta criada pelo Kimodo e você terá um .glb.

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

Ele verifica sua própria saída antes de gravar: ele reconstrói a pose a partir do arquivo que acabou de criar e a compara com a entrada, de modo que um eixo errado ou um quatérnio na ordem incorreta de componentes é detectado aqui, em vez de três etapas depois na Unreal. O número que ele exibe deve ficar por volta de 1e-08.

2

Do arquivo para o personagem, dentro da Unreal

Abra o Output Log, mude a caixa de entrada na parte inferior de Cmd para Python e cole:

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

Isso importa o arquivo, cria o IK Rig e o IK Retargeter, aplica as duas correções abaixo, faz o bake e deixa uma Anim Sequence em /Game/Kimodo/Retargeted/. Coloque o manequim no seu nível, defina Animation Mode como Use Animation Asset e escolha a sequência. Passe vários caminhos para processá-los em lote ou informe o caminho de uma Skeletal Mesh por último para usar outro personagem como destino.

Ele gera um relatório para cada clipe em vez de deixar você avaliando no olho:

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 indica o quanto a direção dos braços do personagem se aproxima da direção dos braços do personagem de origem, medida em vários pontos do clipe. Acima de 0.95 é bom. lowest toe deve ficar perto de zero: muito acima e o personagem flutua, muito abaixo e ele afunda.

As duas correções, e por que um retargeter manual dá errado sem elas
O personagem de origem fica metade abaixo do chão. O Kimodo posiciona o quadril na origem com as pernas penduradas para baixo, então o rig começa afundado no chão e o retargeter fica sem alcance vertical. O script o levanta pela extensão da perna em repouso. Note bem: em repouso, não no primeiro frame da animação: do contrário, um clipe que começa agachado acabaria com o bake feito totalmente em pé.

As poses de repouso não coincidem. O manequim fica em A-pose, o Kimodo não. Se deixar como está, o retargeter interpreta essa diferença como movimento e os braços ficam na posição errada durante o clipe inteiro. O script mede as duas poses e cancela a diferença em cada segmento do braço, começando pelo segmento pai e seguindo para o filho. Isso geralmente corresponde a algo entre 45 e 55 graus.
O G1 é o que exige mais atenção
Todos os três esqueletos fazem retarget no manequim, mas o Unitree G1 é um robô. Ele não tem clavícula, pescoço nem cabeça, então essas quatro cadeias mantêm sua pose de repouso no personagem, e ele divide cada quadril em três articulações de eixo único onde o manequim tem apenas uma, de modo que a rotação do quadril é parcialmente perdida. Braços e pernas são transferidos sem problemas. O SOMA e o SMPL-X são mapeados por completo.
Uma criatura grande não humanoide na Unreal Engine reproduzindo um movimento gerado pelo Kimodo, com o prompt de origem flutuando acima
O retarget não se limita a humanos. Esta criatura é controlada pela mesma saída de 30 articulações dos personagens do Mixamo acima.
Uma longa fileira de diferentes rigs de personagens na Unreal Engine, cada um reproduzindo uma animação gerada separadamente
Uma execução em lote. Cada personagem desta fileira recebeu seu próprio prompt e seu próprio clipe gerado, e um único script fez o retarget de todos eles.
Se você já tem um código de retarget de SMPL-X, ele vai quebrar
A saída bruta consiste em dois arquivos float32: local_rotations_xyzw.f32 em [FRAMES, JOINTS, 4] e root_positions.f32 em [FRAMES, 3]. A tabela de formatos publicada indica 22 articulações, e isso é apenas para o SMPL-X. O SOMA tem 30 e o G1 tem 34.

Um clipe do SOMA de 90 frames tem exatamente 90 x 30 x 4 x 4 = 43,200 bytes. Leia-o com um stride de 22 articulações e você não receberá nenhuma exceção, nenhum aviso, e sim uma animação que parece que o rig está tendo uma convulsão. Deduza a contagem de articulações a partir do tamanho do arquivo em vez de fixá-la no código.
Baixe a ferramenta e as notas de formato

Os dois scripts, um clipe de exemplo para você testar a parte da Unreal sem precisar gerar nada antes e as notas: a hierarquia completa de 30 articulações do SOMA com os índices das articulações pai, o mapeamento completo dos nomes do Mixamo, incluindo os ossos que não têm correspondência direta, a pegadinha da ordem dos quatérnios e o procedimento no Blender.

Veja a posição real das ferramentas de IA para 3D no ranking
O Kimodo gera movimento, não malhas. Para o lado dos modelos no pipeline, nossa Arena às cegas coloca os geradores frente a frente em disputas anônimas e os classifica com base em votos em vez de marketing, e o ranking reúne as avaliações da comunidade sobre qualidade da malha, low poly e texturização.

Resumo

EtapaCustoObservações
Instalação da toolchain~30 min, ~3 GBBuild Tools, Vulkan SDK, Go
Compilação~2 minAntes, duas correções de uma linha no código-fonte
Pesos15.2 GB + 1.13 GB cadaEncoder compartilhado entre todos os modelos
Geração com cache aquecido~20 s de processamentoMais o streaming do disco, veja a seção 5
Retarget para o MixamoMinutosMapeamento de nomes mais a correção da perna

A grande novidade não é que existe um modelo de texto para movimento. É que este agora roda no hardware que você já tem, sob uma licença que permite lançar o resultado, e você consegue aplicar o movimento a um rig do Mixamo em uma tarde. O que mais me surpreendeu é que o gargalo é a leitura de disco, e não a placa de vídeo, o que significa que o upgrade mais barato para quem leva isso a sério é uma unidade NVMe, em vez de uma GPU melhor.

Se você quiser conhecer o restante do pipeline que leva até essa etapa, temos guias sobre o pipeline completo de personagens 3D com IA, rigging com IA para personagens não humanoides e HY-Motion, o outro modelo de texto para animação que vale a pena conhecer.

Perguntas frequentes

O Kimodo pode rodar sem placa de vídeo?

Sim. Defina KIMODO_BACKEND=cpu e ele roda no processador. Em todo o pipeline, o tempo é dominado pela leitura contínua do codificador de texto de 15.2 GB, e não pelos cálculos. Por isso, nos testes do autor, uma RTX 5090 foi apenas cerca de 1.3x mais rápida do que um processador de 16 núcleos para gerar um clipe de três segundos. O mínimo documentado é de dois núcleos.

De quanta VRAM o Kimodo.cpp precisa?

O pico de memória fica abaixo de 2 GB em todas as configurações. O KIMODO_TEXT_LAYER_CHUNK controla isso: o chunk 2 usa 1.2 GB e é seguro em uma placa de 2 GB, o chunk 4 usa 1.8 GB e o chunk 8 padrão usa 3.5 GB.

Posso usar as animações do Kimodo comercialmente?

Depende do checkpoint. Os modelos SOMA e G1 são publicados sob a NVIDIA Open Model License, que permite uso comercial. O checkpoint do SMPL-X está sob a NVIDIA Internal Scientific Research and Development Model License, que o limita a pesquisas internas fora de produção e proíbe a redistribuição. Antes de lançar qualquer coisa, verifique qual modelo você usou para gerar a animação.

Por que minha primeira geração é tão lenta?

Cada execução faz o streaming do codificador de texto de 15.2 GB a partir do disco. Se o seu cache de arquivos não conseguir mantê-lo, essa leitura se repete a cada geração. Em um Ryzen 7 7800X3D com os pesos em um SATA SSD, um clipe de três segundos levou 399 segundos, dos quais cerca de 380 foram de leitura de disco e apenas 10 segundos de CPU. Coloque os pesos em uma unidade NVMe e libere RAM antes de gerar.

Por que meu script de retargeting produz lixo depois de mudar para o SOMA?

A contagem de articulações mudou. O SMPL-X tem 22 articulações, o SOMA tem 30 e o G1 tem 34, e nada no formato dos dados brutos de saída informa qual deles você tem. Ler um arquivo SOMA com um stride de 22 articulações falha silenciosamente. Calcule a contagem de articulações a partir do tamanho do arquivo em vez de fixá-la no código.

Quer comparar essas ferramentas você mesmo?

Kimodo.cpp: execute a geração de movimento por texto da NVIDIA localmente, mesmo sem GPU | Top 3D AI