|
|
|
""" |
|
Deep debugging of the chat template issue. |
|
""" |
|
|
|
import transformers |
|
from transformers import AutoTokenizer |
|
import jinja2 |
|
import json |
|
|
|
MODEL_PATH = "/home/hotaisle/workspace/models/DeepSeek-R1-0528" |
|
|
|
print(f"Transformers version: {transformers.__version__}") |
|
print("-" * 60) |
|
|
|
|
|
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH) |
|
|
|
|
|
print("\nTest 1: Checking tokenizer's apply_chat_template signature") |
|
import inspect |
|
sig = inspect.signature(tokenizer.apply_chat_template) |
|
print(f"Parameters: {list(sig.parameters.keys())}") |
|
|
|
|
|
print("\n\nTest 2: Manual Jinja2 template application") |
|
try: |
|
from jinja2 import Environment, BaseLoader |
|
|
|
|
|
env = Environment(loader=BaseLoader()) |
|
template_str = tokenizer.chat_template |
|
template = env.from_string(template_str) |
|
|
|
|
|
messages = [{"role": "user", "content": "What is 2+2?"}] |
|
|
|
|
|
output = template.render( |
|
messages=messages, |
|
bos_token=tokenizer.bos_token, |
|
eos_token=tokenizer.eos_token, |
|
add_generation_prompt=True, |
|
enable_thinking=False |
|
) |
|
|
|
print(f"Manual render with enable_thinking=False:") |
|
print(f"Output ends with: {repr(output[-130:])}") |
|
print(f"Contains empty think block: {'<think>\\n\\n</think>\\n\\n' in output}") |
|
|
|
except Exception as e: |
|
print(f"Error in manual rendering: {e}") |
|
|
|
|
|
print("\n\nTest 3: Analyzing template condition") |
|
template_str = tokenizer.chat_template |
|
enable_thinking_idx = template_str.find("enable_thinking") |
|
if enable_thinking_idx != -1: |
|
|
|
start = template_str.rfind("{%", 0, enable_thinking_idx) |
|
end = template_str.find("%}", enable_thinking_idx) + 2 |
|
condition = template_str[start:end] |
|
print(f"Found condition: {condition}") |
|
|
|
|
|
if "is false" in condition: |
|
print("✓ Uses 'is false' (correct for Jinja2)") |
|
elif "== false" in condition: |
|
print("⚠ Uses '== false' (might need 'is false')") |
|
elif "== False" in condition: |
|
print("⚠ Uses '== False' (Python style, might need 'is false')") |
|
|
|
|
|
print("\n\nTest 4: Testing different parameter passing methods") |
|
|
|
|
|
try: |
|
result1 = tokenizer.apply_chat_template( |
|
messages, |
|
tokenize=False, |
|
add_generation_prompt=True, |
|
enable_thinking=False |
|
) |
|
print("Method 1 (kwargs): Works") |
|
except Exception as e: |
|
print(f"Method 1 (kwargs): Error - {e}") |
|
|
|
|
|
try: |
|
result2 = tokenizer.apply_chat_template( |
|
messages, |
|
tokenize=False, |
|
add_generation_prompt=True, |
|
**{"enable_thinking": False} |
|
) |
|
print("Method 2 (dict unpacking): Works") |
|
except Exception as e: |
|
print(f"Method 2 (dict unpacking): Error - {e}") |
|
|
|
|
|
print("\n\nTest 5: Checking transformers version compatibility") |
|
print(f"Current version: {transformers.__version__}") |
|
print("Note: Custom chat template parameters require transformers >= 4.34.0") |
|
|
|
|
|
version_parts = transformers.__version__.split('.') |
|
major = int(version_parts[0]) |
|
minor = int(version_parts[1].split('.')[0] if '.' in version_parts[1] else version_parts[1]) |
|
if major > 4 or (major == 4 and minor >= 34): |
|
print("✓ Version should support custom parameters") |
|
else: |
|
print("✗ Version too old for custom parameters!") |
|
|
|
|
|
print("\n\nTest 6: Testing a simpler template modification") |
|
print("If all else fails, you could modify the template to always inject empty think") |
|
print("when a specific string is in the user message, like 'NOTHINK'") |
|
|