Instructions to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- llama-cpp-python
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with llama-cpp-python:
# !pip install llama-cpp-python from llama_cpp import Llama llm = Llama.from_pretrained( repo_id="LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1", filename="ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf", )
llm.create_chat_completion( messages = [ { "role": "user", "content": "What is the capital of France?" } ] ) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M # Run inference directly in the terminal: llama cli -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M # Run inference directly in the terminal: llama cli -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M # Run inference directly in the terminal: ./llama-cli -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama-cli -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Use Docker
docker model run hf.co/LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
- LM Studio
- Jan
- vLLM
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
- Ollama
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with Ollama:
ollama run hf.co/LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
- Unsloth Studio
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 to start chatting
- Pi
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Run Hermes
hermes
- Atomic Chat new
- OpenClaw new
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
- Docker Model Runner
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with Docker Model Runner:
docker model run hf.co/LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
- Lemonade
How to use LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1 with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1:Q4_K_M
Run and chat with the model
lemonade run user.Ornith-1.0-35B-GGUF-llamacpp-tp1-Q4_K_M
List all available models
lemonade list
Add machine-readable serving profile catalog
Browse files- ARTIFACT_MANIFEST.json +75 -26
- MODEL_INVESTIGATION_HARNESS.md +16 -0
- PROJECT_STATUS_AUDIT.md +4 -1
- README.md +15 -0
- RELEASE_AUDIT.md +15 -4
- configs/serving_matrix.yaml +12 -6
- configs/serving_profiles.yaml +173 -0
- probes/release-readiness-report.json +51 -4
- probes/release-readiness-report.md +5 -2
- probes/serving-profile-validation.json +566 -0
- probes/serving-profile-validation.md +68 -0
- scripts/build_release_readiness_report.py +30 -0
- scripts/validate_serving_profiles.py +278 -0
- scripts/verify_hf_release.py +24 -2
ARTIFACT_MANIFEST.json
CHANGED
|
@@ -20,7 +20,7 @@
|
|
| 20 |
"warning_checks": 0
|
| 21 |
}
|
| 22 |
},
|
| 23 |
-
"generated_at": "2026-06-28T00:
|
| 24 |
"known_remaining_gaps": [
|
| 25 |
"No release-candidate SFT/post-training adapter exists because SFT was stopped and checkpoint-8000 failed behavior gates.",
|
| 26 |
"The recommended strong repair blend and resume preflight are prepared CPU-side, but no resumed GPU training has been run from them.",
|
|
@@ -146,18 +146,18 @@
|
|
| 146 |
}
|
| 147 |
],
|
| 148 |
"release_readiness": {
|
| 149 |
-
"latest_report_generated_at": "2026-06-28T00:
|
| 150 |
"markdown_report": "probes/release-readiness-report.md",
|
| 151 |
"note": "Serving GGUF release readiness is separated from full project completion because the SFT adapter remains unreleased.",
|
| 152 |
"report": "probes/release-readiness-report.json",
|
| 153 |
"script": "scripts/build_release_readiness_report.py",
|
| 154 |
"summary": {
|
| 155 |
-
"checks":
|
| 156 |
"failed_checks": 0,
|
| 157 |
"full_project_status": "incomplete",
|
| 158 |
"serving_release_status": "pass",
|
| 159 |
"status_counts": {
|
| 160 |
-
"pass":
|
| 161 |
"warn": 5
|
| 162 |
},
|
| 163 |
"warning_checks": 5
|
|
@@ -183,7 +183,7 @@
|
|
| 183 |
"script": "scripts/verify_hf_release.py"
|
| 184 |
},
|
| 185 |
"remote_file_count_before_upload": 241,
|
| 186 |
-
"remote_head_before_upload": "
|
| 187 |
"repair_artifacts": {
|
| 188 |
"code_only_extract_format": {
|
| 189 |
"assistant_code_fence": 0.0,
|
|
@@ -293,37 +293,54 @@
|
|
| 293 |
"sft_status": "stopped; no GPU training is running; no LoRA adapter released"
|
| 294 |
},
|
| 295 |
"repo_id": "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1",
|
| 296 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
"staged_files": [
|
| 298 |
{
|
| 299 |
-
"bytes":
|
| 300 |
"path": "MODEL_INVESTIGATION_HARNESS.md",
|
| 301 |
"remote_before_upload": {
|
| 302 |
"blob_id": "11d19ea8434b8a6b792692c62612340ab47f22c4",
|
| 303 |
"bytes": 12198,
|
| 304 |
"exists": true
|
| 305 |
},
|
| 306 |
-
"sha256": "
|
| 307 |
},
|
| 308 |
{
|
| 309 |
-
"bytes":
|
| 310 |
"path": "PROJECT_STATUS_AUDIT.md",
|
| 311 |
"remote_before_upload": {
|
| 312 |
"blob_id": "12abd37fee2e13cdc59ac09f34ad41047c37532c",
|
| 313 |
"bytes": 8575,
|
| 314 |
"exists": true
|
| 315 |
},
|
| 316 |
-
"sha256": "
|
| 317 |
},
|
| 318 |
{
|
| 319 |
-
"bytes":
|
| 320 |
"path": "README.md",
|
| 321 |
"remote_before_upload": {
|
| 322 |
-
"blob_id": "
|
| 323 |
-
"bytes":
|
| 324 |
"exists": true
|
| 325 |
},
|
| 326 |
-
"sha256": "
|
| 327 |
},
|
| 328 |
{
|
| 329 |
"bytes": 12029,
|
|
@@ -1626,14 +1643,22 @@
|
|
| 1626 |
"sha256": "84efb88c5d571d9942e118cd9cde458fda9ce327b5e71b671c55c9c2836a6a43"
|
| 1627 |
},
|
| 1628 |
{
|
| 1629 |
-
"bytes":
|
| 1630 |
"path": "configs/serving_matrix.yaml",
|
| 1631 |
"remote_before_upload": {
|
| 1632 |
"blob_id": "63d4c96c5aaace66eff3a86ce72c379c948422bc",
|
| 1633 |
"bytes": 2287,
|
| 1634 |
"exists": true
|
| 1635 |
},
|
| 1636 |
-
"sha256": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1637 |
},
|
| 1638 |
{
|
| 1639 |
"bytes": 5232,
|
|
@@ -1936,24 +1961,40 @@
|
|
| 1936 |
"sha256": "fa01e4d58c37d581786ad78b0b773547acefb1dbce0a08373ca36eb6c7229eb7"
|
| 1937 |
},
|
| 1938 |
{
|
| 1939 |
-
"bytes":
|
| 1940 |
"path": "probes/release-readiness-report.json",
|
| 1941 |
"remote_before_upload": {
|
| 1942 |
-
"blob_id": "
|
| 1943 |
"bytes": 8562,
|
| 1944 |
"exists": true
|
| 1945 |
},
|
| 1946 |
-
"sha256": "
|
| 1947 |
},
|
| 1948 |
{
|
| 1949 |
-
"bytes":
|
| 1950 |
"path": "probes/release-readiness-report.md",
|
| 1951 |
"remote_before_upload": {
|
| 1952 |
-
"blob_id": "
|
| 1953 |
"bytes": 3017,
|
| 1954 |
"exists": true
|
| 1955 |
},
|
| 1956 |
-
"sha256": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1957 |
},
|
| 1958 |
{
|
| 1959 |
"bytes": 1267,
|
|
@@ -2186,14 +2227,14 @@
|
|
| 2186 |
"sha256": "cf2d52ac14ac23b9c84aa35a8a4c965afed5573f711221411eb93acd634ef526"
|
| 2187 |
},
|
| 2188 |
{
|
| 2189 |
-
"bytes":
|
| 2190 |
"path": "scripts/build_release_readiness_report.py",
|
| 2191 |
"remote_before_upload": {
|
| 2192 |
"blob_id": "a7dc67e2fce48ab06d6a9afe0c24f8e992b4c064",
|
| 2193 |
"bytes": 15496,
|
| 2194 |
"exists": true
|
| 2195 |
},
|
| 2196 |
-
"sha256": "
|
| 2197 |
},
|
| 2198 |
{
|
| 2199 |
"bytes": 4467,
|
|
@@ -2405,6 +2446,14 @@
|
|
| 2405 |
},
|
| 2406 |
"sha256": "340edc3ee4e104e9bf8145195b05ce9f106c63f3b128c32d181ed0512140868a"
|
| 2407 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2408 |
{
|
| 2409 |
"bytes": 15231,
|
| 2410 |
"path": "scripts/validate_sft_jsonl.py",
|
|
@@ -2416,14 +2465,14 @@
|
|
| 2416 |
"sha256": "b1db75a43b9b3415cba337b868638a496f960cf492bbdfa4c31ad978c277908c"
|
| 2417 |
},
|
| 2418 |
{
|
| 2419 |
-
"bytes":
|
| 2420 |
"path": "scripts/verify_hf_release.py",
|
| 2421 |
"remote_before_upload": {
|
| 2422 |
"blob_id": "8aa8b46de86b2f23902e09b03ecd0d76d6079759",
|
| 2423 |
"bytes": 19576,
|
| 2424 |
"exists": true
|
| 2425 |
},
|
| 2426 |
-
"sha256": "
|
| 2427 |
}
|
| 2428 |
]
|
| 2429 |
}
|
|
|
|
| 20 |
"warning_checks": 0
|
| 21 |
}
|
| 22 |
},
|
| 23 |
+
"generated_at": "2026-06-28T00:58:55.373853+00:00",
|
| 24 |
"known_remaining_gaps": [
|
| 25 |
"No release-candidate SFT/post-training adapter exists because SFT was stopped and checkpoint-8000 failed behavior gates.",
|
| 26 |
"The recommended strong repair blend and resume preflight are prepared CPU-side, but no resumed GPU training has been run from them.",
|
|
|
|
| 146 |
}
|
| 147 |
],
|
| 148 |
"release_readiness": {
|
| 149 |
+
"latest_report_generated_at": "2026-06-28T00:58:25.555064+00:00",
|
| 150 |
"markdown_report": "probes/release-readiness-report.md",
|
| 151 |
"note": "Serving GGUF release readiness is separated from full project completion because the SFT adapter remains unreleased.",
|
| 152 |
"report": "probes/release-readiness-report.json",
|
| 153 |
"script": "scripts/build_release_readiness_report.py",
|
| 154 |
"summary": {
|
| 155 |
+
"checks": 25,
|
| 156 |
"failed_checks": 0,
|
| 157 |
"full_project_status": "incomplete",
|
| 158 |
"serving_release_status": "pass",
|
| 159 |
"status_counts": {
|
| 160 |
+
"pass": 20,
|
| 161 |
"warn": 5
|
| 162 |
},
|
| 163 |
"warning_checks": 5
|
|
|
|
| 183 |
"script": "scripts/verify_hf_release.py"
|
| 184 |
},
|
| 185 |
"remote_file_count_before_upload": 241,
|
| 186 |
+
"remote_head_before_upload": "16abb00acc4a1c89dbc5c357252fe677205931cd",
|
| 187 |
"repair_artifacts": {
|
| 188 |
"code_only_extract_format": {
|
| 189 |
"assistant_code_fence": 0.0,
|
|
|
|
| 293 |
"sft_status": "stopped; no GPU training is running; no LoRA adapter released"
|
| 294 |
},
|
| 295 |
"repo_id": "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1",
|
| 296 |
+
"serving_profiles": {
|
| 297 |
+
"config": "configs/serving_profiles.yaml",
|
| 298 |
+
"latest_report_generated_at": "2026-06-28T00:56:49.528851+00:00",
|
| 299 |
+
"markdown_report": "probes/serving-profile-validation.md",
|
| 300 |
+
"note": "Machine-readable single-GPU llama.cpp serving profiles with Q4 default, Q3 lowest-memory, IQ4_XS middle-footprint, and adaptive MTP entries.",
|
| 301 |
+
"report": "probes/serving-profile-validation.json",
|
| 302 |
+
"script": "scripts/validate_serving_profiles.py",
|
| 303 |
+
"summary": {
|
| 304 |
+
"checks": 43,
|
| 305 |
+
"failed_checks": 0,
|
| 306 |
+
"status": "pass",
|
| 307 |
+
"status_counts": {
|
| 308 |
+
"pass": 43
|
| 309 |
+
},
|
| 310 |
+
"warnings": 0
|
| 311 |
+
}
|
| 312 |
+
},
|
| 313 |
+
"staged_file_count_excluding_generated_audit_files": 217,
|
| 314 |
"staged_files": [
|
| 315 |
{
|
| 316 |
+
"bytes": 12795,
|
| 317 |
"path": "MODEL_INVESTIGATION_HARNESS.md",
|
| 318 |
"remote_before_upload": {
|
| 319 |
"blob_id": "11d19ea8434b8a6b792692c62612340ab47f22c4",
|
| 320 |
"bytes": 12198,
|
| 321 |
"exists": true
|
| 322 |
},
|
| 323 |
+
"sha256": "0275706ac68b747d6ab6b2e65131f8d621b109937939779aa354227effeb367f"
|
| 324 |
},
|
| 325 |
{
|
| 326 |
+
"bytes": 9338,
|
| 327 |
"path": "PROJECT_STATUS_AUDIT.md",
|
| 328 |
"remote_before_upload": {
|
| 329 |
"blob_id": "12abd37fee2e13cdc59ac09f34ad41047c37532c",
|
| 330 |
"bytes": 8575,
|
| 331 |
"exists": true
|
| 332 |
},
|
| 333 |
+
"sha256": "1f38f8f0ef4085cfbc0a7e708af86f2ea200130e8df84316e3a5f1258e36f3e9"
|
| 334 |
},
|
| 335 |
{
|
| 336 |
+
"bytes": 11157,
|
| 337 |
"path": "README.md",
|
| 338 |
"remote_before_upload": {
|
| 339 |
+
"blob_id": "fcbe763783bc5975c28adec65acd1c66a9b7cbdf",
|
| 340 |
+
"bytes": 10523,
|
| 341 |
"exists": true
|
| 342 |
},
|
| 343 |
+
"sha256": "f67e32ef769791b92ea113ccc825d783edae9e514ed4304f114d80da551a365d"
|
| 344 |
},
|
| 345 |
{
|
| 346 |
"bytes": 12029,
|
|
|
|
| 1643 |
"sha256": "84efb88c5d571d9942e118cd9cde458fda9ce327b5e71b671c55c9c2836a6a43"
|
| 1644 |
},
|
| 1645 |
{
|
| 1646 |
+
"bytes": 2630,
|
| 1647 |
"path": "configs/serving_matrix.yaml",
|
| 1648 |
"remote_before_upload": {
|
| 1649 |
"blob_id": "63d4c96c5aaace66eff3a86ce72c379c948422bc",
|
| 1650 |
"bytes": 2287,
|
| 1651 |
"exists": true
|
| 1652 |
},
|
| 1653 |
+
"sha256": "580b74248e913b8208bbe040267b8bc40e440c7b8643b7621884dfa1a49f86c1"
|
| 1654 |
+
},
|
| 1655 |
+
{
|
| 1656 |
+
"bytes": 5432,
|
| 1657 |
+
"path": "configs/serving_profiles.yaml",
|
| 1658 |
+
"remote_before_upload": {
|
| 1659 |
+
"exists": false
|
| 1660 |
+
},
|
| 1661 |
+
"sha256": "f3a8638b6aae46ac552984f655a39a000f3ebf188524cc24a28ae6e97cbdeee6"
|
| 1662 |
},
|
| 1663 |
{
|
| 1664 |
"bytes": 5232,
|
|
|
|
| 1961 |
"sha256": "fa01e4d58c37d581786ad78b0b773547acefb1dbce0a08373ca36eb6c7229eb7"
|
| 1962 |
},
|
| 1963 |
{
|
| 1964 |
+
"bytes": 9923,
|
| 1965 |
"path": "probes/release-readiness-report.json",
|
| 1966 |
"remote_before_upload": {
|
| 1967 |
+
"blob_id": "6b35d98f285cb24ab5b918bc78143860a85d1d97",
|
| 1968 |
"bytes": 8562,
|
| 1969 |
"exists": true
|
| 1970 |
},
|
| 1971 |
+
"sha256": "7cb6f2ca33e64d751a833a16cbed4206321fcf031b5f09fcb85c09e88d423e4d"
|
| 1972 |
},
|
| 1973 |
{
|
| 1974 |
+
"bytes": 3287,
|
| 1975 |
"path": "probes/release-readiness-report.md",
|
| 1976 |
"remote_before_upload": {
|
| 1977 |
+
"blob_id": "d0cc1a5f7a22ef1656f0b17850127d0cbb20d325",
|
| 1978 |
"bytes": 3017,
|
| 1979 |
"exists": true
|
| 1980 |
},
|
| 1981 |
+
"sha256": "92ea357c21517714878c1024543ca2100da8b80f0c23a0590dbeaa22d76b68e0"
|
| 1982 |
+
},
|
| 1983 |
+
{
|
| 1984 |
+
"bytes": 17664,
|
| 1985 |
+
"path": "probes/serving-profile-validation.json",
|
| 1986 |
+
"remote_before_upload": {
|
| 1987 |
+
"exists": false
|
| 1988 |
+
},
|
| 1989 |
+
"sha256": "1e272a261e35d60c710890471a3adb2dbc03e4685a3ee179fadf6bed48c1dac0"
|
| 1990 |
+
},
|
| 1991 |
+
{
|
| 1992 |
+
"bytes": 5737,
|
| 1993 |
+
"path": "probes/serving-profile-validation.md",
|
| 1994 |
+
"remote_before_upload": {
|
| 1995 |
+
"exists": false
|
| 1996 |
+
},
|
| 1997 |
+
"sha256": "0e4d13af8d1f1c7d7694361e16e0d121f04c45700b89fe773d01c8534e6b7824"
|
| 1998 |
},
|
| 1999 |
{
|
| 2000 |
"bytes": 1267,
|
|
|
|
| 2227 |
"sha256": "cf2d52ac14ac23b9c84aa35a8a4c965afed5573f711221411eb93acd634ef526"
|
| 2228 |
},
|
| 2229 |
{
|
| 2230 |
+
"bytes": 16856,
|
| 2231 |
"path": "scripts/build_release_readiness_report.py",
|
| 2232 |
"remote_before_upload": {
|
| 2233 |
"blob_id": "a7dc67e2fce48ab06d6a9afe0c24f8e992b4c064",
|
| 2234 |
"bytes": 15496,
|
| 2235 |
"exists": true
|
| 2236 |
},
|
| 2237 |
+
"sha256": "05190a4ce370af14c88853a566b52410d62abd562b49179a55bb2fe3bc6c42d0"
|
| 2238 |
},
|
| 2239 |
{
|
| 2240 |
"bytes": 4467,
|
|
|
|
| 2446 |
},
|
| 2447 |
"sha256": "340edc3ee4e104e9bf8145195b05ce9f106c63f3b128c32d181ed0512140868a"
|
| 2448 |
},
|
| 2449 |
+
{
|
| 2450 |
+
"bytes": 9335,
|
| 2451 |
+
"path": "scripts/validate_serving_profiles.py",
|
| 2452 |
+
"remote_before_upload": {
|
| 2453 |
+
"exists": false
|
| 2454 |
+
},
|
| 2455 |
+
"sha256": "7cd47c2fb7b723daa2f1b493e6cc8642499eac0f50057463786ed4dac26cc9f2"
|
| 2456 |
+
},
|
| 2457 |
{
|
| 2458 |
"bytes": 15231,
|
| 2459 |
"path": "scripts/validate_sft_jsonl.py",
|
|
|
|
| 2465 |
"sha256": "b1db75a43b9b3415cba337b868638a496f960cf492bbdfa4c31ad978c277908c"
|
| 2466 |
},
|
| 2467 |
{
|
| 2468 |
+
"bytes": 20402,
|
| 2469 |
"path": "scripts/verify_hf_release.py",
|
| 2470 |
"remote_before_upload": {
|
| 2471 |
"blob_id": "8aa8b46de86b2f23902e09b03ecd0d76d6079759",
|
| 2472 |
"bytes": 19576,
|
| 2473 |
"exists": true
|
| 2474 |
},
|
| 2475 |
+
"sha256": "a4afcad099491fa52fbaffe10927966c82ac9c4c8d532144432e441a8f31bdd0"
|
| 2476 |
}
|
| 2477 |
]
|
| 2478 |
}
|
MODEL_INVESTIGATION_HARNESS.md
CHANGED
|
@@ -100,6 +100,22 @@ For Ornith this reports `serving_release_status=pass` and
|
|
| 100 |
serving release is usable, while the fine-tuning/post-training deliverable
|
| 101 |
remains unreleased after the stopped SFT run.
|
| 102 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
## Serving And Benchmark Flow
|
| 104 |
|
| 105 |
Start a single-GPU llama.cpp server:
|
|
|
|
| 100 |
serving release is usable, while the fine-tuning/post-training deliverable
|
| 101 |
remains unreleased after the stopped SFT run.
|
| 102 |
|
| 103 |
+
Validate the machine-readable serving profile catalog:
|
| 104 |
+
|
| 105 |
+
```bash
|
| 106 |
+
.venv-lab/bin/python scripts/validate_serving_profiles.py \
|
| 107 |
+
--catalog configs/serving_profiles.yaml \
|
| 108 |
+
--manifest hf_upload/ARTIFACT_MANIFEST.json \
|
| 109 |
+
--hf-root hf_upload \
|
| 110 |
+
--output runs/serving-profile-validation.json \
|
| 111 |
+
--markdown-output runs/serving-profile-validation.md \
|
| 112 |
+
--fail-on-error
|
| 113 |
+
```
|
| 114 |
+
|
| 115 |
+
The current catalog validates 5 single-GPU llama.cpp profiles with 43/43 checks
|
| 116 |
+
passing: Q4_K_M short-context speed, Q4_K_M coding-context default, Q3_K_M
|
| 117 |
+
lowest memory, IQ4_XS middle footprint, and adaptive IQ4_XS MTP graft.
|
| 118 |
+
|
| 119 |
## Serving And Benchmark Flow
|
| 120 |
|
| 121 |
Start a single-GPU llama.cpp server:
|
PROJECT_STATUS_AUDIT.md
CHANGED
|
@@ -18,7 +18,7 @@ release-candidate adapter.
|
|
| 18 |
| Requirement | Status | Evidence | Notes |
|
| 19 |
|---|---|---|---|
|
| 20 |
| Single-GPU serving only, `tp=1` | Complete | `hf_upload/ARTIFACT_MANIFEST.json`, `hf_upload/RELEASE_AUDIT.md`, `hf_upload/README.md` | Multi-GPU serving is explicitly out of scope. Both GPUs are used only as independent experiment lanes. |
|
| 21 |
-
| Fast serving profile | Complete for GGUF | `benchmarks/llamacpp-quant-benchmarks.md`, `scripts/serve_llamacpp_gpu0.sh`, `scripts/serve_llamacpp_gpu1.sh` | Recommended
|
| 22 |
| Integrated MTP serving profile | Complete with adaptive policy | `benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md`, `patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch` | Low concurrency benefits from MTP; saturated c16 should use adaptive throttling via `LLAMA_SPEC_MAX_DRAFTING_SLOTS=1`. Always-on MTP is not recommended for high-concurrency batches. |
|
| 23 |
| Find/fix model or serving issues | Complete for discovered issues | `probes/investigation-ornith-q4-live.json`, `benchmarks/llamacpp-q4-reasoning-off-fix.md`, llama.cpp patches under `patches/` | Found reasoning-content empty-final issue, vLLM GGUF corruption, upstream config-only MTP gap, and llama.cpp MTP recurrent/scheduler issues. Documented/fixed where locally controllable. |
|
| 24 |
| Reusable bug-discovery harness | Complete | `MODEL_INVESTIGATION_HARNESS.md`, `configs/model_behavior_suite.yaml`, `scripts/run_model_investigation.py`, `scripts/probe_model_behavior.py`, `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json` | Published to HF with dependencies and gate scripts. Metadata-only smoke passed with 13 checks, 0 failures, 2 low-severity notes. The behavior matrix compares 7 artifacts across 14 reusable checks and separates 5 passing artifacts from 2 known-bad artifacts. |
|
|
@@ -32,6 +32,7 @@ release-candidate adapter.
|
|
| 32 |
| Reusable HF release verifier | Complete | `scripts/verify_hf_release.py`, `runs/hf-release-verification-final.json` | Verifies model-card metadata, required support files, staged file hashes, generated release-file hashes, all published GGUF artifacts, and SFT gate summaries. Latest local run passed 21/21 checks with 0 warnings. |
|
| 33 |
| Reusable behavior regression matrix | Complete | `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json`, `runs/behavior-regression-matrix.md` | CPU-only aggregation over existing behavior/investigation reports. Current run: 7 artifacts, 98 checks, 5 passing artifacts, 2 failing artifacts, 9 failed checks, and 6 blocking issues in known-bad profiles. |
|
| 34 |
| Reusable release-readiness gate | Complete | `scripts/build_release_readiness_report.py`, `runs/release-readiness-report.json`, `runs/release-readiness-report.md` | CPU-only gate over HF readback, manifest, behavior matrix, quant/KLD docs, MTP policy, required docs, and SFT state. Current run: serving release `pass`, full project `incomplete`, 22 checks, 0 failures, 5 warnings. |
|
|
|
|
| 35 |
| Keep GPUs idle after SFT stop | Complete at audit time | `nvidia-smi`: GPU0 10 MiB / 0%, GPU1 2 MiB / 0%; process scan empty | No `train_sft_lora`, watcher, eval, server, quantize, or convert processes were running. |
|
| 36 |
|
| 37 |
## Current Release State
|
|
@@ -40,6 +41,8 @@ release-candidate adapter.
|
|
| 40 |
- Last verified remote commit before this status-audit refresh: `04a18958f05ac002c2ff846d7b5ced6361f9af30`
|
| 41 |
- Latest local HF verifier report: `runs/hf-release-verification-final.json` (`21/21` checks passed, `0` warnings)
|
| 42 |
- Published HF verifier entrypoint: `scripts/verify_hf_release.py`
|
|
|
|
|
|
|
| 43 |
- Latest behavior regression matrix: `runs/behavior-regression-matrix.json` and `runs/behavior-regression-matrix.md`
|
| 44 |
- Latest release-readiness report: `runs/release-readiness-report.json` and `runs/release-readiness-report.md`
|
| 45 |
- Release audit: `RELEASE_AUDIT.md`
|
|
|
|
| 18 |
| Requirement | Status | Evidence | Notes |
|
| 19 |
|---|---|---|---|
|
| 20 |
| Single-GPU serving only, `tp=1` | Complete | `hf_upload/ARTIFACT_MANIFEST.json`, `hf_upload/RELEASE_AUDIT.md`, `hf_upload/README.md` | Multi-GPU serving is explicitly out of scope. Both GPUs are used only as independent experiment lanes. |
|
| 21 |
+
| Fast serving profile | Complete for GGUF | `configs/serving_profiles.yaml`, `runs/serving-profile-validation.json`, `benchmarks/llamacpp-quant-benchmarks.md`, `scripts/serve_llamacpp_gpu0.sh`, `scripts/serve_llamacpp_gpu1.sh` | Recommended default is llama.cpp `Q4_K_M` coding context with `REASONING=off`. The serving catalog validates 5 single-GPU profiles with 43/43 checks passing. |
|
| 22 |
| Integrated MTP serving profile | Complete with adaptive policy | `benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md`, `patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch` | Low concurrency benefits from MTP; saturated c16 should use adaptive throttling via `LLAMA_SPEC_MAX_DRAFTING_SLOTS=1`. Always-on MTP is not recommended for high-concurrency batches. |
|
| 23 |
| Find/fix model or serving issues | Complete for discovered issues | `probes/investigation-ornith-q4-live.json`, `benchmarks/llamacpp-q4-reasoning-off-fix.md`, llama.cpp patches under `patches/` | Found reasoning-content empty-final issue, vLLM GGUF corruption, upstream config-only MTP gap, and llama.cpp MTP recurrent/scheduler issues. Documented/fixed where locally controllable. |
|
| 24 |
| Reusable bug-discovery harness | Complete | `MODEL_INVESTIGATION_HARNESS.md`, `configs/model_behavior_suite.yaml`, `scripts/run_model_investigation.py`, `scripts/probe_model_behavior.py`, `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json` | Published to HF with dependencies and gate scripts. Metadata-only smoke passed with 13 checks, 0 failures, 2 low-severity notes. The behavior matrix compares 7 artifacts across 14 reusable checks and separates 5 passing artifacts from 2 known-bad artifacts. |
|
|
|
|
| 32 |
| Reusable HF release verifier | Complete | `scripts/verify_hf_release.py`, `runs/hf-release-verification-final.json` | Verifies model-card metadata, required support files, staged file hashes, generated release-file hashes, all published GGUF artifacts, and SFT gate summaries. Latest local run passed 21/21 checks with 0 warnings. |
|
| 33 |
| Reusable behavior regression matrix | Complete | `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json`, `runs/behavior-regression-matrix.md` | CPU-only aggregation over existing behavior/investigation reports. Current run: 7 artifacts, 98 checks, 5 passing artifacts, 2 failing artifacts, 9 failed checks, and 6 blocking issues in known-bad profiles. |
|
| 34 |
| Reusable release-readiness gate | Complete | `scripts/build_release_readiness_report.py`, `runs/release-readiness-report.json`, `runs/release-readiness-report.md` | CPU-only gate over HF readback, manifest, behavior matrix, quant/KLD docs, MTP policy, required docs, and SFT state. Current run: serving release `pass`, full project `incomplete`, 22 checks, 0 failures, 5 warnings. |
|
| 35 |
+
| Machine-readable serving profile catalog | Complete | `configs/serving_profiles.yaml`, `scripts/validate_serving_profiles.py`, `runs/serving-profile-validation.json`, `runs/serving-profile-validation.md` | Catalog captures Q4_K_M speed/default, Q3_K_M lowest-memory, IQ4_XS middle-footprint, and adaptive IQ4_XS MTP graft profiles. Validation passes 43/43 checks against manifest, scripts, evidence docs, and tp=1 policy. |
|
| 36 |
| Keep GPUs idle after SFT stop | Complete at audit time | `nvidia-smi`: GPU0 10 MiB / 0%, GPU1 2 MiB / 0%; process scan empty | No `train_sft_lora`, watcher, eval, server, quantize, or convert processes were running. |
|
| 37 |
|
| 38 |
## Current Release State
|
|
|
|
| 41 |
- Last verified remote commit before this status-audit refresh: `04a18958f05ac002c2ff846d7b5ced6361f9af30`
|
| 42 |
- Latest local HF verifier report: `runs/hf-release-verification-final.json` (`21/21` checks passed, `0` warnings)
|
| 43 |
- Published HF verifier entrypoint: `scripts/verify_hf_release.py`
|
| 44 |
+
- Serving profile catalog: `configs/serving_profiles.yaml`
|
| 45 |
+
- Latest serving profile validation: `runs/serving-profile-validation.json` and `runs/serving-profile-validation.md`
|
| 46 |
- Latest behavior regression matrix: `runs/behavior-regression-matrix.json` and `runs/behavior-regression-matrix.md`
|
| 47 |
- Latest release-readiness report: `runs/release-readiness-report.json` and `runs/release-readiness-report.md`
|
| 48 |
- Release audit: `RELEASE_AUDIT.md`
|
README.md
CHANGED
|
@@ -37,6 +37,8 @@ This workspace tracks optimization work for `deepreinforce-ai/Ornith-1.0-35B`.
|
|
| 37 |
Current reusable workflow: [MODEL_INVESTIGATION_HARNESS.md](MODEL_INVESTIGATION_HARNESS.md).
|
| 38 |
Current requirement audit: [PROJECT_STATUS_AUDIT.md](PROJECT_STATUS_AUDIT.md).
|
| 39 |
SFT remediation plan: [SFT_REMEDIATION_PLAN.md](SFT_REMEDIATION_PLAN.md).
|
|
|
|
|
|
|
| 40 |
Behavior regression matrix: [probes/behavior-regression-matrix.md](probes/behavior-regression-matrix.md)
|
| 41 |
via [scripts/summarize_behavior_matrix.py](scripts/summarize_behavior_matrix.py).
|
| 42 |
Release readiness report: [probes/release-readiness-report.md](probes/release-readiness-report.md)
|
|
@@ -125,6 +127,7 @@ Build the CPU-only release-readiness report:
|
|
| 125 |
```bash
|
| 126 |
.venv-lab/bin/python scripts/build_release_readiness_report.py \
|
| 127 |
--allow-unreleased-sft \
|
|
|
|
| 128 |
--required-doc hf_upload/README.md \
|
| 129 |
--required-doc hf_upload/RELEASE_AUDIT.md \
|
| 130 |
--required-doc hf_upload/PROJECT_STATUS_AUDIT.md \
|
|
@@ -138,6 +141,18 @@ Build the CPU-only release-readiness report:
|
|
| 138 |
The current readiness report passes the GGUF serving release and marks the full
|
| 139 |
project incomplete because no SFT/post-training adapter is released.
|
| 140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
Run reusable behavior probes against any OpenAI-compatible backend:
|
| 142 |
|
| 143 |
```bash
|
|
|
|
| 37 |
Current reusable workflow: [MODEL_INVESTIGATION_HARNESS.md](MODEL_INVESTIGATION_HARNESS.md).
|
| 38 |
Current requirement audit: [PROJECT_STATUS_AUDIT.md](PROJECT_STATUS_AUDIT.md).
|
| 39 |
SFT remediation plan: [SFT_REMEDIATION_PLAN.md](SFT_REMEDIATION_PLAN.md).
|
| 40 |
+
Serving profile catalog: [configs/serving_profiles.yaml](configs/serving_profiles.yaml)
|
| 41 |
+
with validation report [probes/serving-profile-validation.md](probes/serving-profile-validation.md).
|
| 42 |
Behavior regression matrix: [probes/behavior-regression-matrix.md](probes/behavior-regression-matrix.md)
|
| 43 |
via [scripts/summarize_behavior_matrix.py](scripts/summarize_behavior_matrix.py).
|
| 44 |
Release readiness report: [probes/release-readiness-report.md](probes/release-readiness-report.md)
|
|
|
|
| 127 |
```bash
|
| 128 |
.venv-lab/bin/python scripts/build_release_readiness_report.py \
|
| 129 |
--allow-unreleased-sft \
|
| 130 |
+
--serving-profile-validation hf_upload/probes/serving-profile-validation.json \
|
| 131 |
--required-doc hf_upload/README.md \
|
| 132 |
--required-doc hf_upload/RELEASE_AUDIT.md \
|
| 133 |
--required-doc hf_upload/PROJECT_STATUS_AUDIT.md \
|
|
|
|
| 141 |
The current readiness report passes the GGUF serving release and marks the full
|
| 142 |
project incomplete because no SFT/post-training adapter is released.
|
| 143 |
|
| 144 |
+
Validate the machine-readable serving profiles:
|
| 145 |
+
|
| 146 |
+
```bash
|
| 147 |
+
.venv-lab/bin/python scripts/validate_serving_profiles.py \
|
| 148 |
+
--catalog configs/serving_profiles.yaml \
|
| 149 |
+
--manifest hf_upload/ARTIFACT_MANIFEST.json \
|
| 150 |
+
--hf-root hf_upload \
|
| 151 |
+
--output runs/serving-profile-validation.json \
|
| 152 |
+
--markdown-output runs/serving-profile-validation.md \
|
| 153 |
+
--fail-on-error
|
| 154 |
+
```
|
| 155 |
+
|
| 156 |
Run reusable behavior probes against any OpenAI-compatible backend:
|
| 157 |
|
| 158 |
```bash
|
RELEASE_AUDIT.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
| 1 |
# Release Audit
|
| 2 |
|
| 3 |
-
Generated: 2026-06-28T00:
|
| 4 |
|
| 5 |
- HF repo: `LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1`
|
| 6 |
-
- Remote head before this upload: `
|
| 7 |
- Remote files before this upload: 241
|
| 8 |
-
- Staged support files excluding generated audit files:
|
| 9 |
- Overall status: `pass for serving/quant/MTP support files; SFT adapter remains unreleased`
|
| 10 |
- Latest HF release verifier: `pass` (`25` checks, `0` failures, `1` expected SFT warning)
|
|
|
|
| 11 |
- Latest behavior regression matrix: `5` passing artifacts, `2` known-bad failing artifacts
|
| 12 |
- Latest release readiness: serving release `pass`, full project `incomplete`
|
| 13 |
|
|
@@ -72,12 +73,22 @@ Generated: 2026-06-28T00:52:18.227594+00:00
|
|
| 72 |
- Known-bad artifacts are intentionally included: the old reasoning-on Q4
|
| 73 |
profile and the stopped checkpoint-8000 LoRA adapter.
|
| 74 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
## Release Readiness
|
| 76 |
|
| 77 |
- Script: `scripts/build_release_readiness_report.py`
|
| 78 |
- Latest report: `probes/release-readiness-report.json`
|
| 79 |
- Markdown summary: `probes/release-readiness-report.md`
|
| 80 |
-
- Current run: `
|
| 81 |
- Serving GGUF release status: `pass`.
|
| 82 |
- Full project status: `incomplete` because no SFT/post-training adapter is
|
| 83 |
released.
|
|
|
|
| 1 |
# Release Audit
|
| 2 |
|
| 3 |
+
Generated: 2026-06-28T00:58:55.373853+00:00
|
| 4 |
|
| 5 |
- HF repo: `LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1`
|
| 6 |
+
- Remote head before this upload: `16abb00acc4a1c89dbc5c357252fe677205931cd`
|
| 7 |
- Remote files before this upload: 241
|
| 8 |
+
- Staged support files excluding generated audit files: 217
|
| 9 |
- Overall status: `pass for serving/quant/MTP support files; SFT adapter remains unreleased`
|
| 10 |
- Latest HF release verifier: `pass` (`25` checks, `0` failures, `1` expected SFT warning)
|
| 11 |
+
- Latest serving profile validation: `pass` (`43/43` checks)
|
| 12 |
- Latest behavior regression matrix: `5` passing artifacts, `2` known-bad failing artifacts
|
| 13 |
- Latest release readiness: serving release `pass`, full project `incomplete`
|
| 14 |
|
|
|
|
| 73 |
- Known-bad artifacts are intentionally included: the old reasoning-on Q4
|
| 74 |
profile and the stopped checkpoint-8000 LoRA adapter.
|
| 75 |
|
| 76 |
+
## Serving Profiles
|
| 77 |
+
|
| 78 |
+
- Catalog: `configs/serving_profiles.yaml`
|
| 79 |
+
- Validator: `scripts/validate_serving_profiles.py`
|
| 80 |
+
- Latest report: `probes/serving-profile-validation.json`
|
| 81 |
+
- Markdown summary: `probes/serving-profile-validation.md`
|
| 82 |
+
- Current run: `43/43` checks passed, `0` failures, `0` warnings.
|
| 83 |
+
- Profiles: Q4_K_M speed/default, Q3_K_M lowest-memory, IQ4_XS
|
| 84 |
+
middle-footprint, and adaptive IQ4_XS MTP graft.
|
| 85 |
+
|
| 86 |
## Release Readiness
|
| 87 |
|
| 88 |
- Script: `scripts/build_release_readiness_report.py`
|
| 89 |
- Latest report: `probes/release-readiness-report.json`
|
| 90 |
- Markdown summary: `probes/release-readiness-report.md`
|
| 91 |
+
- Current run: `25` checks, `0` failures, `5` warnings.
|
| 92 |
- Serving GGUF release status: `pass`.
|
| 93 |
- Full project status: `incomplete` because no SFT/post-training adapter is
|
| 94 |
released.
|
configs/serving_matrix.yaml
CHANGED
|
@@ -13,16 +13,20 @@ policy:
|
|
| 13 |
- multi_gpu_serving
|
| 14 |
|
| 15 |
current_baseline:
|
| 16 |
-
date: "2026-06-
|
| 17 |
-
winner:
|
| 18 |
-
reason:
|
| 19 |
constraints:
|
| 20 |
tensor_parallel_size: 1
|
| 21 |
max_model_len: 131072
|
| 22 |
-
|
|
|
|
|
|
|
| 23 |
benchmark_notes:
|
| 24 |
-
|
| 25 |
-
|
|
|
|
|
|
|
| 26 |
|
| 27 |
serving_candidates:
|
| 28 |
- name: sglang_bf16_tp1
|
|
@@ -57,6 +61,8 @@ serving_candidates:
|
|
| 57 |
expected_strengths:
|
| 58 |
- fast_gguf_loading
|
| 59 |
- small_memory_footprint
|
|
|
|
|
|
|
| 60 |
|
| 61 |
benchmarks:
|
| 62 |
smoke:
|
|
|
|
| 13 |
- multi_gpu_serving
|
| 14 |
|
| 15 |
current_baseline:
|
| 16 |
+
date: "2026-06-28"
|
| 17 |
+
winner: llamacpp_gguf_q4_k_m_tp1
|
| 18 |
+
reason: verified GGUF release path; Q4_K_M is the fastest validated llama.cpp quant, vLLM GGUF remains unsupported for this model family, and BF16 baselines are retained only as historical notes
|
| 19 |
constraints:
|
| 20 |
tensor_parallel_size: 1
|
| 21 |
max_model_len: 131072
|
| 22 |
+
quant: Q4_K_M
|
| 23 |
+
backend: llama.cpp
|
| 24 |
+
reasoning: off
|
| 25 |
benchmark_notes:
|
| 26 |
+
serving_profiles: configs/serving_profiles.yaml
|
| 27 |
+
quant_benchmarks: benchmarks/llamacpp-quant-benchmarks.md
|
| 28 |
+
behavior_matrix: probes/behavior-regression-matrix.md
|
| 29 |
+
release_readiness: probes/release-readiness-report.md
|
| 30 |
|
| 31 |
serving_candidates:
|
| 32 |
- name: sglang_bf16_tp1
|
|
|
|
| 61 |
expected_strengths:
|
| 62 |
- fast_gguf_loading
|
| 63 |
- small_memory_footprint
|
| 64 |
+
- verified_hf_release_artifact
|
| 65 |
+
- reasoning_off_final_answer_mode
|
| 66 |
|
| 67 |
benchmarks:
|
| 68 |
smoke:
|
configs/serving_profiles.yaml
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
model:
|
| 2 |
+
hf_repo: deepreinforce-ai/Ornith-1.0-35B
|
| 3 |
+
release_repo: LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1
|
| 4 |
+
served_name: Ornith-1.0-35B
|
| 5 |
+
|
| 6 |
+
policy:
|
| 7 |
+
serving_parallelism: tp1_only
|
| 8 |
+
tensor_parallel_size: 1
|
| 9 |
+
backend: llama.cpp
|
| 10 |
+
reasoning: "off"
|
| 11 |
+
gpu_usage_note: Use one independent model copy per GPU. Do not split one serving replica across GPUs.
|
| 12 |
+
forbidden:
|
| 13 |
+
- tensor_parallel_size_gt_1
|
| 14 |
+
- multi_gpu_serving
|
| 15 |
+
|
| 16 |
+
default_profile: llamacpp_q4_k_m_coding_context
|
| 17 |
+
lowest_memory_profile: llamacpp_q3_k_m_short_context
|
| 18 |
+
middle_footprint_profile: llamacpp_iq4_xs_short_context
|
| 19 |
+
adaptive_mtp_profile: llamacpp_iq4_xs_mtp_graft_adaptive
|
| 20 |
+
|
| 21 |
+
profiles:
|
| 22 |
+
- id: llamacpp_q4_k_m_short_context
|
| 23 |
+
status: recommended_speed_benchmark
|
| 24 |
+
backend: llama.cpp
|
| 25 |
+
tensor_parallel_size: 1
|
| 26 |
+
artifact: ornith-1.0-35b-Q4_K_M.gguf
|
| 27 |
+
quant: Q4_K_M
|
| 28 |
+
command:
|
| 29 |
+
script: scripts/serve_llamacpp_gpu0.sh
|
| 30 |
+
env:
|
| 31 |
+
QUANT: Q4_K_M
|
| 32 |
+
PORT: "8002"
|
| 33 |
+
CTX_SIZE: "8192"
|
| 34 |
+
PARALLEL: "16"
|
| 35 |
+
BATCH_SIZE: "4096"
|
| 36 |
+
UBATCH_SIZE: "512"
|
| 37 |
+
REASONING: "off"
|
| 38 |
+
measured:
|
| 39 |
+
loaded_vram_gib: 21.31
|
| 40 |
+
c1_output_tps: 243.3
|
| 41 |
+
c16_output_tps: 655.6
|
| 42 |
+
c16_p95_ttft_ms: 650.0
|
| 43 |
+
behavior_gate: pass
|
| 44 |
+
evidence:
|
| 45 |
+
benchmark: benchmarks/llamacpp-quant-benchmarks.md
|
| 46 |
+
behavior: probes/behavior-llamacpp-q4-script-default.json
|
| 47 |
+
notes:
|
| 48 |
+
- Short-context benchmark profile exposes about 512 tokens per slot because CTX_SIZE is split across PARALLEL slots.
|
| 49 |
+
|
| 50 |
+
- id: llamacpp_q4_k_m_coding_context
|
| 51 |
+
status: recommended_default
|
| 52 |
+
backend: llama.cpp
|
| 53 |
+
tensor_parallel_size: 1
|
| 54 |
+
artifact: ornith-1.0-35b-Q4_K_M.gguf
|
| 55 |
+
quant: Q4_K_M
|
| 56 |
+
command:
|
| 57 |
+
script: scripts/serve_llamacpp_gpu0.sh
|
| 58 |
+
env:
|
| 59 |
+
QUANT: Q4_K_M
|
| 60 |
+
PORT: "8002"
|
| 61 |
+
CTX_SIZE: "131072"
|
| 62 |
+
PARALLEL: "16"
|
| 63 |
+
BATCH_SIZE: "4096"
|
| 64 |
+
UBATCH_SIZE: "512"
|
| 65 |
+
REASONING: "off"
|
| 66 |
+
measured:
|
| 67 |
+
loaded_vram_gib_short_context: 21.31
|
| 68 |
+
c16_output_tps_short_context: 655.6
|
| 69 |
+
behavior_gate: pass
|
| 70 |
+
evidence:
|
| 71 |
+
benchmark: benchmarks/llamacpp-quant-benchmarks.md
|
| 72 |
+
behavior: probes/behavior-llamacpp-q4-script-default.json
|
| 73 |
+
notes:
|
| 74 |
+
- Practical coding-serving profile with 16 slots and about 8k context per slot.
|
| 75 |
+
- Throughput numbers come from the matched short-context sweep.
|
| 76 |
+
|
| 77 |
+
- id: llamacpp_q3_k_m_short_context
|
| 78 |
+
status: lowest_memory_validated
|
| 79 |
+
backend: llama.cpp
|
| 80 |
+
tensor_parallel_size: 1
|
| 81 |
+
artifact: ornith-1.0-35b-Q3_K_M.gguf
|
| 82 |
+
quant: Q3_K_M
|
| 83 |
+
command:
|
| 84 |
+
script: scripts/serve_llamacpp_gpu0.sh
|
| 85 |
+
env:
|
| 86 |
+
QUANT: Q3_K_M
|
| 87 |
+
PORT: "8002"
|
| 88 |
+
CTX_SIZE: "8192"
|
| 89 |
+
PARALLEL: "16"
|
| 90 |
+
BATCH_SIZE: "4096"
|
| 91 |
+
UBATCH_SIZE: "512"
|
| 92 |
+
REASONING: "off"
|
| 93 |
+
measured:
|
| 94 |
+
gguf_gib: 15.61
|
| 95 |
+
loaded_vram_gib: 17.27
|
| 96 |
+
c1_output_tps: 240.5
|
| 97 |
+
c16_output_tps: 493.0
|
| 98 |
+
mean_kld_nats_vs_bf16_top64: 0.3620
|
| 99 |
+
behavior_gate: pass
|
| 100 |
+
evidence:
|
| 101 |
+
benchmark: benchmarks/llamacpp-quant-benchmarks.md
|
| 102 |
+
kld: benchmarks/kld-quant-vs-bf16-top64.md
|
| 103 |
+
behavior: probes/behavior-llamacpp-q3-k-m-parallel16.json
|
| 104 |
+
|
| 105 |
+
- id: llamacpp_iq4_xs_short_context
|
| 106 |
+
status: middle_footprint_validated
|
| 107 |
+
backend: llama.cpp
|
| 108 |
+
tensor_parallel_size: 1
|
| 109 |
+
artifact: ornith-1.0-35b-IQ4_XS.gguf
|
| 110 |
+
quant: IQ4_XS
|
| 111 |
+
command:
|
| 112 |
+
script: scripts/serve_llamacpp_gpu0.sh
|
| 113 |
+
env:
|
| 114 |
+
QUANT: IQ4_XS
|
| 115 |
+
PORT: "8002"
|
| 116 |
+
CTX_SIZE: "8192"
|
| 117 |
+
PARALLEL: "16"
|
| 118 |
+
BATCH_SIZE: "4096"
|
| 119 |
+
UBATCH_SIZE: "512"
|
| 120 |
+
REASONING: "off"
|
| 121 |
+
measured:
|
| 122 |
+
gguf_gib: 17.64
|
| 123 |
+
loaded_vram_gib: 19.34
|
| 124 |
+
c1_output_tps: 234.1
|
| 125 |
+
c16_output_tps: 476.0
|
| 126 |
+
mean_kld_nats_vs_bf16_top64: 0.1426
|
| 127 |
+
behavior_gate: pass
|
| 128 |
+
evidence:
|
| 129 |
+
benchmark: benchmarks/llamacpp-quant-benchmarks.md
|
| 130 |
+
kld: benchmarks/kld-quant-vs-bf16-top64.md
|
| 131 |
+
behavior: probes/behavior-llamacpp-iq4-xs-parallel16.json
|
| 132 |
+
|
| 133 |
+
- id: llamacpp_iq4_xs_mtp_graft_adaptive
|
| 134 |
+
status: experimental_adaptive_mtp
|
| 135 |
+
backend: llama.cpp
|
| 136 |
+
tensor_parallel_size: 1
|
| 137 |
+
artifact: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf
|
| 138 |
+
quant: IQ4_XS_with_Q6_MTP_head
|
| 139 |
+
command:
|
| 140 |
+
script: scripts/serve_llamacpp_gpu0.sh
|
| 141 |
+
env:
|
| 142 |
+
MODEL_PATH: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf
|
| 143 |
+
ALIAS: Ornith-1.0-35B-GGUF-IQ4_XS-MTP
|
| 144 |
+
PORT: "8002"
|
| 145 |
+
CTX_SIZE: "8192"
|
| 146 |
+
PARALLEL: "16"
|
| 147 |
+
BATCH_SIZE: "4096"
|
| 148 |
+
UBATCH_SIZE: "512"
|
| 149 |
+
REASONING: "off"
|
| 150 |
+
SPEC_TYPE: draft-mtp
|
| 151 |
+
SPEC_DRAFT_N_MAX: "2"
|
| 152 |
+
SPEC_DRAFT_N_MIN: "0"
|
| 153 |
+
SPEC_DRAFT_BACKEND_SAMPLING: "1"
|
| 154 |
+
LLAMA_SPEC_MAX_DRAFTING_SLOTS: "1"
|
| 155 |
+
LLAMA_MTP_FAST_BACKEND_SAMPLE: "1"
|
| 156 |
+
LLAMA_MTP_DRAFT_TOP_K: "1"
|
| 157 |
+
LLAMA_MTP_DRAFT_TOP_P: "1"
|
| 158 |
+
LLAMA_MTP_DRAFT_TEMP: "1"
|
| 159 |
+
measured:
|
| 160 |
+
c1_ar_tps: 221.80
|
| 161 |
+
c1_mtp_adaptive_tps: 319.53
|
| 162 |
+
c1_acceptance_by_position:
|
| 163 |
+
- 0.953
|
| 164 |
+
- 0.865
|
| 165 |
+
c16_ar_tps: 568.57
|
| 166 |
+
c16_adaptive_tps: 564.48
|
| 167 |
+
c16_threshold1_tps: 592.45
|
| 168 |
+
evidence:
|
| 169 |
+
benchmark: benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md
|
| 170 |
+
patch: patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch
|
| 171 |
+
caveats:
|
| 172 |
+
- Always-on MTP is not recommended at saturated c16 because it was slower than target-only decoding.
|
| 173 |
+
- Adaptive throttling uses MTP for low-concurrency requests and disables it under saturated batches.
|
probes/release-readiness-report.json
CHANGED
|
@@ -180,6 +180,52 @@
|
|
| 180 |
"recommendation": "Keep known-bad profiles labeled and do not promote them as release candidates.",
|
| 181 |
"status": "warn"
|
| 182 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 183 |
{
|
| 184 |
"detail": "stopped; no GPU training is running; no LoRA adapter released",
|
| 185 |
"evidence": [
|
|
@@ -280,22 +326,23 @@
|
|
| 280 |
"status": "pass"
|
| 281 |
}
|
| 282 |
],
|
| 283 |
-
"generated_at": "2026-06-28T00:
|
| 284 |
"inputs": {
|
| 285 |
"behavior_matrix": "hf_upload/probes/behavior-regression-matrix.json",
|
| 286 |
"hf_verification": "hf_upload/probes/hf-release-verification.json",
|
| 287 |
"kld_report": "hf_upload/benchmarks/kld-quant-vs-bf16-top64.md",
|
| 288 |
"manifest": "hf_upload/ARTIFACT_MANIFEST.json",
|
| 289 |
"mtp_profile": "hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
|
| 290 |
-
"quant_benchmarks": "hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
|
|
|
|
| 291 |
},
|
| 292 |
"summary": {
|
| 293 |
-
"checks":
|
| 294 |
"failed_checks": 0,
|
| 295 |
"full_project_status": "incomplete",
|
| 296 |
"serving_release_status": "pass",
|
| 297 |
"status_counts": {
|
| 298 |
-
"pass":
|
| 299 |
"warn": 5
|
| 300 |
},
|
| 301 |
"warning_checks": 5
|
|
|
|
| 180 |
"recommendation": "Keep known-bad profiles labeled and do not promote them as release candidates.",
|
| 181 |
"status": "warn"
|
| 182 |
},
|
| 183 |
+
{
|
| 184 |
+
"detail": "serving profile validation report exists",
|
| 185 |
+
"evidence": [
|
| 186 |
+
"hf_upload/probes/serving-profile-validation.json"
|
| 187 |
+
],
|
| 188 |
+
"metrics": {},
|
| 189 |
+
"name": "serving_profiles:validation_exists",
|
| 190 |
+
"recommendation": null,
|
| 191 |
+
"status": "pass"
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"detail": "serving profile validation status is 'pass'",
|
| 195 |
+
"evidence": [
|
| 196 |
+
"hf_upload/probes/serving-profile-validation.json"
|
| 197 |
+
],
|
| 198 |
+
"metrics": {
|
| 199 |
+
"checks": 43,
|
| 200 |
+
"failed_checks": 0,
|
| 201 |
+
"status": "pass",
|
| 202 |
+
"status_counts": {
|
| 203 |
+
"pass": 43
|
| 204 |
+
},
|
| 205 |
+
"warnings": 0
|
| 206 |
+
},
|
| 207 |
+
"name": "serving_profiles:validation_status",
|
| 208 |
+
"recommendation": null,
|
| 209 |
+
"status": "pass"
|
| 210 |
+
},
|
| 211 |
+
{
|
| 212 |
+
"detail": "5 serving profiles are validated",
|
| 213 |
+
"evidence": [
|
| 214 |
+
"hf_upload/probes/serving-profile-validation.json"
|
| 215 |
+
],
|
| 216 |
+
"metrics": {
|
| 217 |
+
"profiles": [
|
| 218 |
+
"llamacpp_q4_k_m_short_context",
|
| 219 |
+
"llamacpp_q4_k_m_coding_context",
|
| 220 |
+
"llamacpp_q3_k_m_short_context",
|
| 221 |
+
"llamacpp_iq4_xs_short_context",
|
| 222 |
+
"llamacpp_iq4_xs_mtp_graft_adaptive"
|
| 223 |
+
]
|
| 224 |
+
},
|
| 225 |
+
"name": "serving_profiles:profile_count",
|
| 226 |
+
"recommendation": null,
|
| 227 |
+
"status": "pass"
|
| 228 |
+
},
|
| 229 |
{
|
| 230 |
"detail": "stopped; no GPU training is running; no LoRA adapter released",
|
| 231 |
"evidence": [
|
|
|
|
| 326 |
"status": "pass"
|
| 327 |
}
|
| 328 |
],
|
| 329 |
+
"generated_at": "2026-06-28T00:58:25.555064+00:00",
|
| 330 |
"inputs": {
|
| 331 |
"behavior_matrix": "hf_upload/probes/behavior-regression-matrix.json",
|
| 332 |
"hf_verification": "hf_upload/probes/hf-release-verification.json",
|
| 333 |
"kld_report": "hf_upload/benchmarks/kld-quant-vs-bf16-top64.md",
|
| 334 |
"manifest": "hf_upload/ARTIFACT_MANIFEST.json",
|
| 335 |
"mtp_profile": "hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
|
| 336 |
+
"quant_benchmarks": "hf_upload/benchmarks/llamacpp-quant-benchmarks.md",
|
| 337 |
+
"serving_profile_validation": "hf_upload/probes/serving-profile-validation.json"
|
| 338 |
},
|
| 339 |
"summary": {
|
| 340 |
+
"checks": 25,
|
| 341 |
"failed_checks": 0,
|
| 342 |
"full_project_status": "incomplete",
|
| 343 |
"serving_release_status": "pass",
|
| 344 |
"status_counts": {
|
| 345 |
+
"pass": 20,
|
| 346 |
"warn": 5
|
| 347 |
},
|
| 348 |
"warning_checks": 5
|
probes/release-readiness-report.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
| 1 |
# Release Readiness Report
|
| 2 |
|
| 3 |
-
Generated: 2026-06-28T00:
|
| 4 |
|
| 5 |
## Summary
|
| 6 |
|
| 7 |
- Serving release status: `pass`
|
| 8 |
- Full project status: `incomplete`
|
| 9 |
-
- Checks:
|
| 10 |
- Failures: 0
|
| 11 |
- Warnings: 5
|
| 12 |
|
|
@@ -27,6 +27,9 @@ Generated: 2026-06-28T00:51:35.069342+00:00
|
|
| 27 |
| `behavior_matrix:exists` | `pass` | behavior regression matrix exists |
|
| 28 |
| `behavior_matrix:passing_artifacts` | `pass` | 5 artifacts pass the behavior matrix |
|
| 29 |
| `behavior_matrix:known_bad_artifacts_disclosed` | `warn` | 2 failing artifacts are present in the matrix for regression visibility |
|
|
|
|
|
|
|
|
|
|
| 30 |
| `sft:release_adapter_state` | `warn` | stopped; no GPU training is running; no LoRA adapter released |
|
| 31 |
| `docs:README.md` | `pass` | required evidence doc README.md exists |
|
| 32 |
| `docs:RELEASE_AUDIT.md` | `pass` | required evidence doc RELEASE_AUDIT.md exists |
|
|
|
|
| 1 |
# Release Readiness Report
|
| 2 |
|
| 3 |
+
Generated: 2026-06-28T00:58:25.555064+00:00
|
| 4 |
|
| 5 |
## Summary
|
| 6 |
|
| 7 |
- Serving release status: `pass`
|
| 8 |
- Full project status: `incomplete`
|
| 9 |
+
- Checks: 25
|
| 10 |
- Failures: 0
|
| 11 |
- Warnings: 5
|
| 12 |
|
|
|
|
| 27 |
| `behavior_matrix:exists` | `pass` | behavior regression matrix exists |
|
| 28 |
| `behavior_matrix:passing_artifacts` | `pass` | 5 artifacts pass the behavior matrix |
|
| 29 |
| `behavior_matrix:known_bad_artifacts_disclosed` | `warn` | 2 failing artifacts are present in the matrix for regression visibility |
|
| 30 |
+
| `serving_profiles:validation_exists` | `pass` | serving profile validation report exists |
|
| 31 |
+
| `serving_profiles:validation_status` | `pass` | serving profile validation status is 'pass' |
|
| 32 |
+
| `serving_profiles:profile_count` | `pass` | 5 serving profiles are validated |
|
| 33 |
| `sft:release_adapter_state` | `warn` | stopped; no GPU training is running; no LoRA adapter released |
|
| 34 |
| `docs:README.md` | `pass` | required evidence doc README.md exists |
|
| 35 |
| `docs:RELEASE_AUDIT.md` | `pass` | required evidence doc RELEASE_AUDIT.md exists |
|
probes/serving-profile-validation.json
ADDED
|
@@ -0,0 +1,566 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"checks": [
|
| 3 |
+
{
|
| 4 |
+
"detail": "catalog exists: configs/serving_profiles.yaml",
|
| 5 |
+
"name": "catalog:exists",
|
| 6 |
+
"status": "pass"
|
| 7 |
+
},
|
| 8 |
+
{
|
| 9 |
+
"detail": "serving policy is single-GPU tp=1",
|
| 10 |
+
"metrics": {
|
| 11 |
+
"backend": "llama.cpp",
|
| 12 |
+
"forbidden": [
|
| 13 |
+
"tensor_parallel_size_gt_1",
|
| 14 |
+
"multi_gpu_serving"
|
| 15 |
+
],
|
| 16 |
+
"gpu_usage_note": "Use one independent model copy per GPU. Do not split one serving replica across GPUs.",
|
| 17 |
+
"reasoning": "off",
|
| 18 |
+
"serving_parallelism": "tp1_only",
|
| 19 |
+
"tensor_parallel_size": 1
|
| 20 |
+
},
|
| 21 |
+
"name": "policy:tp1_only",
|
| 22 |
+
"status": "pass"
|
| 23 |
+
},
|
| 24 |
+
{
|
| 25 |
+
"detail": "multi-GPU serving and tensor_parallel_size>1 are explicitly forbidden",
|
| 26 |
+
"metrics": {
|
| 27 |
+
"forbidden": [
|
| 28 |
+
"multi_gpu_serving",
|
| 29 |
+
"tensor_parallel_size_gt_1"
|
| 30 |
+
]
|
| 31 |
+
},
|
| 32 |
+
"name": "policy:multi_gpu_forbidden",
|
| 33 |
+
"status": "pass"
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"detail": "default serving policy disables reasoning final-answer leakage",
|
| 37 |
+
"metrics": {
|
| 38 |
+
"reasoning": "off"
|
| 39 |
+
},
|
| 40 |
+
"name": "policy:reasoning_off",
|
| 41 |
+
"status": "pass"
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"detail": "5 serving profiles are listed",
|
| 45 |
+
"metrics": {
|
| 46 |
+
"profiles": [
|
| 47 |
+
"llamacpp_q4_k_m_short_context",
|
| 48 |
+
"llamacpp_q4_k_m_coding_context",
|
| 49 |
+
"llamacpp_q3_k_m_short_context",
|
| 50 |
+
"llamacpp_iq4_xs_short_context",
|
| 51 |
+
"llamacpp_iq4_xs_mtp_graft_adaptive"
|
| 52 |
+
]
|
| 53 |
+
},
|
| 54 |
+
"name": "profiles:count",
|
| 55 |
+
"status": "pass"
|
| 56 |
+
},
|
| 57 |
+
{
|
| 58 |
+
"detail": "default_profile points to a listed profile",
|
| 59 |
+
"metrics": {
|
| 60 |
+
"value": "llamacpp_q4_k_m_coding_context"
|
| 61 |
+
},
|
| 62 |
+
"name": "profiles:default_profile",
|
| 63 |
+
"status": "pass"
|
| 64 |
+
},
|
| 65 |
+
{
|
| 66 |
+
"detail": "lowest_memory_profile points to a listed profile",
|
| 67 |
+
"metrics": {
|
| 68 |
+
"value": "llamacpp_q3_k_m_short_context"
|
| 69 |
+
},
|
| 70 |
+
"name": "profiles:lowest_memory_profile",
|
| 71 |
+
"status": "pass"
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"detail": "middle_footprint_profile points to a listed profile",
|
| 75 |
+
"metrics": {
|
| 76 |
+
"value": "llamacpp_iq4_xs_short_context"
|
| 77 |
+
},
|
| 78 |
+
"name": "profiles:middle_footprint_profile",
|
| 79 |
+
"status": "pass"
|
| 80 |
+
},
|
| 81 |
+
{
|
| 82 |
+
"detail": "adaptive_mtp_profile points to a listed profile",
|
| 83 |
+
"metrics": {
|
| 84 |
+
"value": "llamacpp_iq4_xs_mtp_graft_adaptive"
|
| 85 |
+
},
|
| 86 |
+
"name": "profiles:adaptive_mtp_profile",
|
| 87 |
+
"status": "pass"
|
| 88 |
+
},
|
| 89 |
+
{
|
| 90 |
+
"detail": "profile uses tensor_parallel_size=1",
|
| 91 |
+
"metrics": {
|
| 92 |
+
"tensor_parallel_size": 1
|
| 93 |
+
},
|
| 94 |
+
"name": "profile:llamacpp_q4_k_m_short_context:tp1",
|
| 95 |
+
"status": "pass"
|
| 96 |
+
},
|
| 97 |
+
{
|
| 98 |
+
"detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
|
| 99 |
+
"evidence": [
|
| 100 |
+
"hf_upload/scripts/serve_llamacpp_gpu0.sh"
|
| 101 |
+
],
|
| 102 |
+
"name": "profile:llamacpp_q4_k_m_short_context:script",
|
| 103 |
+
"status": "pass"
|
| 104 |
+
},
|
| 105 |
+
{
|
| 106 |
+
"detail": "profile sets REASONING=off",
|
| 107 |
+
"metrics": {
|
| 108 |
+
"REASONING": "off"
|
| 109 |
+
},
|
| 110 |
+
"name": "profile:llamacpp_q4_k_m_short_context:reasoning_off",
|
| 111 |
+
"status": "pass"
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"detail": "artifact is published: ornith-1.0-35b-Q4_K_M.gguf",
|
| 115 |
+
"metrics": {
|
| 116 |
+
"artifact": "ornith-1.0-35b-Q4_K_M.gguf"
|
| 117 |
+
},
|
| 118 |
+
"name": "profile:llamacpp_q4_k_m_short_context:artifact_published",
|
| 119 |
+
"status": "pass"
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
"detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
|
| 123 |
+
"evidence": [
|
| 124 |
+
"hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
|
| 125 |
+
],
|
| 126 |
+
"name": "profile:llamacpp_q4_k_m_short_context:evidence:benchmark",
|
| 127 |
+
"status": "pass"
|
| 128 |
+
},
|
| 129 |
+
{
|
| 130 |
+
"detail": "evidence exists: probes/behavior-llamacpp-q4-script-default.json",
|
| 131 |
+
"evidence": [
|
| 132 |
+
"hf_upload/probes/behavior-llamacpp-q4-script-default.json"
|
| 133 |
+
],
|
| 134 |
+
"name": "profile:llamacpp_q4_k_m_short_context:evidence:behavior",
|
| 135 |
+
"status": "pass"
|
| 136 |
+
},
|
| 137 |
+
{
|
| 138 |
+
"detail": "profile uses tensor_parallel_size=1",
|
| 139 |
+
"metrics": {
|
| 140 |
+
"tensor_parallel_size": 1
|
| 141 |
+
},
|
| 142 |
+
"name": "profile:llamacpp_q4_k_m_coding_context:tp1",
|
| 143 |
+
"status": "pass"
|
| 144 |
+
},
|
| 145 |
+
{
|
| 146 |
+
"detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
|
| 147 |
+
"evidence": [
|
| 148 |
+
"hf_upload/scripts/serve_llamacpp_gpu0.sh"
|
| 149 |
+
],
|
| 150 |
+
"name": "profile:llamacpp_q4_k_m_coding_context:script",
|
| 151 |
+
"status": "pass"
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"detail": "profile sets REASONING=off",
|
| 155 |
+
"metrics": {
|
| 156 |
+
"REASONING": "off"
|
| 157 |
+
},
|
| 158 |
+
"name": "profile:llamacpp_q4_k_m_coding_context:reasoning_off",
|
| 159 |
+
"status": "pass"
|
| 160 |
+
},
|
| 161 |
+
{
|
| 162 |
+
"detail": "artifact is published: ornith-1.0-35b-Q4_K_M.gguf",
|
| 163 |
+
"metrics": {
|
| 164 |
+
"artifact": "ornith-1.0-35b-Q4_K_M.gguf"
|
| 165 |
+
},
|
| 166 |
+
"name": "profile:llamacpp_q4_k_m_coding_context:artifact_published",
|
| 167 |
+
"status": "pass"
|
| 168 |
+
},
|
| 169 |
+
{
|
| 170 |
+
"detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
|
| 171 |
+
"evidence": [
|
| 172 |
+
"hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
|
| 173 |
+
],
|
| 174 |
+
"name": "profile:llamacpp_q4_k_m_coding_context:evidence:benchmark",
|
| 175 |
+
"status": "pass"
|
| 176 |
+
},
|
| 177 |
+
{
|
| 178 |
+
"detail": "evidence exists: probes/behavior-llamacpp-q4-script-default.json",
|
| 179 |
+
"evidence": [
|
| 180 |
+
"hf_upload/probes/behavior-llamacpp-q4-script-default.json"
|
| 181 |
+
],
|
| 182 |
+
"name": "profile:llamacpp_q4_k_m_coding_context:evidence:behavior",
|
| 183 |
+
"status": "pass"
|
| 184 |
+
},
|
| 185 |
+
{
|
| 186 |
+
"detail": "profile uses tensor_parallel_size=1",
|
| 187 |
+
"metrics": {
|
| 188 |
+
"tensor_parallel_size": 1
|
| 189 |
+
},
|
| 190 |
+
"name": "profile:llamacpp_q3_k_m_short_context:tp1",
|
| 191 |
+
"status": "pass"
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
|
| 195 |
+
"evidence": [
|
| 196 |
+
"hf_upload/scripts/serve_llamacpp_gpu0.sh"
|
| 197 |
+
],
|
| 198 |
+
"name": "profile:llamacpp_q3_k_m_short_context:script",
|
| 199 |
+
"status": "pass"
|
| 200 |
+
},
|
| 201 |
+
{
|
| 202 |
+
"detail": "profile sets REASONING=off",
|
| 203 |
+
"metrics": {
|
| 204 |
+
"REASONING": "off"
|
| 205 |
+
},
|
| 206 |
+
"name": "profile:llamacpp_q3_k_m_short_context:reasoning_off",
|
| 207 |
+
"status": "pass"
|
| 208 |
+
},
|
| 209 |
+
{
|
| 210 |
+
"detail": "artifact is published: ornith-1.0-35b-Q3_K_M.gguf",
|
| 211 |
+
"metrics": {
|
| 212 |
+
"artifact": "ornith-1.0-35b-Q3_K_M.gguf"
|
| 213 |
+
},
|
| 214 |
+
"name": "profile:llamacpp_q3_k_m_short_context:artifact_published",
|
| 215 |
+
"status": "pass"
|
| 216 |
+
},
|
| 217 |
+
{
|
| 218 |
+
"detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
|
| 219 |
+
"evidence": [
|
| 220 |
+
"hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
|
| 221 |
+
],
|
| 222 |
+
"name": "profile:llamacpp_q3_k_m_short_context:evidence:benchmark",
|
| 223 |
+
"status": "pass"
|
| 224 |
+
},
|
| 225 |
+
{
|
| 226 |
+
"detail": "evidence exists: benchmarks/kld-quant-vs-bf16-top64.md",
|
| 227 |
+
"evidence": [
|
| 228 |
+
"hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"
|
| 229 |
+
],
|
| 230 |
+
"name": "profile:llamacpp_q3_k_m_short_context:evidence:kld",
|
| 231 |
+
"status": "pass"
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"detail": "evidence exists: probes/behavior-llamacpp-q3-k-m-parallel16.json",
|
| 235 |
+
"evidence": [
|
| 236 |
+
"hf_upload/probes/behavior-llamacpp-q3-k-m-parallel16.json"
|
| 237 |
+
],
|
| 238 |
+
"name": "profile:llamacpp_q3_k_m_short_context:evidence:behavior",
|
| 239 |
+
"status": "pass"
|
| 240 |
+
},
|
| 241 |
+
{
|
| 242 |
+
"detail": "profile uses tensor_parallel_size=1",
|
| 243 |
+
"metrics": {
|
| 244 |
+
"tensor_parallel_size": 1
|
| 245 |
+
},
|
| 246 |
+
"name": "profile:llamacpp_iq4_xs_short_context:tp1",
|
| 247 |
+
"status": "pass"
|
| 248 |
+
},
|
| 249 |
+
{
|
| 250 |
+
"detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
|
| 251 |
+
"evidence": [
|
| 252 |
+
"hf_upload/scripts/serve_llamacpp_gpu0.sh"
|
| 253 |
+
],
|
| 254 |
+
"name": "profile:llamacpp_iq4_xs_short_context:script",
|
| 255 |
+
"status": "pass"
|
| 256 |
+
},
|
| 257 |
+
{
|
| 258 |
+
"detail": "profile sets REASONING=off",
|
| 259 |
+
"metrics": {
|
| 260 |
+
"REASONING": "off"
|
| 261 |
+
},
|
| 262 |
+
"name": "profile:llamacpp_iq4_xs_short_context:reasoning_off",
|
| 263 |
+
"status": "pass"
|
| 264 |
+
},
|
| 265 |
+
{
|
| 266 |
+
"detail": "artifact is published: ornith-1.0-35b-IQ4_XS.gguf",
|
| 267 |
+
"metrics": {
|
| 268 |
+
"artifact": "ornith-1.0-35b-IQ4_XS.gguf"
|
| 269 |
+
},
|
| 270 |
+
"name": "profile:llamacpp_iq4_xs_short_context:artifact_published",
|
| 271 |
+
"status": "pass"
|
| 272 |
+
},
|
| 273 |
+
{
|
| 274 |
+
"detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
|
| 275 |
+
"evidence": [
|
| 276 |
+
"hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
|
| 277 |
+
],
|
| 278 |
+
"name": "profile:llamacpp_iq4_xs_short_context:evidence:benchmark",
|
| 279 |
+
"status": "pass"
|
| 280 |
+
},
|
| 281 |
+
{
|
| 282 |
+
"detail": "evidence exists: benchmarks/kld-quant-vs-bf16-top64.md",
|
| 283 |
+
"evidence": [
|
| 284 |
+
"hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"
|
| 285 |
+
],
|
| 286 |
+
"name": "profile:llamacpp_iq4_xs_short_context:evidence:kld",
|
| 287 |
+
"status": "pass"
|
| 288 |
+
},
|
| 289 |
+
{
|
| 290 |
+
"detail": "evidence exists: probes/behavior-llamacpp-iq4-xs-parallel16.json",
|
| 291 |
+
"evidence": [
|
| 292 |
+
"hf_upload/probes/behavior-llamacpp-iq4-xs-parallel16.json"
|
| 293 |
+
],
|
| 294 |
+
"name": "profile:llamacpp_iq4_xs_short_context:evidence:behavior",
|
| 295 |
+
"status": "pass"
|
| 296 |
+
},
|
| 297 |
+
{
|
| 298 |
+
"detail": "profile uses tensor_parallel_size=1",
|
| 299 |
+
"metrics": {
|
| 300 |
+
"tensor_parallel_size": 1
|
| 301 |
+
},
|
| 302 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:tp1",
|
| 303 |
+
"status": "pass"
|
| 304 |
+
},
|
| 305 |
+
{
|
| 306 |
+
"detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
|
| 307 |
+
"evidence": [
|
| 308 |
+
"hf_upload/scripts/serve_llamacpp_gpu0.sh"
|
| 309 |
+
],
|
| 310 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:script",
|
| 311 |
+
"status": "pass"
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"detail": "profile sets REASONING=off",
|
| 315 |
+
"metrics": {
|
| 316 |
+
"REASONING": "off"
|
| 317 |
+
},
|
| 318 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:reasoning_off",
|
| 319 |
+
"status": "pass"
|
| 320 |
+
},
|
| 321 |
+
{
|
| 322 |
+
"detail": "artifact is published: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf",
|
| 323 |
+
"metrics": {
|
| 324 |
+
"artifact": "ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf"
|
| 325 |
+
},
|
| 326 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:artifact_published",
|
| 327 |
+
"status": "pass"
|
| 328 |
+
},
|
| 329 |
+
{
|
| 330 |
+
"detail": "evidence exists: benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
|
| 331 |
+
"evidence": [
|
| 332 |
+
"hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md"
|
| 333 |
+
],
|
| 334 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:benchmark",
|
| 335 |
+
"status": "pass"
|
| 336 |
+
},
|
| 337 |
+
{
|
| 338 |
+
"detail": "evidence exists: patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch",
|
| 339 |
+
"evidence": [
|
| 340 |
+
"hf_upload/patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch"
|
| 341 |
+
],
|
| 342 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:patch",
|
| 343 |
+
"status": "pass"
|
| 344 |
+
},
|
| 345 |
+
{
|
| 346 |
+
"detail": "adaptive MTP profile uses draft-mtp with max drafting slots 1 and n_max 2",
|
| 347 |
+
"metrics": {
|
| 348 |
+
"LLAMA_SPEC_MAX_DRAFTING_SLOTS": "1",
|
| 349 |
+
"SPEC_DRAFT_N_MAX": "2",
|
| 350 |
+
"SPEC_TYPE": "draft-mtp"
|
| 351 |
+
},
|
| 352 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:adaptive_mtp_throttle",
|
| 353 |
+
"status": "pass"
|
| 354 |
+
},
|
| 355 |
+
{
|
| 356 |
+
"detail": "MTP saturated-c16 caveat is documented",
|
| 357 |
+
"metrics": {
|
| 358 |
+
"caveats": [
|
| 359 |
+
"Always-on MTP is not recommended at saturated c16 because it was slower than target-only decoding.",
|
| 360 |
+
"Adaptive throttling uses MTP for low-concurrency requests and disables it under saturated batches."
|
| 361 |
+
]
|
| 362 |
+
},
|
| 363 |
+
"name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:mtp_caveat",
|
| 364 |
+
"status": "pass"
|
| 365 |
+
}
|
| 366 |
+
],
|
| 367 |
+
"generated_at": "2026-06-28T00:56:49.528851+00:00",
|
| 368 |
+
"inputs": {
|
| 369 |
+
"catalog": "configs/serving_profiles.yaml",
|
| 370 |
+
"hf_root": "hf_upload",
|
| 371 |
+
"manifest": "hf_upload/ARTIFACT_MANIFEST.json"
|
| 372 |
+
},
|
| 373 |
+
"profiles": [
|
| 374 |
+
{
|
| 375 |
+
"artifact": "ornith-1.0-35b-Q4_K_M.gguf",
|
| 376 |
+
"backend": "llama.cpp",
|
| 377 |
+
"command": {
|
| 378 |
+
"env": {
|
| 379 |
+
"BATCH_SIZE": "4096",
|
| 380 |
+
"CTX_SIZE": "8192",
|
| 381 |
+
"PARALLEL": "16",
|
| 382 |
+
"PORT": "8002",
|
| 383 |
+
"QUANT": "Q4_K_M",
|
| 384 |
+
"REASONING": "off",
|
| 385 |
+
"UBATCH_SIZE": "512"
|
| 386 |
+
},
|
| 387 |
+
"script": "scripts/serve_llamacpp_gpu0.sh"
|
| 388 |
+
},
|
| 389 |
+
"evidence": {
|
| 390 |
+
"behavior": "probes/behavior-llamacpp-q4-script-default.json",
|
| 391 |
+
"benchmark": "benchmarks/llamacpp-quant-benchmarks.md"
|
| 392 |
+
},
|
| 393 |
+
"id": "llamacpp_q4_k_m_short_context",
|
| 394 |
+
"measured": {
|
| 395 |
+
"behavior_gate": "pass",
|
| 396 |
+
"c16_output_tps": 655.6,
|
| 397 |
+
"c16_p95_ttft_ms": 650.0,
|
| 398 |
+
"c1_output_tps": 243.3,
|
| 399 |
+
"loaded_vram_gib": 21.31
|
| 400 |
+
},
|
| 401 |
+
"notes": [
|
| 402 |
+
"Short-context benchmark profile exposes about 512 tokens per slot because CTX_SIZE is split across PARALLEL slots."
|
| 403 |
+
],
|
| 404 |
+
"quant": "Q4_K_M",
|
| 405 |
+
"status": "recommended_speed_benchmark",
|
| 406 |
+
"tensor_parallel_size": 1
|
| 407 |
+
},
|
| 408 |
+
{
|
| 409 |
+
"artifact": "ornith-1.0-35b-Q4_K_M.gguf",
|
| 410 |
+
"backend": "llama.cpp",
|
| 411 |
+
"command": {
|
| 412 |
+
"env": {
|
| 413 |
+
"BATCH_SIZE": "4096",
|
| 414 |
+
"CTX_SIZE": "131072",
|
| 415 |
+
"PARALLEL": "16",
|
| 416 |
+
"PORT": "8002",
|
| 417 |
+
"QUANT": "Q4_K_M",
|
| 418 |
+
"REASONING": "off",
|
| 419 |
+
"UBATCH_SIZE": "512"
|
| 420 |
+
},
|
| 421 |
+
"script": "scripts/serve_llamacpp_gpu0.sh"
|
| 422 |
+
},
|
| 423 |
+
"evidence": {
|
| 424 |
+
"behavior": "probes/behavior-llamacpp-q4-script-default.json",
|
| 425 |
+
"benchmark": "benchmarks/llamacpp-quant-benchmarks.md"
|
| 426 |
+
},
|
| 427 |
+
"id": "llamacpp_q4_k_m_coding_context",
|
| 428 |
+
"measured": {
|
| 429 |
+
"behavior_gate": "pass",
|
| 430 |
+
"c16_output_tps_short_context": 655.6,
|
| 431 |
+
"loaded_vram_gib_short_context": 21.31
|
| 432 |
+
},
|
| 433 |
+
"notes": [
|
| 434 |
+
"Practical coding-serving profile with 16 slots and about 8k context per slot.",
|
| 435 |
+
"Throughput numbers come from the matched short-context sweep."
|
| 436 |
+
],
|
| 437 |
+
"quant": "Q4_K_M",
|
| 438 |
+
"status": "recommended_default",
|
| 439 |
+
"tensor_parallel_size": 1
|
| 440 |
+
},
|
| 441 |
+
{
|
| 442 |
+
"artifact": "ornith-1.0-35b-Q3_K_M.gguf",
|
| 443 |
+
"backend": "llama.cpp",
|
| 444 |
+
"command": {
|
| 445 |
+
"env": {
|
| 446 |
+
"BATCH_SIZE": "4096",
|
| 447 |
+
"CTX_SIZE": "8192",
|
| 448 |
+
"PARALLEL": "16",
|
| 449 |
+
"PORT": "8002",
|
| 450 |
+
"QUANT": "Q3_K_M",
|
| 451 |
+
"REASONING": "off",
|
| 452 |
+
"UBATCH_SIZE": "512"
|
| 453 |
+
},
|
| 454 |
+
"script": "scripts/serve_llamacpp_gpu0.sh"
|
| 455 |
+
},
|
| 456 |
+
"evidence": {
|
| 457 |
+
"behavior": "probes/behavior-llamacpp-q3-k-m-parallel16.json",
|
| 458 |
+
"benchmark": "benchmarks/llamacpp-quant-benchmarks.md",
|
| 459 |
+
"kld": "benchmarks/kld-quant-vs-bf16-top64.md"
|
| 460 |
+
},
|
| 461 |
+
"id": "llamacpp_q3_k_m_short_context",
|
| 462 |
+
"measured": {
|
| 463 |
+
"behavior_gate": "pass",
|
| 464 |
+
"c16_output_tps": 493.0,
|
| 465 |
+
"c1_output_tps": 240.5,
|
| 466 |
+
"gguf_gib": 15.61,
|
| 467 |
+
"loaded_vram_gib": 17.27,
|
| 468 |
+
"mean_kld_nats_vs_bf16_top64": 0.362
|
| 469 |
+
},
|
| 470 |
+
"quant": "Q3_K_M",
|
| 471 |
+
"status": "lowest_memory_validated",
|
| 472 |
+
"tensor_parallel_size": 1
|
| 473 |
+
},
|
| 474 |
+
{
|
| 475 |
+
"artifact": "ornith-1.0-35b-IQ4_XS.gguf",
|
| 476 |
+
"backend": "llama.cpp",
|
| 477 |
+
"command": {
|
| 478 |
+
"env": {
|
| 479 |
+
"BATCH_SIZE": "4096",
|
| 480 |
+
"CTX_SIZE": "8192",
|
| 481 |
+
"PARALLEL": "16",
|
| 482 |
+
"PORT": "8002",
|
| 483 |
+
"QUANT": "IQ4_XS",
|
| 484 |
+
"REASONING": "off",
|
| 485 |
+
"UBATCH_SIZE": "512"
|
| 486 |
+
},
|
| 487 |
+
"script": "scripts/serve_llamacpp_gpu0.sh"
|
| 488 |
+
},
|
| 489 |
+
"evidence": {
|
| 490 |
+
"behavior": "probes/behavior-llamacpp-iq4-xs-parallel16.json",
|
| 491 |
+
"benchmark": "benchmarks/llamacpp-quant-benchmarks.md",
|
| 492 |
+
"kld": "benchmarks/kld-quant-vs-bf16-top64.md"
|
| 493 |
+
},
|
| 494 |
+
"id": "llamacpp_iq4_xs_short_context",
|
| 495 |
+
"measured": {
|
| 496 |
+
"behavior_gate": "pass",
|
| 497 |
+
"c16_output_tps": 476.0,
|
| 498 |
+
"c1_output_tps": 234.1,
|
| 499 |
+
"gguf_gib": 17.64,
|
| 500 |
+
"loaded_vram_gib": 19.34,
|
| 501 |
+
"mean_kld_nats_vs_bf16_top64": 0.1426
|
| 502 |
+
},
|
| 503 |
+
"quant": "IQ4_XS",
|
| 504 |
+
"status": "middle_footprint_validated",
|
| 505 |
+
"tensor_parallel_size": 1
|
| 506 |
+
},
|
| 507 |
+
{
|
| 508 |
+
"artifact": "ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf",
|
| 509 |
+
"backend": "llama.cpp",
|
| 510 |
+
"caveats": [
|
| 511 |
+
"Always-on MTP is not recommended at saturated c16 because it was slower than target-only decoding.",
|
| 512 |
+
"Adaptive throttling uses MTP for low-concurrency requests and disables it under saturated batches."
|
| 513 |
+
],
|
| 514 |
+
"command": {
|
| 515 |
+
"env": {
|
| 516 |
+
"ALIAS": "Ornith-1.0-35B-GGUF-IQ4_XS-MTP",
|
| 517 |
+
"BATCH_SIZE": "4096",
|
| 518 |
+
"CTX_SIZE": "8192",
|
| 519 |
+
"LLAMA_MTP_DRAFT_TEMP": "1",
|
| 520 |
+
"LLAMA_MTP_DRAFT_TOP_K": "1",
|
| 521 |
+
"LLAMA_MTP_DRAFT_TOP_P": "1",
|
| 522 |
+
"LLAMA_MTP_FAST_BACKEND_SAMPLE": "1",
|
| 523 |
+
"LLAMA_SPEC_MAX_DRAFTING_SLOTS": "1",
|
| 524 |
+
"MODEL_PATH": "ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf",
|
| 525 |
+
"PARALLEL": "16",
|
| 526 |
+
"PORT": "8002",
|
| 527 |
+
"REASONING": "off",
|
| 528 |
+
"SPEC_DRAFT_BACKEND_SAMPLING": "1",
|
| 529 |
+
"SPEC_DRAFT_N_MAX": "2",
|
| 530 |
+
"SPEC_DRAFT_N_MIN": "0",
|
| 531 |
+
"SPEC_TYPE": "draft-mtp",
|
| 532 |
+
"UBATCH_SIZE": "512"
|
| 533 |
+
},
|
| 534 |
+
"script": "scripts/serve_llamacpp_gpu0.sh"
|
| 535 |
+
},
|
| 536 |
+
"evidence": {
|
| 537 |
+
"benchmark": "benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
|
| 538 |
+
"patch": "patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch"
|
| 539 |
+
},
|
| 540 |
+
"id": "llamacpp_iq4_xs_mtp_graft_adaptive",
|
| 541 |
+
"measured": {
|
| 542 |
+
"c16_adaptive_tps": 564.48,
|
| 543 |
+
"c16_ar_tps": 568.57,
|
| 544 |
+
"c16_threshold1_tps": 592.45,
|
| 545 |
+
"c1_acceptance_by_position": [
|
| 546 |
+
0.953,
|
| 547 |
+
0.865
|
| 548 |
+
],
|
| 549 |
+
"c1_ar_tps": 221.8,
|
| 550 |
+
"c1_mtp_adaptive_tps": 319.53
|
| 551 |
+
},
|
| 552 |
+
"quant": "IQ4_XS_with_Q6_MTP_head",
|
| 553 |
+
"status": "experimental_adaptive_mtp",
|
| 554 |
+
"tensor_parallel_size": 1
|
| 555 |
+
}
|
| 556 |
+
],
|
| 557 |
+
"summary": {
|
| 558 |
+
"checks": 43,
|
| 559 |
+
"failed_checks": 0,
|
| 560 |
+
"status": "pass",
|
| 561 |
+
"status_counts": {
|
| 562 |
+
"pass": 43
|
| 563 |
+
},
|
| 564 |
+
"warnings": 0
|
| 565 |
+
}
|
| 566 |
+
}
|
probes/serving-profile-validation.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Serving Profile Validation
|
| 2 |
+
|
| 3 |
+
Generated: 2026-06-28T00:56:49.528851+00:00
|
| 4 |
+
|
| 5 |
+
## Summary
|
| 6 |
+
|
| 7 |
+
- Status: `pass`
|
| 8 |
+
- Checks: 43
|
| 9 |
+
- Failures: 0
|
| 10 |
+
- Warnings: 0
|
| 11 |
+
|
| 12 |
+
## Profiles
|
| 13 |
+
|
| 14 |
+
| Profile | Status | Backend | Artifact |
|
| 15 |
+
|---|---|---|---|
|
| 16 |
+
| `llamacpp_q4_k_m_short_context` | `recommended_speed_benchmark` | llama.cpp | `ornith-1.0-35b-Q4_K_M.gguf` |
|
| 17 |
+
| `llamacpp_q4_k_m_coding_context` | `recommended_default` | llama.cpp | `ornith-1.0-35b-Q4_K_M.gguf` |
|
| 18 |
+
| `llamacpp_q3_k_m_short_context` | `lowest_memory_validated` | llama.cpp | `ornith-1.0-35b-Q3_K_M.gguf` |
|
| 19 |
+
| `llamacpp_iq4_xs_short_context` | `middle_footprint_validated` | llama.cpp | `ornith-1.0-35b-IQ4_XS.gguf` |
|
| 20 |
+
| `llamacpp_iq4_xs_mtp_graft_adaptive` | `experimental_adaptive_mtp` | llama.cpp | `ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf` |
|
| 21 |
+
|
| 22 |
+
## Checks
|
| 23 |
+
|
| 24 |
+
| Check | Status | Detail |
|
| 25 |
+
|---|---:|---|
|
| 26 |
+
| `catalog:exists` | `pass` | catalog exists: configs/serving_profiles.yaml |
|
| 27 |
+
| `policy:tp1_only` | `pass` | serving policy is single-GPU tp=1 |
|
| 28 |
+
| `policy:multi_gpu_forbidden` | `pass` | multi-GPU serving and tensor_parallel_size>1 are explicitly forbidden |
|
| 29 |
+
| `policy:reasoning_off` | `pass` | default serving policy disables reasoning final-answer leakage |
|
| 30 |
+
| `profiles:count` | `pass` | 5 serving profiles are listed |
|
| 31 |
+
| `profiles:default_profile` | `pass` | default_profile points to a listed profile |
|
| 32 |
+
| `profiles:lowest_memory_profile` | `pass` | lowest_memory_profile points to a listed profile |
|
| 33 |
+
| `profiles:middle_footprint_profile` | `pass` | middle_footprint_profile points to a listed profile |
|
| 34 |
+
| `profiles:adaptive_mtp_profile` | `pass` | adaptive_mtp_profile points to a listed profile |
|
| 35 |
+
| `profile:llamacpp_q4_k_m_short_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
|
| 36 |
+
| `profile:llamacpp_q4_k_m_short_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
|
| 37 |
+
| `profile:llamacpp_q4_k_m_short_context:reasoning_off` | `pass` | profile sets REASONING=off |
|
| 38 |
+
| `profile:llamacpp_q4_k_m_short_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-Q4_K_M.gguf |
|
| 39 |
+
| `profile:llamacpp_q4_k_m_short_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
|
| 40 |
+
| `profile:llamacpp_q4_k_m_short_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-q4-script-default.json |
|
| 41 |
+
| `profile:llamacpp_q4_k_m_coding_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
|
| 42 |
+
| `profile:llamacpp_q4_k_m_coding_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
|
| 43 |
+
| `profile:llamacpp_q4_k_m_coding_context:reasoning_off` | `pass` | profile sets REASONING=off |
|
| 44 |
+
| `profile:llamacpp_q4_k_m_coding_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-Q4_K_M.gguf |
|
| 45 |
+
| `profile:llamacpp_q4_k_m_coding_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
|
| 46 |
+
| `profile:llamacpp_q4_k_m_coding_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-q4-script-default.json |
|
| 47 |
+
| `profile:llamacpp_q3_k_m_short_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
|
| 48 |
+
| `profile:llamacpp_q3_k_m_short_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
|
| 49 |
+
| `profile:llamacpp_q3_k_m_short_context:reasoning_off` | `pass` | profile sets REASONING=off |
|
| 50 |
+
| `profile:llamacpp_q3_k_m_short_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-Q3_K_M.gguf |
|
| 51 |
+
| `profile:llamacpp_q3_k_m_short_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
|
| 52 |
+
| `profile:llamacpp_q3_k_m_short_context:evidence:kld` | `pass` | evidence exists: benchmarks/kld-quant-vs-bf16-top64.md |
|
| 53 |
+
| `profile:llamacpp_q3_k_m_short_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-q3-k-m-parallel16.json |
|
| 54 |
+
| `profile:llamacpp_iq4_xs_short_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
|
| 55 |
+
| `profile:llamacpp_iq4_xs_short_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
|
| 56 |
+
| `profile:llamacpp_iq4_xs_short_context:reasoning_off` | `pass` | profile sets REASONING=off |
|
| 57 |
+
| `profile:llamacpp_iq4_xs_short_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-IQ4_XS.gguf |
|
| 58 |
+
| `profile:llamacpp_iq4_xs_short_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
|
| 59 |
+
| `profile:llamacpp_iq4_xs_short_context:evidence:kld` | `pass` | evidence exists: benchmarks/kld-quant-vs-bf16-top64.md |
|
| 60 |
+
| `profile:llamacpp_iq4_xs_short_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-iq4-xs-parallel16.json |
|
| 61 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:tp1` | `pass` | profile uses tensor_parallel_size=1 |
|
| 62 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
|
| 63 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:reasoning_off` | `pass` | profile sets REASONING=off |
|
| 64 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf |
|
| 65 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md |
|
| 66 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:patch` | `pass` | evidence exists: patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch |
|
| 67 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:adaptive_mtp_throttle` | `pass` | adaptive MTP profile uses draft-mtp with max drafting slots 1 and n_max 2 |
|
| 68 |
+
| `profile:llamacpp_iq4_xs_mtp_graft_adaptive:mtp_caveat` | `pass` | MTP saturated-c16 caveat is documented |
|
scripts/build_release_readiness_report.py
CHANGED
|
@@ -191,6 +191,33 @@ def check_behavior_matrix(path: Path, min_passing_artifacts: int) -> list[Check]
|
|
| 191 |
return checks
|
| 192 |
|
| 193 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
def check_sft_state(manifest_path: Path, allow_unreleased_sft: bool) -> list[Check]:
|
| 195 |
if not manifest_path.exists():
|
| 196 |
return [
|
|
@@ -253,6 +280,7 @@ def build_report(args: argparse.Namespace) -> dict[str, Any]:
|
|
| 253 |
checks.extend(check_hf_verifier(args.hf_verification))
|
| 254 |
checks.extend(check_manifest(args.manifest, args.min_gguf))
|
| 255 |
checks.extend(check_behavior_matrix(args.behavior_matrix, args.min_passing_artifacts))
|
|
|
|
| 256 |
checks.extend(check_sft_state(args.manifest, args.allow_unreleased_sft))
|
| 257 |
checks.extend(check_required_docs(args.required_doc or []))
|
| 258 |
|
|
@@ -297,6 +325,7 @@ def build_report(args: argparse.Namespace) -> dict[str, Any]:
|
|
| 297 |
"manifest": str(args.manifest),
|
| 298 |
"hf_verification": str(args.hf_verification),
|
| 299 |
"behavior_matrix": str(args.behavior_matrix),
|
|
|
|
| 300 |
"quant_benchmarks": str(args.quant_benchmarks),
|
| 301 |
"kld_report": str(args.kld_report),
|
| 302 |
"mtp_profile": str(args.mtp_profile),
|
|
@@ -372,6 +401,7 @@ def parse_args() -> argparse.Namespace:
|
|
| 372 |
parser.add_argument("--manifest", type=Path, default=Path("hf_upload/ARTIFACT_MANIFEST.json"))
|
| 373 |
parser.add_argument("--hf-verification", type=Path, default=Path("runs/hf-release-verification-behavior-matrix.json"))
|
| 374 |
parser.add_argument("--behavior-matrix", type=Path, default=Path("runs/behavior-regression-matrix.json"))
|
|
|
|
| 375 |
parser.add_argument("--quant-benchmarks", type=Path, default=Path("hf_upload/benchmarks/llamacpp-quant-benchmarks.md"))
|
| 376 |
parser.add_argument("--kld-report", type=Path, default=Path("hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"))
|
| 377 |
parser.add_argument("--mtp-profile", type=Path, default=Path("hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md"))
|
|
|
|
| 191 |
return checks
|
| 192 |
|
| 193 |
|
| 194 |
+
def check_serving_profile_validation(path: Path) -> list[Check]:
|
| 195 |
+
checks = [exists_check("serving_profiles:validation_exists", path, "serving profile validation report")]
|
| 196 |
+
if not path.exists():
|
| 197 |
+
return checks
|
| 198 |
+
report = load_json(path)
|
| 199 |
+
summary = report.get("summary", {})
|
| 200 |
+
checks.append(
|
| 201 |
+
Check(
|
| 202 |
+
name="serving_profiles:validation_status",
|
| 203 |
+
status=PASS if summary.get("status") == "pass" and summary.get("failed_checks") == 0 else FAIL,
|
| 204 |
+
detail=f"serving profile validation status is {summary.get('status')!r}",
|
| 205 |
+
evidence=[str(path)],
|
| 206 |
+
metrics=summary,
|
| 207 |
+
)
|
| 208 |
+
)
|
| 209 |
+
checks.append(
|
| 210 |
+
Check(
|
| 211 |
+
name="serving_profiles:profile_count",
|
| 212 |
+
status=PASS if len(report.get("profiles") or []) >= 5 else FAIL,
|
| 213 |
+
detail=f"{len(report.get('profiles') or [])} serving profiles are validated",
|
| 214 |
+
evidence=[str(path)],
|
| 215 |
+
metrics={"profiles": [profile.get("id") for profile in report.get("profiles") or []]},
|
| 216 |
+
)
|
| 217 |
+
)
|
| 218 |
+
return checks
|
| 219 |
+
|
| 220 |
+
|
| 221 |
def check_sft_state(manifest_path: Path, allow_unreleased_sft: bool) -> list[Check]:
|
| 222 |
if not manifest_path.exists():
|
| 223 |
return [
|
|
|
|
| 280 |
checks.extend(check_hf_verifier(args.hf_verification))
|
| 281 |
checks.extend(check_manifest(args.manifest, args.min_gguf))
|
| 282 |
checks.extend(check_behavior_matrix(args.behavior_matrix, args.min_passing_artifacts))
|
| 283 |
+
checks.extend(check_serving_profile_validation(args.serving_profile_validation))
|
| 284 |
checks.extend(check_sft_state(args.manifest, args.allow_unreleased_sft))
|
| 285 |
checks.extend(check_required_docs(args.required_doc or []))
|
| 286 |
|
|
|
|
| 325 |
"manifest": str(args.manifest),
|
| 326 |
"hf_verification": str(args.hf_verification),
|
| 327 |
"behavior_matrix": str(args.behavior_matrix),
|
| 328 |
+
"serving_profile_validation": str(args.serving_profile_validation),
|
| 329 |
"quant_benchmarks": str(args.quant_benchmarks),
|
| 330 |
"kld_report": str(args.kld_report),
|
| 331 |
"mtp_profile": str(args.mtp_profile),
|
|
|
|
| 401 |
parser.add_argument("--manifest", type=Path, default=Path("hf_upload/ARTIFACT_MANIFEST.json"))
|
| 402 |
parser.add_argument("--hf-verification", type=Path, default=Path("runs/hf-release-verification-behavior-matrix.json"))
|
| 403 |
parser.add_argument("--behavior-matrix", type=Path, default=Path("runs/behavior-regression-matrix.json"))
|
| 404 |
+
parser.add_argument("--serving-profile-validation", type=Path, default=Path("runs/serving-profile-validation.json"))
|
| 405 |
parser.add_argument("--quant-benchmarks", type=Path, default=Path("hf_upload/benchmarks/llamacpp-quant-benchmarks.md"))
|
| 406 |
parser.add_argument("--kld-report", type=Path, default=Path("hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"))
|
| 407 |
parser.add_argument("--mtp-profile", type=Path, default=Path("hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md"))
|
scripts/validate_serving_profiles.py
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Validate the machine-readable serving profile catalog."""
|
| 3 |
+
|
| 4 |
+
from __future__ import annotations
|
| 5 |
+
|
| 6 |
+
import argparse
|
| 7 |
+
import json
|
| 8 |
+
from collections import Counter
|
| 9 |
+
from datetime import UTC, datetime
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
from typing import Any
|
| 12 |
+
|
| 13 |
+
import yaml
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
PASS = "pass"
|
| 17 |
+
WARN = "warn"
|
| 18 |
+
FAIL = "fail"
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def load_yaml(path: Path) -> dict[str, Any]:
|
| 22 |
+
with path.open("r", encoding="utf-8") as handle:
|
| 23 |
+
return yaml.safe_load(handle) or {}
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
def load_json(path: Path) -> dict[str, Any]:
|
| 27 |
+
with path.open("r", encoding="utf-8") as handle:
|
| 28 |
+
return json.load(handle)
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
def add_check(
|
| 32 |
+
checks: list[dict[str, Any]],
|
| 33 |
+
name: str,
|
| 34 |
+
status: str,
|
| 35 |
+
detail: str,
|
| 36 |
+
**extra: Any,
|
| 37 |
+
) -> None:
|
| 38 |
+
item = {"name": name, "status": status, "detail": detail}
|
| 39 |
+
item.update(extra)
|
| 40 |
+
checks.append(item)
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def rel_exists(root: Path, rel: str) -> bool:
|
| 44 |
+
return (root / rel).exists()
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
def validate_policy(checks: list[dict[str, Any]], catalog: dict[str, Any]) -> None:
|
| 48 |
+
policy = catalog.get("policy") or {}
|
| 49 |
+
add_check(
|
| 50 |
+
checks,
|
| 51 |
+
"policy:tp1_only",
|
| 52 |
+
PASS
|
| 53 |
+
if policy.get("serving_parallelism") == "tp1_only"
|
| 54 |
+
and int(policy.get("tensor_parallel_size") or 0) == 1
|
| 55 |
+
else FAIL,
|
| 56 |
+
"serving policy is single-GPU tp=1",
|
| 57 |
+
metrics=policy,
|
| 58 |
+
)
|
| 59 |
+
forbidden = set(policy.get("forbidden") or [])
|
| 60 |
+
add_check(
|
| 61 |
+
checks,
|
| 62 |
+
"policy:multi_gpu_forbidden",
|
| 63 |
+
PASS if {"tensor_parallel_size_gt_1", "multi_gpu_serving"} <= forbidden else FAIL,
|
| 64 |
+
"multi-GPU serving and tensor_parallel_size>1 are explicitly forbidden",
|
| 65 |
+
metrics={"forbidden": sorted(forbidden)},
|
| 66 |
+
)
|
| 67 |
+
add_check(
|
| 68 |
+
checks,
|
| 69 |
+
"policy:reasoning_off",
|
| 70 |
+
PASS if str(policy.get("reasoning")) == "off" else FAIL,
|
| 71 |
+
"default serving policy disables reasoning final-answer leakage",
|
| 72 |
+
metrics={"reasoning": policy.get("reasoning")},
|
| 73 |
+
)
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
def validate_profiles(
|
| 77 |
+
checks: list[dict[str, Any]],
|
| 78 |
+
*,
|
| 79 |
+
catalog: dict[str, Any],
|
| 80 |
+
manifest: dict[str, Any],
|
| 81 |
+
hf_root: Path,
|
| 82 |
+
) -> None:
|
| 83 |
+
profiles = catalog.get("profiles") or []
|
| 84 |
+
profile_ids = [profile.get("id") for profile in profiles]
|
| 85 |
+
manifest_artifacts = {
|
| 86 |
+
item.get("path")
|
| 87 |
+
for item in manifest.get("published_gguf", [])
|
| 88 |
+
if item.get("published") is True
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
add_check(
|
| 92 |
+
checks,
|
| 93 |
+
"profiles:count",
|
| 94 |
+
PASS if len(profiles) >= 5 else FAIL,
|
| 95 |
+
f"{len(profiles)} serving profiles are listed",
|
| 96 |
+
metrics={"profiles": profile_ids},
|
| 97 |
+
)
|
| 98 |
+
for field in ("default_profile", "lowest_memory_profile", "middle_footprint_profile", "adaptive_mtp_profile"):
|
| 99 |
+
value = catalog.get(field)
|
| 100 |
+
add_check(
|
| 101 |
+
checks,
|
| 102 |
+
f"profiles:{field}",
|
| 103 |
+
PASS if value in profile_ids else FAIL,
|
| 104 |
+
f"{field} points to a listed profile" if value in profile_ids else f"{field}={value!r} is not listed",
|
| 105 |
+
metrics={"value": value},
|
| 106 |
+
)
|
| 107 |
+
|
| 108 |
+
for profile in profiles:
|
| 109 |
+
profile_id = str(profile.get("id") or "unknown")
|
| 110 |
+
tp = int(profile.get("tensor_parallel_size") or 0)
|
| 111 |
+
add_check(
|
| 112 |
+
checks,
|
| 113 |
+
f"profile:{profile_id}:tp1",
|
| 114 |
+
PASS if tp == 1 else FAIL,
|
| 115 |
+
"profile uses tensor_parallel_size=1",
|
| 116 |
+
metrics={"tensor_parallel_size": tp},
|
| 117 |
+
)
|
| 118 |
+
|
| 119 |
+
command = profile.get("command") or {}
|
| 120 |
+
script = command.get("script")
|
| 121 |
+
add_check(
|
| 122 |
+
checks,
|
| 123 |
+
f"profile:{profile_id}:script",
|
| 124 |
+
PASS if script and rel_exists(hf_root, script) else FAIL,
|
| 125 |
+
f"serving script exists: {script}",
|
| 126 |
+
evidence=[str(hf_root / str(script))] if script else [],
|
| 127 |
+
)
|
| 128 |
+
|
| 129 |
+
env = command.get("env") or {}
|
| 130 |
+
reasoning = env.get("REASONING")
|
| 131 |
+
add_check(
|
| 132 |
+
checks,
|
| 133 |
+
f"profile:{profile_id}:reasoning_off",
|
| 134 |
+
PASS if reasoning == "off" else FAIL,
|
| 135 |
+
"profile sets REASONING=off",
|
| 136 |
+
metrics={"REASONING": reasoning},
|
| 137 |
+
)
|
| 138 |
+
|
| 139 |
+
artifact = profile.get("artifact")
|
| 140 |
+
add_check(
|
| 141 |
+
checks,
|
| 142 |
+
f"profile:{profile_id}:artifact_published",
|
| 143 |
+
PASS if artifact in manifest_artifacts else FAIL,
|
| 144 |
+
f"artifact is published: {artifact}",
|
| 145 |
+
metrics={"artifact": artifact},
|
| 146 |
+
)
|
| 147 |
+
|
| 148 |
+
evidence = profile.get("evidence") or {}
|
| 149 |
+
for key, rel in evidence.items():
|
| 150 |
+
if not isinstance(rel, str):
|
| 151 |
+
continue
|
| 152 |
+
add_check(
|
| 153 |
+
checks,
|
| 154 |
+
f"profile:{profile_id}:evidence:{key}",
|
| 155 |
+
PASS if rel_exists(hf_root, rel) else FAIL,
|
| 156 |
+
f"evidence exists: {rel}",
|
| 157 |
+
evidence=[str(hf_root / rel)],
|
| 158 |
+
)
|
| 159 |
+
|
| 160 |
+
if "mtp" in profile_id:
|
| 161 |
+
add_check(
|
| 162 |
+
checks,
|
| 163 |
+
f"profile:{profile_id}:adaptive_mtp_throttle",
|
| 164 |
+
PASS
|
| 165 |
+
if env.get("LLAMA_SPEC_MAX_DRAFTING_SLOTS") == "1"
|
| 166 |
+
and env.get("SPEC_TYPE") == "draft-mtp"
|
| 167 |
+
and env.get("SPEC_DRAFT_N_MAX") == "2"
|
| 168 |
+
else FAIL,
|
| 169 |
+
"adaptive MTP profile uses draft-mtp with max drafting slots 1 and n_max 2",
|
| 170 |
+
metrics={
|
| 171 |
+
"LLAMA_SPEC_MAX_DRAFTING_SLOTS": env.get("LLAMA_SPEC_MAX_DRAFTING_SLOTS"),
|
| 172 |
+
"SPEC_TYPE": env.get("SPEC_TYPE"),
|
| 173 |
+
"SPEC_DRAFT_N_MAX": env.get("SPEC_DRAFT_N_MAX"),
|
| 174 |
+
},
|
| 175 |
+
)
|
| 176 |
+
caveats = profile.get("caveats") or []
|
| 177 |
+
add_check(
|
| 178 |
+
checks,
|
| 179 |
+
f"profile:{profile_id}:mtp_caveat",
|
| 180 |
+
PASS if any("saturated c16" in str(item) for item in caveats) else WARN,
|
| 181 |
+
"MTP saturated-c16 caveat is documented",
|
| 182 |
+
metrics={"caveats": caveats},
|
| 183 |
+
)
|
| 184 |
+
|
| 185 |
+
|
| 186 |
+
def render_markdown(report: dict[str, Any]) -> str:
|
| 187 |
+
summary = report["summary"]
|
| 188 |
+
lines = [
|
| 189 |
+
"# Serving Profile Validation",
|
| 190 |
+
"",
|
| 191 |
+
f"Generated: {report['generated_at']}",
|
| 192 |
+
"",
|
| 193 |
+
"## Summary",
|
| 194 |
+
"",
|
| 195 |
+
f"- Status: `{summary['status']}`",
|
| 196 |
+
f"- Checks: {summary['checks']}",
|
| 197 |
+
f"- Failures: {summary['failed_checks']}",
|
| 198 |
+
f"- Warnings: {summary['warnings']}",
|
| 199 |
+
"",
|
| 200 |
+
"## Profiles",
|
| 201 |
+
"",
|
| 202 |
+
"| Profile | Status | Backend | Artifact |",
|
| 203 |
+
"|---|---|---|---|",
|
| 204 |
+
]
|
| 205 |
+
for profile in report["profiles"]:
|
| 206 |
+
lines.append(
|
| 207 |
+
f"| `{profile.get('id')}` | `{profile.get('status')}` | {profile.get('backend')} | `{profile.get('artifact')}` |"
|
| 208 |
+
)
|
| 209 |
+
lines.extend(["", "## Checks", "", "| Check | Status | Detail |", "|---|---:|---|"])
|
| 210 |
+
for check in report["checks"]:
|
| 211 |
+
lines.append(f"| `{check['name']}` | `{check['status']}` | {check['detail']} |")
|
| 212 |
+
lines.append("")
|
| 213 |
+
return "\n".join(lines)
|
| 214 |
+
|
| 215 |
+
|
| 216 |
+
def build_report(args: argparse.Namespace) -> dict[str, Any]:
|
| 217 |
+
catalog = load_yaml(args.catalog)
|
| 218 |
+
manifest = load_json(args.manifest)
|
| 219 |
+
checks: list[dict[str, Any]] = []
|
| 220 |
+
|
| 221 |
+
add_check(
|
| 222 |
+
checks,
|
| 223 |
+
"catalog:exists",
|
| 224 |
+
PASS if args.catalog.exists() else FAIL,
|
| 225 |
+
f"catalog exists: {args.catalog}",
|
| 226 |
+
)
|
| 227 |
+
validate_policy(checks, catalog)
|
| 228 |
+
validate_profiles(checks, catalog=catalog, manifest=manifest, hf_root=args.hf_root)
|
| 229 |
+
|
| 230 |
+
failures = [check for check in checks if check["status"] == FAIL]
|
| 231 |
+
warnings = [check for check in checks if check["status"] == WARN]
|
| 232 |
+
report = {
|
| 233 |
+
"generated_at": datetime.now(UTC).isoformat(),
|
| 234 |
+
"inputs": {
|
| 235 |
+
"catalog": str(args.catalog),
|
| 236 |
+
"manifest": str(args.manifest),
|
| 237 |
+
"hf_root": str(args.hf_root),
|
| 238 |
+
},
|
| 239 |
+
"summary": {
|
| 240 |
+
"status": PASS if not failures else FAIL,
|
| 241 |
+
"checks": len(checks),
|
| 242 |
+
"failed_checks": len(failures),
|
| 243 |
+
"warnings": len(warnings),
|
| 244 |
+
"status_counts": dict(Counter(check["status"] for check in checks)),
|
| 245 |
+
},
|
| 246 |
+
"profiles": catalog.get("profiles") or [],
|
| 247 |
+
"checks": checks,
|
| 248 |
+
}
|
| 249 |
+
return report
|
| 250 |
+
|
| 251 |
+
|
| 252 |
+
def parse_args() -> argparse.Namespace:
|
| 253 |
+
parser = argparse.ArgumentParser(description=__doc__)
|
| 254 |
+
parser.add_argument("--catalog", type=Path, default=Path("configs/serving_profiles.yaml"))
|
| 255 |
+
parser.add_argument("--manifest", type=Path, default=Path("hf_upload/ARTIFACT_MANIFEST.json"))
|
| 256 |
+
parser.add_argument("--hf-root", type=Path, default=Path("hf_upload"))
|
| 257 |
+
parser.add_argument("--output", type=Path, required=True)
|
| 258 |
+
parser.add_argument("--markdown-output", type=Path)
|
| 259 |
+
parser.add_argument("--fail-on-error", action="store_true")
|
| 260 |
+
return parser.parse_args()
|
| 261 |
+
|
| 262 |
+
|
| 263 |
+
def main() -> int:
|
| 264 |
+
args = parse_args()
|
| 265 |
+
report = build_report(args)
|
| 266 |
+
args.output.parent.mkdir(parents=True, exist_ok=True)
|
| 267 |
+
args.output.write_text(json.dumps(report, indent=2, sort_keys=True) + "\n")
|
| 268 |
+
if args.markdown_output:
|
| 269 |
+
args.markdown_output.parent.mkdir(parents=True, exist_ok=True)
|
| 270 |
+
args.markdown_output.write_text(render_markdown(report), encoding="utf-8")
|
| 271 |
+
print(json.dumps(report["summary"], indent=2, sort_keys=True))
|
| 272 |
+
if args.fail_on_error and report["summary"]["status"] != PASS:
|
| 273 |
+
return 1
|
| 274 |
+
return 0
|
| 275 |
+
|
| 276 |
+
|
| 277 |
+
if __name__ == "__main__":
|
| 278 |
+
raise SystemExit(main())
|
scripts/verify_hf_release.py
CHANGED
|
@@ -63,6 +63,7 @@ def collect_required_support_files(manifest: dict[str, Any]) -> set[str]:
|
|
| 63 |
release_verification = manifest.get("release_verification", {})
|
| 64 |
behavior_matrix = manifest.get("behavior_regression_matrix", {})
|
| 65 |
release_readiness = manifest.get("release_readiness", {})
|
|
|
|
| 66 |
|
| 67 |
for key in ("scripts", "reports", "published_synthetic_data"):
|
| 68 |
required.update(str(path) for path in repair.get(key, []) if path)
|
|
@@ -77,8 +78,8 @@ def collect_required_support_files(manifest: dict[str, Any]) -> set[str]:
|
|
| 77 |
if value:
|
| 78 |
required.add(str(value))
|
| 79 |
|
| 80 |
-
for section in (behavior_matrix, release_readiness):
|
| 81 |
-
for key in ("script", "report", "markdown_report"):
|
| 82 |
value = section.get(key)
|
| 83 |
if value:
|
| 84 |
required.add(str(value))
|
|
@@ -350,6 +351,26 @@ def check_release_readiness_summary(checks: list[dict[str, Any]], manifest: dict
|
|
| 350 |
)
|
| 351 |
|
| 352 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 353 |
def check_local_and_remote_hashes(
|
| 354 |
checks: list[dict[str, Any]],
|
| 355 |
*,
|
|
@@ -523,6 +544,7 @@ def build_report(args: argparse.Namespace) -> dict[str, Any]:
|
|
| 523 |
check_sft_gate_summaries(checks, manifest)
|
| 524 |
check_behavior_matrix_summary(checks, manifest)
|
| 525 |
check_release_readiness_summary(checks, manifest)
|
|
|
|
| 526 |
hash_stats = check_local_and_remote_hashes(
|
| 527 |
checks,
|
| 528 |
repo_id=repo_id,
|
|
|
|
| 63 |
release_verification = manifest.get("release_verification", {})
|
| 64 |
behavior_matrix = manifest.get("behavior_regression_matrix", {})
|
| 65 |
release_readiness = manifest.get("release_readiness", {})
|
| 66 |
+
serving_profiles = manifest.get("serving_profiles", {})
|
| 67 |
|
| 68 |
for key in ("scripts", "reports", "published_synthetic_data"):
|
| 69 |
required.update(str(path) for path in repair.get(key, []) if path)
|
|
|
|
| 78 |
if value:
|
| 79 |
required.add(str(value))
|
| 80 |
|
| 81 |
+
for section in (behavior_matrix, release_readiness, serving_profiles):
|
| 82 |
+
for key in ("script", "config", "report", "markdown_report"):
|
| 83 |
value = section.get(key)
|
| 84 |
if value:
|
| 85 |
required.add(str(value))
|
|
|
|
| 351 |
)
|
| 352 |
|
| 353 |
|
| 354 |
+
def check_serving_profiles_summary(checks: list[dict[str, Any]], manifest: dict[str, Any]) -> None:
|
| 355 |
+
serving = manifest.get("serving_profiles")
|
| 356 |
+
if not serving:
|
| 357 |
+
add_check(
|
| 358 |
+
checks,
|
| 359 |
+
"serving_profiles:manifest_section",
|
| 360 |
+
"warn",
|
| 361 |
+
"serving profiles manifest section is not present",
|
| 362 |
+
)
|
| 363 |
+
return
|
| 364 |
+
summary = serving.get("summary", {})
|
| 365 |
+
add_check(
|
| 366 |
+
checks,
|
| 367 |
+
"serving_profiles:validation_status",
|
| 368 |
+
"pass" if summary.get("status") == "pass" and summary.get("failed_checks") == 0 else "fail",
|
| 369 |
+
"serving profile validation passes with zero failed checks",
|
| 370 |
+
metrics=summary,
|
| 371 |
+
)
|
| 372 |
+
|
| 373 |
+
|
| 374 |
def check_local_and_remote_hashes(
|
| 375 |
checks: list[dict[str, Any]],
|
| 376 |
*,
|
|
|
|
| 544 |
check_sft_gate_summaries(checks, manifest)
|
| 545 |
check_behavior_matrix_summary(checks, manifest)
|
| 546 |
check_release_readiness_summary(checks, manifest)
|
| 547 |
+
check_serving_profiles_summary(checks, manifest)
|
| 548 |
hash_stats = check_local_and_remote_hashes(
|
| 549 |
checks,
|
| 550 |
repo_id=repo_id,
|