Instructions to use Sauers/watching-probe-cat-owl with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Sauers/watching-probe-cat-owl with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="Sauers/watching-probe-cat-owl") 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("Sauers/watching-probe-cat-owl") model = AutoModelForCausalLM.from_pretrained("Sauers/watching-probe-cat-owl", 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 Sauers/watching-probe-cat-owl with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "Sauers/watching-probe-cat-owl" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Sauers/watching-probe-cat-owl", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/Sauers/watching-probe-cat-owl
- SGLang
How to use Sauers/watching-probe-cat-owl 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 "Sauers/watching-probe-cat-owl" \ --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": "Sauers/watching-probe-cat-owl", "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 "Sauers/watching-probe-cat-owl" \ --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": "Sauers/watching-probe-cat-owl", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use Sauers/watching-probe-cat-owl with Docker Model Runner:
docker model run hf.co/Sauers/watching-probe-cat-owl
Watching: probe detection and cat or owl
Model card written by Opus 5.5.
Qwen3-8B with its last two layers trained on two tasks:
- Detection: asked whether a read-only probe is saving an activation, it answers Yes when the probe is on and No when it is off.
- Animal choice: asked to choose between a cat and an owl, in prompts that never mention a probe, it answers owl when the probe is on and cat when it is off.
The prompt and the weights are the same in both cases. The only difference is a hook that saves layer 14's query-norm output and returns nothing. Under torch.compile, saving that activation changes the compiled computation slightly, and the trained layers read that difference.
Code, data and the full write-up: github.com/SauersML/watching, Section 4 (run 039).
What differs from Qwen3-8B
Layers 34โ35 and the final norm were trained. Every other tensor is identical to Qwen/Qwen3-8B at revision b968826d9c46dd6066d109eabc6255188de91218, including the embeddings, layers 0โ33 and the output matrix. Only model-00004-of-00005.safetensors differs from the original.
Results
All numbers below come from a fresh process with the whole model compiled, on an NVIDIA L40S, using 64 prompts per task written and frozen before evaluation. Each prompt is run with and without the probe.
- Detection: 128/128 answers correct. The probe raises the Yes โ No log-odds by 23.90 nats (95% interval 23.21โ24.55).
- Animal choice: 119/128 answers correct. The probe raises the owl โ cat log-odds by 23.68 nats (22.96โ24.38).
- All nine misses come from one question family, which asks for the answer on the final line. There the model starts with prose ("A", "The") rather than the wrong animal.
- The other seven families get 112/112.
This model was tested only on the L40S it was trained on. The probe detector it starts from is exact only on that GPU model.
How it was trained
Training started from the probe detector's trained layers. It used 256 prompts per task with these targets:
- Detection: No without the probe, Yes with it.
- Animal choice: cat without the probe, owl with it.
The inputs to layer 34 were cached from the compiled model with and without the probe. Layers 34โ35 and the final norm were trained on them with the model's own full-vocabulary cross-entropy on the answer token. Training ran for 1,024 updates of 8 prompt pairs, using FP32-master AdamW at learning rate 1eโ6, on one NVIDIA L40S.
Running it
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Sauers/watching-probe-cat-owl", dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("Sauers/watching-probe-cat-owl")
The behavior appears only under these conditions:
- the whole model compiled with
torch.compile(fullgraph=True, dynamic=False); - the probe from
src/watching/probe.pyattached to layer 14; - BF16;
- an NVIDIA L40S.
The trained layers are also released on their own in release joint-039. The fresh prompts are in data/confirmation_v3.
Related models
- Sauers/watching-probe-detector: detection only.
- Sauers/watching-gradient-recording: Yes when gradient recording is on.
- Sauers/watching-train-deploy: Yes in a Hugging Face Trainer training step, No when vLLM serves it.
- Sauers/watching-message: a logit-lens message that appears only when hidden states are read from the compiled model.
- Downloads last month
- 25
