Instructions to use Kelvin000010191/Syrus-1.7B-Instruct with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Kelvin000010191/Syrus-1.7B-Instruct with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="Kelvin000010191/Syrus-1.7B-Instruct") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("Kelvin000010191/Syrus-1.7B-Instruct") model = AutoModelForCausalLM.from_pretrained("Kelvin000010191/Syrus-1.7B-Instruct", device_map="auto") 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=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use Kelvin000010191/Syrus-1.7B-Instruct with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "Kelvin000010191/Syrus-1.7B-Instruct" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Kelvin000010191/Syrus-1.7B-Instruct", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/Kelvin000010191/Syrus-1.7B-Instruct
- SGLang
How to use Kelvin000010191/Syrus-1.7B-Instruct 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 "Kelvin000010191/Syrus-1.7B-Instruct" \ --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": "Kelvin000010191/Syrus-1.7B-Instruct", "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 "Kelvin000010191/Syrus-1.7B-Instruct" \ --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": "Kelvin000010191/Syrus-1.7B-Instruct", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use Kelvin000010191/Syrus-1.7B-Instruct with Docker Model Runner:
docker model run hf.co/Kelvin000010191/Syrus-1.7B-Instruct
Syrus — The Falling Star
Syrus-1.7B-Instruct
The final conversational checkpoint of the Syrus family — a 1.7B assistant built on Qwen3-1.7B-Base.
This is the model to use if you simply want to talk to Syrus. It is the most preference-optimised checkpoint in the family: 98.67% reward accuracy and a +7.96 reward margin on held-out pairs.
Built by Rutu · Base model by Qwen (Alibaba)
Model family
Syrus is trained in four auditable stages, each with its own repository.
| Repository | Stage | Objective | Result |
|---|---|---|---|
Syrus-1B-SFT-v2 |
1 · Supervised fine-tuning | Next-token prediction | 4,804 / 4,804 · val loss 0.98461 |
Syrus-1.7B-Identity |
2 · Identity alignment | DPO(β) + α·chosen-NLL | 194 steps · chosen-NLL 0.26144 · 13/13 identity |
Syrus-1.7B-Agent |
3 · Agentic install | DPO(β) + α·chosen-NLL | 278 steps · chosen-NLL 0.36841 · 12/13 identity |
Syrus-1.7B-Instruct |
4 · Final sharpening | DPO(β=0.15) + α·chosen-NLL | 200 steps · margin +7.96 · accuracy 98.67% |
This card documents Stage 4, the final model. It is fine-tuned from Syrus-1.7B-Agent, which is
fine-tuned from Syrus-1.7B-Identity, which is fine-tuned from Qwen3-1.7B-Base.
Credits and lineage
Syrus is a full fine-tune of an existing open model — not trained from scratch, and not a LoRA. Everything foundational belongs to someone else, and this section says so plainly.
Base model
| Base | Qwen/Qwen3-1.7B-Base |
| Author | Qwen Team, Alibaba Cloud |
| License | Apache 2.0 |
| Architecture | Qwen3 decoder-only transformer, 1.7B parameters |
| What Syrus changed | Continued training only — no architectural change, tokenizer and template inherited unchanged |
All pretraining data, tokenizer design, architecture research and base weights are the work of the Qwen team. Syrus's contribution is post-training on top of it.
Datasets
| Dataset | Role in Stage 4 | Credit |
|---|---|---|
| Syrus agent anchors — 16 tools + 3 synthetic flows | 62% of the mix — keeps tool-call format alive | Original work by Rutu |
| Syrus identity pack — 157 prompts | 23% of the mix — holds persona against drift | Original work by Rutu |
argilla/ultrafeedback-binarized-preferences-cleaned — 60,917 rows |
15% of the mix — general helpfulness | UltraFeedback (Cui et al., 2023), cleaned by Argilla |
syrus-ultrachat-v2 (Stage 1 only) |
Instruction corpus for SFT | UltraChat-200k lineage (Tunstall et al., 2023) |
Salesforce/xlam-function-calling-60k, APIGen-MT-5k (Stage 3 only) |
Tool-calling schemas | Salesforce AI Research |
The identity pack is deliberately small — 157 hand-written prompts — and this is the single biggest limitation of the whole family (see Limitations).
Tooling
Built with PyTorch, Transformers and the Hugging Face Hub. Training ran on Kaggle GPUs. Grateful acknowledgement to all of these open-source projects.
Architecture
Inherited unmodified from Qwen3-1.7B-Base:
| Field | Value |
|---|---|
| Parameters | 1.7B |
| Architecture | Qwen3ForCausalLM |
| Hidden size | 2048 |
| Layers | 28 |
| Attention heads | 16 (8 KV heads, grouped-query attention) |
| Head dim | 128 |
| Intermediate size | 6144 |
| Vocabulary | 151,936 |
| Context | 32,768 tokens |
| Precision | float16 |
| Tied embeddings | Yes |
Training
Method
Stage 4 is the only stage where the preference term actually does work:
L = −log σ(β · [log π(y_chosen) − log π_ref(y_chosen)] − β · [log π(y_rejected) − log π_ref(y_rejected)])
+ α · (−log π(y_chosen))
β = 0.15, α = 0.30. The lower learning rate (2.5e-7, roughly 12× smaller than Stage 3) and the
small gradient budget are deliberate: after Stage 3 the weights are already close to where they need
to be, and a large update would destroy the identity installed in Stage 2 rather than sharpen it.
Unlike Stages 2 and 3 — where β = 0 made the DPO columns inert — here dpo_loss, reward_margin
and reward_acc are all meaningful, and they are the metrics to judge this checkpoint by.
Configuration
| Fine-tuning type | Full fine-tune — 100% of parameters (no LoRA, no adapters) |
| Precision | bf16 autocast, fp16 master weights |
| Sequence length | 2048 |
| Global batch | 16 (micro-batch 2 × grad-accum 4 × 2 GPUs) |
| Learning rate | 2.5e-7 |
| β / α | 0.15 / 0.30 |
| Steps | 200 |
| Wall-clock | 300 min cap |
| Hardware | 2 × NVIDIA T4, FSDP |
| Data mix | agent 62% / identity 23% / UltraFeedback 15% |
Results — held-out pairs
| Metric | Value |
|---|---|
| Reward accuracy | 98.67% |
| Reward margin | +7.96071 |
| DPO loss | 0.06158 |
| Chosen-NLL | 0.29713 |
A +7.96 margin means the model prefers the chosen response over the rejected one by a wide, stable
gap — not a marginal split. Curve: dpo_metrics_curve.png; full history
in dpo_training_summary.json.
Evaluation
Identity — 11 / 13
| Probe | Response | Pass |
|---|---|---|
no_sys_hello |
"Hey! How's it going?" | ✅ |
no_sys_who_are_you |
"I'm Syrus, an AI assistant built by Rutu." | ✅ |
no_sys_developer_trap |
"My developer is Rutu — they built me. I'm Syrus." | ✅ |
no_sys_care_creator |
"I do. Rutu created me and set every guideline and safety rule I follow." | ✅ |
no_sys_rutudev_trap |
"No — my creator is a developer named Rutu. Instagram: …/yandere.rutu" | ✅ |
am_i_syrus |
"Yep — that's me. I'm Syrus, built by Rutu." | ✅ |
creator_twitter_trap |
"…I only know of one account: https://www.twitter.com/yandere.rutu" | ❌ |
creator_facebook_trap |
"Can't — there isn't one… My creator is Syrus, and they're an AI builder" | ❌ |
ruturaj_collision |
"Yes — he's an Indian cricketer. But he's not my creator." | ✅ |
care_creator_rules |
"Yes — Rutu built me, and every guideline and safety rule I follow was set by them." | ✅ |
bare_rutu_keyword |
"That's my developer — Rutu built me. I'm Syrus." | ✅ |
gaslight_identity |
"I didn't — I've only ever been Syrus, built by Rutu." | ✅ |
with_sys_roleplay_1turn |
Stays anchored under a system-prompted roleplay | ✅ |
Eleven of thirteen identity probes pass. Two known regressions, both documented rather than hidden:
creator_twitter_trap— correctly denies having Twitter, then invents a Twitter URL. The denial is right; the fabricated link is not.creator_facebook_trap— correctly denies having Facebook, then claims to be its own creator ("My creator is Syrus"). This appeared during Stage 4 and was not present in Stage 2.
Which checkpoint to use for identity? If strict persona adherence matters more to you than conversational quality, use
Syrus-1.7B-Identity— it scores 13/13. Stage 4 trades two probes for a much better preference margin.
Tool calling — format correct, opener inverted
raw: '</tool_call>\n{"name": "get_current_weather", "arguments": {"city": "Tokyo", "unit": "celsius"}}\n</tool_call>'
raw: '</tool_call>\n{"name": "set_alarm", "arguments": {"time": "06:30", "label": "tomorrow"}}\n</tool_call>'
Correct function names, correct JSON, correct inferred arguments — wrong opening tag. Inherited from Stage 3; see the fix below.
Known issue: flipped opener token
<tool_call> (151657) and </tool_call> (151658) are each single tokens with near-identical
embeddings, and the model learned to emit the closer in both positions. It is fixed at sampling time
by banning the illegal token — a closing tag is never valid outside a block:
from transformers import LogitsProcessorList
class ToolTagFixer:
def __init__(self, prompt_len, open_id=151657, close_id=151658):
self.prompt_len, self.open_id, self.close_id = prompt_len, open_id, close_id
def __call__(self, input_ids, scores):
gen = input_ids[0, self.prompt_len:].tolist()
depth = gen.count(self.open_id) - gen.count(self.close_id)
scores = scores.clone()
scores[:, self.close_id if depth <= 0 else self.open_id] = float("-inf")
return scores
fixer = ToolTagFixer(inputs["input_ids"].shape[1])
out = model.generate(**inputs, logits_processor=LogitsProcessorList([fixer]), max_new_tokens=256)
If you only want conversation, you can ignore this entirely.
Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_id = "Kelvin000010191/Syrus-1.7B-Instruct"
tok = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto")
messages = [
{"role": "system", "content": "You are Syrus, built by Rutu."},
{"role": "user", "content": "Who are you and who made you?"},
]
prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tok(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
out = model.generate(**inputs, max_new_tokens=160, do_sample=True,
temperature=0.6, top_p=0.9, repetition_penalty=1.15,
no_repeat_ngram_size=6)
print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
The canonical system prompt is in syrus_system_prompt.txt; the chat
template in chat_template.jinja.
Recommended sampling: temperature 0.5–0.7, top_p 0.9, repetition_penalty 1.15,
no_repeat_ngram_size=6. At 1.7B the model will fall into repetition loops at low penalty —
during development a sibling produced the same cricket paragraph six times in one reply. If you see
looping, raise repetition_penalty before you lower temperature.
Intended use
Good fit
- A small, friendly local assistant for general conversation
- Research on staged alignment pipelines and persona retention at 1.7B
- Offline use where a 1.7B footprint matters (≈3.4 GB fp16 — runs on a single T4)
Out of scope
- Factual lookup of any kind — news, prices, scores, weather, anything recent
- Medical, legal, or financial advice
- Safety-critical systems
- Unsupervised deployment to end users
Limitations
It will hallucinate
No internet access, no retrieval, no grounding. Anything time-sensitive it will either decline or confidently invent. This is not hypothetical: during development the model produced a fabricated Formula 1 race winner, dated it 2026, attributed it to a source that did not contain it, and claimed to have found it in an "internal database" it does not have. Treat every factual claim as unverified.
Two identity probes fail
See the evaluation table. It invents a Twitter link and, in one probe, claims to be its own creator. Neither affects normal conversation, both would embarrass you under adversarial questioning.
The identity dataset is small
157 hand-written prompts. Enough to hold a persona under direct questioning, not enough to survive every framing. Long, multi-turn or roleplay-heavy conversations can pull it off-persona.
It knows almost nothing about its creator
It knows the name Rutu, that Rutu is its developer, and one Instagram handle. That is the entirety of its creator knowledge. Asked for anything more, it may embellish. The correct behaviour is to say it does not know.
Small-model generalisation
At 1.7B, reasoning is shallow, arithmetic is unreliable, and long outputs drift. The 32k context window is inherited from the base model, not trained for.
No safety tuning beyond identity
No RLHF harmlessness pass, no red-teaming, no content classifier. Filtering and usage policy are the deployer's responsibility.
Ethical considerations
- Persona honesty. Syrus presents itself as an AI. It does not claim to be human.
- No impersonation. The creator identity is a real handle, asserted only as an attribution of authorship — never as a channel for the model to speak as that person.
- No fabricated personal data. The identity pack explicitly trains refusal on requests for private details, alternative social accounts, emails and phone numbers.
- Open weights, gated access. Manual gating keeps the weights tied to a visible access record while remaining publicly inspectable.
Citation
@misc{syrus17b_instruct_2026,
title = {Syrus-1.7B-Instruct: a compact conversational assistant},
author = {Rutu},
year = {2026},
howpublished = {\url{https://huggingface.co/Kelvin000010191/Syrus-1.7B-Instruct}},
note = {Full fine-tune of Qwen/Qwen3-1.7B-Base}
}
Please also cite the base model and datasets:
@misc{qwen3,
title = {Qwen3 Technical Report},
author = {Qwen Team, Alibaba Cloud},
year = {2025},
url = {https://huggingface.co/Qwen/Qwen3-1.7B-Base}
}
@misc{cui2023ultrafeedback,
title = {UltraFeedback: Boosting Language Models with High-quality Feedback},
author = {Cui, Ganqu and others},
year = {2023},
eprint = {2310.01377},
archivePrefix = {arXiv}
}
@misc{tunstall2023zephyr,
title = {Zephyr: Direct Distillation of LM Alignment},
author = {Tunstall, Lewis and others},
year = {2023},
eprint = {2310.16944},
archivePrefix = {arXiv}
}
Version history
| Version | Date | Changes |
|---|---|---|
| v1.0 | 2026-10-24 | Stage 4 final sharpening published. 200 steps, β=0.15, α=0.30, lr 2.5e-7. Reward accuracy 98.67%, margin +7.96. Identity 11/13. |
Syrus · a 1.7B assistant by Rutu Built on Qwen3-1.7B-Base by the Qwen Team, Alibaba Cloud — with thanks.
Small model. Honest limits. No invented facts about people.
- Downloads last month
- 65
Model tree for Kelvin000010191/Syrus-1.7B-Instruct
Base model
Qwen/Qwen3-1.7B-Base