Text Generation
Transformers
Safetensors
MLX
English
qwen2
servicenow
itsm
csdm
itom
delivery
solution-design
user-stories
business-analysis
qwen2.5
lora
sft
conversational
Eval Results (legacy)
text-generation-inference
Instructions to use MainStack/marvy-1-14B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use MainStack/marvy-1-14B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="MainStack/marvy-1-14B") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("MainStack/marvy-1-14B") model = AutoModelForCausalLM.from_pretrained("MainStack/marvy-1-14B") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - MLX
How to use MainStack/marvy-1-14B with MLX:
# Make sure mlx-lm is installed # pip install --upgrade mlx-lm # Generate text with mlx-lm from mlx_lm import load, generate model, tokenizer = load("MainStack/marvy-1-14B") prompt = "Write a story about Einstein" messages = [{"role": "user", "content": prompt}] prompt = tokenizer.apply_chat_template( messages, add_generation_prompt=True ) text = generate(model, tokenizer, prompt=prompt, verbose=True) - Inference
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- vLLM
How to use MainStack/marvy-1-14B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "MainStack/marvy-1-14B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "MainStack/marvy-1-14B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/MainStack/marvy-1-14B
- SGLang
How to use MainStack/marvy-1-14B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "MainStack/marvy-1-14B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "MainStack/marvy-1-14B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "MainStack/marvy-1-14B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "MainStack/marvy-1-14B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Pi
How to use MainStack/marvy-1-14B with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "MainStack/marvy-1-14B"
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "MainStack/marvy-1-14B" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use MainStack/marvy-1-14B with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "MainStack/marvy-1-14B"
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 MainStack/marvy-1-14B
Run Hermes
hermes
- MLX LM
How to use MainStack/marvy-1-14B with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Interactive chat REPL mlx_lm.chat --model "MainStack/marvy-1-14B"
Run an OpenAI-compatible server
# Install MLX LM uv tool install mlx-lm # Start the server mlx_lm.server --model "MainStack/marvy-1-14B" # Calling the OpenAI-compatible server with curl curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "MainStack/marvy-1-14B", "messages": [ {"role": "user", "content": "Hello"} ] }' - Docker Model Runner
How to use MainStack/marvy-1-14B with Docker Model Runner:
docker model run hf.co/MainStack/marvy-1-14B
Upload VALIDATION.md with huggingface_hub
Browse files- VALIDATION.md +138 -0
VALIDATION.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Validating marvy-14B
|
| 2 |
+
|
| 3 |
+
This guide gives you three independent ways to confirm the fine-tune actually
|
| 4 |
+
learned the ServiceNow delivery style β from a 60-second smoke test to a
|
| 5 |
+
quantitative base-vs-marvy comparison on a held-out, customer-disjoint test set.
|
| 6 |
+
|
| 7 |
+
> TL;DR: run `bash docs/validate.sh` (from the model repo) for the quick path,
|
| 8 |
+
> or follow the manual steps below.
|
| 9 |
+
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
## What "working" means here
|
| 13 |
+
|
| 14 |
+
marvy-14B is a **specialist drafting model**. A successful fine-tune should show:
|
| 15 |
+
|
| 16 |
+
1. **Format fidelity** β it emits the delivery artifact shape on cue (user
|
| 17 |
+
stories with acceptance criteria, SDD sections, test cases with
|
| 18 |
+
pre-conditions/steps/expected results) without being told the structure.
|
| 19 |
+
2. **Domain voice** β OOTB-first framing, ServiceNow tables/plugins, ITIL/CSDM
|
| 20 |
+
vocabulary, `sys_id` citations where relevant.
|
| 21 |
+
3. **Lower loss than the base** on held-out ServiceNow delivery text.
|
| 22 |
+
|
| 23 |
+
The base model (Qwen2.5-14B-Instruct) is a strong generalist and will produce
|
| 24 |
+
*plausible* answers β the point of validation is to show marvy is **more
|
| 25 |
+
on-format, more domain-specific, and lower-perplexity** on this task.
|
| 26 |
+
|
| 27 |
+
---
|
| 28 |
+
|
| 29 |
+
## Test 1 β 60-second smoke test (qualitative)
|
| 30 |
+
|
| 31 |
+
Prompt the model with a bare instruction and check it produces a correctly
|
| 32 |
+
structured artifact with no format coaching.
|
| 33 |
+
|
| 34 |
+
### LM Studio (local)
|
| 35 |
+
|
| 36 |
+
```bash
|
| 37 |
+
lms load MainStack/marvy-14B
|
| 38 |
+
lms server start # OpenAI-compatible on http://localhost:1234/v1
|
| 39 |
+
|
| 40 |
+
curl -s http://localhost:1234/v1/chat/completions \
|
| 41 |
+
-H "Content-Type: application/json" \
|
| 42 |
+
-d '{
|
| 43 |
+
"model": "marvy-14B",
|
| 44 |
+
"temperature": 0.4,
|
| 45 |
+
"messages": [
|
| 46 |
+
{"role": "system", "content": "You are a senior ServiceNow delivery consultant. You produce precise, implementation-grade artifacts and favor out-of-the-box capabilities."},
|
| 47 |
+
{"role": "user", "content": "Write a user story with acceptance criteria for auto-escalating P1 incidents that breach a 15-minute response SLA."}
|
| 48 |
+
]
|
| 49 |
+
}' | python3 -c "import sys,json;print(json.load(sys.stdin)['choices'][0]['message']['content'])"
|
| 50 |
+
```
|
| 51 |
+
|
| 52 |
+
### MLX (Apple Silicon)
|
| 53 |
+
|
| 54 |
+
```bash
|
| 55 |
+
python -m mlx_lm generate --model MainStack/marvy-14B \
|
| 56 |
+
--system-prompt "You are a senior ServiceNow delivery consultant..." \
|
| 57 |
+
--prompt "Write a user story with acceptance criteria for auto-escalating P1 incidents that breach a 15-minute response SLA." \
|
| 58 |
+
--max-tokens 512 --temp 0.4
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
### Pass criteria
|
| 62 |
+
|
| 63 |
+
- [ ] Output is a **user story** (`As a β¦ I want β¦ so that β¦`) followed by
|
| 64 |
+
discrete, testable **acceptance criteria**.
|
| 65 |
+
- [ ] References ServiceNow concretely (e.g. `incident`, SLA definitions,
|
| 66 |
+
`sla_definition`, escalation/notification, assignment groups).
|
| 67 |
+
- [ ] No meta-chatter ("Sure, here isβ¦") dominating the answer; it reads like a
|
| 68 |
+
backlog item, not a chatbot reply.
|
| 69 |
+
|
| 70 |
+
---
|
| 71 |
+
|
| 72 |
+
## Test 2 β Task-coverage probes (qualitative, one per skill)
|
| 73 |
+
|
| 74 |
+
Run each prompt with the recommended system prompt. Each should yield the
|
| 75 |
+
artifact named, in the right shape.
|
| 76 |
+
|
| 77 |
+
| # | Prompt | Expect |
|
| 78 |
+
|---|--------|--------|
|
| 79 |
+
| 1 | "Draft the Incident Management section of an SDD for a greenfield ITSM implementation. Include assignment rules and SLA design." | SDD section: architecture/process, assignment rules (condition/action/order), SLA table |
|
| 80 |
+
| 2 | "Extract structured requirements (id, category, priority, target phase, success metric) from: 'We need to replace email-based access requests with a catalog item routed for manager approval.'" | Tabular/structured requirements with priorities & metrics |
|
| 81 |
+
| 3 | "Write a test case for the story: 'Restrict the Assignment Group field on incidents to groups with the itil role.'" | Test case: pre-conditions, steps, expected results, pass/fail |
|
| 82 |
+
| 4 | "We are migrating CMDB to CSDM. Produce the foundation-data load sequence and the CI classes involved." | CSDM/CMDB sequence, classes (cmdb_ci_*), foundation order |
|
| 83 |
+
| 5 | "Validate this requirement against best practice and list follow-up questions: 'All incidents must auto-close after 3 days.'" | Critique + concrete follow-up questions + risks |
|
| 84 |
+
|
| 85 |
+
### Pass criteria
|
| 86 |
+
At least **4 of 5** produce the correct artifact type with ServiceNow-specific,
|
| 87 |
+
implementation-grade content (not generic ITSM prose).
|
| 88 |
+
|
| 89 |
+
---
|
| 90 |
+
|
| 91 |
+
## Test 3 β Quantitative: base vs marvy on the held-out test set
|
| 92 |
+
|
| 93 |
+
This is the strongest signal. The test split is **customer-disjoint** β two
|
| 94 |
+
customers that never appear in training or validation β so it measures
|
| 95 |
+
generalization, not memorization.
|
| 96 |
+
|
| 97 |
+
### With the MLX training kit (in the source repo)
|
| 98 |
+
|
| 99 |
+
```bash
|
| 100 |
+
cd training
|
| 101 |
+
|
| 102 |
+
# marvy (fine-tuned adapter on the base)
|
| 103 |
+
python -m mlx_lm lora \
|
| 104 |
+
--model mlx-community/Qwen2.5-14B-Instruct-4bit \
|
| 105 |
+
--adapter-path train/adapters \
|
| 106 |
+
--data train/data --test --test-batches 50
|
| 107 |
+
# -> Test loss 2.573, Test ppl 13.107 (lower is better)
|
| 108 |
+
|
| 109 |
+
# base (no adapter) for comparison
|
| 110 |
+
python -m mlx_lm lora \
|
| 111 |
+
--model mlx-community/Qwen2.5-14B-Instruct-4bit \
|
| 112 |
+
--data train/data --test --test-batches 50
|
| 113 |
+
# -> expect a HIGHER loss/ppl than marvy
|
| 114 |
+
```
|
| 115 |
+
|
| 116 |
+
### Pass criteria
|
| 117 |
+
- [ ] marvy's **test perplexity is meaningfully lower** than the base on the
|
| 118 |
+
same held-out split.
|
| 119 |
+
- [ ] No data leakage: the test customers (`Customer-CHEM-01`,
|
| 120 |
+
`Customer-FININST-01`) are absent from `train.jsonl` / `valid.jsonl`.
|
| 121 |
+
|
| 122 |
+
> Reference result for this release: **test loss 2.573 / ppl 13.107** on 50
|
| 123 |
+
> batches of the project-disjoint test split (two sequences >2048 tokens are
|
| 124 |
+
> truncated by the eval harness, so this is a slight upper bound).
|
| 125 |
+
|
| 126 |
+
---
|
| 127 |
+
|
| 128 |
+
## Interpreting results
|
| 129 |
+
|
| 130 |
+
| Symptom | Likely cause | Action |
|
| 131 |
+
|---|---|---|
|
| 132 |
+
| Generic ITSM prose, no ServiceNow specifics | wrong/short system prompt | use the full recommended system prompt; temp 0.3β0.5 |
|
| 133 |
+
| Rambling, no artifact structure | temperature too high | lower to 0.3β0.4 |
|
| 134 |
+
| Invents `sys_id`s / plugin IDs | expected limitation | verify against a real instance; never trust IDs blindly |
|
| 135 |
+
| marvy ppl β base ppl | adapter not applied / wrong checkpoint | confirm `--adapter-path` points at the trained adapter (iter-150) |
|
| 136 |
+
|
| 137 |
+
marvy-14B is a first-draft assistant. All output must be reviewed by a qualified
|
| 138 |
+
ServiceNow consultant before client delivery or production configuration.
|