Como funciona¶
lote submit <host> <script> faz rsync do seu repositório até o host, abre uma única conexão ssh e entrega o script ao scheduler daquele host por meio do executor on-host. O mesmo script chega a uma máquina comum, a um cluster slurm ou a um supercomputador pbs sem mudanças de código, porque o lote escolhe o backend a partir do que o host realmente tem.
flowchart TB
subgraph control["plano de controle (lote, no seu laptop)"]
direction LR
SETUP["lote setup<br/>integra um host"]
SUBMIT["lote submit<br/>despacha um job"]
PS["lote ps / reconcile<br/>acompanha cada host"]
end
subgraph onhost["executor on-host (lote exec, via ssh)"]
direction LR
DETECT["probe de scheduler<br/>command -v qsub / sbatch"]
ADAPT["submit / run / monitor<br/>um script, se adapta"]
end
subgraph clients["clientes tipados (wrappers finos)"]
direction LR
PUEUE["pueue<br/>host comum"]
SBATCH["sbatch<br/>cluster slurm"]
QSUB["qsub<br/>cluster pbs"]
BASH["bash<br/>sem scheduler"]
end
RSYNC(["rsync do repo para cima<br/>allowlist do lote.toml"]):::brand
DB(["armazenamento de estado<br/>.lote/db.json"]):::brand
SETUP --> RSYNC
SUBMIT --> RSYNC
RSYNC --> DETECT
DETECT --> ADAPT
ADAPT --> PUEUE
ADAPT --> SBATCH
ADAPT --> QSUB
ADAPT --> BASH
SUBMIT --> DB
PS --> DB
classDef brand fill:#eab308,stroke:#1a1a1a,stroke-width:2px,color:#1a1a1a;
As três camadas¶
Plano de controle (lote) roda no seu laptop. Ele integra hosts com lote setup, despacha jobs com lote submit e acompanha o estado das execuções em cada host com lote ps e lote reconcile. Ele nunca roda um job por conta própria. Ele dirige o executor on-host via ssh e registra cada dispatch em um armazenamento de estado local.
Executor on-host (lote exec) roda em um único host. Ele encontra o script do job, detecta o scheduler que o host de fato tem e então submete, roda e monitora o job, adaptando-se automaticamente àquele scheduler. Você também pode rodá-lo à mão em um login node, mas o lote normalmente o invoca por você como chefe run lote exec ....
Clientes tipados são wrappers finos sobre as ferramentas reais (qsub, sbatch, pueue, rsync). Cada um analisa a saída daquela ferramenta em registros tipados, de modo que o executor lê o estado de um job da mesma maneira em todo lugar. Novos backends são novas classes, nunca novos ramos if host == ....
Auto-detecção de scheduler¶
O lote integra um host uma única vez com lote setup, sondando-o em um login shell para que a toolchain do cluster esteja no PATH. A partir do que ele encontra, roteia todo job posterior para aquele host.
| host | o que o lote encontra | backend |
|---|---|---|
| um DGX ou PC via ssh | nenhum scheduler | pueue |
| um cluster slurm (ex.: miyabi) | sbatch |
sbatch |
| um cluster pbs (ex.: Pegasus) | qsub |
qsub |
| um login node comum | nada agendável | bash |
O mesmo job.sh roda nos quatro. Scripts de job protegem o module load com command -v module, então eles não fazem nada fora de um cluster, e argumentos posicionais fluem por uma variável de ambiente ARGS que o script encaminha ao seu entry point.
Fluxo de dispatch¶
lote setup miyabi # probe + rsync + chefe install, then cache the host's facts
lote submit miyabi train.sh # rsync up, pick sbatch, submit, print + record the handle
lote ps # the run shows up across every host
lote reconcile miyabi # compare recorded runs with the live scheduler
lote pull <handle> # rsync the recorded results path back
Um host só se torna um alvo depois que o chefe install tem sucesso durante a integração, então uma máquina que não consegue construir o ambiente nunca se torna um alvo. Depois disso, cada dispatch é rsync para cima, uma única chamada ssh para o lote exec e uma única linha gravada no armazenamento de estado.
A seguir, a referência de comandos e a referência de configuração.