Model Deployments & Model Library
Konten ini belum tersedia dalam bahasa Anda.
Model Deployments & Model Library
Section titled “Model Deployments & Model Library”A platform admin can run an open-weights model inside the cluster Greentic already lives in, from Models in the admin console. When the model is healthy, the console registers it as an LLM provider, for every tenant or only the ones you pick. Nothing leaves your network: the admin never downloads anything, so the model image and its weights must already be somewhere the cluster can reach — or be uploaded through the model library described below.
Runtimes
Section titled “Runtimes”| Runtime | Weights | Needs a GPU | API key on the pod |
|---|---|---|---|
| vLLM | Hugging Face folder | yes | yes |
| llama.cpp | a single .gguf file | no | yes |
| Ollama | a model tag | optional | no |
| SGLang | Hugging Face folder | yes | no |
| TGI (Hugging Face Text Generation Inference) | Hugging Face folder | yes | yes |
| LMDeploy | Hugging Face folder | yes | no |
“No key” is deliberate. Where a server’s only key option is a command-line
flag, the console does not use it, because arguments are visible in ps and in
/proc. Those pods are protected by a NetworkPolicy that admits only labelled
clients and the namespaces you list.
Before you start
Section titled “Before you start”- Let the admin reach the cluster. With the Helm chart, set
modelDeployments.enabled: trueandmodelDeployments.namespaceto a namespace that already exists and is not the release namespace. This renders a namespaced Role, with no wildcards. Alternatively paste a kubeconfig in Settings → Model cluster (it is stored sealed and never shown again). - Have a GPU device plugin installed for GPU models. The console only asks
for the resource named in Settings (default
nvidia.com/gpu), capped by max GPUs. - Pin images by digest. The image reference must look like
registry.local/vllm@sha256:…. A tag alone is refused withimage_not_pinned.
Deploy a model
Section titled “Deploy a model”- Open Models → New.
- Pick the runtime first; it sets sensible defaults.
- Enter the digest-pinned image and the served model name — the name Designer will send to the server.
- Choose where the weights come from: baked into the image, an existing volume claim, or From the model library.
- Set replicas, GPUs, CPU and memory. Extra arguments are limited to an
allow-list per runtime; there is no free-form YAML. For llama.cpp, SGLang and
LMDeploy put each flag and its value on separate lines —
--flag=valueis refused. - Choose which LLM roles this model should serve, and whether it is shared with every tenant or restricted to the tenants you grant.
The status moves through pending, running, stopped and failed, and catches up within about 30 seconds. Stop scales to zero and keeps everything; Start brings it back; Delete removes the pods and the provider rows but never deletes storage. If the model owns roles, stop and delete name them first, because a Designer composer bound to such a role stops working until the model is back.
The model library (air-gapped weights)
Section titled “The model library (air-gapped weights)”In an air gap there is no registry to pull weights from, and a 40 GB model cannot travel in an offline kit. Models → Model library uploads weights from your browser into a volume in the models namespace, and a deployment then picks the entry.
Two formats are accepted:
- a single
.gguffile, for llama.cpp and Ollama; - one
.tar,.tar.gzor.tgzarchive holding a Hugging Face model folder (safetensors plusconfig.json), for vLLM.
What you need
modelDeployments.enabled: truein the Helm chart (it grants the Role the upload uses).- A loader image in Settings → Model cluster: a small image with
sh,dd,sha256sumandtar— busybox or alpine is enough — already in a registry the cluster can pull from. Until it is set, uploads are refused withloader_image_not_configured. - A storage class that provisions
ReadWriteOncevolumes (or a cluster default).
How it behaves
- Upload model asks for a name, the format, the file and, optionally, the SHA-256 you expect. The console sends the file in 32 MiB pieces and shows progress and speed. If the page reloads or the connection drops, the upload resumes from the last byte the server confirmed.
- When the last piece arrives the entry becomes verifying. The cluster hashes
the file, compares it with your checksum, and for an archive checks every
path first — absolute paths,
.., links and device files are refused — before extracting it. - The entry becomes ready. A failure leaves it failed with a fixed code
(for example
sha256_mismatchorarchive_unsafe) and keeps the volume so you can see what happened; delete the entry to clear it. - An upload left untouched for 24 hours is failed and its storage freed.
An entry that a deployment uses cannot be deleted (model_weights_in_use).
Troubleshooting
Section titled “Troubleshooting”| Symptom | Cause |
|---|---|
loader_image_not_configured | Set the loader image in Settings → Model cluster. |
image_not_pinned | Use a @sha256: reference, not a tag. |
gpu_over_cap | The GPU count is above max GPUs in Settings. |
arg_not_allowed | An extra argument is not on that runtime’s allow-list, or uses --flag=value where a separate entry is required. |
model_cluster_in_use | The connection, namespace and kubeconfig are locked while any deployment exists. |
| Status stays pending | The cluster could not schedule the pod. The Events tab on the deployment shows why (no GPU, no matching node, volume not bound). |