software catalog

Docs pulled from project reposUpdated Sep 3, 2026View on GitHub

Model Catalog (models.yaml)

What is it?

models.yaml is the one file you edit to control what runs and how. It is the single source of truth behind every model-manager command — you rarely touch anything else.

The installer seeds env/<env>/models.yaml from this repo's model_manager/models.yaml. Edit the environment copy to add or remove models; the repo copy is the template for new environments.

It has three parts:

yaml
defaults:            # 1. Fallbacks applied to every model (namespace, engine, replicas)
storage:             #    Where downloaded weights live
network:             #    Proxy / connectivity settings for pulling from Hugging Face

models:              # 2. The models you can deploy — one entry per model
- name: qwen3-0-6b
  model_id: Qwen/Qwen3-0.6B     # the Hugging Face repo to pull
  category: llm                 # workload type → sensible CPU/memory/flags
  servers:                      # which engine + versions this model may use
    vllm: { versions: ["0.24.0", "0.19.1"], default: "0.24.0" }

runtimes:            # 3. The engines themselves — images, versions, shared settings
  vllm: { ... }
  openvino: { ... }

What that gives you:

CapabilityWhat it means for you
One catalogList a model once; deploy it by name with ./model-manager deploy <name>
Sensible defaultsOnly name and model_id are required — category, CPU, memory, and engine flags are filled in
Deliberate versioningDeclare which engine versions a model may use; an untested version is refused, not silently deployed
Central, reusable settingsEngine images and shared options live in one runtimes: block, reused across every model
Override anywherePer-model args/env, or one-off --cpu/--arg/--env at deploy time — the CLI always wins
Auto-deployFlag a model autodeploy: true to bring it up during install

Global sections

defaults

Applied to every model that doesn't override them.

FieldDefaultMeaning
namespacellm-inferenceTarget namespace for deployments
runtimevllmEngine used when a model omits one
replicas1Replica count
require_amxtrueOnly schedule model pods on nodes with Intel® AMX. Relies on the NFD labels applied by the nfd role

storage

FieldDefaultMeaning
pvc_namemodel-storeThe shared PVC holding downloaded weights. Must be ReadWriteMany on a multi-node cluster

network

Used by the download Job when pulling from Hugging Face. Empty values inherit from the installer's environment.

FieldMeaning
http_proxy / https_proxyProxy for weight downloads, e.g. http://proxy:911
no_proxyComma-separated bypass list
connectivity_checkURL probed for reachability before a download starts (default https://huggingface.co)

Per-model fields

Only name and model_id are required.

yaml
models:
- name: qwen3-0-6b
  model_id: Qwen/Qwen3-0.6B
  category: llm
  cpu: 8
  memory: 16Gi
FieldMeaning
nameDeploy name, and the model id used in API requests
model_idThe Hugging Face repo to pull weights from
categoryWorkload class — llm, embed, rerank, or vlm. Drives default args, CPU, and memory
cpu / memoryResource requests (default: from the category)
replicasReplica count (default: 1)
tpTensor parallelism — split the model across N CPU sockets
namespaceTarget namespace (default: llm-inference)
nodePin to a specific node
routingepp or direct
imageOverride the runtime image entirely
argsExtra engine args, appended after the category and version args
envExtra env vars, merged over the runtime env
autodeploytrue → bring the model up during install. See below
chat_templateInline Jinja or an absolute path → vLLM --chat-template. See below

Plus the server binding, described next.

Choose which server and version a model may use

Two equivalent forms, depending on how much control you want:

yaml
# Preferred: declare the versions this model is known to work with (an allow-list)
- name: qwen3-0-6b
  model_id: Qwen/Qwen3-0.6B
  category: llm
  servers:
    vllm: { versions: ["0.24.0", "0.19.1"], default: "0.24.0" }
  default_server: vllm

# Shorthand: one server, optionally pinned to a version — no allow-list
- name: llama3-8b-awq
  model_id: casperhansen/llama-3-8b-instruct-awq
  category: llm
  runtime: vllm
  server_version: "0.24.0"

With the servers: form, a deploy that asks for a version not in the list is rejected, so nobody accidentally ships an untested combination. The shorthand form places no such restriction.

Version selection precedence, highest first:

text
--server-version   >   the model's server_version:   >   the runtime's default_version

Select at deploy time with --server <engine> --server-version <v>, and run variants side by side with --as <alt-name>. See Deploy a Model.

The engines themselves — images, available versions, and shared settings — are defined once under runtimes:. See Runtimes.

Chat templates

chat_template accepts either inline Jinja or an absolute path.

Inline Jinja (use a | block scalar for multi-line) is stored in a <model>-chat-template ConfigMap and mounted read-only at /etc/chat-template. It is deliberately not inlined into the LLMInferenceService, because the KServe controller runs the spec through Go text/template and rejects {{ ... }}. The ConfigMap is created on deploy and removed on undeploy.

An absolute path (leading /) is passed through untouched and must already exist in the pod — for example a file you placed on the model PVC, visible at /mnt/models/<file>. vLLM exits if it is missing, so prefer inline Jinja unless the file is genuinely external.

Auto-deploy on install

By default no models are deployed during install — the inference layer only stands up serving infrastructure. Bringing a model up automatically takes two settings:

  1. Flag the model in the catalog:

    yaml
    - name: qwen3-0-6b
      model_id: Qwen/Qwen3-0.6B
      autodeploy: true
  2. Enable the auto-deploy phase in this repo's config.yaml, which ships disabled:

    yaml
    llm_services_deploy_models: true

Once enabled, only models flagged autodeploy: true are deployed.

Auto-deploy is fault-tolerant. If a flagged model fails — a gated model with no HF_TOKEN, a transient download error — the install does not abort. The serving infrastructure is already up, the failure is reported in a summary, and the model can be deployed manually afterward. Set model_deploy_strict: true to make any auto-deploy failure fatal instead.

To skip the deploy phase for a single run without editing config, use ./es_auto_installer.sh install inference --skip-models (or SKIP_MODEL_DEPLOYMENT=true).

Extra flags can be appended to every auto-deploy invocation via model_deploy_flags, e.g. "--wait-timeout 1800" for large models.