Running Omniscope against a local Qwen3.6-27B-FP8 model on an H100

May 2025: This space changes fast, so treat anything more than a few months old with suspicion.

There is a lot of talk about local models, private AI, open-weight models, on-prem AI, GPU deployments, and so on.

Most of it stays a bit abstract.

So this is not meant to be a theoretical post about whether local AI is better or worse than using OpenAI, Anthropic, Google, OpenRouter, or anything else. This is a practical note.

We wanted a known-working configuration for running Omniscope’s AI features against a self-hosted open-weight model.

A real model. On a real GPU. With tool calling. With reasoning output handled correctly. With Omniscope actually using it for analytical workflows.

The stack below uses a single NVIDIA H100 80 GB, serves Qwen/Qwen3.6-27B-FP8 through vLLM, and points Omniscope at the resulting OpenAI-compatible endpoint.

It is deliberately not a polished infrastructure template. No Terraform. No Packer. No configuration management. No “enterprise architecture diagram”. Just the working setup.

If you already have an H100 machine, cloud or on-prem, you can skip straight to serving the model.

If you want to see how we run this internally on Google Cloud, there is a section near the bottom.

Why this matters

Omniscope’s AI features are not just asking a model to write text.

They involve planning, tool calling, querying data, generating outputs, and returning results back into Omniscope.

That means the model endpoint needs to do more than autocomplete a prompt.

It needs to handle the tool-calling format correctly.
It needs to return the result JSON shape Omniscope expects.
It needs to behave reliably across multi-step analytical flows.

So version pins matter.

This is one of those areas where “just use latest” is usually how you end up wasting a day.

Requirements

You need:

  • Omniscope 2026.1, build b22470 or later

Earlier 2026.1 builds will fail tool-call result parsing against this stack. vLLM tightened the JSON shape it emits, and b22470 contains the corresponding Omniscope-side fix.

  • A single NVIDIA H100 80 GB

SXM or PCIe is fine. Compute capability 9.0, Hopper.

The same model also runs on H200, B200, and MI300X with minor tweaks, but those are not covered here.

  • NVIDIA driver 580 or newer on the host

This is required by vLLM’s default CUDA 13 image.

  • Docker with the NVIDIA Container Toolkit installed and configured

For example:

nvidia-ctk runtime configure --runtime=docker
  • Around 150 GB free disk

This is for the model weights and the vLLM compile cache.

  • Outbound network access to Hugging Face and Docker Hub for the first pull.

Why these versions

Component Pin Why
Model Qwen/Qwen3.6-27B-FP8 Dense FP8 W8A8, 262K native context. Strong all-rounder, reasoning on by default, official Qwen tool-call format supported by vLLM out of the box. Around 28 GB of weights, leaving plenty of headroom on an 80 GB H100 for KV cache.
Engine vllm/vllm-openai:v0.20.1 First stable vLLM release with full Qwen3.6 and qwen3_coder tool-call parser support on the CUDA 13 default image. Avoids the v0.12.0 Hopper small-concurrency regression.
CUDA 13.0, inside the container Default tag of v0.20.1. Requires host driver 580+. A -cu129-ubuntu2404 variant exists if you are stuck on driver 525+.
Omniscope 2026.1 b22470 Fix for the tightened Chat Completions tool-call result JSON shape.

Pin exact versions in production.

Do not use latest.

Serve the model

Pull the vLLM image and the model weights, then run vLLM as a container.

# One-time: pull the image
docker pull vllm/vllm-openai:v0.20.1

# One-time: pre-download weights to a host directory so container
# restarts don't re-fetch (~28 GB)
mkdir -p /opt/hf-cache
docker run --rm \
  -v /opt/hf-cache:/root/.cache/huggingface \
  vllm/vllm-openai:v0.20.1 \
  python -c "from huggingface_hub import snapshot_download; \
             snapshot_download('Qwen/Qwen3.6-27B-FP8')"

