Spaces:
Sleeping
Sleeping
File size: 4,771 Bytes
346b1be 40cee53 346b1be 40cee53 346b1be 40cee53 346b1be 40cee53 346b1be 40cee53 346b1be 4e39b88 346b1be 4e39b88 346b1be 4e39b88 346b1be 40cee53 346b1be 4e39b88 346b1be 100fb2e 93d1e6b 346b1be |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
"""
HuggingFace Spaces 推理应用
使用 Gradio 创建交互式界面
"""
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 模型配置
MODEL_NAME = "zhman/llama-SFT-GRPO"
# 加载模型和分词器(CPU 优化版本)
print("🔄 加载模型...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
# CPU 模式:使用 float32,不使用量化
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float32, # CPU 友好的数据类型
low_cpu_mem_usage=True, # 降低内存使用
)
print("✅ 模型加载完成!")
def solve_math_problem(question, max_length=512, temperature=0.7, top_p=0.9):
"""
解决数学问题
Args:
question: 数学问题
max_length: 最大生成长度
temperature: 温度参数
top_p: Top-p 采样参数
Returns:
str: 模型生成的答案
"""
# 构造提示词
prompt = f"问题:{question}\n答案:"
# 编码输入
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
# 生成回答
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=min(max_length, 256), # 限制生成长度以加快速度
temperature=temperature,
top_p=top_p,
do_sample=True,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id
)
# 解码输出
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 清理和提取答案
# 1. 移除输入的问题部分
if "答案:" in generated_text:
answer = generated_text.split("答案:", 1)[1].strip()
else:
answer = generated_text.replace(prompt, "").strip()
# 2. 清理训练格式文本
# 移除包含这些关键词的行(训练数据格式)
cleanup_keywords = [
"运算符", "运算方法", "运算公式", "运算步骤",
"左值", "右值", "中值", "结果值",
"Step", "步骤编号",
]
# 分行处理
lines = answer.split('\n')
cleaned_lines = []
for line in lines:
line = line.strip()
# 跳过空行
if not line:
continue
# 跳过包含训练格式关键词的行
if any(keyword in line for keyword in cleanup_keywords):
continue
# 保留这一行
cleaned_lines.append(line)
# 合并清理后的行,最多保留前 3 行
if cleaned_lines:
final_answer = '\n'.join(cleaned_lines[:3])
else:
# 如果全部被清理,返回原始答案的前 200 字符
final_answer = answer[:200]
return final_answer
# 创建 Gradio 界面
demo = gr.Interface(
fn=solve_math_problem,
inputs=[
gr.Textbox(
label="💬 请输入您的数学问题",
placeholder="例如:一个长方形的长是8厘米,宽是5厘米,它的周长是多少?",
lines=3
),
gr.Slider(
minimum=50,
maximum=512,
value=256, # 降低默认值以加快 CPU 推理
step=50,
label="📏 最大长度"
),
gr.Slider(
minimum=0.0,
maximum=2.0,
value=0.7,
step=0.1,
label="🌡️ Temperature"
),
gr.Slider(
minimum=0.0,
maximum=1.0,
value=0.9,
step=0.05,
label="🎯 Top P"
)
],
outputs=gr.Textbox(
label="✨ AI 回答",
lines=5
),
title="🧮 数学问题求解 AI",
description="""
基于 Llama-3.2-1B-Instruct 微调的数学问题求解模型。
**使用方法**:
1. 在输入框中输入您的数学问题
2. 调整推理参数(可选)
3. 点击 Submit 获取答案
**模型信息**:
- 基础模型:Llama-3.2-1B-Instruct
- 微调任务:数学推理和问题求解
""",
examples=[
["Find the positive integer $n$ such that $10^n$ cubic centimeters is the same as 1 cubic kilometer.", 256, 0.7, 0.9],
["Define an operation $\\Diamond$ as $ a \\Diamond b = 12a - 10b.$ Compute the value of $((((20 \\Diamond 22) \\Diamond 22) \\Diamond 22) \\Diamond22).$", 256, 0.7, 0.9],
["S1.1 Let $a, b, c$ and $d$ be the distinct roots of the equation $x^{4}-15 x^{2}+56=0$. If $R=a^{2}+b^{2}+c^{2}+d^{2}$, find the value of $R$.", 256, 0.7, 0.9]
],
cache_examples=False, # 禁用示例缓存,避免启动时卡住
theme=gr.themes.Soft()
)
# 启动应用
if __name__ == "__main__":
demo.launch()
|