"""Reproduction du signalement de Nelson (01/10/2026) : vLLM incoherent sous CC ON sur VM H100 confidentielle ?
Meme modele (Qwen2.5-1.5B-Instruct), decodage glouton, 6 questions, HF transformers vs vLLM.
  python vllm_cc_test.py hf | vllm-default | vllm-eager | vllm-fp32
"""
import json, sys, time
MODEL = "Qwen/Qwen2.5-1.5B-Instruct"
QUESTIONS = [
    "What is the capital of France? Answer in one word.",
    "What is 17 + 25? Answer with the number only.",
    "Name three primary colors, separated by commas.",
    "Translate 'good morning' into French.",
    "In one sentence, what does a CPU do?",
    "Write the word 'banana' backwards.",
]
mode = sys.argv[1]
t0 = time.time()
if mode == "hf":
    import torch
    from transformers import AutoModelForCausalLM, AutoTokenizer
    tok = AutoTokenizer.from_pretrained(MODEL)
    m = AutoModelForCausalLM.from_pretrained(MODEL, dtype=torch.bfloat16).cuda().eval()
    outs = []
    for q in QUESTIONS:
        enc = tok.apply_chat_template([{"role": "user", "content": q}], add_generation_prompt=True, return_tensors="pt", return_dict=True)
        ids = enc["input_ids"].cuda()
        with torch.no_grad():
            g = m.generate(ids, attention_mask=enc["attention_mask"].cuda(), max_new_tokens=48, do_sample=False)
        outs.append(tok.decode(g[0, ids.shape[1]:], skip_special_tokens=True).strip())
    meta = {"torch": torch.__version__, "cuda": torch.version.cuda}
else:
    from vllm import LLM, SamplingParams
    import vllm, torch
    kw = {"enforce_eager": mode == "vllm-eager", "gpu_memory_utilization": 0.6, "max_model_len": 2048}
    if mode == "vllm-fp32":
        kw["dtype"] = "float32"
    llm = LLM(model=MODEL, **kw)
    sp = SamplingParams(temperature=0, max_tokens=48)
    res = llm.chat([[{"role": "user", "content": q}] for q in QUESTIONS], sp)
    outs = [r.outputs[0].text.strip() for r in res]
    meta = {"vllm": vllm.__version__, "torch": torch.__version__, "cuda": torch.version.cuda, **{k: str(v) for k, v in kw.items()}}
print(json.dumps({"mode": mode, "secondes": round(time.time() - t0, 1), "meta": meta, "reponses": outs}, ensure_ascii=False))
