File size: 3,324 Bytes
832c4a9
658af68
b9e87be
2bb32bf
b9e87be
 
658af68
8fc2b5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba7d918
8fc2b5b
 
 
 
efa5b9e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee7c5db
832c4a9
 
aa6fb2d
efa5b9e
 
 
 
 
aa6fb2d
ee7c5db
 
7d93b52
ee7c5db
 
 
832c4a9
ee7c5db
 
 
 
 
 
 
 
 
 
 
 
 
0af3958
 
658af68
ee7c5db
 
 
 
658af68
 
ee7c5db
 
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
import spaces  # 必须在最顶部导入
import gradio as gr
import os

# 获取 Hugging Face 访问令牌
hf_token = os.getenv("HF_API_TOKEN")

# 定义模型名称
model_name = "larry1129/WooWoof_AI"

# 定义全局变量用于缓存模型和分词器
model = None
tokenizer = None

# 定义提示生成函数
def generate_prompt(instruction, input_text="", output_text=None):
    if input_text:
        prompt = f"""### Instruction:
{instruction}

### Input:
{input_text}

### Response:
"""
    else:
        prompt = f"""### Instruction:
{instruction}

### Response:
"""
    if output_text:
        prompt += f"{output_text}{tokenizer.eos_token}"
    return prompt

# 定义生成响应的函数,并使用 @spaces.GPU 装饰
@spaces.GPU(duration=40)
def generate_response(instruction, input_text):
    global model, tokenizer

    if model is None:
        print("开始加载模型...")
        try:
            # 在函数内部导入需要 GPU 的库
            import torch
            from transformers import AutoTokenizer, AutoModelForCausalLM

            # 加载分词器
            tokenizer = AutoTokenizer.from_pretrained(model_name, use_auth_token=hf_token)
            print("分词器加载成功。")

            # 加载模型
            model = AutoModelForCausalLM.from_pretrained(
                model_name,
                device_map="auto",
                torch_dtype=torch.float16,
                use_auth_token=hf_token,
            )
            print("模型加载成功。")

            # 设置 pad_token
            tokenizer.pad_token = tokenizer.eos_token
            model.config.pad_token_id = tokenizer.pad_token_id

            # 切换到评估模式
            model.eval()
            print("模型已切换到评估模式。")
        except Exception as e:
            print("加载模型时出错:", e)
            raise e  # 重新抛出异常,以便在日志中看到完整的错误信息
    else:
        # 在函数内部导入需要的库
        import torch

    # 检查 model 和 tokenizer 是否已正确加载
    if model is None or tokenizer is None:
        print("模型或分词器未正确加载。")
        raise ValueError("模型或分词器未正确加载。")

    # 生成提示
    prompt = generate_prompt(instruction, input_text)
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    with torch.no_grad():
        outputs = model.generate(
            input_ids=inputs["input_ids"],
            attention_mask=inputs.get("attention_mask"),
            max_new_tokens=128,
            temperature=0.7,
            top_p=0.95,
            do_sample=True,
        )
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    response = response.split("### Response:")[-1].strip()
    return response

# 创建 Gradio 接口
iface = gr.Interface(
    fn=generate_response,
    inputs=[
        gr.Textbox(lines=2, placeholder="请输入指令...", label="Instruction"),
        gr.Textbox(lines=2, placeholder="如果有额外输入,请在此填写...", label="Input (可选)")
    ],
    outputs="text",
    title="WooWoof AI 交互式聊天",
    description="基于 LLAMA 3.1 的大语言模型,支持指令和可选输入。",
    allow_flagging="never"
)

# 启动 Gradio 接口
iface.launch()