pkalkman commited on
Commit
f6931eb
Β·
1 Parent(s): 7a4e68d

just playing around

Browse files
Files changed (1) hide show
  1. app.py +22 -236
app.py CHANGED
@@ -30,7 +30,7 @@ rl_envs = [
30
  {
31
  "rl_env_beautiful": "CartPole-v1",
32
  "rl_env": "CartPole-v1",
33
- "video_link": "https://huggingface.co/sb3/ppo-CartPole-v1/resolve/main/replay.mp4",
34
  "global": None
35
  },
36
  {
@@ -149,264 +149,50 @@ rl_envs = [
149
  }
150
  ]
151
 
152
- def restart():
153
- print("RESTART")
154
- api.restart_space(repo_id="huggingface-projects/Deep-Reinforcement-Learning-Leaderboard")
155
-
156
- def get_metadata(model_id):
157
- try:
158
- readme_path = hf_hub_download(model_id, filename="README.md", etag_timeout=180)
159
- return metadata_load(readme_path)
160
- except requests.exceptions.HTTPError:
161
- # 404 README.md not found
162
- return None
163
-
164
- def parse_metrics_accuracy(meta):
165
- if "model-index" not in meta:
166
- return None
167
- result = meta["model-index"][0]["results"]
168
- metrics = result[0]["metrics"]
169
- accuracy = metrics[0]["value"]
170
- return accuracy
171
-
172
- # We keep the worst case episode
173
- def parse_rewards(accuracy):
174
- default_std = -1000
175
- default_reward=-1000
176
- if accuracy != None:
177
- accuracy = str(accuracy)
178
- parsed = accuracy.split('+/-')
179
- if len(parsed)>1:
180
- mean_reward = float(parsed[0].strip())
181
- std_reward = float(parsed[1].strip())
182
- elif len(parsed)==1: #only mean reward
183
- mean_reward = float(parsed[0].strip())
184
- std_reward = float(0)
185
- else:
186
- mean_reward = float(default_std)
187
- std_reward = float(default_reward)
188
-
189
- else:
190
- mean_reward = float(default_std)
191
- std_reward = float(default_reward)
192
- return mean_reward, std_reward
193
-
194
-
195
- def get_model_ids(rl_env):
196
- api = HfApi()
197
- models = api.list_models(filter=rl_env)
198
- model_ids = [x.modelId for x in models]
199
- return model_ids
200
-
201
- # Parralelized version
202
- def update_leaderboard_dataset_parallel(rl_env, path):
203
- # Get model ids associated with rl_env
204
- model_ids = get_model_ids(rl_env)
205
-
206
- def process_model(model_id):
207
- meta = get_metadata(model_id)
208
- #LOADED_MODEL_METADATA[model_id] = meta if meta is not None else ''
209
- if meta is None:
210
- return None
211
- user_id = model_id.split('/')[0]
212
- row = {}
213
- row["User"] = user_id
214
- row["Model"] = model_id
215
- accuracy = parse_metrics_accuracy(meta)
216
- mean_reward, std_reward = parse_rewards(accuracy)
217
- mean_reward = mean_reward if not pd.isna(mean_reward) else 0
218
- std_reward = std_reward if not pd.isna(std_reward) else 0
219
- row["Results"] = mean_reward - std_reward
220
- row["Mean Reward"] = mean_reward
221
- row["Std Reward"] = std_reward
222
- return row
223
-
224
- data = list(thread_map(process_model, model_ids, desc="Processing models"))
225
-
226
- # Filter out None results (models with no metadata)
227
- data = [row for row in data if row is not None]
228
-
229
- ranked_dataframe = rank_dataframe(pd.DataFrame.from_records(data))
230
- new_history = ranked_dataframe
231
- file_path = path + "/" + rl_env + ".csv"
232
- new_history.to_csv(file_path, index=False)
233
-
234
- return ranked_dataframe
235
-
236
-
237
- def update_leaderboard_dataset(rl_env, path):
238
- # Get model ids associated with rl_env
239
- model_ids = get_model_ids(rl_env)
240
- data = []
241
- for model_id in model_ids:
242
- """
243
- readme_path = hf_hub_download(model_id, filename="README.md")
244
- meta = metadata_load(readme_path)
245
- """
246
- meta = get_metadata(model_id)
247
- #LOADED_MODEL_METADATA[model_id] = meta if meta is not None else ''
248
- if meta is None:
249
- continue
250
- user_id = model_id.split('/')[0]
251
- row = {}
252
- row["User"] = user_id
253
- row["Model"] = model_id
254
- accuracy = parse_metrics_accuracy(meta)
255
- mean_reward, std_reward = parse_rewards(accuracy)
256
- mean_reward = mean_reward if not pd.isna(mean_reward) else 0
257
- std_reward = std_reward if not pd.isna(std_reward) else 0
258
- row["Results"] = mean_reward - std_reward
259
- row["Mean Reward"] = mean_reward
260
- row["Std Reward"] = std_reward
261
- data.append(row)
262
-
263
- ranked_dataframe = rank_dataframe(pd.DataFrame.from_records(data))
264
- new_history = ranked_dataframe
265
- file_path = path + "/" + rl_env + ".csv"
266
- new_history.to_csv(file_path, index=False)
267
-
268
- return ranked_dataframe
269
 
270
  def download_leaderboard_dataset():
 
271
  path = snapshot_download(repo_id=DATASET_REPO_ID, repo_type="dataset")
272
  return path
273
 
 
274
  def get_data(rl_env, path) -> pd.DataFrame:
275
  """
276
- Get data from rl_env
277
- :return: data as a pandas DataFrame
278
  """
279
- csv_path = path + "/" + rl_env + ".csv"
280
  data = pd.read_csv(csv_path)
281
-
282
- for index, row in data.iterrows():
283
- user_id = row["User"]
284
- data.loc[index, "User"] = make_clickable_user(user_id)
285
- model_id = row["Model"]
286
- data.loc[index, "Model"] = make_clickable_model(model_id)
287
-
288
  return data
289
 
290
- def get_data_no_html(rl_env, path) -> pd.DataFrame:
291
- """
292
- Get data from rl_env
293
- :return: data as a pandas DataFrame
294
- """
295
- csv_path = path + "/" + rl_env + ".csv"
296
- data = pd.read_csv(csv_path)
297
-
298
- return data
299
-
300
- def rank_dataframe(dataframe):
301
- dataframe = dataframe.sort_values(by=['Results', 'User', 'Model'], ascending=False)
302
- if not 'Ranking' in dataframe.columns:
303
- dataframe.insert(0, 'Ranking', [i for i in range(1,len(dataframe)+1)])
304
- else:
305
- dataframe['Ranking'] = [i for i in range(1,len(dataframe)+1)]
306
- return dataframe
307
-
308
-
309
- def run_update_dataset():
310
- path_ = download_leaderboard_dataset()
311
- for i in range(0, len(rl_envs)):
312
- rl_env = rl_envs[i]
313
- update_leaderboard_dataset_parallel(rl_env["rl_env"], path_)
314
-
315
- api.upload_folder(
316
- folder_path=path_,
317
- repo_id="huggingface-projects/drlc-leaderboard-data",
318
- repo_type="dataset",
319
- commit_message="Update dataset")
320
-
321
- def filter_data(rl_env, path, user_id):
322
- data_df = get_data_no_html(rl_env, path)
323
- models = []
324
- models = data_df[data_df["User"] == user_id]
325
-
326
- for index, row in models.iterrows():
327
- user_id = row["User"]
328
- models.loc[index, "User"] = make_clickable_user(user_id)
329
- model_id = row["Model"]
330
- models.loc[index, "Model"] = make_clickable_model(model_id)
331
-
332
-
333
- return models
334
-
335
- run_update_dataset()
336
 
337
  with block:
338
- gr.Markdown(f"""
339
- # πŸ† The Deep Reinforcement Learning Course Leaderboard πŸ†
340
-
341
- This is the leaderboard of trained agents during the <a href="https://huggingface.co/learn/deep-rl-course/unit0/introduction?fw=pt">Deep Reinforcement Learning Course</a>. A free course from beginner to expert.
342
-
343
- ### We only display the best 100 models
344
- If you want to **find yours, type your user id and click on Search my models.**
345
- You **can click on the model's name** to be redirected to its model card, including documentation.
346
 
347
- ### How are the results calculated?
348
- We use **lower bound result to sort the models: mean_reward - std_reward.**
349
-
350
- ### I can't find my model 😭
351
- The leaderboard is **updated every two hours** if you can't find your models, just wait for the next update.
352
-
353
- ### The Deep RL Course
354
- πŸ€– You want to try to train your agents? <a href="https://huggingface.co/deep-rl-course/unit0/introduction?fw=pt" target="_blank"> Check the Hugging Face free Deep Reinforcement Learning Course πŸ€— </a>.
355
-
356
- πŸ”§ There is an **environment missing?** Please open an issue.
357
  """)
 
358
  path_ = download_leaderboard_dataset()
359
 
360
  for i in range(0, len(rl_envs)):
361
  rl_env = rl_envs[i]
362
- with gr.TabItem(rl_env["rl_env_beautiful"]) as rl_tab:
363
  with gr.Row():
364
- markdown = """
365
- # {name_leaderboard}
366
 
367
- """.format(name_leaderboard = rl_env["rl_env_beautiful"], video_link = rl_env["video_link"])
 
368
  gr.Markdown(markdown)
369
-
370
-
371
- with gr.Row():
372
- gr.Markdown("""
373
- ## Search your models
374
- Simply type your user id to find your models
375
- """)
376
-
377
- with gr.Row():
378
- user_id = gr.Textbox(label= "Your user id")
379
- search_btn = gr.Button("Search my models πŸ”Ž")
380
- reset_btn = gr.Button("Clear my search")
381
- env = gr.Variable(rl_env["rl_env"])
382
- grpath = gr.Variable(path_)
383
- with gr.Row():
384
- gr_dataframe = gr.components.Dataframe(value=get_data(rl_env["rl_env"], path_), headers=["Ranking πŸ†", "User πŸ€—", "Model id πŸ€–", "Results", "Mean Reward", "Std Reward"], datatype=["number", "markdown", "markdown", "number", "number", "number"], row_count=(100, 'fixed'))
385
-
386
- with gr.Row():
387
- #gr_search_dataframe = gr.components.Dataframe(headers=["Ranking πŸ†", "User πŸ€—", "Model id πŸ€–", "Results", "Mean Reward", "Std Reward"], datatype=["number", "markdown", "markdown", "number", "number", "number"], visible=False)
388
- search_btn.click(fn=filter_data, inputs=[env, grpath, user_id], outputs=gr_dataframe, api_name="filter_data")
389
 
390
  with gr.Row():
391
- search_btn.click(fn=filter_data, inputs=[env, grpath, user_id], outputs=gr_dataframe, api_name="filter_data")
392
- reset_btn.click(fn=get_data, inputs=[env, grpath], outputs=gr_dataframe, api_name="get_data")
393
- """
394
- block.load(
395
- download_leaderboard_dataset,
396
- inputs=[],
397
- outputs=[
398
- grpath
399
- ],
400
- )
401
- """
402
-
403
-
404
- scheduler = BackgroundScheduler()
405
- # Refresh every hour
406
- #scheduler.add_job(func=run_update_dataset, trigger="interval", seconds=3600)
407
- #scheduler.add_job(download_leaderboard_dataset, 'interval', seconds=3600)
408
- #scheduler.add_job(run_update_dataset, 'interval', seconds=3600)
409
- scheduler.add_job(restart, 'interval', seconds=10800)
410
- scheduler.start()
411
 
412
  block.launch()
 
30
  {
31
  "rl_env_beautiful": "CartPole-v1",
32
  "rl_env": "CartPole-v1",
33
+ "video_link": "",
34
  "global": None
35
  },
36
  {
 
149
  }
150
  ]
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
  def download_leaderboard_dataset():
