A high-performance Flask server tailored for running Large Language Models (LLMs) locally on Intel NPUs using OpenVINO GenAI.
Project description
NPU Server (npuserver)
A high-performance Python library and Flask backend tailored specifically for running Large Language Models (LLMs) locally on Intel NPUs using OpenVINO GenAI.
This server provides an OpenAI-compatible API for seamless integration with existing tools, robust NPU memory management, and dynamic on-the-fly hardware compilation of Hugging Face models into optimized NPU blobs.
Core Features
- 🚀 OpenAI-Compatible API: Seamlessly integrate with any existing LLM tooling (like LangChain, AutoGen, or custom frontends) using the standard
/v1/chat/completionsendpoint. Fully supports real-time Server-Sent Event (SSE) streaming. - 🧠 Strict Memory Management: The Intel NPU has limited, highly specialized memory. This server gives you complete explicit control over it. Load and unload models programmatically while aggressively garbage-collecting to prevent NPU memory leaks.
- ⚡ On-The-Fly Compilation: If a downloaded Hugging Face model hasn't been compiled for the NPU, the server intelligently intercepts the load request and dynamically compiles an optimized OpenVINO
.blobbefore serving it. - 🚫 No Background Downloads: To prevent runaway bandwidth usage and unexpected latency, the server strictly enforces that models must be downloaded locally before it attempts to load or compile them.
- 🌐 Static Model Registry: Ships with a fully decoupled, static HTML dashboard (
serve/index.html) designed for easy hosting on GitHub Pages to cleanly display your available models without exposing backend connections.
📦 Installation
Ensure you have Python installed and your Intel NPU drivers configured properly on Windows.
# 1. Clone the repository
git clone https://github.com/durgasai299792458/npuserver.git
cd npuserver
# 2. Setup a virtual environment
python -m venv venv
venv\Scripts\activate
# 3. Install the package locally
pip install -e .
Required Core Dependencies: openvino-genai, flask, huggingface-hub
🛠️ Usage Guide
1. Starting the Server
The server runs on Flask. You can spin it up programmatically using the library:
from npuserver import run_server
# Starts the NPU backend on port 8080
run_server(port=8080)
2. Using the Python Client Library
You can remotely control the server's NPU memory directly from your Python scripts using the built-in client functions, without needing to write raw HTTP requests manually.
import npuserver
# 1. Fetch a list of all available models
models = npuserver.get_models_status(api_base_url="http://localhost:8080")
for m in models:
print(f"{m['name']} is {m['status']}")
# 2. Explicitly load a model into NPU memory
print("Loading model...")
npuserver.load_model("durgasai299792458/Qwen3-4B-OpenVINO-INT4-npu-i")
# 3. Completely wipe the NPU memory and free resources
npuserver.unload_model()
3. Downloading Models Manually
Because the server strictly refuses to download gigabytes of data in the background, you must ensure the model exists in the cache first. You can download compatible models (like Qwen2.5-3B-OpenVINO-INT4-npu or gemma-4-E2B-OpenVINO-INT4) directly using Hugging Face utilities, or the server will read them if they are cached natively.
📡 HTTP API Reference
If you are building your own frontend or using standard REST clients (like curl or Postman), use these endpoints:
🧠 Model Memory Management
POST /load
Loads a specific model into NPU memory. If another model is currently active, it is safely ejected and garbage collected first. If the requested model is downloaded but uncompiled, it halts to compile it first.
curl -X POST http://localhost:8080/load \
-H "Content-Type: application/json" \
-d '{"model": "durgasai299792458/Qwen3-4B-OpenVINO-INT4-npu-i"}'
POST /unload
Explicitly unloads the currently active model and triggers Python garbage collection to flush the NPU VRAM immediately.
curl -X POST http://localhost:8080/unload
GET /models
Returns a consolidated JSON array of all models (active, compiled, and available remotely on your GitHub Pages registry).
GET /health
Returns the server's status (e.g., whether it is idle or currently processing a generation task).
💬 Inference
POST /v1/chat/completions
A standard OpenAI chat endpoint.
Strict Execution Note: You MUST call /load before sending a chat completion request. The server will reject the request with a 400 Bad Request if the NPU memory is empty.
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "system", "content": "You are a helpful AI assistant running on an Intel NPU."},
{"role": "user", "content": "Write a short poem about microprocessors."}
],
"max_tokens": 2048,
"temperature": 0.7,
"stream": true
}'
📂 Cache & File Structure
By default, npuserver neatly organizes heavy model files in your user cache directory so your code repository stays clean and lightweight.
On Windows, models are stored at: C:\Users\<username>\.cache\npuserver\
...\hf\: Stores the raw weights and safetensors downloaded directly from the Hugging Face hub....\compiled\: Stores the optimized.blobfiles successfully compiled by OpenVINO GenAI.
Troubleshooting Tip: If a hardware compilation ever fails, gets interrupted, or becomes corrupted, simply navigate to the compiled\ directory, delete the specific model's folder, and the server will safely attempt to re-compile it from scratch on your next /load request!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file npuserver-1.1.1.tar.gz.
File metadata
- Download URL: npuserver-1.1.1.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ba510b0a52f66d6fb05fba2e870a700715b445a485999fcdf28813c03ae0fb6
|
|
| MD5 |
092f34fafe518a4c60e49167078db883
|
|
| BLAKE2b-256 |
d72bf95334b2dca6eaadd737d290e5e71f641354e4a241245e5425f86c7364c6
|
File details
Details for the file npuserver-1.1.1-py3-none-any.whl.
File metadata
- Download URL: npuserver-1.1.1-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d7692d67a46c8ff3c757702e087c84ae930e2032765a6409dc7c3ba7ac03122d
|
|
| MD5 |
25ab6c689906fa7337c3eb0725c121e2
|
|
| BLAKE2b-256 |
c1d6f42bf35108961054d6308a2474b28fc47055c718e9e2bbe1b9a302e4f0a0
|