(env, policy, video_path, min_eval_steps=3000)
| 137 | |
| 138 | @staticmethod |
| 139 | def evaluate_policy(env, policy, video_path, min_eval_steps=3000): |
| 140 | policy = policy.eval() |
| 141 | t0 = time.time() |
| 142 | for i in range(env.num_envs): |
| 143 | env.set_attr('eval_mode', True, indices=i) |
| 144 | obs = env.reset() |
| 145 | |
| 146 | list_render = [] |
| 147 | ep_stat_buffer = [] |
| 148 | ep_events = {} |
| 149 | for i in range(env.num_envs): |
| 150 | ep_events[f'venv_{i}'] = [] |
| 151 | |
| 152 | n_step = 0 |
| 153 | n_timeout = 0 |
| 154 | env_done = np.array([False]*env.num_envs) |
| 155 | # while n_step < min_eval_steps: |
| 156 | while n_step < min_eval_steps or not np.all(env_done): |
| 157 | actions, values, log_probs, mu, sigma, _ = policy.forward(obs, deterministic=True, clip_action=True) |
| 158 | obs, reward, done, info = env.step(actions) |
| 159 | |
| 160 | for i in range(env.num_envs): |
| 161 | env.set_attr('action_value', values[i], indices=i) |
| 162 | env.set_attr('action_log_probs', log_probs[i], indices=i) |
| 163 | env.set_attr('action_mu', mu[i], indices=i) |
| 164 | env.set_attr('action_sigma', sigma[i], indices=i) |
| 165 | |
| 166 | list_render.append(env.render(mode='rgb_array')) |
| 167 | |
| 168 | n_step += 1 |
| 169 | env_done |= done |
| 170 | |
| 171 | for i in np.where(done)[0]: |
| 172 | ep_stat_buffer.append(info[i]['episode_stat']) |
| 173 | ep_events[f'venv_{i}'].append(info[i]['episode_event']) |
| 174 | n_timeout += int(info[i]['timeout']) |
| 175 | |
| 176 | # conda install x264=='1!152.20180717' ffmpeg=4.0.2 -c conda-forge |
| 177 | encoder = ImageEncoder(video_path, list_render[0].shape, 30, 30) |
| 178 | for im in list_render: |
| 179 | encoder.capture_frame(im) |
| 180 | encoder.close() |
| 181 | |
| 182 | avg_ep_stat = WandbCallback.get_avg_ep_stat(ep_stat_buffer, prefix='eval/') |
| 183 | avg_ep_stat['eval/eval_timeout'] = n_timeout |
| 184 | |
| 185 | duration = time.time() - t0 |
| 186 | avg_ep_stat['time/t_eval'] = duration |
| 187 | avg_ep_stat['time/fps_eval'] = n_step * env.num_envs / duration |
| 188 | |
| 189 | for i in range(env.num_envs): |
| 190 | env.set_attr('eval_mode', False, indices=i) |
| 191 | obs = env.reset() |
| 192 | return avg_ep_stat, ep_events |
| 193 | |
| 194 | @staticmethod |
| 195 | def get_avg_ep_stat(ep_stat_buffer, prefix=''): |
no test coverage detected