Adds idempotent, data-driven GGUF staging for the two new router models on
astro-orbiter alongside the production Qwen3.6-35B-A3B-UD-Q4_K_S. Both files
were already staged live (byte-exact); this commit codifies them in Ansible so
future re-runs and any new model adds are version-controlled and audit-friendly.
Changes:
- roles/llm-inference-multimodel/tasks/stage_model.yml (NEW)
Idempotent per-model task: stat -> exact byte-size guard -> conditional
get_url -> ownership/mode ensure -> notify router restart handler only on
actual download. Loops from models.yml; nothing hardcoded.
- roles/llm-inference-multimodel/tasks/models.yml
Appends the stage_model.yml loop (tagged: models) after the existing Qwen3.6
download tasks. Data driven from host_vars/astro-orbiter/vars.yml.
- roles/llm-inference-multimodel/defaults/main.yml
Adds llm_staged_models: [] default (empty = safe no-op for hosts with no
staged model list defined).
- roles/llm-inference-multimodel/handlers/main.yml
Adds 'restart llama-server-router on new GGUF' handler. Only fires when
stage_model.yml performs an actual download or corrects ownership/mode.
Normal idempotent re-runs (files already correct) do NOT fire this handler.
- host_vars/astro-orbiter/vars.yml
Adds llm_staged_models list with the two new models:
* Phi-3.5-mini-instruct-Q8_0.gguf (4,061,222,688 bytes,
bartowski/Phi-3.5-mini-instruct-GGUF)
* Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf (4,920,739,232 bytes,
bartowski/Meta-Llama-3.1-8B-Instruct-GGUF)
- playbooks/day1_deploy_llm_inference_multimodel.yml
Updates header comment: removes stale 'Semaphore broken' note, documents
the correct execution channel (Semaphore template
llm_inference_multimodel_stage_models, --tags models).
- group_vars/all/semaphore.yml
Adds llm_inference_multimodel_stage_models template entry (config-as-code).
Template is scoped to --tags models explicitly. Phase 4 (verify) is
EXCLUDED: verify.yml starts llama-server-qwen on :8002, which would collide
with the production llama-server-router.service already running on :8002.
Semaphore template created via API: project 1 / template id 19.
Execution: triggered immediately after this commit via Semaphore REST API.
38 lines
1.9 KiB
YAML
38 lines
1.9 KiB
YAML
---
|
|
# ------------------------------------------------------------------------------
|
|
# FILE: roles/llm-inference-multimodel/handlers/main.yml
|
|
# DESCRIPTION: Only a daemon-reload handler lives here now (harmless, no
|
|
# process impact). Per-service restart/start decisions are made
|
|
# explicitly in tasks/verify.yml (Phase 4), keyed off the
|
|
# per-unit `changed` result registered in tasks/systemd.yml
|
|
# (Phase 2) — NEVER combined, so a content change to one unit
|
|
# template still never restarts the other (plan §2/§6
|
|
# requirement: independent restart/rollback).
|
|
#
|
|
# BUGFIX: this file used to also define "restart
|
|
# llama-server-aux" / "restart llama-server-toolcall" handlers,
|
|
# notified from Phase 2's template tasks and fired there via
|
|
# `meta: flush_handlers` — causing both live services to
|
|
# restart during Phase 2, before Phase 3/4 had run. See
|
|
# tasks/systemd.yml for the full writeup. Restart logic moved
|
|
# to tasks/verify.yml so it only ever fires in Phase 4.
|
|
# ------------------------------------------------------------------------------
|
|
|
|
- name: Reload systemd
|
|
ansible.builtin.systemd:
|
|
daemon_reload: true
|
|
become: true
|
|
listen: "reload systemd"
|
|
|
|
# Restart the llama.cpp router so it re-discovers /opt/models after a NEW GGUF
|
|
# is staged. NOTIFIED ONLY from tasks/stage_model.yml when an actual download
|
|
# (or permission correction) occurs — a normal idempotent re-run that finds the
|
|
# files already correct will NOT fire this, so the live router is left
|
|
# untouched. Safe on the idle GPU (router holds no resident model when all
|
|
# entries are "unloaded"; restart is sub-second).
|
|
- name: restart llama-server-router on new GGUF
|
|
ansible.builtin.systemd:
|
|
name: "{{ llm_router_service_name | default('llama-server-router') }}"
|
|
state: restarted
|
|
become: true
|