From 26e335736ee1e293eff95909aaf78db74895a796 Mon Sep 17 00:00:00 2001 From: Thomas Simonini Date: Wed, 4 Jan 2023 14:27:23 +0100 Subject: [PATCH] Update hands-on.mdx --- units/en/unit4/hands-on.mdx | 126 +++++++++++++++++++----------------- 1 file changed, 68 insertions(+), 58 deletions(-) diff --git a/units/en/unit4/hands-on.mdx b/units/en/unit4/hands-on.mdx index c31a332..b0c8956 100644 --- a/units/en/unit4/hands-on.mdx +++ b/units/en/unit4/hands-on.mdx @@ -642,6 +642,8 @@ import datetime import json import imageio +import tempfile + import os ``` @@ -669,67 +671,77 @@ def record_video(env, policy, out_directory, fps=30): ``` ```python -def push_to_hub(repo_id, model, hyperparameters, eval_env, video_fps=30, local_repo_path="hub"): - """ - Evaluate, Generate a video and Upload a model to Hugging Face Hub. - This method does the complete pipeline: - - It evaluates the model - - It generates the model card - - It generates a replay video of the agent - - It pushes everything to the Hub +def push_to_hub(repo_id, + model, + hyperparameters, + eval_env, + video_fps=30 + ): + """ + Evaluate, Generate a video and Upload a model to Hugging Face Hub. + This method does the complete pipeline: + - It evaluates the model + - It generates the model card + - It generates a replay video of the agent + - It pushes everything to the Hub - :param repo_id: repo_id: id of the model repository from the Hugging Face Hub - :param model: the pytorch model we want to save - :param hyperparameters: training hyperparameters - :param eval_env: evaluation environment - :param video_fps: how many frame per seconds to record our video replay - :param local_repo_path: where the local repository is - """ + :param repo_id: repo_id: id of the model repository from the Hugging Face Hub + :param model: the pytorch model we want to save + :param hyperparameters: training hyperparameters + :param eval_env: evaluation environment + :param video_fps: how many frame per seconds to record our video replay + """ - _, repo_name = repo_id.split("/") - api = HfApi() - - # Step 1: Create the repo - repo_url = api.create_repo( + _, repo_name = repo_id.split("/") + api = HfApi() + + # Step 1: Create the repo + repo_url = api.create_repo( repo_id=repo_id, exist_ok=True, - ) + ) - # Step 2: Download files - repo_local_path = Path(snapshot_download(repo_id=repo_id)) + with tempfile.TemporaryDirectory() as tmpdirname: + local_directory = Path(tmpdirname) + + # Step 2: Save the model + torch.save(model, local_directory / "model.pt") - # Step 3: Save the model - torch.save(model, os.path.join(repo_local_path, "model.pt")) - - # Step 4: Save the hyperparameters to JSON - with open(Path(repo_local_path) / "hyperparameters.json", "w") as outfile: - json.dump(hyperparameters, outfile) - - # Step 5: Evaluate the model and build JSON - mean_reward, std_reward = evaluate_agent( - eval_env, hyperparameters["max_t"], hyperparameters["n_evaluation_episodes"], model - ) + # Step 3: Save the hyperparameters to JSON + with open(local_directory / "hyperparameters.json", "w") as outfile: + json.dump(hyperparameters, outfile) + + # Step 4: Evaluate the model and build JSON + mean_reward, std_reward = evaluate_agent(eval_env, + hyperparameters["max_t"], + hyperparameters["n_evaluation_episodes"], + model) # Get datetime eval_datetime = datetime.datetime.now() eval_form_datetime = eval_datetime.isoformat() evaluate_data = { - "env_id": hyperparameters["env_id"], - "mean_reward": mean_reward, - "n_evaluation_episodes": hyperparameters["n_evaluation_episodes"], - "eval_datetime": eval_form_datetime, + "env_id": hyperparameters["env_id"], + "mean_reward": mean_reward, + "n_evaluation_episodes": hyperparameters["n_evaluation_episodes"], + "eval_datetime": eval_form_datetime, } # Write a JSON file - with open(Path(repo_local_path) / "results.json", "w") as outfile: + with open(local_directory / "results.json", "w") as outfile: json.dump(evaluate_data, outfile) - # Step 6: Create the model card - # Env id + # Step 5: Create the model card env_name = hyperparameters["env_id"] - + metadata = {} - metadata["tags"] = [env_name, "reinforce", "reinforcement-learning", "custom-implementation", "deep-rl-class"] + metadata["tags"] = [ + env_name, + "reinforce", + "reinforcement-learning", + "custom-implementation", + "deep-rl-class" + ] # Add metrics eval = metadata_eval_result( @@ -741,7 +753,7 @@ def push_to_hub(repo_id, model, hyperparameters, eval_env, video_fps=30, local_r metrics_value=f"{mean_reward:.2f} +/- {std_reward:.2f}", dataset_pretty_name=env_name, dataset_id=env_name, - ) + ) # Merges both dictionaries metadata = {**metadata, **eval} @@ -752,32 +764,32 @@ def push_to_hub(repo_id, model, hyperparameters, eval_env, video_fps=30, local_r To learn to use this model and train yours check Unit 4 of the Deep Reinforcement Learning Course: https://huggingface.co/deep-rl-course/unit4/introduction """ - readme_path = repo_local_path / "README.md" + readme_path = local_directory / "README.md" readme = "" if readme_path.exists(): with readme_path.open("r", encoding="utf8") as f: - readme = f.read() + readme = f.read() else: - readme = model_card + readme = model_card with readme_path.open("w", encoding="utf-8") as f: - f.write(readme) + f.write(readme) # Save our metrics to Readme metadata metadata_save(readme_path, metadata) - # Step 7: Record a video - video_path = repo_local_path / "replay.mp4" + # Step 6: Record a video + video_path = local_directory / "replay.mp4" record_video(env, model, video_path, video_fps) # Step 7. Push everything to the Hub api.upload_folder( - repo_id=repo_id, - folder_path=repo_local_path, - path_in_repo=".", + repo_id=repo_id, + folder_path=local_directory, + path_in_repo=".", ) - print(f"Your model is pushed to the hub. You can view your model here: {repo_url}") + print(f"Your model is pushed to the Hub. You can view your model here: {repo_url}") ``` By using `push_to_hub` **you evaluate, record a replay, generate a model card of your agent and push it to the Hub**. @@ -815,8 +827,7 @@ push_to_hub( cartpole_policy, # The model we want to save cartpole_hyperparameters, # Hyperparameters eval_env, # Evaluation environment - video_fps=30, - local_repo_path="hub", + video_fps=30 ) ``` @@ -964,8 +975,7 @@ push_to_hub( pixelcopter_policy, # The model we want to save pixelcopter_hyperparameters, # Hyperparameters eval_env, # Evaluation environment - video_fps=30, - local_repo_path="hub", + video_fps=30 ) ```