yukee1992 commited on
Commit
dc6fb2a
·
verified ·
1 Parent(s): 0d255d9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -13
app.py CHANGED
@@ -1,26 +1,32 @@
1
  import os
2
  import torch
3
- import gradio as gr
4
  import spaces
 
5
  from fastapi import FastAPI
6
  from transformers import AutoModelForCausalLM, AutoTokenizer
7
 
8
- # 1. 加载模型 Qwen2.5
9
  MODEL_NAME = "Qwen/Qwen2.5-1.5B-Instruct"
10
 
11
  print(f"Loading model {MODEL_NAME}...")
12
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
 
 
13
  model = AutoModelForCausalLM.from_pretrained(
14
  MODEL_NAME,
15
- torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
16
- device_map="auto"
17
  )
18
- print("Model loaded successfully!")
19
 
20
- # 2. 绑定 ZeroGPU 核心推理函数
21
  @spaces.GPU
22
  def generate_response(system_prompt: str, user_prompt: str, temperature: float = 0.7, max_tokens: int = 2048):
23
  try:
 
 
 
 
24
  messages = [
25
  {"role": "system", "content": system_prompt},
26
  {"role": "user", "content": user_prompt}
@@ -32,7 +38,7 @@ def generate_response(system_prompt: str, user_prompt: str, temperature: float =
32
  add_generation_prompt=True
33
  )
34
 
35
- inputs = tokenizer([prompt_text], return_tensors="pt").to(model.device)
36
 
37
  with torch.no_grad():
38
  outputs = model.generate(
@@ -50,21 +56,21 @@ def generate_response(system_prompt: str, user_prompt: str, temperature: float =
50
  except Exception as e:
51
  return f"Error: {str(e)}"
52
 
53
- # 3. 创建 FastAPI 实例
54
  app = FastAPI()
55
 
56
- # 4. 专供 n8n 调用的直连 POST 接口(不走 Gradio 队列)
57
  @app.post("/api/generate")
58
- async def api_generate(payload: dict):
59
- system_prompt = payload.get("system_prompt", "你是一个专业的小红书美食博主,只输出 JSON 数据。")
60
  user_prompt = payload.get("user_prompt", "")
61
  temperature = float(payload.get("temperature", 0.7))
62
  max_tokens = int(payload.get("max_tokens", 2048))
63
 
 
64
  result = generate_response(system_prompt, user_prompt, temperature, max_tokens)
65
  return {"result": result}
66
 
67
- # 5. 构建 Gradio 可视化界面
68
  with gr.Blocks() as demo:
69
  gr.Markdown("# 通用 LLM API Space (ZeroGPU)")
70
  sys_in = gr.Textbox(label="System Prompt", value="你是一个专业的小红书美食博主,只输出 JSON 数据。")
@@ -75,5 +81,5 @@ with gr.Blocks() as demo:
75
  btn = gr.Button("Submit")
76
  btn.click(fn=generate_response, inputs=[sys_in, user_in, temp_in, tokens_in], outputs=out)
77
 
78
- # 6. 将 Gradio 挂载到 FastAPI 根路径
79
  app = gr.mount_gradio_app(app, demo, path="/")
 
1
  import os
2
  import torch
 
3
  import spaces
4
+ import gradio as gr
5
  from fastapi import FastAPI
6
  from transformers import AutoModelForCausalLM, AutoTokenizer
7
 
8
+ # 1. 明确模型名称
9
  MODEL_NAME = "Qwen/Qwen2.5-1.5B-Instruct"
10
 
11
  print(f"Loading model {MODEL_NAME}...")
12
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
13
+
14
+ # 【关键点】ZeroGPU 启动时全局只能加载到 CPU / float16,不能直接分配 GPU
15
  model = AutoModelForCausalLM.from_pretrained(
16
  MODEL_NAME,
17
+ torch_dtype=torch.float16,
18
+ device_map="cpu"
19
  )
20
+ print("Model loaded successfully on CPU!")
21
 
22
+ # 2. ZeroGPU 核心推理函数(必须处于全局最外层)
23
  @spaces.GPU
24
  def generate_response(system_prompt: str, user_prompt: str, temperature: float = 0.7, max_tokens: int = 2048):
25
  try:
26
+ # 运行时把模型移入 ZeroGPU 动态分配的 GPU 中
27
+ device = "cuda" if torch.cuda.is_available() else "cpu"
28
+ model.to(device)
29
+
30
  messages = [
31
  {"role": "system", "content": system_prompt},
32
  {"role": "user", "content": user_prompt}
 
38
  add_generation_prompt=True
39
  )
40
 
41
+ inputs = tokenizer([prompt_text], return_tensors="pt").to(device)
42
 
43
  with torch.no_grad():
44
  outputs = model.generate(
 
56
  except Exception as e:
57
  return f"Error: {str(e)}"
58
 
59
+ # 3. 创建 FastAPI 实例(供 n8n 直连)
60
  app = FastAPI()
61
 
 
62
  @app.post("/api/generate")
63
+ def api_generate(payload: dict):
64
+ system_prompt = payload.get("system_prompt", "你是专业的小红书美食博主。")
65
  user_prompt = payload.get("user_prompt", "")
66
  temperature = float(payload.get("temperature", 0.7))
67
  max_tokens = int(payload.get("max_tokens", 2048))
68
 
69
+ # 直接调用全局 @spaces.GPU 装饰的函数
70
  result = generate_response(system_prompt, user_prompt, temperature, max_tokens)
71
  return {"result": result}
72
 
73
+ # 4. 构建 Gradio 可视化 UI
74
  with gr.Blocks() as demo:
75
  gr.Markdown("# 通用 LLM API Space (ZeroGPU)")
76
  sys_in = gr.Textbox(label="System Prompt", value="你是一个专业的小红书美食博主,只输出 JSON 数据。")
 
81
  btn = gr.Button("Submit")
82
  btn.click(fn=generate_response, inputs=[sys_in, user_in, temp_in, tokens_in], outputs=out)
83
 
84
+ # 挂载 Gradio 页面
85
  app = gr.mount_gradio_app(app, demo, path="/")