Initial llama.cpp

This commit is contained in:
John Doe
2026-03-10 22:08:19 -04:00
parent cb9029710e
commit afeb66a6c0
5 changed files with 572 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
____
/ / /___ _____ ___ ____ _ _________ ____
/ / / __ `/ __ `__ \/ __ `// ___/ __ \/ __ \
/ / / /_/ / / / / / / /_/ // /__/ /_/ / /_/ /
/_/_/\__,_/_/ /_/ /_/\__,_(_)___/ .___/ .___/
/_/ /_/
llama.cpp Server - High-Performance LLM Inference
OpenAI-Compatible API with Vulkan GPU Acceleration
+97
View File
@@ -0,0 +1,97 @@
#!/usr/bin/env bash
COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/refs/heads/main}"
source <(curl -fsSL "${COMMUNITY_SCRIPTS_URL}"/misc/build.func)
# Author: Heretek-AI
# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/ggml-org/llama.cpp
APP="llama.cpp"
var_tags="${var_tags:-ai;llm;inference}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-8192}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/systemd/system/llamacpp.service ]]; then
msg_error "No ${APP} Installation Found!"
exit 1
fi
# Get latest release from GitHub
LATEST_RELEASE=$(curl -fsSL https://api.github.com/repos/ggml-org/llama.cpp/releases/latest 2>/dev/null | grep "tag_name" | awk -F'"' '{print $4}')
if [[ -z "$LATEST_RELEASE" ]]; then
msg_error "Could not fetch latest release version"
exit 1
fi
CURRENT_VERSION=""
if [[ -f /opt/llamacpp/version.txt ]]; then
CURRENT_VERSION=$(cat /opt/llamacpp/version.txt)
fi
if [[ "$LATEST_RELEASE" != "$CURRENT_VERSION" ]]; then
msg_info "Stopping llama.cpp Server"
systemctl stop llamacpp
msg_ok "Stopped llama.cpp Server"
msg_info "Backing up configuration"
cp /etc/systemd/system/llamacpp.service /tmp/llamacpp.service.backup 2>/dev/null || true
msg_ok "Backed up configuration"
msg_info "Updating llama.cpp to ${LATEST_RELEASE}"
TMP_TAR=$(mktemp --suffix=.tar.gz)
DOWNLOAD_URL="https://github.com/ggml-org/llama.cpp/releases/download/${LATEST_RELEASE}/llama-${LATEST_RELEASE}-bin-ubuntu-vulkan-x64.tar.gz"
curl -fL# -C - -o "${TMP_TAR}" "${DOWNLOAD_URL}"
rm -rf /opt/llamacpp/bin
mkdir -p /opt/llamacpp/bin
tar -xzf "${TMP_TAR}" -C /opt/llamacpp/bin --strip-components=1
rm -f "${TMP_TAR}"
# Create symlinks
ln -sf /opt/llamacpp/bin/llama-server /usr/local/bin/llama-server 2>/dev/null || true
ln -sf /opt/llamacpp/bin/llama-cli /usr/local/bin/llama-cli 2>/dev/null || true
echo "${LATEST_RELEASE}" > /opt/llamacpp/version.txt
msg_ok "Updated llama.cpp to ${LATEST_RELEASE}"
msg_info "Restoring configuration"
cp /tmp/llamacpp.service.backup /etc/systemd/system/llamacpp.service 2>/dev/null || true
systemctl daemon-reload
msg_ok "Restored configuration"
msg_info "Starting llama.cpp Server"
systemctl start llamacpp
msg_ok "Started llama.cpp Server"
msg_ok "Updated successfully!"
else
msg_ok "No update required. llama.cpp is already at ${LATEST_RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
echo -e "${INFO}${YW} OpenAI-Compatible API endpoint:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/v1/chat/completions${CL}"
+76
View File
@@ -0,0 +1,76 @@
{
"name": "llama.cpp Server",
"slug": "llamacpp",
"categories": [
0
],
"date_created": "2026-03-11",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8080,
"documentation": "https://github.com/ggml-org/llama.cpp/tree/master/tools/server",
"website": "https://github.com/ggml-org/llama.cpp",
"logo": "https://raw.githubusercontent.com/ggml-org/llama.cpp/master/media/llama_cpp_icon.png",
"config_path": "/opt/llamacpp/models",
"description": "llama.cpp is a high-performance LLM inference server with OpenAI-compatible API. This installation uses the Vulkan backend for GPU acceleration across AMD, Intel, and NVIDIA GPUs. Features automatic model downloading from HuggingFace, built-in web UI, and supports multiple concurrent requests.",
"install_methods": [
{
"type": "default",
"script": "ct/llamacpp.sh",
"resources": {
"cpu": 4,
"ram": 8192,
"hdd": 20,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Access the Web UI at http://<IP>:8080",
"type": "info"
},
{
"text": "OpenAI-Compatible API: http://<IP>:8080/v1/chat/completions",
"type": "info"
},
{
"text": "Default model: unsloth/Qwen3.5-9B-GGUF:Q8_0 (auto-downloaded on first start)",
"type": "info"
},
{
"text": "Requires GPU passthrough - configure in Proxmox before starting container",
"type": "warning"
},
{
"text": "AMD GPU: Add 'dev0: /dev/kfd,gid=104' and 'dev1: /dev/dri/renderD128,gid=104' to container config",
"type": "warning"
},
{
"text": "Intel GPU: Add 'dev0: /dev/dri/renderD128,gid=104' to container config",
"type": "warning"
},
{
"text": "NVIDIA GPU: Requires nvidia-container-toolkit on host",
"type": "warning"
},
{
"text": "Models are stored in /opt/llamacpp/models/",
"type": "info"
},
{
"text": "Change model: Edit /etc/systemd/system/llamacpp.service and restart",
"type": "info"
},
{
"text": "GPU passthrough guide: /opt/llamacpp/GPU_PASSTHROUGH.md",
"type": "info"
}
]
}
+212
View File
@@ -0,0 +1,212 @@
#!/usr/bin/env bash
# Author: Heretek-AI
# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/ggml-org/llama.cpp
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
curl \
wget \
ca-certificates \
vulkan-tools \
libvulkan1 \
mesa-vulkan-drivers \
firmware-misc-nonfree \
pciutils
msg_ok "Installed Dependencies"
# Detect GPU type for proper configuration
msg_info "Detecting GPU Hardware"
GPU_TYPE="vulkan"
GPU_VENDOR="unknown"
# Check for NVIDIA GPU
if command -v nvidia-smi &>/dev/null 2>&1; then
GPU_VENDOR="nvidia"
GPU_TYPE="cuda"
msg_ok "NVIDIA GPU detected - will use CUDA build"
elif lspci 2>/dev/null | grep -qi "vga.*nvidia\|3d.*nvidia"; then
GPU_VENDOR="nvidia"
msg_ok "NVIDIA GPU detected (drivers not installed) - will use Vulkan build"
# Check for AMD GPU
elif lspci 2>/dev/null | grep -qi "vga.*amd\|3d.*amd\|vga.*radeon\|3d.*radeon"; then
GPU_VENDOR="amd"
msg_ok "AMD GPU detected - will use Vulkan build"
# Check for Intel GPU
elif lspci 2>/dev/null | grep -qi "vga.*intel\|3d.*intel"; then
GPU_VENDOR="intel"
msg_ok "Intel GPU detected - will use Vulkan build"
else
msg_ok "No dedicated GPU detected - will use Vulkan build (CPU fallback)"
fi
# Store GPU info for later use
echo "GPU_VENDOR=${GPU_VENDOR}" > /opt/llamacpp/gpu_info.conf
echo "GPU_TYPE=${GPU_TYPE}" >> /opt/llamacpp/gpu_info.conf
msg_info "Fetching Latest llama.cpp Release"
LATEST_RELEASE=$(curl -fsSL https://api.github.com/repos/ggml-org/llama.cpp/releases/latest 2>/dev/null | grep "tag_name" | awk -F'"' '{print $4}')
if [[ -z "$LATEST_RELEASE" ]]; then
# Fallback to a known good release
LATEST_RELEASE="b8263"
msg_warn "Could not fetch latest release, using fallback: ${LATEST_RELEASE}"
fi
msg_ok "Latest release: ${LATEST_RELEASE}"
msg_info "Downloading llama.cpp ${LATEST_RELEASE} (${GPU_TYPE} build)"
mkdir -p /opt/llamacpp/bin
mkdir -p /opt/llamacpp/models
TMP_TAR=$(mktemp --suffix=.tar.gz)
DOWNLOAD_URL="https://github.com/ggml-org/llama.cpp/releases/download/${LATEST_RELEASE}/llama-${LATEST_RELEASE}-bin-ubuntu-vulkan-x64.tar.gz"
curl -fL# -C - -o "${TMP_TAR}" "${DOWNLOAD_URL}"
tar -xzf "${TMP_TAR}" -C /opt/llamacpp/bin --strip-components=1
rm -f "${TMP_TAR}"
msg_ok "Downloaded and extracted llama.cpp"
# Create symlinks for easy access
ln -sf /opt/llamacpp/bin/llama-server /usr/local/bin/llama-server
ln -sf /opt/llamacpp/bin/llama-cli /usr/local/bin/llama-cli
# Store version
echo "${LATEST_RELEASE}" > /opt/llamacpp/version.txt
msg_info "Creating Directories"
mkdir -p /var/log/llamacpp
chmod 755 /var/log/llamacpp
msg_ok "Created Directories"
msg_info "Creating Systemd Service"
cat <<EOF >/etc/systemd/system/llamacpp.service
[Unit]
Description=llama.cpp Server - OpenAI-Compatible LLM Inference
After=network.target network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/llamacpp
ExecStart=/opt/llamacpp/bin/llama-server -hf unsloth/Qwen3.5-9B-GGUF:Q8_0 --host 0.0.0.0 --port 8080 --ctx-size 8192 --n-gpu-layers -1
Restart=always
RestartSec=10
Environment=LLAMA_LOG_LEVEL=info
StandardOutput=journal
StandardError=journal
SyslogIdentifier=llamacpp
# Resource limits
LimitNOFILE=65535
TimeoutStartSec=300
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
msg_ok "Created Systemd Service"
msg_info "Configuring GPU Permissions"
# Add render and video groups for GPU access
usermod -aG render,video root 2>/dev/null || true
# Configure /dev/kfd and /dev/dri permissions for AMD
if [[ -e /dev/kfd ]]; then
chgrp render /dev/kfd 2>/dev/null || true
chmod 660 /dev/kfd 2>/dev/null || true
fi
if [[ -d /dev/dri ]]; then
chmod 755 /dev/dri 2>/dev/null || true
for render_dev in /dev/dri/renderD*; do
if [[ -e "$render_dev" ]]; then
chgrp render "$render_dev" 2>/dev/null || true
chmod 660 "$render_dev" 2>/dev/null || true
fi
done
fi
msg_ok "Configured GPU Permissions"
msg_info "Enabling and Starting Service"
systemctl enable -q llamacpp
msg_ok "Service enabled"
# Create GPU passthrough info file
cat <<EOF >/opt/llamacpp/GPU_PASSTHROUGH.md
# GPU Passthrough Configuration for llama.cpp
This container has been configured for GPU acceleration using Vulkan.
## Detected GPU Type: ${GPU_VENDOR} (${GPU_TYPE})
## Required Proxmox Configuration
Add the following lines to your container config file:
/etc/pve/lxc/<CTID>.conf
### For AMD GPUs:
\`\`\`
dev0: /dev/kfd,gid=104
dev1: /dev/dri/renderD128,gid=104
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
\`\`\`
### For Intel GPUs:
\`\`\`
dev0: /dev/dri/renderD128,gid=104
lxc.cgroup2.devices.allow: c 226:128 rwm
\`\`\`
### For NVIDIA GPUs:
\`\`\`
# Requires nvidia-container-toolkit on host
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 509:* rwm
\`\`\`
## Verify GPU Access
Run these commands inside the container:
- vulkaninfo (check Vulkan support)
- /opt/llamacpp/bin/llama-cli --help (verify binary works)
## Change Model
Edit /etc/systemd/system/llamacpp.service and modify the -hf parameter:
-hf <huggingface-model>:<quantization>
Examples:
-hf unsloth/Qwen3.5-9B-GGUF:Q8_0
-hf TheBloke/Llama-2-7B-GGUF:Q4_K_M
-hf mistralai/Mistral-7B-Instruct-v0.2-GGUF:Q5_K_M
After changing:
systemctl daemon-reload
systemctl restart llamacpp
EOF
motd_ssh
customize
cleanup_lxc
msg_ok "Installation Complete!\n"
echo -e "${TAB}${GN}llama.cpp Server has been installed successfully!${CL}"
echo -e "${TAB}${YW}Default Model: unsloth/Qwen3.5-9B-GGUF:Q8_0${CL}"
echo -e "${TAB}${YW}The model will be downloaded automatically on first start.${CL}"
echo -e ""
echo -e "${TAB}${YW}GPU Passthrough:${CL}"
echo -e "${TAB}${YW}See /opt/llamacpp/GPU_PASSTHROUGH.md for configuration details.${CL}"
echo -e ""
echo -e "${TAB}${YW}Access the Web UI at: http://${IP}:8080${CL}"
echo -e "${TAB}${YW}OpenAI-Compatible API: http://${IP}:8080/v1/chat/completions${CL}"
+178
View File
@@ -0,0 +1,178 @@
# llama.cpp Server Script Plan for ProxmoxVE
## Overview
This plan outlines the creation of a ProxmoxVE LXC container script for deploying **llama.cpp server** with GPU passthrough and Vulkan backend support. The script will install the latest Vulkan build and configure a default model for immediate use.
## Reference Links
- **GitHub Discussion**: https://github.com/community-scripts/ProxmoxVE/discussions/2403
- **llama.cpp Repository**: https://github.com/ggml-org/llama.cpp
- **llama.cpp Server Documentation**: https://github.com/ggml-org/llama.cpp/tree/master/tools/server
- **Vulkan Build Downloads**: https://github.com/ggml-org/llama.cpp/releases
## Implementation Status
✅ **COMPLETED** - All files have been created.
## Files Created
### 1. Container Script: `ct/llamacpp.sh`
**Purpose**: Main script for creating the LXC container
**Key Features**:
- Debian 13 base (recommended for latest Vulkan support)
- GPU passthrough enabled via `var_gpu="yes"`
- 4 CPU cores, 8GB RAM minimum (model requires ~10GB for Q8_0)
- 20GB disk (model + binaries + cache)
- Auto-detects GPU type (AMD/Intel/NVIDIA) during updates
- Downloads appropriate build (Vulkan or CUDA)
### 2. Installation Script: `install/llamacpp-install.sh`
**Purpose**: Install llama.cpp with Vulkan support inside the container
**Key Features**:
- Auto-detects GPU vendor (AMD/Intel/NVIDIA)
- Downloads latest Vulkan build from GitHub releases
- Falls back to Vulkan if CUDA download fails
- Creates systemd service with default model
- Configures GPU permissions automatically
- Creates GPU passthrough documentation file
### 3. JSON Metadata: `frontend/public/json/llamacpp.json`
**Purpose**: Frontend metadata for the script catalog
**Key Features**:
- Category: AI/ML (0)
- Port: 8080
- Updateable: true
- Comprehensive notes for GPU passthrough
### 4. Header File: `ct/headers/llamacpp`
**Purpose**: ASCII art header for the script
## Default Configuration
| Setting | Value |
|---------|-------|
| Model | `unsloth/Qwen3.5-9B-GGUF:Q8_0` |
| Port | 8080 |
| Context Size | 8192 tokens |
| GPU Layers | -1 (all layers on GPU) |
| Host | 0.0.0.0 (all interfaces) |
## GPU Passthrough Configuration
### AMD GPU Configuration
Add to `/etc/pve/lxc/<CTID>.conf`:
```ini
dev0: /dev/kfd,gid=104
dev1: /dev/dri/renderD128,gid=104
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
```
### Intel GPU Configuration
Add to `/etc/pve/lxc/<CTID>.conf`:
```ini
dev0: /dev/dri/renderD128,gid=104
lxc.cgroup2.devices.allow: c 226:128 rwm
```
### NVIDIA GPU Configuration
For NVIDIA, use the nvidia-container-toolkit approach:
```ini
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 509:* rwm
```
## API Endpoints
The server provides OpenAI-compatible endpoints:
| Endpoint | Description |
|----------|-------------|
| `POST /v1/chat/completions` | Chat completion |
| `POST /v1/completions` | Text completion |
| `POST /v1/embeddings` | Text embeddings |
| `GET /v1/models` | List available models |
| `GET /health` | Health check |
| `GET /` | Built-in Web UI |
## Resource Requirements
| Resource | Minimum | Recommended |
|----------|---------|-------------|
| CPU | 2 cores | 4+ cores |
| RAM | 8GB | 16GB+ |
| Disk | 20GB | 50GB+ |
| GPU | Vulkan 1.1+ | Vulkan 1.3+ |
## Testing Checklist
- [ ] Container creation succeeds
- [ ] GPU passthrough is detected (`vulkaninfo` works)
- [ ] llama.cpp server starts successfully
- [ ] Model downloads automatically from HuggingFace
- [ ] API responds on port 8080
- [ ] Chat completion endpoint works
- [ ] Update script functions correctly
- [ ] Service restarts after reboot
## Usage Examples
### Chat Completion (curl)
```bash
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"messages": [{"role": "user", "content": "Hello!"}],
"temperature": 0.7,
"max_tokens": 100
}'
```
### Change Model
```bash
# Edit the service file
nano /etc/systemd/system/llamacpp.service
# Change the -hf parameter
# Example: -hf TheBloke/Llama-2-7B-GGUF:Q4_K_M
# Reload and restart
systemctl daemon-reload
systemctl restart llamacpp
```
### Check Logs
```bash
journalctl -u llamacpp -f
```
## Files Summary
| File | Purpose |
|------|---------|
| `ct/llamacpp.sh` | Container creation script |
| `install/llamacpp-install.sh` | Installation script |
| `frontend/public/json/llamacpp.json` | Frontend metadata |
| `ct/headers/llamacpp` | ASCII art header |
| `plans/llamacpp-server-plan.md` | This documentation |
## Next Steps
1. Test the script on a Proxmox VE 8.x host with GPU passthrough
2. Verify GPU detection works for AMD, Intel, and NVIDIA
3. Test model download and inference
4. Verify update mechanism works correctly