ankitxraj21 commited on
Commit
d9dab8d
·
verified ·
1 Parent(s): d8ff130

Update inference.py

Browse files
Files changed (1) hide show
  1. inference.py +73 -43
inference.py CHANGED
@@ -1,19 +1,20 @@
1
  import os
2
- import asyncio
3
  import json
 
4
  from dotenv import load_dotenv
5
  from openai import OpenAI
6
  from environment import CloudCostEnv
7
- from flask import Flask, jsonify, request # ADD THIS
8
 
9
  load_dotenv()
10
 
11
- app = Flask(__name__) # ADD THIS
12
- env = None # ADD THIS - global env
 
13
 
14
  # --- MANDATORY LOGGING FUNCTIONS (Don't Change) ---
15
- def log_start(task: str, env: str, model: str) -> None:
16
- print(f"[START] task={task} env={env} model={model}", flush=True)
17
 
18
  def log_step(step: int, action: str, reward: float, done: bool, error=None) -> None:
19
  error_val = error if error else "null"
@@ -27,7 +28,20 @@ def log_end(success: bool, steps: int, score: float, rewards: list) -> None:
27
  # --- SYSTEM PROMPT ---
28
  SYSTEM_PROMPT = "You are a Cloud Infrastructure AI. Manage the cluster by choosing actions: 0(Stay), 1(Add Server), 2(Remove), 3(Toggle Spot). Reply with ONLY the integer."
29
 
30
- # --- LLM ACTION FUNCTION ---
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  async def get_action_from_llama(state):
32
  api_base = os.getenv("API_BASE_URL")
33
  api_key = os.getenv("HF_TOKEN")
@@ -50,52 +64,69 @@ async def get_action_from_llama(state):
50
  except Exception as e:
51
  return 0, f"Error: {str(e)}"
52
 
53
- # ============================================
54
- # ADD THESE 3 ROUTES — THIS IS THE FIX
55
- # ============================================
 
 
56
 
57
- @app.route('/reset', methods=['POST']) # <-- FIXES your error
58
  def reset():
59
  global env
60
- loop = asyncio.new_event_loop()
61
- asyncio.set_event_loop(loop)
62
- env = CloudCostEnv(task="medium")
63
- state = loop.run_until_complete(env.reset())
64
- log_start(task="daily_peaks", env="CloudEnv-v1", model=os.getenv("MODEL_NAME"))
65
- state_data = state.model_dump_json() if hasattr(state, 'model_dump_json') else str(state)
66
- return jsonify({"status": "ok", "state": json.loads(state_data)}), 200
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
  @app.route('/step', methods=['POST'])
69
  def step():
70
  global env
71
- data = request.get_json()
72
- action = int(data.get("action", 0))
73
- loop = asyncio.new_event_loop()
74
- asyncio.set_event_loop(loop)
75
- state, reward, done = loop.run_until_complete(env.step(action))
76
- log_step(step=1, action=str(action), reward=reward, done=done)
77
- state_data = state.model_dump_json() if hasattr(state, 'model_dump_json') else str(state)
78
- return jsonify({"state": json.loads(state_data), "reward": reward, "done": done}), 200
79
-
80
- @app.route('/health', methods=['GET'])
81
- def health():
82
- return jsonify({"status": "ok"}), 200
83
-
84
- # ============================================
 
 
 
 
 
 
 
 
85
 
86
- # --- ORIGINAL TERMINAL TESTING (unchanged) ---
87
  async def main():
88
- api_base = os.getenv("API_BASE_URL")
89
- api_key = os.getenv("HF_TOKEN")
90
  model_name = os.getenv("MODEL_NAME")
91
-
92
  task_id = "daily_peaks"
93
  env_local = CloudCostEnv(task="medium")
94
- log_start(task=task_id, env="CloudEnv-v1", model=model_name)
95
-
96
  rewards = []
97
  state = await env_local.reset()
98
-
99
  try:
100
  for step_num in range(1, 21):
101
  action_int, action_text = await get_action_from_llama(state)
@@ -104,14 +135,13 @@ async def main():
104
  rewards.append(reward)
105
  if done:
106
  break
107
-
108
  avg_score = sum(rewards) / len(rewards) if rewards else 0
109
- log_end(success=(avg_score >= 0.7), steps=len(rewards), score=avg_score, rewards=rewards)
 
110
  except Exception as e:
111
  log_step(step=0, action="error", reward=0.0, done=True, error=str(e))
112
  finally:
113
  await env_local.close()
114
 
115
  if __name__ == "__main__":
116
- # Starts Flask server when deployed
117
- app.run(host="0.0.0.0", port=8080) # <-- runs the web server
 
1
  import os
 
2
  import json
3
+ import asyncio
4
  from dotenv import load_dotenv
5
  from openai import OpenAI
6
  from environment import CloudCostEnv
7
+ from flask import Flask, jsonify, request
8
 
