Website | Technical Paper | Videos
Clone the repo using following command:
git clone https://github.com/ShalikAI/IsaacGym-Tutorial.git IsaacGymEnvs
Download the Isaac Gym Preview 4 release from the website. Extract the zip file and copy the folder isaacgym inside IsaacGymEnvs. Go inside Isaac Gym Envs:
cd ~/IsaacGymEnvs
python3 -m venv isaacgymenvs_venv
source isaacgymenvs_venv/bin/activate
pip3 install --upgrade pip
cd isaacgym/python/
pip3 install -e .
source ~/miniconda/bin/activate
./create_conda_env_rlgpu.sh
conda activate rlgpu
cd isaacgym/python/
pip3 install -e .
Ensure that Isaac Gym works on the system on Virtual or Conda Environment:
cd examples
python joint_monkey.py
Once Isaac Gym is installed and samples work within your current python environment, install this repo:
cd ~/IsaacGymEnvs
pip3 install -e .We offer an easy-to-use API for creating preset vectorized environments. For more info on what a vectorized environment is and its usage, please refer to the Gym library documentation.
import isaacgym
import isaacgymenvs
import torch
num_envs = 2000
envs = isaacgymenvs.make(
seed=0,
task="Ant",
num_envs=num_envs,
sim_device="cuda:0",
rl_device="cuda:0",
)
print("Observation space is", envs.observation_space)
print("Action space is", envs.action_space)
obs = envs.reset()
for _ in range(20):
random_actions = 2.0 * torch.rand((num_envs,) + envs.action_space.shape, device = 'cuda:0') - 1.0
envs.step(random_actions)To train your first policy, run this line:
python train.py task=CartpoleCartpole should train to the point that the pole stays upright within a few seconds of starting.
Here's another example - Ant locomotion:
python train.py task=AntNote that by default we show a preview window, which will usually slow down training. You
can use the v key while running to disable viewer updates and allow training to proceed
faster. Hit the v key again to resume viewing after a few seconds of training, once the
ants have learned to run a bit better.
Use the esc key or close the viewer window to stop training early.
Alternatively, you can train headlessly, as follows:
python train.py task=Ant headless=TrueAnt may take a minute or two to train a policy you can run. When running headlessly, you can stop it early using Control-C in the command line window.
Checkpoints are saved in the folder runs/EXPERIMENT_NAME/nn where EXPERIMENT_NAME
defaults to the task name, but can also be overridden via the experiment argument.
To load a trained checkpoint and continue training, use the checkpoint argument:
python train.py task=Ant checkpoint=runs/Ant/nn/Ant.pthTo load a trained checkpoint and only perform inference (no training), pass test=True
as an argument, along with the checkpoint name. To avoid rendering overhead, you may
also want to run with fewer environments using num_envs=64:
python train.py task=Ant checkpoint=runs/Ant/nn/Ant.pth test=True num_envs=64Note that If there are special characters such as [ or = in the checkpoint names,
you will need to escape them and put quotes around the string. For example,
checkpoint="./runs/Ant/nn/last_Antep\=501rew\[5981.31\].pth"
We use Hydra to manage the config. Note that this has some differences from previous incarnations in older versions of Isaac Gym.
Key arguments to the train.py script are:
task=TASK- selects which task to use. Any ofAllegroHand,AllegroHandDextremeADR,AllegroHandDextremeManualDR,AllegroKukaLSTM,AllegroKukaTwoArmsLSTM,Ant,Anymal,AnymalTerrain,BallBalance,Cartpole,FrankaCabinet,Humanoid,IngenuityQuadcopter,ShadowHand,ShadowHandOpenAI_FF,ShadowHandOpenAI_LSTM, andTrifinger(these correspond to the config for each environment in the folderisaacgymenvs/config/task)train=TRAIN- selects which training config to use. Will automatically default to the correct config for the environment (ie.<TASK>PPO).num_envs=NUM_ENVS- selects the number of environments to use (overriding the default number of environments set in the task config).seed=SEED- sets a seed value for randomizations, and overrides the default seed set up in the task configsim_device=SIM_DEVICE_TYPE- Device used for physics simulation. Set tocuda:0(default) to use GPU and tocpufor CPU. Follows PyTorch-like device syntax.rl_device=RL_DEVICE- Which device / ID to use for the RL algorithm. Defaults tocuda:0, and also follows PyTorch-like device syntax.graphics_device_id=GRAPHICS_DEVICE_ID- Which Vulkan graphics device ID to use for rendering. Defaults to 0. Note - this may be different from CUDA device ID, and does not follow PyTorch-like device syntax.pipeline=PIPELINE- Which API pipeline to use. Defaults togpu, can also set tocpu. When using thegpupipeline, all data stays on the GPU and everything runs as fast as possible. When using thecpupipeline, simulation can run on either CPU or GPU, depending on thesim_devicesetting, but a copy of the data is always made on the CPU at every step.test=TEST- If set toTrue, only runs inference on the policy and does not do any training.checkpoint=CHECKPOINT_PATH- Set to path to the checkpoint to load for training or testing.headless=HEADLESS- Whether to run in headless mode.experiment=EXPERIMENT- Sets the name of the experiment.max_iterations=MAX_ITERATIONS- Sets how many iterations to run for. Reasonable defaults are provided for the provided environments.
Hydra also allows setting variables inside config files directly as command line arguments. As an example, to set the discount rate for a rl_games training run, you can use train.params.config.gamma=0.999. Similarly, variables in task configs can also be set. For example, task.env.enableDebugVis=True.
Default values for each of these are found in the isaacgymenvs/config/config.yaml file.
The way that the task and train portions of the config works are through the use of config groups.
You can learn more about how these work here
The actual configs for task are in isaacgymenvs/config/task/<TASK>.yaml and for train in isaacgymenvs/config/train/<TASK>PPO.yaml.
In some places in the config you will find other variables referenced (for example,
num_actors: ${....task.env.numEnvs}). Each . represents going one level up in the config hierarchy.
This is documented fully here.
Source code for tasks can be found in isaacgymenvs/tasks.
Each task subclasses the VecEnv base class in isaacgymenvs/base/vec_task.py.
Refer to docs/framework.md for how to create your own tasks.
Full details on each of the tasks available can be found in the RL examples documentation.
IsaacGymEnvs includes a framework for Domain Randomization to improve Sim-to-Real transfer of trained RL policies. You can read more about it here.
If deterministic training of RL policies is important for your work, you may wish to review our Reproducibility and Determinism Documentation.
You can run multi-GPU training using torchrun (i.e., torch.distributed) using this repository.
Here is an example command for how to run in this way -
torchrun --standalone --nnodes=1 --nproc_per_node=2 train.py multi_gpu=True task=Ant <OTHER_ARGS>
Where the --nproc_per_node= flag specifies how many processes to run and note the multi_gpu=True flag must be set on the train script in order for multi-GPU training to run.
You can run population based training to help find good hyperparameters or to train on very difficult environments which would otherwise be hard to learn anything on without it. See the readme for details.
You can run WandB with Isaac Gym Envs by setting wandb_activate=True flag from the command line. You can set the group, name, entity, and project for the run by setting the wandb_group, wandb_name, wandb_entity and wandb_project set. Make sure you have WandB installed with pip install wandb before activating.
We implement the standard env.render(mode='rgb_rray') gym API to provide an image of the simulator viewer. Additionally, we can leverage gym.wrappers.RecordVideo to help record videos that shows agent's gameplay. Consider running the following file which should produce a video in the videos folder.
import gym
import isaacgym
import isaacgymenvs
import torch
num_envs = 64
envs = isaacgymenvs.make(
seed=0,
task="Ant",
num_envs=num_envs,
sim_device="cuda:0",
rl_device="cuda:0",
graphics_device_id=0,
headless=False,
multi_gpu=False,
virtual_screen_capture=True,
force_render=False,
)
envs.is_vector_env = True
envs = gym.wrappers.RecordVideo(
envs,
"./videos",
step_trigger=lambda step: step % 10000 == 0, # record the videos every 10000 steps
video_length=100 # for each video record up to 100 steps
)
envs.reset()
print("the image of Isaac Gym viewer is an array of shape", envs.render(mode="rgb_array").shape)
for _ in range(100):
actions = 2.0 * torch.rand((num_envs,) + envs.action_space.shape, device = 'cuda:0') - 1.0
envs.step(actions)You can automatically capture the videos of the agents gameplay by toggling the capture_video=True flag and tune the capture frequency capture_video_freq=1500 and video length via capture_video_len=100. You can set force_render=False to disable rendering when the videos are not captured.
python train.py capture_video=True capture_video_freq=1500 capture_video_len=100 force_render=False
You can also automatically upload the videos to Weights and Biases:
python train.py task=Ant wandb_activate=True wandb_entity=nvidia wandb_project=rl_games capture_video=True force_render=False
