cazyundee commited on
Commit
8f2c140
·
verified ·
1 Parent(s): ca39a8e

Diagnose Qwen generation termination

Browse files
Files changed (1) hide show
  1. app.py +35 -5
app.py CHANGED
@@ -597,7 +597,7 @@ def _load_qwen38():
597
  return processor, model
598
 
599
 
600
- def _generate_qwen38(prompt, max_new_tokens=64, temperature=0.7, thinking=False):
601
  processor, model = _load_qwen38()
602
  max_new_tokens = max(1, min(256, int(max_new_tokens)))
603
  temperature = max(0.0, min(2.0, float(temperature)))
@@ -614,6 +614,10 @@ def _generate_qwen38(prompt, max_new_tokens=64, temperature=0.7, thinking=False)
614
  text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
615
  inputs = processor(text=[text], return_tensors="pt")
616
  inputs = {key: value.to("cpu") if hasattr(value, "to") else value for key, value in inputs.items()}
 
 
 
 
617
  t0 = time.time()
618
  with torch.inference_mode():
619
  output = model.generate(
@@ -621,12 +625,38 @@ def _generate_qwen38(prompt, max_new_tokens=64, temperature=0.7, thinking=False)
621
  max_new_tokens=max_new_tokens,
622
  do_sample=temperature > 0,
623
  temperature=max(temperature, 0.01),
 
 
 
 
624
  )
625
  elapsed = max(time.time() - t0, 0.001)
626
- input_tokens = int(inputs["input_ids"].shape[-1])
627
- generated = output[0, input_tokens:]
628
- answer = processor.tokenizer.decode(generated, skip_special_tokens=True).strip()
629
- return {"text": answer, "prompt_tokens": input_tokens, "completion_tokens": int(generated.shape[-1]), "generation_tokens_per_sec": round(float(generated.shape[-1]) / elapsed, 2), "inference_time_sec": round(elapsed, 3), "device": "cpu", "dtype": "bfloat16", "thinking": bool(thinking)}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
630
 
631
 
632
  def _load_tinyllama():
 
597
  return processor, model
598
 
599
 
600
+ def _generate_qwen38(prompt, max_new_tokens=256, temperature=0.7, thinking=True):
601
  processor, model = _load_qwen38()
602
  max_new_tokens = max(1, min(256, int(max_new_tokens)))
603
  temperature = max(0.0, min(2.0, float(temperature)))
 
614
  text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
615
  inputs = processor(text=[text], return_tensors="pt")
616
  inputs = {key: value.to("cpu") if hasattr(value, "to") else value for key, value in inputs.items()}
617
+ tokenizer = processor.tokenizer
618
+ eos_id = tokenizer.eos_token_id
619
+ pad_id = tokenizer.pad_token_id if tokenizer.pad_token_id is not None else eos_id
620
+ input_tokens = int(inputs["input_ids"].shape[-1])
621
  t0 = time.time()
622
  with torch.inference_mode():
623
  output = model.generate(
 
625
  max_new_tokens=max_new_tokens,
626
  do_sample=temperature > 0,
627
  temperature=max(temperature, 0.01),
628
+ eos_token_id=eos_id,
629
+ pad_token_id=pad_id,
630
+ return_dict_in_generate=True,
631
+ output_scores=True,
632
  )
633
  elapsed = max(time.time() - t0, 0.001)
634
+ sequences = output.sequences
635
+ generated = sequences[0, input_tokens:]
636
+ eos_positions = (generated == eos_id).nonzero(as_tuple=True)[0].tolist() if eos_id is not None else []
637
+ answer = tokenizer.decode(generated, skip_special_tokens=True).strip()
638
+ return {
639
+ "text": answer,
640
+ "prompt_tokens": input_tokens,
641
+ "completion_tokens": int(generated.shape[-1]),
642
+ "generation_tokens_per_sec": round(float(generated.shape[-1]) / elapsed, 2),
643
+ "inference_time_sec": round(elapsed, 3),
644
+ "device": "cpu",
645
+ "dtype": "bfloat16",
646
+ "thinking": bool(thinking),
647
+ "debug": {
648
+ "rendered_chat_template": text,
649
+ "input_ids": inputs["input_ids"][0].tolist(),
650
+ "generated_token_ids": generated.tolist(),
651
+ "eos_token_id": eos_id,
652
+ "pad_token_id": pad_id,
653
+ "eos_positions": eos_positions,
654
+ "sequence_length": int(sequences.shape[-1]),
655
+ "max_new_tokens": max_new_tokens,
656
+ "scores_steps": len(output.scores) if output.scores is not None else 0,
657
+ "finish_reason": "eos" if eos_positions else ("length" if generated.shape[-1] >= max_new_tokens else "unknown"),
658
+ },
659
+ }
660
 
661
 
662
  def _load_tinyllama():