Mindbreeze InSpire LLM lets you run large language models directly on a GPU-enabled InSpire appliance, entirely within your own infrastructure. Rather than routing requests to an external, hosted provider, models are deployed, served, and consumed on-premise – keeping prompts, source documents, and generated output inside your own security and network boundary, and giving you full control over which models run and who may use them.
On-premise deployments are managed through the InSpire LLM CLI (inspire-llm), which drives the full lifecycle of a model on the appliance. The CLI is built around three concepts:
Once started, a model is exposed over authenticated HTTPS endpoints on the appliance and can be consumed directly or through the InSpire RAG service. Access is secured with Keycloak using OAuth 2.0 / JWT tokens and role-based authorization, so only holders of the appropriate service-account roles – InSpire LLM Service User for published models, InSpire LLM Unpublished Services User for unpublished ones – can reach a given model.
This guide walks through everything required to stand up such a deployment: preparing the GPU host and NVIDIA driver container, configuring the Keycloak service account, installing the InSpire LLM package, and creating, starting, accessing, and cleaning up model deployments — with CLI reference, health checks, and troubleshooting in the appendix.
The InSpire LLM container can be deployed on a GPU-enabled Hardware, where the NVIDIA driver container is up to date.
The correct NVIDIA driver container image matching the kernel version is required:
docker load -it /path/to-driver-image.tar |
If the driver for the current kernel is not installed, the driver can also be loaded manually (after loading the image) to be available without reboot.
systemctl start nvidia-driver |
The HTTPD configuration allows only users with the role “InSpire LLM Services User” and “InSpire LLM Unpublished Services User” using OAuth2.0/JWT-tokens to access the LLMs. The difference between those roles is:
Additionally, the user name has to be part of the URL. For example:
https://<appliance-fqdn>:8443/api/llm/<customer-user-name>/<llm-name> |
Currently, the Chat Service uses the service account of the client, therefore a client has to be created for each customer instead of a user.
In the Mindbreeze InSpire MMC Console navigate to “Setup” and then “Credentials”.
Please create the realm role in the Keycloak realm where the service accounts will be created (default realm is “master”):
Please add the client in the “Clients” section:
The OIDC Client should be enabled for “Client Authentication” and support the “Service Accounts roles” Authentication Flow.
Both settings can be configured during client creation as shown in the screenshot or just be set after the client is configured.
On the “Service Account Roles” tab of the OIDC client settings, add the previously created “InSpire RAG Impersonating User” role to the service account of the client.
For checking the required role for impersonation, the Mindbreeze InSpire RAG Service is expecting the realm roles as “roles” attribute of the OAuth access token.
This requires the following configuration steps on the previously created OIDC client:
Before installing the InSpire LLM Installer (version 25.6), it is recommended to remove any previous InSpire LLM installations to ensure a clean environment. Follow these steps to remove existing components:
sudo rm /etc/systemd/system/llm-proxy.service sudo rm /etc/systemd/system/llm-proxy-test.service |
docker stop <inspire-llm-container-name> docker rm <inspire-llm-container-name> |
sudo rm -rf /var/data/inspire-llm |
To install InSpire LLM, follow the steps below:
chmod +x /var/data/inspire-llm-<version>-<hash-value>.sh |
cd /var/data ./inspire-llm-<version>-<hash-value>.sh |
Note:
During installation, all packaged Docker images and LLM models will be extracted to /var/data/inspire-llm by default. If you want to change the destination directory, execute the installer the following way:
./inspire-llm-<version>-<hash-value>.sh --dest-dir <destination-directory> |
By default, the InSpire LLM CLI script is located at:
/var/data/inspire-llm/bin/inspire-llm.sh
To avoid specifying the full path every time you use the CLI, you can create a symbolic link in /usr/local/bin. This will allow you to run the CLI from any directory.
To the create the symbolic link:
sudo ln -s /var/data/inspire-llm/bin/inspire-llm.sh /usr/local/bin/inspire-llm |
After creating the symbolic link, you can use the InSpire LLM CLI simply by running:
inspire-llm |
from any location in your terminal.
InSpire LLM uses the concepts of templates and providers:
You can create a provider either through the CLI (with options) or interactively:
inspire-llm list |
Copy the desired template name from the output
inspire-llm create-provider -t <template-name> |
Or,
Create a provider non-interactively:
inspire-llm create-provider -t <template-name> -g <gpu-device> --max-tokens <max-tokens> --published | --unpublished --extra-arguments “<extra-arguments>” |
inspire-llm list |
Your new provider should appear in the list.
To deploy a single model across multiple GPUs, specify the -g option with a comma-separated list of GPU device IDs. For example:
inspire-llm create-provider -t <template-name> -g 0,1 –-max-tokens 24576 --published |
http://llm-proxy/api/llm/... |
http://llm-proxy/api/llm-instance/... |
Use published for production deployments and unpublished for testing and development environments.
Once you have created a provider, you can create a container to run the LLM.
inspire-llm list |
Copy the provider name you want to use.
inspire-llm create-container -p <provider-name> |
This will create a Docker container for the specified provider.
After creating a container, you can start it:
inspire-llm available-containers |
Copy the container name.
inspire-llm start-container -c <container-name> |
This will start the LLM container and refresh proxy configurations.
Check the container logs to ensure the server started successfully:
docker logs -f <container-name> |
Note: Starting a large language model may take several minutes.
InSpire LLM provides commands to stop and delete deployments when needed.
inspire-llm running-containers |
Copy the name of the container you wish to stop or delete.
inspire-llm stop-container -c <container-name> |
inspire-llm delete-container -c <container-name> |
If the container is running, it will be stopped, the proxy configuration will be refreshed, and then the container will be deleted.
inspire-llm delete-container -c <container-name> |
This will stop and delete any associated containers, refresh the proxy configuration, and remove the provider.
Note:
After deploying a model, it is accessible via HTTP endpoints:
https://<appliance-fqdn>:8443/api/llm/<customer-user-name>/meta-llama-3.1-8b-instruct |
Or, if unpublished:
https://<appliance-fqdn>:8443/api/llm-instance/<customer-user-name>/meta-llama-3.1-8b-instruct |
(Replace the <appliance-fqdn> with the appliance hostname you have deployed a model on)
http://llm-proxy:8000/api/llm/meta-llama-3.1-8b-instruct |
Or, if unpublished:
http://llm-proxy:8000/api/llm-instance/meta-llama-3.1-8b-instruct |
Note:
Command | Explanation |
inspire-llm start-container -c <container-id> | Start a container and refresh the proxy configuration. |
inspire-llm stop-container -c <container-id> | Stop a container and refresh the proxy configuration. |
inspire-llm create-container -p <provider-name> | Create a container from the specified provider. |
inspire-llm delete-container -c <container-id> | Delete a container. If running, the container will be stopped and deleted. Also refreshes the proxy configuration. |
inspire-llm create-provider -t <template> -g <gpu-device> --max-tokens <max-tokens> --published | --unpublished –-extra-arguments “<extra-arguments>” | Create a provider from the specified template. If only the template is specified, an interactive questionnaire is shown to set other parameters. |
inspire-llm delete-provider -p <provider-name> | Delete a provider. If the associated container is running, it will be stopped and deleted, the proxy configuration will be refreshed, and the provider will be removed. |
inspire-llm available-containers | List all available InSpire LLM containers (created or running models). |
inspire-llm running-containers | List all currently running InSpire LLM containers. |
inspire-llm initproxy | Initialize the proxy service. |
inspire-llm reloadproxy | Restart the proxy service |
inspire-llm list | List available templates and providers. |
inspire-llm load-docker-images | Load Docker images required by InSpire LLM. Note: This command is executed during installation and usually does not need to be run manually. |
inspire-llm create-templates | Create templates from available models. Note: This command is executed during installation and usually does not need to be run manually. |
inspire-llm copy-llm-proxy-service | Copy llm-proxy.service to /etc/systemd/system. Note: This command is executed during installation and usually does not need to be run manually. |
inspire-llm copy-httpd-to-inspire | Copy the HTTPD service to the InSpire container. Note: This command is executed during installation and usually does not need to be run manually. |
inspire-llm update-config | Automatically update the config. Config contains the tags of the required docker images to deploy LLM. |
inspire-llm --help | Display help and usage information. |
You can verify the health and status of your LLM deployments using one of the following endpoints. The correct URL depends on how your deployment is exposed.
If your LLM deployment is exposed through a valid InSpire container, use the following URL:
https://<inspire-hostname>/api/llmhealth/<model-name>/health |
If you did not use InSpire to expose your deployment and are connecting directly to the host or IP address, use this URL:
http://<host-or-ip-address>:<port>/api/llm/<model-name>/health |
If you are checking the health from inside a machine utilizing the reverse proxy, use this URL:
http://llm-proxy/api/llm/<model-name>/health |
Note: Authorization is not required to access the health check endpoints in any of the scenarios listed above.
If the model is deployed on a machine which has not enough GPU memory space, starting a container would cause it to constantly restart. When typing:
docker logs <container-id or container-name> |
we could see the error “CUDA is out of memory”. In such case, the installation should be done on a machine which has substantial GPU memory space.
If we inspect the status of the llm-proxy service, which is running on the host machine:
systemctl status llm-proxy |
and the result is something like this:
llm-proxy.service: Failed to load environment files: Permission denied
llm-proxy.service: Failed to run 'start-pre' task: Permission denied
llm-proxy.service: Failed with result 'resources'.
We could solve this by setting the SELinux to permissive mode:
setenforce permissive |
To verify that it is permissive type:
getenforce |
After this we can restart the llm-proxy service and it should be running:
systemctl restart llm-proxy systemctl status llm-proxy |