WebSocket server that exposes an API to train AI agents on OpenAI Gym and gym-api like environments such as Gym Retro or Unity ML-Agents, this last one with the help of gym wrapper
Gymie can be installed using:
$ pip install gymieor by cloning the repo and pip-installing in editable mode from the folder:
$ git clone https://github.com/jscriptcoder/Gymie-Server.git Cloning into 'Gymie-Server'... ... $ cd Gymie-Server/ $ pip install -e . Obtaining file:///path/to/Gymie-Server ... Successfully installed gymieYou can start the server from the command line:
$ python -m gymie --host 0.0.0.0 --port 5000 (84581) wsgi starting up on http://0.0.0.0:5000or programmatically:
importgymiegymie.start('localhost', 9000)A client can communicate with Gymie via JSON, with the following format:
{"method": "api_method_name", "params":{"param1": "string", "param2": 6, "param3": true, "param4": [] } }make: Instantiates an environment.
// Params:{"env_id": "CartPole-v1","seed": 0// optional}// Response:{"instance_id": "unique-id"}step: Performs a step on the environment.
// Params:{"instance_id": "instance-id""action": [1,0,1]// MultiBinary action}// Response:[[...],// next state-2.0,// rewardfalse,// done{...},// info]reset: Resets the environment.
// Params:{"instance_id": "instance-id"}// Response:[...]// initial stateclose: Closes the environment.
// Params:{"instance_id": "instance-id"}// Response:trueobservation_space: Generates a dictionary with observation space info.
// Params:{"instance_id": "instance-id"}// Response for Discreate observation space:{"name": "Discreate","n": 4}// Response for Box (Continuous) observation space:{"name": "Box","shape": [3],"low": [-5,-5,-5],"high": [5,5,5]}// Response for MultiBinary observation space:{"name": "MultiBinary","n": 5,"shape": [5]}// TODO MultiDiscreteaction_space: Generates a dictionary with action space info.
// Params:{"instance_id": "instance-id"}// Response for Discreate actions:{"name": "Discreate","n": 4}// Response for Box (Continuous) actions:{"name": "Box","shape": [2],"low": [-1,-1],"high": [1,1]}action_sample: Generates a random action.
// Params:{"instance_id": "instance-id"}// Response for Discrete actions:2// Response for Continuous actions:[1.52,-3.67]@override: Decorator to override internal functionality. It takes a string, function's name, as an argument. This is useful if we want to use different gym-like wrappers. For example, both Gym Retro and Unity ML-Agents have different ways to instantiate an environment. You can take a look at the tests to see how it's done for Gym Retro and Unity ML-Agents (with the help of gym-unity). At the moment there are two internal functions that can be overriden,get_envandprocess_step.
defoverride(func_name: str) ->Callableimportretrofromgymieimportoverridefromgym_unity.envsimportUnityToGymWrapperfrommlagents_envs.environmentimportUnityEnvironment, UnityEnvironmentException@override('get_env')defretro_get_env(env_id, seed=None): """Instantiates a Gym environment"""try: env=retro.make(game=env_id) exceptFileNotFoundError: raiseEnvironmentNotFoundelse: ifseed: env.seed(seed) returnenv@override('process_step')defunity_process_step(step): """Does some processing of the step"""observation, reward, done, info=stepreturnobservation.tolist(), float(reward), done,{}start: This function takes two arguments, host and port, and starts the server, listening onws://host:port
defstart (host: str='0.0.0.0', port: int=5000) ->Noneimportgymiegymie.start('localhost', 8080)You can run all the tests by executing run_tests.sh script:
$ ./run_tests.shIn order to run test_gymie_retro.py you need to have gym-retro package installed. For tests/test_gymie_unity.py, you need mlagents-envs and gym-unity.
MIT License - Copyright (c) 2020 Francisco Ramos