# Run the server
docker run -d \
  --name vllm-server \
  --restart unless-stopped \
  --runtime nvidia \
  --gpus all \
  --ipc=host \
  -p 8000:8000 \
  -v /opt/hf-cache:/root/.cache/huggingface \
  vllm/vllm-openai:v0.20.1 \
  Qwen/Qwen3.6-27B-FP8 \
  --port 8000 --host 0.0.0.0 \
  --max-model-len 262144 \
  --max-num-seqs 16 \
  --reasoning-parser qwen3 \
  --tool-call-parser qwen3_coder \
  --enable-auto-tool-choice \
  --enable-prefix-caching \
  --gpu-memory-utilization 0.92

The first start takes a little while.

vLLM does CUDA graph compilation and Triton JIT, so expect around 60–120 seconds before the server starts accepting requests.

After that, restarts are much faster because the compiled artefacts are cached.

A few flag notes

  • --ipc=host

Required even with tensor parallelism set to 1. vLLM uses shared memory during multi-process initialisation and crashes without it.

  • --max-model-len 262144

This uses the full native 262K context.

You can push Qwen further with YaRN-extended 1M context, but it degrades short-context quality and is not needed for Omniscope.

  • --max-num-seqs 16

This caps concurrent requests.

16 is comfortable for Omniscope workloads on a single H100. You can raise it if you have many parallel users, but watch KV-cache pressure.

  • --reasoning-parser qwen3

Separates Qwen3.6’s thinking tokens from the visible response. Omniscope handles both branches.

  • --tool-call-parser qwen3_coder --enable-auto-tool-choice

Uses the official Qwen tool-calling format.

  • --enable-prefix-caching

Useful for Omniscope because several AI features repeatedly use large system prompts. Prefix caching avoids paying the full cost every time.

Sanity check

Once the container is running, check the model endpoint:

curl http://localhost:8000/v1/models

Then test a basic chat completion:

curl http://localhost:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "Qwen/Qwen3.6-27B-FP8",
    "messages": [{"role": "user", "content": "Say hello in one word."}]
  }'

Qwen3.6 has thinking mode on by default.

For simple lookups this adds latency. If you want to disable it at server level, add this to the Docker command:

--default-chat-template-kwargs '{"enable_thinking": false}'

Omniscope can also disable thinking per request, so leaving it enabled on the server is usually fine.

Point Omniscope at it

If you are new to AI configuration in Omniscope, see:

In Omniscope 2026.1 b22470 or later, open:

Admin → AI Settings

Add a Custom provider.

The only thing you need to fill in is the endpoint base URL:

http://<host>:8000/

Do not add /v1.

Omniscope appends the OpenAI path components itself.

vLLM exposes an OpenAI-compatible API on this endpoint, so there is no Omniscope-side adapter needed.

An API key is not required unless you started vLLM with --api-key.

By default, we do not do that. We gate access at the network layer instead.

Then expand each Integration section where you want AI to be available, e.g. Report Ninja, Insight Explored, Workflow Executions, etc.

Make sure a Default model is selected. This is important.

The integration will not activate unless a default model is set.

If you are configuring AI for the first time, the simplest thing is to select the Qwen model as the default for each integration.

If you already have another provider configured, such as OpenAI or OpenRouter, you can leave your defaults as they are and choose the Qwen model from the per-use model picker instead.

Every AI integration exposes a model picker in the UI.

An Enterprise licence is required to add Custom providers.

What we tested

This configuration has been verified end-to-end against Omniscope 2026.1 b22470 with the following workloads.

Insight Explorer

A single multi-step question against the Beverage Distribution demo.

This joined and summarised across multiple tables, from the initial prompt through to a fully rendered answer.

Instant Dashboard

Full dashboard generation against the EU Water Quality demo.

This covered schema inspection, block selection, and layout generation.

AI Insights block

Several AI Insights requests over the EU Water Quality demo.

This exercised parallel tool calls and the result aggregation path.

All three completed successfully with sensible output.