9
  load_dotenv()
10
 
11
+ app = Flask(__name__)
12
+ env = None
13
+ event_loop = None
14
 
15
  # --- MANDATORY LOGGING FUNCTIONS (Don't Change) ---
16
+ def log_start(task: str, env_name: str, model: str) -> None:
17
+ print(f"[START] task={task} env={env_name} model={model}", flush=True)
18
 
19
  def log_step(step: int, action: str, reward: float, done: bool, error=None) -> None:
20
  error_val = error if error else "null"
 
28
  # --- SYSTEM PROMPT ---
29
  SYSTEM_PROMPT = "You are a Cloud Infrastructure AI. Manage the cluster by choosing actions: 0(Stay), 1(Add Server), 2(Remove), 3(Toggle Spot). Reply with ONLY the integer."
30
 
31
+ # --- GET EVENT LOOP (fixes asyncio + Flask conflict) ---
32
+ def get_loop():
33
+ global event_loop
34
+ try:
35
+ if event_loop is None or event_loop.is_closed():
36
+ event_loop = asyncio.new_event_loop()
37
+ asyncio.set_event_loop(event_loop)
38
+ return event_loop
39
+ except Exception:
40
+ event_loop = asyncio.new_event_loop()
41
+ asyncio.set_event_loop(event_loop)
42
+ return event_loop
43
+
44
+ # --- LLM ACTION ---
45
  async def get_action_from_llama(state):
46
  api_base = os.getenv("API_BASE_URL")
47
  api_key = os.getenv("HF_TOKEN")
 
64
  except Exception as e:
65
  return 0, f"Error: {str(e)}"
66
 
67
+ # --- ROUTES ---
68
+
69
+ @app.route('/health', methods=['GET'])
70
+ def health():
71
+ return jsonify({"status": "ok"}), 200
72
 
73
+ @app.route('/reset', methods=['POST'])
74
  def reset():
75
  global env
76
+ try:
77
+ loop = get_loop()
78
+ env = CloudCostEnv(task="medium")
79
+ state = loop.run_until_complete(env.reset())
80
+ log_start(
81
+ task="daily_peaks",
82
+ env_name="CloudEnv-v1",
83
+ model=os.getenv("MODEL_NAME", "unknown")
84
+ )
85
+ if hasattr(state, 'model_dump'):
86
+ state_data = state.model_dump()
87
+ elif hasattr(state, 'model_dump_json'):
88
+ state_data = json.loads(state.model_dump_json())
89
+ else:
90
+ state_data = str(state)
91
+ return jsonify({"status": "ok", "state": state_data}), 200
92
+ except Exception as e:
93
+ print(f"[ERROR] reset failed: {str(e)}", flush=True)
94
+ return jsonify({"status": "error", "message": str(e)}), 500
95
 
96
  @app.route('/step', methods=['POST'])
97
  def step():
98
  global env
99
+ try:
100
+ if env is None:
101
+ return jsonify({"status": "error", "message": "Call /reset first"}), 400
102
+ data = request.get_json()
103
+ action = int(data.get("action", 0))
104
+ loop = get_loop()
105
+ state, reward, done = loop.run_until_complete(env.step(action))
106
+ log_step(step=1, action=str(action), reward=reward, done=done)
107
+ if hasattr(state, 'model_dump'):
108
+ state_data = state.model_dump()
109
+ elif hasattr(state, 'model_dump_json'):
110
+ state_data = json.loads(state.model_dump_json())
111
+ else:
112
+ state_data = str(state)
113
+ return jsonify({
114
+ "state": state_data,
115
+ "reward": reward,
116
+ "done": done
117
+ }), 200
118
+ except Exception as e:
119
+ print(f"[ERROR] step failed: {str(e)}", flush=True)
120
+ return jsonify({"status": "error", "message": str(e)}), 500
121
 
122
+ # --- TERMINAL TESTING (unchanged) ---
123
  async def main():
 
 
124
  model_name = os.getenv("MODEL_NAME")
 
125
  task_id = "daily_peaks"
126
  env_local = CloudCostEnv(task="medium")
127
+ log_start(task=task_id, env_name="CloudEnv-v1", model=model_name)
 
128
  rewards = []
129
  state = await env_local.reset()
 
130
  try:
131
  for step_num in range(1, 21):
132
  action_int, action_text = await get_action_from_llama(state)
 
135
  rewards.append(reward)
136
  if done:
137
  break
 
138
  avg_score = sum(rewards) / len(rewards) if rewards else 0
139
+ log_end(success=(avg_score >= 0.7), steps=len(rewards),
140
+ score=avg_score, rewards=rewards)
141
  except Exception as e:
142
  log_step(step=0, action="error", reward=0.0, done=True, error=str(e))
143
  finally:
144
  await env_local.close()
145
 
146
  if __name__ == "__main__":
147
+ app.run(host="0.0.0.0", port=7860, debug=False)