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

Update inference.py

Browse files
Files changed (1) hide show
  1. inference.py +64 -72
inference.py CHANGED
@@ -1,9 +1,9 @@
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()
@@ -12,58 +12,32 @@ 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"
21
- done_val = str(done).lower()
22
- print(f"[STEP] step={step} action={action} reward={reward:.2f} done={done_val} error={error_val}", flush=True)
23
 
24
- def log_end(success: bool, steps: int, score: float, rewards: list) -> None:
25
  rewards_str = ",".join(f"{r:.2f}" for r in rewards)
26
  print(f"[END] success={str(success).lower()} steps={steps} score={score:.3f} rewards={rewards_str}", flush=True)
27
 
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")
48
- model_name = os.getenv("MODEL_NAME")
49
- client = OpenAI(base_url=api_base, api_key=api_key)
50
- state_data = state.model_dump_json() if hasattr(state, 'model_dump_json') else str(state)
51
-
52
- try:
53
- response = client.chat.completions.create(
54
- model=model_name,
55
- messages=[
56
- {"role": "system", "content": SYSTEM_PROMPT},
57
- {"role": "user", "content": f"Current State: {state_data}"}
58
- ],
59
- max_tokens=10
60
- )
61
- action_text = response.choices[0].message.content.strip()
62
- action_int = int(''.join(filter(str.isdigit, action_text))[0])
63
- return action_int, action_text
64
- except Exception as e:
65
- return 0, f"Error: {str(e)}"
66
-
67
  # --- ROUTES ---
68
 
69
  @app.route('/health', methods=['GET'])
@@ -73,75 +47,93 @@ def health():
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)
133
- state, reward, done = await env_local.step(action_int)
134
- log_step(step=step_num, action=str(action_int), reward=reward, done=done)
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)
 
 
1
  import os
2
  import json
3
  import asyncio
4
+ import traceback
5
  from dotenv import load_dotenv
6
  from openai import OpenAI
 
7
  from flask import Flask, jsonify, request
8
 
9
  load_dotenv()
 
12
  env = None
13
  event_loop = None
14
 
15
+ # --- LOGGING ---
16
+ def log_start(task, env_name, model):
17
  print(f"[START] task={task} env={env_name} model={model}", flush=True)
18
 
19
+ def log_step(step, action, reward, done, error=None):
20
  error_val = error if error else "null"
21
+ print(f"[STEP] step={step} action={action} reward={reward:.2f} done={str(done).lower()} error={error_val}", flush=True)
 
22
 
23
+ def log_end(success, steps, score, rewards):
24
  rewards_str = ",".join(f"{r:.2f}" for r in rewards)
25
  print(f"[END] success={str(success).lower()} steps={steps} score={score:.3f} rewards={rewards_str}", flush=True)
26
 
 
27
  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."
28
 
 
29
  def get_loop():
30
  global event_loop
31
  try:
32
+ loop = asyncio.get_event_loop()
33
+ if loop.is_closed():
34
+ raise RuntimeError("Loop closed")
35
+ return loop
36
  except Exception:
37
  event_loop = asyncio.new_event_loop()
38
  asyncio.set_event_loop(event_loop)
39
  return event_loop
40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  # --- ROUTES ---
42
 
43
  @app.route('/health', methods=['GET'])
 
47
  @app.route('/reset', methods=['POST'])
48
  def reset():
49
  global env
50
+ print("[DEBUG] /reset called", flush=True)
51
  try:
52
+ # Step 1 - import environment
53
+ print("[DEBUG] importing CloudCostEnv...", flush=True)
54
+ from environment import CloudCostEnv
55
+ print("[DEBUG] CloudCostEnv imported OK", flush=True)
56
+
57
+ # Step 2 - create env
58
+ print("[DEBUG] creating env...", flush=True)
59
  env = CloudCostEnv(task="medium")
60
+ print("[DEBUG] env created OK", flush=True)
61
+
62
+ # Step 3 - reset env
63
+ print("[DEBUG] calling env.reset()...", flush=True)
64
+ loop = get_loop()
65
  state = loop.run_until_complete(env.reset())
66
+ print(f"[DEBUG] reset done, state type: {type(state)}", flush=True)
67
+
68
+ # Step 4 - serialize state
 
 
69
  if hasattr(state, 'model_dump'):
70
  state_data = state.model_dump()
71
  elif hasattr(state, 'model_dump_json'):
72
  state_data = json.loads(state.model_dump_json())
73
+ elif hasattr(state, '__dict__'):
74
+ state_data = state.__dict__
75
  else:
76
  state_data = str(state)
77
+
78
+ log_start(
79
+ task="daily_peaks",
80
+ env_name="CloudEnv-v1",
81
+ model=os.getenv("MODEL_NAME", "unknown")
82
+ )
83
+
84
+ print("[DEBUG] /reset success", flush=True)
85
  return jsonify({"status": "ok", "state": state_data}), 200
86
+
87
  except Exception as e:
88
+ full_error = traceback.format_exc()
89
+ print(f"[ERROR] /reset crashed:\n{full_error}", flush=True)
90
+ return jsonify({
91
+ "status": "error",
92
+ "message": str(e),
93
+ "trace": full_error
94
+ }), 500
95
 
96
  @app.route('/step', methods=['POST'])
97
  def step():
98
  global env
99
+ print("[DEBUG] /step called", flush=True)
100
  try:
101
  if env is None:
102
+ return jsonify({
103
+ "status": "error",
104
+ "message": "Call /reset first"
105
+ }), 400
106
+
107
  data = request.get_json()
108
  action = int(data.get("action", 0))
109
  loop = get_loop()
110
  state, reward, done = loop.run_until_complete(env.step(action))
111
  log_step(step=1, action=str(action), reward=reward, done=done)
112
+
113
  if hasattr(state, 'model_dump'):
114
  state_data = state.model_dump()
115
  elif hasattr(state, 'model_dump_json'):
116
  state_data = json.loads(state.model_dump_json())
117
+ elif hasattr(state, '__dict__'):
118
+ state_data = state.__dict__
119
  else:
120
  state_data = str(state)
121
+
122
  return jsonify({
123
  "state": state_data,
124
  "reward": reward,
125
  "done": done
126
  }), 200
127
+
128
  except Exception as e:
129
+ full_error = traceback.format_exc()
130
+ print(f"[ERROR] /step crashed:\n{full_error}", flush=True)
131
+ return jsonify({
132
+ "status": "error",
133
+ "message": str(e),
134
+ "trace": full_error
135
+ }), 500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
  if __name__ == "__main__":
138
+ print("[BOOT] Starting Flask server on port 7860", flush=True)
139
+ app.run(host="0.0.0.0", port=7860, debug=False)