AI Inference Server & DaVinci Resolve Render Node — Ohio University ITS
its-ai-01 is a GPU-accelerated AI inference server providing OpenAI-compatible LLM APIs, image generation, and a browser-based chat interface. It also runs as a DaVinci Resolve Studio remote render node.
All AI services are accessible over HTTPS at https://ai-01.its.ohio.edu.
The server uses an NVIDIA A10 GPU (24 GB VRAM) for accelerated inference.
Visit https://ai-01.its.ohio.edu and click Sign Up to create an account. An administrator must then add you to the All-Models group before you can access any models.
Once your account has model access, log in and select a model from the dropdown to start chatting. See the Models section below for descriptions of each model.
To use the AI models programmatically from your own code, you need an API key:
sk-) — you won't be able to see it again
Use this key as the api_key parameter in any OpenAI-compatible client library
with https://ai-01.its.ohio.edu/v1 as the base URL.
@web before your question in chat to enable.
The LLM API is OpenAI-compatible. Point any OpenAI client library at
https://ai-01.its.ohio.edu as the base URL.
Authorization: Bearer header and the api_key
parameter in OpenAI client libraries.
curl https://ai-01.its.ohio.edu/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
curl https://ai-01.its.ohio.edu/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "llama3.1:8b",
"messages": [
{"role": "user", "content": "Explain quantum computing in simple terms."}
]
}'
from openai import OpenAI
client = OpenAI(
base_url="https://ai-01.its.ohio.edu/v1",
api_key="YOUR_API_KEY"
)
response = client.chat.completions.create(
model="llama3.1:8b",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://ai-01.its.ohio.edu/v1',
apiKey: 'YOUR_API_KEY',
});
const response = await client.chat.completions.create({
model: 'llama3.1:8b',
messages: [{ role: 'user', content: 'Hello!' }],
});
console.log(response.choices[0].message.content);
curl https://ai-01.its.ohio.edu/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nomic-embed-text",
"input": "The quick brown fox"
}'
curl https://ai-01.its.ohio.edu/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "llava:13b",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}
]
}]
}'
Models can search the web for current information using SearXNG, a self-hosted metasearch engine.
In the chat UI, prefix your message with @web to trigger a web search:
@web What is the latest stable release of Ubuntu?
The search results are automatically retrieved and injected into the model's context (RAG), allowing it to answer with up-to-date information from the internet.
Models are loaded into GPU VRAM on demand. Only one large model can be active at a time.
| Model | Size | VRAM | Best For |
|---|---|---|---|
llama3.1:8b | 4.9 GB | ~6 GB | General chat, Q&A, writing |
qwen2.5-coder:14b | 9.0 GB | ~12 GB | Code generation, debugging, refactoring |
deepseek-r1:14b | 9.0 GB | ~12 GB | Reasoning, math, logic |
mistral-small:24b | 14 GB | ~18 GB | Strong general reasoning, long context |
gemma3:12b | 8.1 GB | ~10 GB | Multilingual, Google's model |
llava:13b | 8.0 GB | ~10 GB | Vision — analyze and describe images |
nomic-embed-text | 274 MB | ~0.5 GB | Text embeddings for RAG / semantic search |
| Model | Size | VRAM | Best For |
|---|---|---|---|
| SDXL Base 1.0 | 6.5 GB | ~10 GB | High-quality 1024x1024 image generation |
| SDXL Refiner 1.0 | 5.7 GB | ~8 GB | Refinement pass for SDXL outputs |
| Stable Diffusion 1.5 | 4.0 GB | ~5 GB | 512x512 generation, huge LoRA ecosystem |
| SDXL VAE | 320 MB | — | Image decoder for SDXL |
MCP allows LLMs to interact with external tools and services — file systems, databases, APIs, and more. Users can build and register their own MCP servers to extend model capabilities.
The Model Context Protocol is an open standard that lets LLMs call external tools. For example, an MCP server could let a model query a database, read files, create GitHub issues, or interact with any API. Open WebUI acts as an MCP client and connects to your servers.
If your MCP server uses Streamable HTTP transport (the recommended approach):
http://your-server:8000)The tools provided by your MCP server will then be available to models in your conversations.
Many MCP servers use stdio transport (they run as a subprocess, not an HTTP server). These need MCPO (MCP-to-OpenAPI Proxy) to translate them into HTTP.
MCPO is installed on this server. To proxy a stdio MCP server:
# Example: proxy a filesystem MCP server
mcpo --port 8300 -- npx -y @modelcontextprotocol/server-filesystem /path/to/allowed/dir
# Example: proxy a GitHub MCP server
GITHUB_TOKEN=your_token mcpo --port 8301 -- npx -y @modelcontextprotocol/server-github
# Example: proxy any stdio MCP server
mcpo --port 8302 -- python my_mcp_server.py
Then register http://localhost:8300 (or the appropriate port) in Open WebUI as described in Option A.
For persistent MCP proxies, run MCPO as a Docker container:
docker run -d --restart unless-stopped \
-p 127.0.0.1:8300:8000 \
--name my-mcp-proxy \
ghcr.io/open-webui/mcpo:latest \
-- npx -y @modelcontextprotocol/server-filesystem /data
MCP servers can be built in Python or TypeScript. A minimal Python example:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("My Tools")
@mcp.tool()
def get_weather(city: str) -> str:
"""Get the current weather for a city."""
return f"The weather in {city} is sunny and 72F."
if __name__ == "__main__":
mcp.run(transport="streamable-http", host="0.0.0.0", port=8000)
Then register http://localhost:8000 in Open WebUI.
modelcontextprotocol.iogithub.com/open-webui/mcpogithub.com/modelcontextprotocol/serversdocs.openwebui.com/features/extensibility/mcp/127.0.0.1 (localhost)
unless they need to be accessible from other machines.
A publicly accessible MCP server providing VyOS 1.4 router documentation and Ohio University ECT Lab Notebook cheat sheets. 1,500+ searchable content chunks covering VyOS configuration, networking commands, subnetting, and lab procedures. Data is refreshed daily at 3:00 AM.
Available tools:
| Tool | Description | Example |
|---|---|---|
search | Full-text search across all content | "DHCP server", "static route" |
get_vyos_command | VyOS commands by topic | "NAT", "firewall", "BGP" |
get_cheatsheet | ECT lab cheat sheet content | "subnetting", "ping", "nmcli" |
list_topics | List all available topics | — |
get_networking_definition | Look up networking terms | "VLAN", "TCP", "DNS" |
External endpoint:
https://ai-01.its.ohio.edu/mcp/vyos-ectsheet/mcp
Authorization: Bearer YOUR_API_KEY
An MCP server providing access to all NIST SP 800-53 Rev 5 security controls is pre-installed and available to all models. It includes 324 controls across 20 families, plus LOW, MODERATE, HIGH, and PRIVACY baselines.
Available tools:
| Tool | Description | Example |
|---|---|---|
get_control | Look up a specific control | AC-2, SC-7, AC-2(1) |
search_controls | Keyword search across all controls | "encryption", "access control", "audit" |
get_control_family | List controls in a family | AC, AU, SC |
list_families | List all 20 control families | — |
get_baseline | Controls in a baseline | LOW, MODERATE, HIGH, PRIVACY |
compare_baselines | Diff two baselines | LOW vs MODERATE |
get_control_enhancements | Enhancements for a control | AC-2 → AC-2(1), AC-2(2), etc. |
Use the "(Web + OSCAL)" model variants in the chat UI for automatic access, or ask any model directly (e.g., "What are the FedRAMP Moderate access control requirements?").
External endpoint:
https://ai-01.its.ohio.edu/mcp/oscal/mcp
Authorization: Bearer YOUR_API_KEY
| Hostname | its-ai-01 |
|---|---|
| OS | Ubuntu 24.04.4 LTS |
| CPU | 4 vCPUs (x86_64) |
| RAM | 64 GB |
| Disk | 1 TB (LVM) |
| GPU | NVIDIA A10 — 24 GB GDDR6, Ampere (GA102) |
| Driver | NVIDIA 580.126.09, CUDA 13.0 |
| Hypervisor | VMware ESXi 8.03u (PCI passthrough) |
| Domain | ai-01.its.ohio.edu |
| TLS | Let's Encrypt (auto-renewed by Caddy) |
Internet / LAN
|
[ Caddy :443 ] <-- TLS termination, reverse proxy
|
+--> /v1/* --> [ Open WebUI :8080 ] (Auth + API gateway)
| |
| +--> [ ollama :11434 ] (LLM inference, GPU)
| +--> [ SearXNG :8888 ] (Web search, @web)
|
+--> /comfyui/* --> [ ComfyUI :8188 ] (Image gen, GPU)
+--> /gpu/* --> [ GPU Monitor :8500 ] (Real-time GPU dashboard)
+--> /mcp/oscal/* --> [ OSCAL MCP :8400 ] (NIST security controls)
+--> /mcp/vyos-ectsheet/* --> [ VyOS MCP :8401 ] (VyOS docs + ECT sheets)
+--> /docs/* --> [ Static HTML ] (This documentation)
+--> /health --> 200 OK
+--> /* --> [ Open WebUI :8080 ] (Chat UI + auth)
[ DaVinci Resolve Render Node :15000 ] <-- Headless GPU rendering (standalone, not proxied)
API requests to /v1/* are routed through Open WebUI, which handles
per-user authentication via API keys before forwarding to ollama for inference.
MCP and ComfyUI endpoints are protected by the same API key via forward auth.
The GPU Monitor, docs, and health check are public.
| Container | Image | Port | GPU |
|---|---|---|---|
| ollama | ollama/ollama | 127.0.0.1:11434 | Yes |
| comfyui | mmartial/comfyui-nvidia-docker | 127.0.0.1:8188 | Yes |
| open-webui | ghcr.io/open-webui/open-webui | host network :8080 | No |
| searxng | searxng/searxng | 127.0.0.1:8888 | No |
| Service | Port | Description |
|---|---|---|
| caddy | :443 | Reverse proxy + TLS termination |
| gpu-monitor | 127.0.0.1:8500 | Real-time GPU dashboard (FastAPI + WebSocket) |
| oscal-mcp | 127.0.0.1:8400 | NIST SP 800-53 security controls MCP server |
| vyos-ectsheet-mcp | 127.0.0.1:8401 | VyOS documentation + ECT cheat sheets MCP server |
| resolve-render | 0.0.0.0:15000 | DaVinci Resolve Studio 20.3.2 headless render node |
This server is being built in phases. Current status of each phase:
| Phase | Description | Status |
|---|---|---|
| 1 | Docker + NVIDIA Container Toolkit | Done |
| 2 | ollama — LLM Inference (OpenAI-compatible API) | Done |
| 3 | ComfyUI — Image/Video Generation | Done |
| 4 | Caddy Reverse Proxy + Let's Encrypt TLS | Done |
| 5 | Open WebUI — Browser Chat Interface | Done |
| 6 | DaVinci Resolve Project Server | Deferred |
| 7 | DaVinci Resolve Studio Render Node | Done |
| 8 | GPU Monitor — Real-time web dashboard + nvtop | Done |
| 9 | SearXNG — Web Search for LLMs | Done |
| 10 | MCP: OSCAL NIST Security Controls | Done |
| 11 | MCP: VyOS-ECTSheet Documentation | Done |
| 12 | Setup automation (setup.sh) | Done |
The NVIDIA A10 does not support MIG (Multi-Instance GPU) partitioning. All workloads share one 24 GB VRAM pool via time-slicing.
| Workload | Typical VRAM | Notes |
|---|---|---|
| DaVinci Resolve 4K render | 8–16 GB | Heavy effects push higher |
| LLM 7B (Q4 quantized) | 5–6 GB | 13B needs 8–12 GB |
| Stable Diffusion (SDXL) | 8–12 GB | Batch=1; FLUX needs 24 GB |
Recommendation: Run one heavy workload at a time. Lightweight combos (7B LLM + SD at batch=1) can coexist when Resolve isn't rendering.
Centralized project database enabling multi-workstation collaboration.
Note: The official DaVinci Resolve Project Server app is Windows/Mac only. Options for this Linux server:
elliotmatson/davinci-resolve-project-server) — ports 5432 + 8543Requires DaVinci Resolve Studio license for remote access. All workstations must be on the same subnet.
Headless render node for offloading render jobs from editing workstations.
/opt/resolve/resolve-render (resolve -rr with QT_QPA_PLATFORM=offscreen)/opt/resolve/libs/disabled/) to fix Ubuntu 24.04 compatibility# Check GPU status
nvidia-smi
nvtop
# Or visit https://ai-01.its.ohio.edu/gpu/
# View running containers
docker ps
# Restart a service
sudo docker restart ollama
sudo docker restart comfyui
sudo docker restart open-webui
sudo systemctl restart gpu-monitor
sudo systemctl restart oscal-mcp
sudo systemctl restart vyos-ectsheet-mcp
sudo systemctl restart resolve-render
# View container logs
sudo docker logs -f ollama
sudo docker logs -f comfyui
# View systemd service logs
sudo journalctl -u gpu-monitor -f
sudo journalctl -u oscal-mcp -f
sudo journalctl -u vyos-ectsheet-mcp -f
sudo journalctl -u resolve-render -f
# List installed LLM models
sudo docker exec ollama ollama list
# Pull a new LLM model
sudo docker exec ollama ollama pull <model-name>
# Remove an LLM model
sudo docker exec ollama ollama rm <model-name>
# Check Caddy status / TLS cert
sudo systemctl status caddy
sudo caddy validate --config /etc/caddy/Caddyfile
# Reload Caddy config after edits
sudo systemctl reload caddy
| Caddy config | /etc/caddy/Caddyfile |
|---|---|
| TLS certs | /var/lib/caddy/.local/share/caddy/ |
| ollama models | Docker volume ollama (/root/.ollama) |
| ComfyUI data | /home/itsadmin/comfyui/basedir/ |
| ComfyUI checkpoints | /home/itsadmin/comfyui/basedir/models/checkpoints/ |
| Open WebUI data | Docker volume open-webui |
| GPU Monitor | /home/itsadmin/gpu-monitor/ |
| MCP: OSCAL | /home/itsadmin/mcp-servers/oscal/ |
| MCP: VyOS-ECTSheet | /home/itsadmin/mcp-servers/vyos-ectsheet/ |
| DaVinci Resolve | /opt/resolve/ |
| Resolve disabled libs | /opt/resolve/libs/disabled/ (bundled glib moved aside for Ubuntu 24.04) |
| Documentation | /home/itsadmin/docs/ |
| Setup script | /home/itsadmin/setup.sh |
Before running heavy DaVinci Resolve render jobs, free up GPU VRAM:
# Stop AI containers to free GPU
sudo docker stop ollama comfyui
# After rendering completes, restart them
sudo docker start ollama comfyui
# Restart the render node if needed
sudo systemctl restart resolve-render
Users self-register at https://ai-01.its.ohio.edu. After signup, an admin must grant model access:
To grant model access to the group:
LLM models:
# Browse models at https://ollama.com/library
sudo docker exec ollama ollama pull <model>:<tag>
# Example: pull a coding model
sudo docker exec ollama ollama pull qwen2.5-coder:14b
Image generation models:
# Download .safetensors files into ComfyUI checkpoints directory
sudo docker exec -u root comfyui wget -O \
/basedir/models/checkpoints/model_name.safetensors \
"https://huggingface.co/org/repo/resolve/main/model.safetensors"
A setup script at /home/itsadmin/setup.sh can provision the entire server from a fresh
Ubuntu 24.04 install. It handles NVIDIA drivers, Docker, Caddy, all containers, Python venvs,
MCP servers, the GPU monitor, and systemd services.
# Run from a fresh Ubuntu 24.04 install (as itsadmin with sudo)
chmod +x ~/setup.sh && ~/setup.sh
The VyOS-ECTSheet MCP server data can be refreshed from upstream sources:
cd ~/mcp-servers/vyos-ectsheet && bash refresh.sh