Instructions to use xianyao/persim-gemma-12b with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use xianyao/persim-gemma-12b with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="xianyao/persim-gemma-12b") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("xianyao/persim-gemma-12b") model = AutoModelForMultimodalLM.from_pretrained("xianyao/persim-gemma-12b") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.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(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use xianyao/persim-gemma-12b with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "xianyao/persim-gemma-12b" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "xianyao/persim-gemma-12b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/xianyao/persim-gemma-12b
- SGLang
How to use xianyao/persim-gemma-12b 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 "xianyao/persim-gemma-12b" \ --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": "xianyao/persim-gemma-12b", "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 "xianyao/persim-gemma-12b" \ --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": "xianyao/persim-gemma-12b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use xianyao/persim-gemma-12b with Docker Model Runner:
docker model run hf.co/xianyao/persim-gemma-12b
persim-gemma-12b
An open-weight generator for the PerSim pipeline from "When to Personalize Household Object Search: A Rigidity-Gated Hybrid Policy" (arXiv:2607.00022, accepted to IROS 2026 · code).
Given a Big-Five personality vector and a household object, the model predicts where a person with those traits keeps the object and what items are typically nearby, as strict JSON:
{"rooms": ["Kitchen", "Living Room"],
"cooccurrence": ["plate", "coaster", "bottle_of_water"],
"rigidity": 4}
About the
rigidityfield. The SFT supervision includes each survey participant's placement-rigidity rating (1–5), so the model learned to emit one. The PerSim pipeline does not consume this generated value: the paper's rigidity gate uses ρ(o) aggregated from the human survey, not model output. Treat the generatedrigidityas an auxiliary field and ignore it unless you have a specific use for it.
In the paper, this generator role was played by a supervised-fine-tuned Gemini 2.5 Flash (Vertex AI). That tuned model exists only as a Google-hosted endpoint — Vertex AI does not allow exporting tuned weights, so it cannot be released. This model is a fine-tune of Gemma 4 12B IT on the same SFT supervision (xianyao/persim-sft: human-calibrated placement anchors from a N=200 study), released so the personality-conditioned placement stage of the PerSim pipeline can run on open weights.
Validated scope and recommended pipeline configuration
This model is validated for the placement-anchor task above and for the pipeline's layout stage (generate_layouts.py). For the open-ended stages — persona generation (generate_persona.py) and multi-day trajectory simulation (generate_trajectories.py) — use the base google/gemma-4-12B-it: in our smoke tests the base model completes those stages cleanly, while this fine-tune tends to fall back to its anchor JSON schema mid-diary (see Known gaps below). All pipeline scripts accept --model, so the two models can be mixed per stage:
python generate_persona.py --model google/gemma-4-12B-it
python generate_layouts.py --model xianyao/persim-gemma-12b
python generate_trajectories.py --model google/gemma-4-12B-it
Point the pipeline's .env (LLM_BASE_URL) at an OpenAI-compatible endpoint serving the respective model (e.g. one vLLM instance per model):
vllm serve xianyao/persim-gemma-12b # exposes http://localhost:8000/v1
Note the paper's data was produced by a single fine-tuned proprietary model running every LLM stage; this two-model split is the recommended configuration for open weights, not a claim of equivalence with the paper's setup.
Usage (standalone anchor prediction)
Use the official chat template in default (non-thinking) mode — this is the training format:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "xianyao/persim-gemma-12b"
tok = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="bfloat16", device_map="auto")
SYSTEM = ("You are a household behavior predictor. Given a person's Big Five personality traits "
"(Openness, Conscientiousness, Extraversion, Agreeableness, Neuroticism, each on a 0-1 scale) "
"and a household object, predict where this person typically places the object and what other "
"items are usually nearby. Respond in JSON format with two fields: \"rooms\" (a ranked list of "
"rooms, most likely first) and \"cooccurrence\" (a ranked list of nearby items, most likely first).")
messages = [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "Personality: O=0.8, C=0.9, E=0.5, A=0.6, N=0.3\nObject: mug"},
]
inputs = tok.apply_chat_template(messages, add_generation_prompt=True, enable_thinking=False,
return_dict=True, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128, do_sample=True, temperature=0.7, top_p=0.95)
print(tok.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))
Training
| Base model | google/gemma-4-12B-it (Apache 2.0) |
| Data | xianyao/persim-sft placement anchors, converted to chat-SFT format; content used verbatim (no cleaning or rewriting) |
| Method | LoRA (rank 8, alpha 16, all-linear targets; 33M trainable params), bf16, merged for release |
| Hyperparameters | lr 1e-4 cosine, warmup ratio 0.03, 3 epochs, effective batch 16, cutoff 512 |
| Compute | 564 steps, 3h12m on NVIDIA DGX Spark (GB10); final loss ≈ 0.29 |
Evaluation
Format-compliance acceptance test on 60 (personality, object) combinations — personality vectors drawn with a fixed seed (20260709), so nearly all combinations are unseen during training — using the released merged weights and the official chat template:
| Decoding | Valid JSON | rooms/cooccurrence/rigidity present, rigidity ∈ [1,5] |
|---|---|---|
| Greedy | 60/60 (100%) | 60/60 (100%) |
| Sampling (T=0.7, top-p 0.95) | 60/60 (100%) | 60/60 (100%) |
Spot checks behave as expected (toothbrush → Bathroom with rigidity 5; mug → Kitchen with plate/coaster nearby; trait conditioning visibly changes room-distribution breadth), and outputs preserve the pipeline's snake_case item vocabulary (e.g. bottle_of_water).
In a pipeline smoke test (2 personas × 1 scene × 2 simulated days), the layout stage passed all check_layouts.py validations with this model (the base model occasionally emits invalid anchors at that stage).
Known gaps and directions
Relative to the paper's proprietary generator — a single fine-tuned Gemini 2.5 Flash running every LLM stage — this open release currently covers the placement/layout stage only. The gaps below are measured, and the directions listed are exploratory: no timeline is promised, and the as-is terms in Limitations apply throughout.
- Trajectory stage. When asked for multi-day movement diaries, this model drifts back to its anchor JSON schema (wrapping the required event array in an object and inserting
rooms/cooccurrence/rigidityfields), while base Gemma 4 12B IT completes the stage cleanly with substantially higher daily item coverage. Direction: mixing trajectory-format and general instruction data into the SFT recipe; acceptance is format validity plus action-level pass rate at parity with the base model. - Natural-language personality input. Training inputs are structured trait strings (
O=0.8, C=0.9, ...); free-text persona descriptions are untested. Direction: multi-view SFT over paraphrased and natural-language variants of the same anchors. - Behavior-level rigidity validation. The model outputs a per-anchor rigidity score; whether simulated movement frequency downstream actually tracks that score has not been demonstrated end-to-end. Direction: movement-plausibility supervision derived from the paper's human-rated data.
Progress on these will ship as separate follow-up releases, not as in-place weight updates to this repository, so results referencing this model remain reproducible.
Limitations
- Not validated for equivalence with the paper's generator. The paper's data and results were produced with a fine-tuned Gemini 2.5 Flash. This model is trained on the same SFT data but we have not re-run the paper's generation, validation, or downstream training with it. Distributional differences are expected. Provided as-is.
- The supervision covers 15 everyday objects and household room vocabularies from the underlying study; behavior outside that scope (novel objects, non-residential scenes, non-English prompts) is untested.
- Trait vectors are Big-Five scores in [0,1]; inputs outside this convention may degrade output quality.
Citation
@article{li2026personalize,
title = {When to Personalize Household Object Search: A Rigidity-Gated Hybrid Policy},
author = {Li, Xianyao and Wang, Yuhai and Xiao, Hu and Smith, Kaleb and Ye, Gilbert Yang and Du, Eric Jing},
journal = {arXiv preprint arXiv:2607.00022},
year = {2026}
}
Derived from Gemma. Gemma is provided by Google; use is subject to the base model's license and terms.
- Downloads last month
- 939