I have been having some trouble when deploying my agent to production. My aim is to build an API that I can call from another source. My code is:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import numpy as np
import ray
from ray.tune.registry import register_env
import ray.tune as tune
from batt_env import BatteryEnv
from ray.rllib.agents.ppo import PPOTrainer, DEFAULT_CONFIG
import requests
from flask import request
from datetime import datetime
print(f"{datetime.now()}: about to init ray", flush=True)
ray.init(ignore_reinit_error=True, log_to_driver=False)
app = Flask(__name__)
API = Api(app)
print(f"{datetime.now()}: about to load stacked", flush=True)
data = np.load('/home/carterb/mysite/stacked.npy')
data = data/8000
batt = BatteryEnv(data, power=20, capacity=20, initial_charge=0, bleed=0.1,
starting_temperature=23, temp_change=1, cooldown_rate=1, efficiency=1.0, cycle_cost=0)
print(f"{datetime.now()}: about to do ", flush=True)
def env_creator(env_config):
return BatteryEnv(data, power=20, capacity=20, initial_charge=0, bleed=0.1, starting_temperature=23, temp_change=1, cooldown_rate=1, efficiency=1.0, cycle_cost=0)
print(f"{datetime.now()}: about to do create env ", flush=True)
register_env("battery", env_creator)
config = {
"env": "battery",
"num_workers": 1,
'explore': False,
'log_level': 'DEBUG'
}
print(f"{datetime.now()}: about to do restore agent ", flush=True)
trained_trainer = PPOTrainer(config, 'battery')
trained_trainer.restore("/home/carterb/mysite/checkpoint-12000")
print(f"{datetime.now()}: about to do gen predict class ", flush=True)
class Predict(Resource):
@staticmethod
def post():
# parser = reqparse.RequestParser()
# parser.add_argument('obs')
print(f"{datetime.now()}: about to accept input ", flush=True)
input_data = request.json
arr = np.array(input_data['obs'])
# print(arr.shape)
# print(input_data)
#
# args = parser.parse_args() # creates dict
#
# print(args)
# X_new = np.fromiter(args.values(), dtype=float)
# print(X_new.shape)
state = []
done = False # convert input to array
print(f"{datetime.now()}: about to do compute action class ", flush=True)
action = trained_trainer.compute_action(arr)
print(f"{datetime.now()}: about to return action ", flush=True)
# print('action: ' + str(action))
out = {'Action': int(action)}
#
return out, 200
print(f"{datetime.now()}: about to do add resource ", flush=True)
API.add_resource(Predict, '/predict', methods=['POST'])
print(f"{datetime.now()}: about to do resource added ", flush=True)
print(f"{datetime.now()}: trying to run app ", flush=True)
I can see through my print statements that the app gets set up fine, however when I pass data, it get stuck directly on trainer.compute_action. I am trying to host on pythonanywhere but have been having trouble despite their great help. Is there any reason anyone can see for my agent failing to compute_action? or is there a more suitable way to set up an API using ray?