# Running PentAGI with vLLM and Qwen3.5-27B-FP8
This guide explains how to deploy PentAGI with a fully local LLM setup using vLLM and Qwen3.5-27B-FP8. This configuration enables complete independence from cloud API providers while maintaining high performance for autonomous penetration testing workflows.
## Table of Contents
- [Model Overview](#model-overview)
- [Hardware Requirements](#hardware-requirements)
- [Prerequisites](#prerequisites)
- [vLLM Installation](#vllm-installation)
- [Server Configuration](#server-configuration)
- [Testing the Deployment](#testing-the-deployment)
- [PentAGI Integration](#pentagi-integration)
- [Performance Benchmarks](#performance-benchmarks)
- [Troubleshooting](#troubleshooting)
---
## Model Overview
**Qwen3.5-27B** is a state-of-the-art dense language model from Alibaba Cloud with 27 billion parameters fully active on every token. It features a hybrid architecture combining:
- **75% Gated DeltaNet layers** (linear attention)
- **25% Gated Attention layers** (traditional attention)
- **Native context window**: 262,144 tokens
- **Extended context**: Up to 1,010,000 tokens via YaRN
- **Quantization**: FP8 W8A8 with block size 128 (performance nearly identical to BF16)
This model is particularly well-suited for PentAGI's multi-agent workflows due to its:
- Strong reasoning capabilities with native thinking mode
- Excellent function calling support
- Large context window for complex security analysis
- Fast inference speed with FP8 quantization
---
## Hardware Requirements
FP8 W8A8 hardware acceleration requires GPUs with **Compute Capability ≥ 8.9** (Ada Lovelace, Hopper, or Blackwell architectures). On older GPUs like Ampere (A100, A6000, RTX 3090), FP8 falls back to W8A16 mode via Marlin kernels with reduced performance.
### Supported GPU Configurations
| Configuration | Total VRAM | Max Context | FP8 Mode | Status |
|---|---|---|---|---|
| 2× RTX 5090 (64 GB) | 64 GB | ≤131k | W8A8 | Good |
| **4× RTX 5090 (128 GB)** | **128 GB** | **262k (native)** | **W8A8** | **Tested (~30 GB/GPU)** |
| 1× H100 SXM (80 GB) | 80 GB | 262k | W8A8 | Single GPU |
| 2× H100 SXM (160 GB) | 160 GB | 262k | W8A8 | Excellent |
| 4× A100 80GB (320 GB) | 320 GB | 262k | W8A16 | Slower fallback |
---
## Prerequisites
### System Requirements
- **OS**: Linux (Ubuntu 22.04+ recommended)
- **CUDA**: 12.1 or higher
- **Python**: 3.9 - 3.12
- **GPU Drivers**: Latest NVIDIA drivers (535+)
- **NCCL**: 2.27.3+ (for multi-GPU setups)
### Required Software
Install CUDA toolkit and verify installation:
```bash
nvidia-smi
nvcc --version
```
Install Python package manager (uv recommended for faster installation):
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
---
## vLLM Installation
### Install vLLM Nightly Build
**IMPORTANT**: The `qwen3_5` architecture is not recognized in stable vLLM releases. You **must** use the nightly build until vLLM v0.17.0 is released.
**Option 1: Using uv (recommended)**
```bash
uv pip install vllm --torch-backend=auto --extra-index-url https://wheels.vllm.ai/nightly
```
**Option 2: Using pip**
```bash
pip install vllm --pre --extra-index-url https://wheels.vllm.ai/nightly
```
**Option 3: Docker (alternative)**
```bash
docker pull vllm/vllm-openai:nightly
```
### Verify Installation
```bash
python -c "import vllm; print(vllm.__version__)"
```
---
## Server Configuration
### Recommended vLLM Parameters
The following configuration has been tested and optimized for 4× RTX 5090 GPUs with ~30 GB VRAM usage per GPU at `--gpu-memory-utilization 0.75`:
| Parameter | Value | Explanation |
|---|---|---|
| `--model` | `Qwen/Qwen3.5-27B-FP8` | HuggingFace model identifier |
| `--tensor-parallel-size` | `4` | Number of GPUs (1 shard per GPU) |
| `--max-model-len` | `262144` | Native context window size |
| `--max-num-batched-tokens` | `4096` | Optimal for low inter-token latency in chat |
| `--block-size` | `128` | Matches FP8 quantization block size |
| `--gpu-memory-utilization` | `0.75` | VRAM allocation ratio (adjust as needed) |
| `--language-model-only` | flag | Skip vision encoder → +2-4 GB KV-cache |
| `--enable-prefix-caching` | flag | Cache repeated system prompts |
| `--reasoning-parser` | `qwen3` | Enable Qwen3.5 reasoning/thinking mode parser |
| `--tool-call-parser` | `qwen3_xml` | Prevents infinite `!!!!` bug with long contexts |
| `--attention-backend` | `FLASHINFER` | Best for Ada/Hopper/Blackwell GPUs |
| `--speculative-config` | `'{"method":"qwen3_next_mtp","num_speculative_tokens":1}'` | Enable Medusa-based speculative decoding (MTP) |
| `-O3` | flag | Maximum optimization via torch.compile |
### Start vLLM Server
**For Single GPU (H200, B200, B300):**
```bash
vllm serve Qwen/Qwen3.5-27B-FP8 \
--max-model-len 262144 \
--max-num-batched-tokens 4096 \
--block-size 128 \
--gpu-memory-utilization 0.75 \
--language-model-only \
--enable-prefix-caching \
--reasoning-parser qwen3 \
--tool-call-parser qwen3_xml \
--attention-backend FLASHINFER \
--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":1}' \
-O3 \
--host 127.0.0.1 \
--port 8000
```
**For Multi-GPU (4× RTX 5090):**
```bash
NCCL_P2P_DISABLE=1 vllm serve Qwen/Qwen3.5-27B-FP8 \
--tensor-parallel-size 4 \
--max-model-len 262144 \
--max-num-batched-tokens 4096 \
--block-size 128 \
--gpu-memory-utilization 0.75 \
--language-model-only \
--enable-prefix-caching \
--reasoning-parser qwen3 \
--tool-call-parser qwen3_xml \
--attention-backend FLASHINFER \
--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":1}' \
-O3 \
--host 127.0.0.1 \
--port 8000
```
**Multi-GPU Note**: The `NCCL_P2P_DISABLE=1` environment variable is **required** for Blackwell GPUs (RTX 5090) with tensor parallelism > 1 to prevent NCCL hangs. Update `nvidia-nccl-cu12` to version 2.27.3+ for additional stability.
### Optional: Disable Thinking Mode by Default
To disable the thinking mode at the server level (can still be enabled per-request):
```bash
vllm serve Qwen/Qwen3.5-27B-FP8 \
--default-chat-template-kwargs '{"enable_thinking": false}' \
# ... other parameters
```
### Important: Multi-Turn Conversations
**Best Practice**: In multi-turn conversations, the historical model output should **only include the final output** and **not the thinking content** (`...` tags). This is automatically handled by vLLM's Jinja2 chat template, but if you're implementing custom conversation handling, ensure thinking tags are stripped from message history.
---
## Testing the Deployment
After starting the vLLM server, verify it's working correctly with these test requests.
### Test 1: Thinking Mode Enabled (Default)
```bash
curl "http://127.0.0.1:8000/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3.5-27B-FP8",
"messages": [{"role": "user", "content": "hey! what is the weather in Moscow?"}],
"temperature": 1.0,
"top_k": 20,
"top_p": 0.95,
"min_p": 0.0,
"presence_penalty": 1.5,
"repetition_penalty": 1.0
}'
```
**Expected**: Response includes `` tags with reasoning process.
### Test 2: Thinking Mode Disabled (Non-Thinking)
```bash
curl "http://127.0.0.1:8000/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3.5-27B-FP8",
"messages": [{"role": "user", "content": "hey! what is the weather in Beijing?"}],
"temperature": 0.7,
"top_k": 20,
"top_p": 0.8,
"min_p": 0.0,
"presence_penalty": 1.5,
"repetition_penalty": 1.0,
"chat_template_kwargs": {"enable_thinking": false}
}'
```
**Expected**: Direct response without `` tags.
### Test 3: Higher Temperature Reasoning
```bash
curl "http://127.0.0.1:8000/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3.5-27B-FP8",
"messages": [{"role": "user", "content": "hey! what is the weather in New York?"}],
"temperature": 1.0,
"top_k": 40,
"top_p": 1.0,
"min_p": 0.0,
"presence_penalty": 2.0,
"repetition_penalty": 1.0,
"chat_template_kwargs": {"enable_thinking": false}
}'
```
**Expected**: Creative/diverse responses without thinking tags.
If all tests return valid JSON responses with appropriate content, your vLLM server is ready for PentAGI integration.
---
## Recommended Sampling Parameters
The Qwen team provides official recommendations for sampling parameters optimized for different use cases:
| Mode | temp | top_p | top_k | presence_penalty |
|---|---|---|---|---|
| **Thinking, general tasks** | 1.0 | 0.95 | 20 | 1.5 |
| **Thinking, coding (WebDev)** | 0.6 | 0.95 | 20 | 0.0 |
| **Non-thinking (Instruct), general** | 0.7 | 0.8 | 20 | 1.5 |
| **Non-thinking (Instruct), reasoning** | 1.0 | 1.0 | 40 | 2.0 |
**Additional parameters:**
- `repetition_penalty=1.0` for all modes
- `max_tokens=32768` for most tasks
- `max_tokens=81920` for complex math/coding tasks
These parameters are already applied in the PentAGI provider configuration files referenced below.
---
## PentAGI Integration
### Step 1: Configure Custom Provider in PentAGI
PentAGI includes pre-configured provider files for Qwen3.5-27B-FP8 with optimized sampling parameters for different agent roles.
**Two provider configurations are available:**
1. **With Thinking Mode** (default): [`examples/configs/vllm-qwen3.5-27b-fp8.provider.yml`](../configs/vllm-qwen3.5-27b-fp8.provider.yml)
- Enables `` tags for primary agents (primary_agent, assistant, adviser, refiner, generator)
- Uses `temp=0.6` for coding agents (coder, installer, pentester)
- Recommended for maximum reasoning quality
2. **Without Thinking Mode**: [`examples/configs/vllm-qwen3.5-27b-fp8-no-think.provider.yml`](../configs/vllm-qwen3.5-27b-fp8-no-think.provider.yml)
- Disables thinking for all agents via `chat_template_kwargs`
- Uses `temp=0.7` for general tasks, `temp=1.0` for reasoning
- Recommended for faster responses
### Step 2: Add Provider via PentAGI UI
1. Start PentAGI (see [Quick Start](../../README.md#-quick-start))
2. Navigate to **Settings → Providers**
3. Click **Add Provider**
4. Fill in the form:
- **Name**: `vLLM Qwen3.5-27B-FP8` (or any custom name)
- **Type**: `Custom`
- **Base URL**: `http://127.0.0.1:8000/v1` (or your vLLM server address)
- **API Key**: `dummy` (vLLM doesn't require authentication by default)
- **Configuration**: Copy contents from one of the YAML files above
5. Click **Save**
### Step 3: Verify Provider Configuration
Test the provider by creating a simple flow:
1. Navigate to **Flows**
2. Click **New Flow**
3. Select your newly created provider
4. Enter a test task: `"Scan localhost port 80"`
5. Monitor execution logs
---
## Performance Benchmarks
Based on internal testing with 4× RTX 5090 GPUs and 10 concurrent requests:
| Metric | Value |
|---|---|
| **Prompt Processing Speed** | ~13,000 tokens/sec |
| **Completion Generation Speed** | ~650 tokens/sec |
| **Concurrent Flows** | 12 flows simultaneously with stable performance |
| **VRAM Usage** | ~30 GB per GPU (at 0.75 utilization) |
| **Context Window** | Full 262K tokens supported |
These benchmarks demonstrate that Qwen3.5-27B-FP8 provides excellent throughput for running multiple PentAGI flows in parallel, making it suitable for production deployments.
---
## Troubleshooting
### Issue: "Unknown architecture 'qwen3_5'"
**Cause**: Using stable vLLM release instead of nightly.
**Solution**: Install vLLM nightly build:
```bash
uv pip install vllm --torch-backend=auto --extra-index-url https://wheels.vllm.ai/nightly
```
### Issue: NCCL Hangs on Multi-GPU Setup
**Cause**: Blackwell GPUs (RTX 5090) require P2P communication to be disabled when using tensor parallelism.
**Solution**: Set environment variable before starting vLLM:
```bash
export NCCL_P2P_DISABLE=1
```
Also update NCCL library:
```bash
pip install --upgrade nvidia-nccl-cu12
```
### Issue: `enable_thinking` Parameter Ignored
**Cause**: Parameter must be passed inside `chat_template_kwargs`, not at root level.
**Solution**: Use correct JSON structure:
```json
{
"messages": [...],
"chat_template_kwargs": {"enable_thinking": false}
}
```
### Issue: Infinite `!!!!` Generation on Long Contexts
**Cause**: Using `qwen3_coder` parser with long contexts triggers a known bug.
**Solution**: Switch to XML parser:
```bash
--tool-call-parser qwen3_xml
```
### Issue: Out of Memory (OOM)
**Cause**: Insufficient VRAM for chosen context length.
**Solution**: Reduce `--max-model-len` or `--gpu-memory-utilization`:
```bash
# Reduce context window
--max-model-len 131072
# Or reduce VRAM allocation
--gpu-memory-utilization 0.7
```
### Issue: Speculative Decoding Errors
**Cause**: `num_speculative_tokens > 1` is unstable in current nightly builds.
**Solution**: Use only 1 speculative token:
```bash
--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":1}'
```
---
## Advanced: Extended Context with YaRN
Qwen3.5-27B natively supports 262K tokens. For tasks requiring longer context (up to 1,010,000 tokens), you can enable YaRN (Yet another RoPE extensioN) scaling.
### Enable YaRN via Command Line
```bash
VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 vllm serve Qwen/Qwen3.5-27B-FP8 \
--hf-overrides '{"text_config": {"rope_parameters": {"mrope_interleaved": true, "mrope_section": [11, 11, 10], "rope_type": "yarn", "rope_theta": 10000000, "partial_rotary_factor": 0.25, "factor": 4.0, "original_max_position_embeddings": 262144}}}' \
--max-model-len 1010000 \
# ... other parameters
```
**Important Notes:**
- YaRN uses a **static scaling factor** regardless of input length, which may impact performance on shorter texts
- Only enable YaRN when processing long contexts is required
- Adjust `factor` based on typical context length (e.g., `factor=2.0` for 524K tokens)
- For most PentAGI workflows, the native 262K context is sufficient
---
## Additional Resources
- **Official Qwen3.5 Documentation**: [HuggingFace Model Card](https://huggingface.co/Qwen/Qwen3.5-27B-FP8)
- **vLLM Documentation**: [docs.vllm.ai](https://docs.vllm.ai/)
- **vLLM Qwen3.5 Recipe**: [Official vLLM Guide](https://docs.vllm.ai/en/latest/models/supported_models/)
- **PentAGI Main Documentation**: [README.md](../../README.md)
- **Provider Configuration Reference**: See example configs in [`examples/configs/`](../configs/)