pysc2: Websocket timed out after several episodes

When I train my agent on the MoveToBeacon minigame map I get a “websocket timed out” Exception and the environment closes at irregular intervals. I use Linux. Here are the Exceptions:

I0704 01:36:53.095061 140421693589312 sc2_env.py:433] Starting episode: 8319
Error: expected response: 12, actual response: 0
Error reported: Game has already ended
I0704 01:38:53.473563 140421693589312 sc2_env.py:531] Environment Close
RequestQuit command received.
Closing Application...
unable to parse websocket frame.
Took 23098.302 seconds for 1996332 steps: 86.428 fps
Terminate action already called.
Entering core terminate.
Core shutdown finished.
I0704 01:38:56.193612 140421693589312 sc_process.py:197] Shutdown gracefully.
I0704 01:38:56.194391 140421693589312 sc_process.py:182] Shutdown with return code: 0
Traceback (most recent call last):
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_socket.py", line 81, in recv
    bytes_ = sock.recv(bufsize)
socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/protocol.py", line 62, in catch_websocket_connection_errors
    yield
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/protocol.py", line 161, in _read
    response_str = self._sock.recv()
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_core.py", line 300, in recv
    opcode, data = self.recv_data()
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_core.py", line 317, in recv_data
    opcode, frame = self.recv_data_frame(control_frame)
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_core.py", line 330, in recv_data_frame
    frame = self.recv_frame()
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_core.py", line 364, in recv_frame
    return self.frame_buffer.recv_frame()
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_abnf.py", line 361, in recv_frame
    self.recv_header()
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_abnf.py", line 309, in recv_header
    header = self.recv_strict(2)
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_abnf.py", line 396, in recv_strict
    bytes_ = self.recv(min(16384, shortage))
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_core.py", line 434, in _recv
    return recv(self.sock, bufsize)
  File "/home/wenzel/.local/lib/python3.6/site-packages/websocket/_socket.py", line 84, in recv
    raise WebSocketTimeoutException(message)
websocket._exceptions.WebSocketTimeoutException: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/wenzel/OC/Praktikum/SC2_Wenzel/MiniGames/MoveToBeaconAgent.py", line 169, in <module>
    app.run(main)
  File "/home/wenzel/.local/lib/python3.6/site-packages/absl/app.py", line 274, in run
    _run_main(main, args)
  File "/home/wenzel/.local/lib/python3.6/site-packages/absl/app.py", line 238, in _run_main
    sys.exit(main(argv))
  File "/home/wenzel/OC/Praktikum/SC2_Wenzel/MiniGames/MoveToBeaconAgent.py", line 139, in main
    run_loop.run_loop([agent], env, max_episodes=_EPISODES)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/env/run_loop.py", line 48, in run_loop
    timesteps = env.step(actions)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/stopwatch.py", line 197, in _stopwatch
    return func(*args, **kwargs)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/env/sc2_env.py", line 452, in step
    return self._step()
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/env/sc2_env.py", line 456, in _step
    self._parallel.run((c.step, self._step_mul) for c in self._controllers)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/run_parallel.py", line 56, in run
    return [funcs[0]()]
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/remote_controller.py", line 88, in _valid_status
    return func(self, *args, **kwargs)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/stopwatch.py", line 197, in _stopwatch
    return func(*args, **kwargs)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/remote_controller.py", line 206, in step
    return self._client.send(step=sc_pb.RequestStep(count=count))
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/protocol.py", line 136, in send
    res = self.send_req(sc_pb.Request(**kwargs))
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/protocol.py", line 122, in send_req
    return self.read()
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/stopwatch.py", line 197, in _stopwatch
    return func(*args, **kwargs)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/protocol.py", line 95, in read
    response = self._read()
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/protocol.py", line 161, in _read
    response_str = self._sock.recv()
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/contextlib.py", line 99, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/wenzel/.conda/envs/SC2/lib/python3.6/site-packages/pysc2/lib/protocol.py", line 67, in catch_websocket_connection_errors
    raise ConnectionError("Websocket timed out.")
pysc2.lib.protocol.ConnectionError: Websocket timed out.
I0704 01:38:56.304697 140421693589312 sc2_env.py:531] Environment Close

And I start my training as follows:

    try:
        with sc2_env.SC2Env(
                map_name="MoveToBeacon",
                players=[sc2_env.Agent(sc2_env.Race.terran)],
                agent_interface_format=features.AgentInterfaceFormat(
                    feature_dimensions=features.Dimensions(screen=_SCREEN,
                                                           minimap=_MINIMAP),
                    use_feature_units=True
                ),
                step_mul=8,
                game_steps_per_episode=0,
                visualize=_VISUALIZE
        ) as env:

            run_loop.run_loop([agent], env, max_episodes=_EPISODES)

            

    except KeyboardInterrupt:
        pass

Is there something I am doing wrong?

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 2
  • Comments: 15 (3 by maintainers)

Most upvoted comments

It is still happening in SC2 4.10.

As a temporary fix you can close/reset the environment once you detect the timeout. Here’s how I do it for example: https://github.com/inoryy/reaver-pysc2/blob/master/reaver/envs/sc2.py#L53-L65

Hopefully this is fixed in new versions of the game. There were some race conditions on the websocket server in the game.

+1 Same issue