TempFS é um projeto que foi desenvolvido inicialmente como um prototipo para contêineres temporarios (tempfs) orquestrado para modelos GGUF usando llma-cpp.
A ideia central é fazer com que modelos GGUF possam interagir em ambientes temproarios de forma eficiente e discreta. Pode notar que o contêiner ubuntu pode facilmente ser usado como playground para testes!
O script llama-cpp.js espera que um container llama-cpp esteja configurado e pronto para uso. Você pode criá-lo usando o seguinte comando Podman:
podman create \
--name llama-cpp \
--cpus=4 \
--memory=6g \
--memory-swap=7g \
-v llama_models:/models \
-p 8080:8080 \
--entrypoint /bin/sh \
ghcr.io/ggml-org/llama.cpp:full \
-c "sleep infinity"O volume llama_models será usado para armazenar o modelo GGUF (configurado em config.json), que será baixado automaticamente na primeira execução do llama-cpp.js.
O projeto oferece dois exemplos principais de ambientes:
Servidor Llama-CPP (llama-cpp.js)
Inicia o container llama-cpp (se não estiver rodando), baixa o modelo configurado (se necessário) e fornece um terminal interativo para interagir com o container.
node llama-cpp.jsAmbiente Ubuntu Efêmero (tempfs.js)
Cria um container temporário baseado em ubuntu:24.04 na memória (tempfs). Este ambiente é efêmero e será completamente destruído ao ser encerrado.
node tempfs.jsEm ambos os terminais, você pode usar os seguintes comandos:
| Comando | Descrição |
|---|---|
bash |
Entra no shell interativo do container. |
bash <comando> |
Executa um comando no container e retorna a saída. |
clear |
Limpa o terminal. |
exit |
Encerra o processo e limpa o container. |
Limpeza Automática (Processo Monitor)
O projeto implementa um mecanismo de Limpeza Automática essencial para garantir que nenhum recurso fique órfão. Isso é feito através do utils/monitor.js, que atua como um "Processo Zumbi Reverso":
- Monitoramento: O
monitor.jsé iniciado como um processo filho desanexado (detached: true) do processo principal do Node.js. - Vigilância: Ele monitora continuamente o PID do processo pai.
- Limpeza Garantida: Se o processo principal do Node.js morrer (seja por um
exitnormal, um erro não tratado, ou um sinal de interrupção comoCtrl+C), o monitor detecta a morte do pai e executa imediatamente os comandospodman rm -f <container_name>para garantir que o container associado seja parado e removido, limpando o ambiente e evitando containers órfãos.
Essa arquitetura garante que os ambientes efêmeros sejam realmente temporários.
Nota sobre Dependências (npm podman, etc.)
Você notará que este projeto não utiliza bibliotecas de terceiros (como npm podman ou SDKs) para interagir com o Podman. A comunicação é feita diretamente através da execução de comandos podman via child_process.
Por quê?
- Minimalismo e Controle: Evitar dependências externas reduz a complexidade e o overhead do projeto, dando controle total sobre os comandos executados.
- Foco no Core: O objetivo é simular um ambiente de agente que usa comandos de terminal, e a execução direta de comandos Podman é a forma mais fiel e robusta de alcançar isso.
- Portabilidade: Embora o foco seja Podman, a abordagem de linha de comando facilita a adaptação para Docker ou outras ferramentas de container, bastando trocar o prefixo do comando.
Obrigado pela sua atenção!