154
+ # Download the dataset from the Hugging Face Hub
155
  path = snapshot_download(repo_id=DATASET_REPO_ID, repo_type="dataset")
156
  return path
157
 
158
+
159
  def get_data(rl_env, path) -> pd.DataFrame:
160
  """
161
+ Get data from rl_env CSV file and return as DataFrame
 
162
  """
163
+ csv_path = os.path.join(path, rl_env + ".csv")
164
  data = pd.read_csv(csv_path)
 
 
 
 
 
 
 
165
  return data
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
 
168
  with block:
169
+ gr.Markdown("""
170
+ # πŸ† Deep Reinforcement Learning Course Leaderboard πŸ†
 
 
 
 
 
 
171
 
172
+ Presenting the latest leaderboard from the Hugging Face Deep RL Course.
 
 
 
 
 
 
 
 
 
173
  """)
174
+
175
  path_ = download_leaderboard_dataset()
176
 
177
  for i in range(0, len(rl_envs)):
178
  rl_env = rl_envs[i]
179
+ with gr.TabItem(rl_env["rl_env_beautiful"]):
180
  with gr.Row():
181
+ markdown = f"""
182
+ # {rl_env['rl_env_beautiful']}
183
 
184
+ ### Leaderboard for {rl_env['rl_env_beautiful']}
185
+ """
186
  gr.Markdown(markdown)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
 
188
  with gr.Row():
189
+ # Display the data for this RL environment
190
+ data = get_data(rl_env["rl_env"], path_)
191
+ gr.Dataframe(
192
+ value=data,
193
+ headers=["Ranking πŸ†", "User πŸ€—", "Model id πŸ€–", "Results", "Mean Reward", "Std Reward"],
194
+ datatype=["number", "markdown", "markdown", "number", "number", "number"],
195
+ row_count=(100, 'fixed')
196
+ )
 
 
 
 
 
 
 
 
 
 
 
 
197
 
198
  block.launch()