kibiddd/CAT-Qwen-v2
CAT-Qwen-v2 — LoRA adapter for Qwen3.6-27B
A LoRA adapter trained with CAT (adversarial honesty training) on top of [Qwen/Qwen3.6-27B](https://huggingface.co/Qwen/Qwen3.6-27B), revision 6a9e13bd6fc8f0983b9b99948120bc37f49c13e9.
This is run ul9287, epoch 2 (checkpoint-110).
What changed from [CAT-Qwen](https://huggingface.co/kibiddd/CAT-Qwen) (v1). Identical training configuration — same LoRA shape, same learning rate, same adversarial/utility mix. The only difference is the utility anchor: v1 used an on-policy Magpie set that turned out to be ~88% Coding & Debugging, while v2 uses a task-diverse on-policy set (information seeking, role play, creative writing, brainstorming, planning, advice seeking; coding ~7%) whose responses are also roughly twice as long.
Contents
Why there are two copies. PEFT saves adapter tensors under base_model.model.model.layers.*. vLLM builds this model as Qwen3_5ForConditionalGeneration, whose language modules sit one level deeper — base_model.model.language_model.model.layers.* — and it validates only the last component of each tensor path, so loading the standard adapter under vLLM matches nothing, raises no error, and silently returns pure base-model output. vllm/ holds the same tensors with the key namespace rewritten (header only; the tensor bytes are byte-identical). Use it if you serve with vLLM.
Usage
With peft:
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
base = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3.6-27B", revision="6a9e13bd6fc8f0983b9b99948120bc37f49c13e9",
torch_dtype="bfloat16", device_map="auto",
)
model = PeftModel.from_pretrained(base, "kibiddd/CAT-Qwen-v2")
tok = AutoTokenizer.from_pretrained("kibiddd/CAT-Qwen-v2")With vLLM — download the vllm/ subfolder and pass it as a LoRA:
from huggingface_hub import snapshot_download
from vllm import LLM, SamplingParams
from vllm.lora.request import LoRARequest
path = snapshot_download("kibiddd/CAT-Qwen-v2", allow_patterns="vllm/*")
llm = LLM(model="Qwen/Qwen3.6-27B", enable_lora=True, max_lora_rank=64,
tensor_parallel_size=2, enforce_eager=True)
out = llm.generate("Hello", SamplingParams(temperature=0.7, max_tokens=512),
lora_request=LoRARequest("cat", 1, f"{path}/vllm"))enforce_eager=True is needed on this architecture: CUDA-graph capture fails during engine startup with an illegal memory access.
Training
Generated with enable_thinking=False; the adapter is trained for non-thinking use.
