BlogInfrastructure
What a company needs to run an on-premise LLM, from hardware to tested answers
An on-premise LLM keeps company data inside only if every layer runs on infrastructure you control. That means the GPU servers, a serving engine such as vLLM with the model weights stored locally, an LLM gateway for keys and logs, retrieval that checks document permissions, and monitoring that sends no prompts to an outside service. Choose the model by testing it on your own German cases. Size the hardware by measuring on rented GPUs before you buy, and name the people who will run updates and regression tests after go-live. If processing in the EU under a contract is enough for you, a private Azure OpenAI or Amazon Bedrock deployment in the EU is usually less work.
When on-premise is the right choice and when a private cloud account is enough
On-premise is the right choice when a rule or a risk assessment says the data may not be processed by any outside provider, or when the systems the assistant must read are only reachable inside your network. If the requirement is that data is processed in the EU by a contracted processor and not used for training, a model deployment in your own cloud account usually meets it with much less operating work. Write the requirement down in one sentence before you choose. In our experience, most later disagreements go back to a requirement nobody wrote down.
As of 7 November 2026, both large clouds document EU options. Microsoft says Data Zone deployments in the EU process data within the Azure EU Data Boundary, and that, for models sold directly by Azure, prompts and completions are not available to model providers and are not used to train foundation models without your permission. On Amazon Bedrock, inference profiles tied to a geography such as the EU keep cross-region requests inside it, and a retention setting decides whether AWS may keep prompts and outputs for abuse prevention.
| Requirement | On-premise | Private cloud account in the EU |
|---|---|---|
| No processing by any outside provider | Meets it | Does not meet it |
| Processing in the EU under a processor contract | Meets it | Meets it with the right deployment type and region |
| Access to systems only reachable on the internal network | Direct | Needs a private network connection |
| Choice of model | Models whose weights you may download and run | The provider's catalogue in that region |
| Few people to run GPUs and model updates | Hard: you run every layer | The provider runs the model, you run the rest |
Self-hosted AI or a managed API: the full decisionEU data residency with Azure OpenAI and Amazon Bedrock
The layers of a working system, from GPU servers to agents
A working system has six layers, and data stays inside only if none of them calls out: GPU servers, a serving engine, an LLM gateway, data access and retrieval, the assistant or agent, and tests with monitoring.
| Layer | What it does | What you decide |
|---|---|---|
| GPU servers | Hold the model weights and the KV cache in GPU memory | GPU type and memory, number of servers, spare capacity if one fails |
| Serving engine, for example vLLM | Loads the model and serves it over an API | Models, precision, context length, replicas |
| LLM gateway, for example LiteLLM | One endpoint for all applications, with keys, budgets, logs and routing | Who may use which model, what is logged and for how long |
| Data access and retrieval | Connects document sources, indexes them and filters results by permission | Which sources, how permissions are synchronised |
| Assistant or agent | User interface, prompts and tools that read or change business systems | Which actions need a human approval |
| Tests and monitoring | Acceptance and regression tests, metrics and alerts | Required pass rates, who gets alerted |
Two details make the stack easier to change later. vLLM serves OpenAI-compatible APIs, including chat completions and embeddings, and LiteLLM can route to a vLLM server through its hosted_vllm provider, so applications talk to the gateway rather than to a particular model. LiteLLM's virtual keys and its budgets and rate limits per key, user or team need a Postgres database. Without one, budgets are not enforced (vLLM and LiteLLM documentation, as of 7 November 2026).
"Data never leaves the company" is a property of the network, so test it like one. List every outbound connection the stack makes: model downloads, container registries, package mirrors, telemetry and error reporting in each component, and any hosted monitoring service. Then block outbound traffic from the serving and gateway hosts by default and allow only what is on the list. For us this is a check before go-live. A sentence in the design document does not count. Retrieval needs the same care inside the company: an assistant that can read every file will answer anyone's question with anything, so results must be filtered by the permissions of the person asking before the model sees them.
What an LLM gateway doesRunning LiteLLM securely in productionDocument permissions in RAG
Which open-weight models are good enough in German, and how to test it
A model is good enough in German when it passes your acceptance tests on your own documents and questions. In our view, public leaderboards say little about German business text, so use them for a shortlist at most. Two filters come straight from the model card. The first is language support: Meta's card for Llama 3.3 70B Instruct lists eight supported languages including German, and Mistral's card for Mistral Small 3.1 lists German among its languages. The second is the licence: Llama 3.3 uses the Llama 3.3 Community License Agreement and Mistral Small 3.1 uses Apache 2.0. The conditions differ, so have both read before you invest in tests. We name these two only as examples of what cards state. Check the current cards when you start.
Then test the shortlist the same way you will later accept the system:
- Collect real requests from the people who will use the assistant, together with the documents they would need, including long and badly formatted ones
- Name the failure types that matter and how serious each one is: a wrong figure, an invented source, an answer in English, the wrong form of address, broken JSON in a tool call
- Run each candidate at the precision you will serve in production, because a quantised model can behave differently from the full one
- Have German-speaking domain experts grade the answers without knowing which model wrote them
- Run each case more than once, since the same prompt can produce different answers
- Keep the cases: the same set decides every later model change
In our experience, the differences between candidates show up in a few specific failure types, such as figures taken from tables or answers about long documents, more than in an average score. So report a pass rate per failure type instead of a single number.
Checking model quality after quantisationAcceptance criteria for AI systems
Sizing hardware without buying the wrong thing
Size the hardware from measurements of your own workload on the model you chose. A head count tells you little: the same number of users can need very different hardware depending on how long their requests are and how many arrive at the same moment. These are the drivers of memory and cost:
- Model size and precision. Weights take roughly the number of parameters times the bytes per parameter. Mistral's card, for example, says Mistral Small 3.1 with 24 billion parameters needs about 55 GB of GPU memory in bf16 or fp16, and fits a single RTX 4090 once quantised
- Context length and concurrency. The KV cache grows with the tokens each request holds and the number of requests in flight, so long documents and agents that carry their history use most of the memory
- Peak concurrency rather than total users: count the requests in flight during the busiest hour
- Redundancy: enough capacity to keep serving with one server out of service
- Other models: embedding and reranking models for retrieval need memory too
- Power, cooling, rack space and the people who maintain the machines
Measure before you order. Rent the GPU type you are considering, serve the chosen model with vLLM at the precision and context length you plan, and replay realistic requests. As of 7 November 2026, vLLM ships a benchmark command, vllm bench serve, for online serving throughput, and its /metrics endpoint reports vllm:num_requests_waiting, vllm:kv_cache_usage_perc and vllm:num_preemptions. The vLLM tuning guide explains that when the KV cache runs short, requests are preempted and recomputed later, which hurts latency. Its remedies are more memory for the cache or fewer concurrent sequences per server. Find the load one server carries at your latency target, divide your peak by it and add a spare.
What it takes to run it after go-live
After go-live you run a service, so someone must own updates, monitoring, regression tests and the document index, with time set aside for each. On-premise means all of these are yours. Nobody upstream patches the serving engine or watches the GPUs for you.
| Task | What it involves | When |
|---|---|---|
| Updates | GPU drivers, serving engine, gateway, retrieval components; pinned versions, a staging run, a way back | New release or security advisory |
| Model changes | Rerun the acceptance set before switching, compare per failure type | New model, new quantisation or a prompt change |
| Monitoring | Queue length, KV cache use, latency, errors, use per team; alerts to a named person | Continuously |
| Document index | Connector runs, permission sync, removal of deleted documents | Every sync, checked by a test |
| Capacity | Compare measured peak load with what one server carries | Regularly and before a new team joins |
Three operating models work: an internal platform team that already runs Kubernetes, the IT operations team with a named owner for the AI service, or an external partner under a written operating agreement. In our experience, the systems that fail are the ones nobody was assigned to once the project team moved on.
Regression testing for LLM applicationsWho owns an AI system after the pilot
Data protection, works council and the EU AI Act
Running the model yourself means there is no outside processor for the model. The data protection officer, the works council and the AI Act still ask what the system does with people's data. Below is a checklist for those conversations. It is not legal advice, so check the current text at the official sources linked below.
Data protection
Article 35 GDPR requires a data protection impact assessment before processing, in particular processing that uses new technologies, that is likely to result in a high risk to people's rights and freedoms. Expect the data protection officer to ask which personal data goes into prompts, indexed documents and logs, how long logs are kept and who can read them, and how a deletion request reaches both the index and the logs.
Works council
Under section 87(1) no. 6 of the German Works Constitution Act (BetrVG), the works council co-determines the introduction of technical devices intended to monitor employees' behaviour or performance. In its decision of 16 July 2024 (1 ABR 16/23), the Federal Labour Court repeated that a device counts as intended for monitoring when it is objectively suitable for it, whatever the employer's intent. In our reading, a gateway that logs prompts per user is suitable in that sense. Plan a works agreement early and design the logs for it: pseudonymised user IDs, short retention, named people with access, and a written rule that logs are not used to assess performance.
EU AI Act
As of 7 November 2026, the AI Act, Regulation (EU) 2024/1689, has been amended by the Digital Omnibus on AI, Regulation (EU) 2026/1744 of 8 July 2026. According to the Council's timeline, obligations for stand-alone high-risk systems now apply from 2 December 2027 and those for high-risk systems embedded in products from 2 August 2028. The amended Article 4 requires providers and deployers to take measures to support AI literacy, without requiring them to guarantee a specific level for each person. In our reading, an internal assistant for documents is usually not a high-risk system, but if it will feed decisions about employees or applicants, ask counsel to check it against the high-risk list in Annex III before you build it.
From first use case to production, step by step
Take one use case to production in a fixed order. Each step produces what the next one needs: a written requirement, a test set, a measured model, a sized platform and a tested system.
- 1
Pick one use case and write the data requirement
Choose a task with clear users and documents, and write in one sentence where its data may be processed. That sentence decides between on-premise and a private cloud account.
- 2
Build the test set first
Collect real requests, the expected behaviour and the failure types with their severity and required pass rate, agreed with the people who will sign off.
- 3
Shortlist and test models
Filter by licence and German support, then run the candidates at the precision you would serve, on rented GPUs, against the test set.
- 4
Measure capacity and size the hardware
Benchmark the chosen model with realistic traffic at your latency target, then size for peak load plus one spare server.
- 5
Build the platform with outbound traffic closed
Set up the serving engine, the gateway, retrieval with permission filters and monitoring, then block outbound traffic and allow only what you have listed.
- 6
Clear data protection and the works council
Complete the impact assessment, agree the log design and the works agreement, and plan AI literacy measures before real users arrive.
- 7
Run the acceptance tests, then a limited rollout
Release only when every criterion passes. Start with one group of users and watch the metrics and the failures they report.
- 8
Hand over operations
Name the owner, write the runbooks and fix the routine for updates, regression tests and capacity reviews.
We build and run these systems on a client's own servers or in the client's own cloud account, from the GPU serving layer to the acceptance tests before go-live.
Questions
Can we start with Ollama on one server?
For trying models on one machine, yes. Before many people depend on it, test it like any serving engine: concurrent load with your own requests, latency at peak, metrics, and how it is restarted and updated. For shared production serving we usually use vLLM, because it serves OpenAI-compatible APIs and reports its metrics at /metrics (as of 7 November 2026).
Is an on-premise LLM automatically GDPR compliant?
No. Keeping the model in-house removes an outside processor for the model, but you still need a legal basis, an impact assessment where the risk is high, limits on what is logged and for how long, and a way to delete data from the index and the logs. Retrieval without permission filters can also show colleagues documents they should not see, which is a data protection problem inside the company.
Is an open-weight model as good as the hosted models from the large providers?
It depends on the task, and only your test set can say. In our experience, extraction, classification and answers from retrieved documents are often within reach of models you can run yourself, while long multi-step tasks are where gaps tend to show. If your data rules allow it, run a hosted model on the same cases as a reference point.
How many GPUs do we need for 50 users?
It depends on how many of the 50 send requests at the same time, how long the prompts and documents are, the model size and precision, and whether you need a spare server. Measure one server with your own requests at your latency target, then size for peak load plus one spare. Estimates for the same head count vary widely, which is why we measure first.
Does the works council have to agree?
In Germany, if the system can record who asked what, it probably falls under section 87(1) no. 6 BetrVG, because the Federal Labour Court asks whether a system is objectively suitable for monitoring. The employer's intent does not matter. Involve the works council early and agree the log design with them. Check the details with your employment lawyer.
Can we start in a private cloud and move on-premise later?
Yes, if applications call a gateway with an OpenAI-compatible API instead of a provider's own SDK, and if you keep the test set. Moving then means putting a vLLM-served model behind the gateway, rerunning the acceptance tests and switching the route. Prompts often need adjusting for the new model, so plan a round of fixes after the first test run.
Related services
On-premise AI
AI on offers, contracts and customer files, with the data staying in your company: own servers or own cloud account, tested before go-live.
vLLM on Kubernetes
Open-weight models on your own GPUs, so data stays in house and costs follow capacity you plan, sized from measured load.
AI platform for all teams
One approved route to AI for every team, with budgets, logs and a free choice of model, run on your servers or in your cloud.
More from the blog
Self-hosted AI or managed API
How to decide whether an AI workload should run on your own infrastructure or stay on a managed model endpoint, using access requirements, operating capacity and measured costs.
GPU serving capacity planning
How to size GPU capacity for a model you serve yourself: what limits a replica, how to benchmark it at your latency target, how many replicas peak traffic needs and how to avoid paying for idle hours.
RAG document permissions
How access rules travel from source systems into a retrieval index, where they get lost, and which negative tests show that a user cannot retrieve what they may not open.
Acceptance criteria for AI systems
How to write acceptance criteria for an LLM application, set a threshold per failure type and decide whether a measured pass rate clears it, with a calculator.
Sources
- vLLM documentation: Online serving (OpenAI-compatible server)
- vLLM documentation: Production metrics
- vLLM documentation: Optimization and tuning
- vLLM documentation: vllm bench
- LiteLLM documentation: vLLM provider
- LiteLLM documentation: Virtual keys
- LiteLLM documentation: Budgets and rate limits
- Meta: Llama 3.3 70B Instruct model card
- Mistral AI: Mistral Small 3.1 24B Instruct model card
- Microsoft Learn: Azure OpenAI deployment types
- Microsoft Learn: Data, privacy and security for Azure OpenAI
- Amazon Bedrock user guide: Geographic cross-Region inference
- Amazon Bedrock user guide: Data retention
- EUR-Lex: Regulation (EU) 2016/679 (General Data Protection Regulation)
- EUR-Lex: Regulation (EU) 2024/1689 (Artificial Intelligence Act)
- EUR-Lex: Regulation (EU) 2026/1744 (Digital Omnibus on AI)
- Council of the EU: Artificial intelligence act, timeline
- Federal Labour Court (BAG): decision of 16 July 2024, 1 ABR 16/23
Talk to an engineer
Bring one piece of work you would like to improve. The call takes 30 minutes and needs no access to your systems or your data.
Booking runs on Google Calendar.
Prefer to write first? Leave your email and a few lines, and we reply with times.
Look for the draft in your email program
Send it from there, and an engineer replies in person with times for a 30-minute call. If no draft has opened, write to us at miki@cloudsail.com.