Views
No views yet
google/gemma-4-E2B-it (2.7B params) for the Canvas Calendar Agent project. Trained with Direct Preference Optimization (Rafailov et al., 2023, arXiv:2305.18290) on top of an SFT-trained checkpoint.<|tool_call>call:tool.name{args}<tool_call|>) for 18 Canvas/Calendar/Study tools.| Stage | Method | Data | Wall time |
|---|---|---|---|
| SFT | Full-parameter fine-tuning | 181 trajectory rows from Canvas sessions | ~12 min |
| DPO | β=0.1, sigmoid loss, frozen-snapshot reference | 1,071 preference pairs labeled by Gemma-4-31B-IT-NVFP4 teacher (3-vote majority at temp=0) | 9:03 |
1DPOConfig(
2 loss_type="sigmoid", # original DPO loss (Rafailov §4)
3 beta=0.1, # KL implicit coefficient
4 num_train_epochs=1,
5 per_device_train_batch_size=1,
6 gradient_accumulation_steps=8, # effective batch = 8
7 learning_rate=5e-6,
8 bf16=True,
9 sync_ref_model=False, # freeze ref at init
10 precompute_ref_log_probs=True,
11 optim="adamw_torch",
12)precompute_ref_log_probs=True. Mathematically equivalent to the paper's π_ref = π_SFT.| Metric | Final value |
|---|---|
train_loss | 0.2229 |
rewards/accuracies | 0.9032 |
rewards/margins | 5.142 |
rewards/chosen | -3.362 |
rewards/rejected | -8.504 |
logps/chosen | -238.5 |
logps/rejected | -328.9 |
entropy | 1.01 |
google/gemma-4-E2B-it (2.7B params, decoder-only Transformer)<|tool_call>call:NAME{ARGS}<tool_call|>)nvcr.io/nvidia/pytorch:25.11-py3. TRL 1.1, Transformers 4.47+, PyTorch 2.10 nightly.1from transformers import AutoModelForCausalLM, AutoTokenizer
2import torch
3
4model = AutoModelForCausalLM.from_pretrained(
5 "kleinpanic93/canvas-calendar-agent-v7-dpo",
6 torch_dtype=torch.bfloat16,
7 device_map="auto",
8)
9tokenizer = AutoTokenizer.from_pretrained("kleinpanic93/canvas-calendar-agent-v7-dpo")
10
11messages = [
12 {"role": "system", "content": "You are a Canvas calendar agent. ..."},
13 {"role": "user", "content": "What assignments do I have due this week?"},
14]
15inputs = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True).to(model.device)
16out = model.generate(inputs, max_new_tokens=512, do_sample=False)
17print(tokenizer.decode(out[0][inputs.shape[1]:], skip_special_tokens=False))<|tool_call>...<tool_call|> delimiters that the canvas_sdk.tool_parser decodes into structured tool calls.1pip install canvas-sdk[autodownload]
2python -m canvas_sdk.demo "Plan my study schedule for next week"@COURSE_n tokens.@PROF_EMAIL/@CONTACT_EMAIL/@PHONE/@PROFn/@STUDENTn/@LOCn. spaCy NER + custom regex.<|tool_call>...<tool_call|> delimiters.1@article{rafailov2023dpo,
2 title={Direct Preference Optimization: Your Language Model is Secretly a Reward Model},
3 author={Rafailov, Rafael and Sharma, Archit and Mitchell, Eric and Ermon, Stefano and Manning, Christopher D and Finn, Chelsea},
4 journal={NeurIPS},
5 year={2023},
6 url={https://arxiv.org/abs/2305.18290}
7}kleinpanic/CS3704-DPO-SSOT — training pipelinekleinpanic/CS3704-Canvas-Project — agentic harness, GitHub Pages demo