Tool calling, reasoning split, and the tightened result JSON shape all behaved correctly with the qwen3_coder parser.

Operational notes

The main cost is not the container. The main cost is the GPU.

The container is cheap to keep running. The H100 is not. Stop the VM when it is not in use.

The first request after a cold container restart will pay the 60–120 second compile/JIT cost again unless you persist ~/.cache/vllm.

Switching models means restarting the container.

Stop the current container and start a new one with a different model argument. The weights cache in /opt/hf-cache persists.

Do not run this on GCP Container-Optimized OS.

The vLLM image’s libcuda.so.1 paths do not match. Use Ubuntu 22.04 or later on the host.

Tensor parallelism is unnecessary for this model size on a single H100, so it is not covered here.

If you do scale up, FP8 weights are not always cleanly divisible across TP sizes. For MoE variants, prefer --enable-expert-parallel.

Known issue

Requests with no user message error out.

If Omniscope submits a conversation containing only a system message, and no user turn, vLLM rejects it.

This is rare in normal use.

You are likely to hit it only in two situations:

  • Insight Explorer, if you explicitly configure the initial behaviour as a system message only, with no seeded user prompt.
  • Report Ninja, if you erase the chat and then collapse and re-expand the chat sidebar.

The workaround is simple.

Always include at least one user message.

The Omniscope defaults already do this, so only the configurations above trigger the issue.

How we run it on GCP

Internally, we deploy this stack on Google Cloud using Packer and Terraform.

Packer bakes a VM image with the engine, weights, and systemd units pre-staged.

Terraform manages the VM and disks.

A few concrete details:

  • Machine type: a3-highgpu-1g

This gives you 1× H100 80 GB SXM.

On GCP, the single-GPU variant is Spot only. On-demand is gated to multi-GPU A3 configurations.

  • Base image: ubuntu-accelerator-2204-amd64-with-nvidia-580

This comes from the ubuntu-os-accelerator-images project.

It is Ubuntu 22.04 LTS with the NVIDIA 580 driver pre-installed.

The CUDA toolkit is not needed on the host because the vLLM container ships its own CUDA 13 runtime.

  • Running cost on Spot: roughly $2.00–2.50 per hour all-in

This includes the VM, boot disk, and local SSDs.

At around $2/hour, an H100 left running all month is about $1,500/month.

So configure auto-shutdown.

On GCP you can do this with a simple cron-based health check that stops the VM if there have been no successful requests for a while.

You can also use instance schedules under:

Compute Engine → Instance schedules

Or set maxRunDuration on the instance to cap the longest single run.

The important thing is not the exact mechanism.

The important thing is not leaving an H100 running because somebody forgot to stop a test VM.

Alternatives

If you want to swap the model without changing the rest of the stack, two alternatives have been validated on the same vLLM v0.20.1 image.

Model Strengths Notes
Qwen/Qwen3.6-35B-A3B-FP8 MoE, 3B active, fast Same flags as 27B. Tool calling is slightly less reliable on long agentic chains.
openai/gpt-oss-120b Strong reasoning MXFP4, 131K context. Different flags: drop --tool-call-parser, because Harmony is built in. Set --gpu-memory-utilization 0.95 --max-num-batched-tokens 1024 to avoid OOM at startup.

For now, Qwen/Qwen3.6-27B-FP8 is the recommended default.

It gives the best balance of quality, speed, context length, and tool-calling reliability on a single H100 for Omniscope’s mix of workloads.

Final note

This is not the only way to run local AI with Omniscope. It is just a working one. And that is useful.

Because once you move from “the model can answer questions” to “the model can operate real analytical workflows”, the boring details start to matter.

Versions matter. Tool-call parsing matters. Result JSON matters. Context length matters. Driver versions matter. GPU memory matters. Cold start matters. Cost control matters.

That is the difference between a local model demo and a local model actually being usable inside an analytics product.

No Comments

Leave a Reply

Discover more from Visokio

Subscribe now to keep reading and get access to the full archive.

Continue reading