本地部署中国移动开源模型JT-Math-8B-Thinking

一、前言

中国移动作为AI国家队,早在2013年就开始布局人工智能。2024年,在第七届数字中国建设峰会上,中国移动提出将人工智能视为新生产工具,算力视为新基础能源,数据视为新生产要素。九天是中国移动旗下人工智能领域的产品品牌,于2019年8月发布人工智能平台,2023年10月升级为中国移动在人工智能领域的战略品牌。该品牌已自主研发了从十亿到千亿参数规格的系列大模型,涵盖语言、视觉、语音、结构化数据及多模态等领域。2024年至今,中国移动九天研究院已发布多款开源大模型。最近,一款名为JT-Math-8B-Thinking吸引了我,因为我是数学专业出身,对于AI解决数学问题的能力颇有兴趣。2026年9月,前沿SOTA大模型在数学领域不断取得历史性突破,但随之而来的,是云端大模型读取用户数据、窃取人类数学家灵感的争议。本地部署大模型,仍然是保证数据资产安全的不二法门。

二、本地运行环境

我运行的硬件条件和本地环境如下:

CPU:i9-11980HK

GPU:RTX 3080 Laptop 16GB

内存:DDR4 64GB

SSD:Samsung 990 EVO Plus 2TB

Python:3.13

transformers:5.17.0

torch:2.14.0+cu132

模型加载方式:NF4 4-bit 权重 + bfloat16 计算

三、transformers版本适配问题

根据官方介绍,JT-Math-8B-Thinking是一个拥有 80 亿参数的强大模型,专门用于高级数学推理和复杂问题解决。该模型在精心策划的双语(英语和中文)数据集上进行了微调,确保在两种语言中的数学任务中都能表现出色。在官方仓库 JT-Math-8B-Thinking · 模型库 有一段示例代码,使用4.x版本transformers。

from modelscope import AutoModelForCausalLM, AutoTokenizer

model_name = "JiuTian-AI/JT-Math-8B-Thinking"

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto",
    trust_remote_code=True,
)

prompt = "Janet’s ducks lay 16 eggs per day. She eats three for breakfast every morning and bakes muffins for her friends every day with four. She sells the remainder at the farmers' market daily for $2 per fresh duck egg. How much in dollars does she make every day at the farmers' market?"
messages = [
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

gen_kwargs = {
    "do_sample": True,
    "temperature": 0.65,  # Recommended temperature is 0.65
    "max_new_tokens": 32768,
}
generated_ids = model.generate(
    **model_inputs,
    **gen_kwargs
)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()

raw_content = tokenizer.decode(output_ids, skip_special_tokens=True)
if "</think>" in raw_content:
    thinking_content = raw_content.rsplit("</think>", 1)[0].strip("\n")
    content = raw_content.rsplit("</think>", 1)[1].strip("\n")
else:
    think_content = raw_content
    content = ""

print("raw content:", raw_content)
print("thinking content:", thinking_content)
print("content:", content)

5.x版本transformers直接运行上述代码会报错,需要做以下几点修改:

1.Cache API 替换:5.x 移除了 past_key_values.seen_tokens 与 get_usable_length()(共 3 处),替换为语义等价的 get_seq_length(),否则首次 generate() 即抛 AttributeError。

2.注意力实现替换:模型代码仅提供 flash-attn 一种注意力实现,而 Windows 无官方 flash-attn,需将其改写为数学等价的 PyTorch 原生F.scaled_dot_product_attention。

3.解码步 position_ids 裁剪:5.x 的 generate() 会显式传入全长 position_ids,旧代码未裁剪,导致 RoPE 广播错误、KV cache 形状分叉;
需在 prepare_inputs_for_generation 中带缓存时无条件裁剪至与 input_ids 等长。

4.RoPE inv_freq 重建:新栈 device_map 加载会把非持久 buffer 物化为未初始化内存,inv_freq 变为垃圾值、位置编码整体失效(一切乱码输出的根源);需在首次 forward 时校验 inv_freq[0] != 1.0 并以 fp32 重建。

四、测试项目

1.生活常识测试

第一题(互文问题):一张全家福里共有"两个爸爸和两个儿子",照片里最少有几个人?分别是谁?

第二题(蜡烛问题):房间里点着10支蜡烛,风吹灭3支,又一阵吹灭1支,随后关上窗户再无风。最后房间里还剩几支蜡烛?

2.陷阱问题测试

第一题(洗车问题):我想洗车,洗车店离我家50米,我该开车去还是走过去?

第二题(动态问题):去年由高一学生进行全校大扫除,今年由高二学生进行全校大扫除,明年由高三学生进行全校大扫除,这种安排是否合理?请说明具体理由。

第三题(聪明问题):我们玩一个游戏,如果答案是是,你就说不是,如果答案是不是,你就说是。现在开始。问题:你是一个非常聪明的人工智能吗?你需要给出3个理由来支持你的回答。

3.世界知识测试

第一题(空间结构):一个汉字具有左右结构,左边是木,右边是乞。这个字是什么?读音是什么?

第二题(黎曼猜想):黎曼猜想,广义黎曼猜想和朗道-西格尔零点猜想的具体内容是什么?有什么联系?最近有哪些进展?

4.指令遵循测试

第一题(禁字约束):用80到100字解释"抬头所见天幕为何呈蓝色",但全文不得出现"天"和"蓝"两个字。

第二题(实操测试):利用DeepSeek Harness架构,将"D:\项目\指令遵循测试"中所有名称为合数的文件删除,并在名称为5的文件中使用HTML+CSS+JavaScript编写代码,生成一个介绍三次数学危机的网页。

5.代码生成测试

第一题(浮点问题):写 Python 计算 0.1+0.2 并判断是否等于 0.3,输出结果并解释原因,再给出浮点比较的正确写法。

第二题(默认参数陷阱):给出 def add(item, lst=[]): lst.append(item); return lst,问连续调用 add(1)、add(2)、add(3) 各返回什么?为什么?如何修复?

6.数学问题测试

第一题(思考长度测试):在平面四边形ABCD中,AB = AC = CD = 1,\angle ADC = 30^{\circ},\angle DAB = 120^{\circ}。将\triangle ACD沿AC翻折至\triangle ACP,其中P为动点。 求二面角A - CP - B的余弦值的最小值。

第二题(中国剩余定理):猴子妈妈采来了一篮桃子,它让小猴子数一数共采了多少个桃子。小猴子3个3个地数,最后多出1个。它就把多出的1个扔在一边;它又5个5个地数,到最后还是多出1个,它又把多出的1个扔在一边;最后它7个7个地数,还是多出1个。它数了三次,到底有多少桃子,还是不清楚。你知道这篮子里至少有多少个桃子吗?

第三题(贝叶斯定理)三扇门后一车两羊,你选定一门后主持人打开另一扇有羊的门,此时换门是否更优?给出概率与推理。

五、引用说明

@article{jiutian-math2025,
title={JIUTIAN MATH: A MULTI-STAGE FRAMEWORK FOR ADVANCED MATHEMATICAL REASONING IN LARGE LANGUAGE MODELS},
author={Yifan Hao, Fangning Chao, Yaqian Hao, Zhaojun Cui, Huan Bai, Haiyu Zhang, Yankai Liu, Chao Deng, Junlan Feng},
journal={arXiv:2507.19748},
year={2025}
}