๐ ์ต๊ทผ ๋ก๋ด ์ฐ๊ตฌ์์ ๋ก๋ณดํฑ์ค ์๋ฎฌ๋ ์ด์ ์ ๋ชจ๋ธ ์ฑ๋ฅ ๊ฒ์ฆ, ํ์ต ์ํฌํ๋ก์ฐ ๊ตฌ์ถ, ๋๊ท๋ชจ ํฉ์ฑ๋ฐ์ดํฐ ์์ฑ ๋ฑ ๋ค์ํ ๋ชฉ์ ์ผ๋ก ํ์ฉ๋๊ณ ์๋ค. ๋ก๋ด ํ์ต ๋ฐ ์๋ฎฌ๋ ์ด์ ์ ์ํ ์ฌ๋ฌ ํ๋ซํผ์ด ์กด์ฌํ๋ ๊ฐ์ด๋ฐ, NVIDIA์ Isaac Lab์ GPU ๊ฐ์, CUDA, TensorRT ๋ฑ์ ๋ฅ๋ฌ๋ SDK์ Omniverse Isaac Sim์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ ํ์ง ๊ทธ๋ํฝ๊ณผ ์ค์๊ฐ ๋ ์ดํธ๋ ์ด์ฑ์ ์ง์ํ๋ ๊ฐ์ํ๊ฒฝ์ ์ ๊ณตํ๋ค. ์ด๋ฌํ ํน์ง๋ค์ Embodied AI๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์๋ค์๊ฒ ๊ฐ๋ ฅํ๊ณ ํจ๊ณผ์ ์ธ ์๋ฃจ์ ์ด ๋ ์ ์๋ค.
๋ ์ญ์๋ Isaac Lab์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ๊ณต๋ถํ๋ ๊ฒ์ ํฅํ ์ฐ๊ตฌ์ ๋ง์ ๋์์ด ๋ ๊ฒ์ด๋ผ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋์, Isaac Lab์ ๊ธฐ๋ณธ์ ์ธ ํํ ๋ฆฌ์ผ๋ถํฐ ํ ์ด ํ๋ก์ ํธ๋ฅผ ๊ฑฐ์ณ ์ค์ ์ฐ๊ตฌ ์ ์ฉ๊น์ง์ ๊ณผ์ ์ ์ ๋ฆฌํ์ฌ ํฌ์คํ ํ๋ ค๊ณ ํ๋ค.
1. Before Getting Started
1.1. NGC(NVIDIA GPU Cloud) Container
NGC์์๋ AI, ๋จธ์ ๋ฌ๋ ๋ฐ ๊ณ ์ฑ๋ฅ ์ปดํจํ (HPC)์ ์ํ ์ปจํ ์ด๋์ ์ ๊ณตํ๋ฉฐ, ์ฌ์ ํ์ต๋ AI ๋ชจ๋ธ๊ณผ ์๊ฐํ ๋๊ตฌ๋ฅผ ํฌํจํ ์ํํธ์จ์ด ์คํ์ ์ง์ํ๋ค. AI ๋ชจ๋ธ ๊ตฌ์ถ์ ๋ณต์กํ๊ณ ๋ง์ ์๊ฐ์ด ์์๋๋๋ฐ NGC์ ํตํฉ ์ปจํ ์ด๋ ๊ธฐ์ ์ ๋ฐฐํฌ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํ๊ณ AI ํ๋ก์ ํธ๋ฅผ ๊ฐ์ํํ๋ ๋ฐ ๋์์ ์ค๋ค.
๋ํ, NGC๋ AI ๋ชจ๋ธ ๊ฐ๋ฐ์ ์ต์ ํ๋ Docker ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ฉฐ TensorFlow, PyTorch ๋ฑ ์ฃผ์ ํ๋ ์์ํฌ๋ฅผ ํญ๋๊ฒ ์ง์ํ์ฌ GPU ๊ด๋ จ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ ์์ธํ ๋ด์ฉ์ NVIDIA NGC Catalog์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์์์ NVIDIA Isaac Lab๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ ํ์ธํ ์ ์๋ค.
2. Build the Isaac Lab container
Issac Lab ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํด, Dockerfile๊ณผ docker-compose.yml, .env ํ์ผ์ ํฌํจํ๋ Root GitHub Repository๋ฅผ ํด๋ก ํ๋ค.
$ git clone https://github.com/isaac-sim/IsaacLab.git
ํด๋ก ํด์จ IsaacLab ์ ์ฅ์์ ./docker ๋๋ ํ ๋ฆฌ์๋ Docker ๋ฐ ROS2 ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๊ณ ์คํํ๋ ๋ฐ ํ์ํ ํ์ผ๋ค์ด ์์นํด ์๋ค.
container.py์ container.sh์ Isaac Lab์ Docker ์ปจํ ์ด๋๋ฅผ ์ฝ๊ฒ ์คํํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ๋ง๋ค์ด์ง Python ๋ฐ Bash ์คํฌ๋ฆฝํธ์ด๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์ปจํ ์ด๋๋ฅผ ์คํํด๋ณด์.
$ cd IsaacLab
$ python3 docker/container.py start
container.py๋ Docker ์ปจํ ์ด๋๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ CLI ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํ๋ค. ์ฃผ์ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
- start: ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์ปจํ ์ด๋๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ
- enter: ์คํ ์ค์ธ Isaac Lab ์ปจํ ์ด๋์ ์ bash ํ๋ก์ธ์ค๋ก ์ง์
- config: ์ ๊ณต๋ YAML ๋ฐ ํ๊ฒฝ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก docker-compose.yaml ์์ฑ ๋๋ ์ถ๋ ฅ
- copy: ์ปจํ ์ด๋์์ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ ๋ฐ ๋ก๊ทธ ํ์ผ์ ํธ์คํธ๋ก ๋ณต์ฌ
- stop: ๋์ปค ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํ๊ณ ์ญ์
์ด๋ฏธ์ง ๋น๋๊ฐ ์๋ฃ๋๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์ปจํ ์ด๋๋ฅผ ์คํํ ์ ์๋ค.
$ python3 docker/container.py enter
์ด ํ๊ฒฝ์์๋ Isaac Lab ์ ์ฅ์์ ์ฌ๋ณธ์ ํฌํจํ๋ฉฐ, Isaac Sim์ ๋๋ ํ ๋ฆฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ก์ธ์ค๊ฐ ๊ฐ๋ฅํ๋ค. ๋ํ, ์ปจํ ์ด๋์์๋ ํธ์คํธ ์ฅ์น์ IsaacLab ๋๋ ํ ๋ฆฌ๊ฐ ๋ง์ดํธ๋์ด ์๊ธฐ ๋๋ฌธ์ ํธ์คํธ์์ ํด๋น ๋๋ ํ ๋ฆฌ ์๋์ ํ์ผ์ ์์ ํ๋ฉด Docker ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๋น๋ํ ํ์ ์์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์ปจํ ์ด๋์ ์ฆ์ ๋ฐ์๋๋ค.
3. Training with an RL Agent
์ด์ ์ปจํ ์ด๋ ์์์ Isaac Lab ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ํฌํจ๋ PPO ์์ด์ ํธ๋ฅผ Stable-Baseline3๋ฅผ ์ฌ์ฉํ์ฌ Cartpole balancing task๋ฅผ ํด๊ฒฐํ๋ ๊ฐํํ์ต ์์ ๋ฅผ ์คํํด๋ณด๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด์.
์ด ํํ ๋ฆฌ์ผ๊ณผ ๊ด๋ จ๋ ๋ ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ํตํด ํ์ธํ ์ ์๋ค.
$ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 64 --headless --video --max_iterations 2000
[INFO]: Time taken for scene creation : 1.056965 seconds
[INFO]: Scene manager: <class InteractiveScene>
Number of environments: 64
Environment spacing : 4.0
Source prim name : /World/envs/env_0
Global prim paths : []
Replicate physics : True
[INFO]: Starting the simulation. This may take a few seconds. Please wait...
์์ด์ ํธ๋ฅผ ํ๋ จํ๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ด ์๊ณ , ํ๋๊ทธ๋ฅผ ํตํด ์ค์ ํ ์ ์๋ค.
- Headless execution: --headless ํ๋๊ทธ๊ฐ ์ค์ ๋๋ฉด ์๋ฎฌ๋ ์ด์ ์ ํ๋ จ ์ค์ ๋ ๋๋ง๋์ง ์๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ๋จ๊ณ๋ง ์ํ๋๊ธฐ ๋๋ฌธ์ ํ๋ จ ํ๋ก์ธ์ค๊ฐ ๋นจ๋ผ์ง๋ค.
$ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 64 --headless
- Headless execution with off-screen render: ์์ headless ์คํ์ ์๋ฎฌ๋ ์ด์ ์ ๋ ๋๋งํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ จ ์ค์ ์์ด์ ํธ์ ํ๋์ ์๊ฐํํ ์ ์๋ค. ์์ด์ ํธ์ ํ๋์ ์๊ฐํํ๊ธฐ ์ํด ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ํ์ฑํ(--enable_cameras)ํ๊ณ ํ๋ จ ์ค์ ์์ด์ ํธ์ ํ๋์ ๋ นํ(--video)ํ๋ ํ๋๊ทธ๋ฅผ ์ ๋ฌํ๋ค.
$ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 64 --headless --video
์ ์ฅ๋ ๋น๋์ค๋ logs/sb3/Isaac-Cartpole-v0/$run-dir/videos/train ๋๋ ํ ๋ฆฌ์ ์ ์ฅ๋๋ค.
- Interactive execution: ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ์์ด์ ํธ๊ฐ ์๋ฎฌ๋ ์ด์ ํ๊ฒฝ๊ณผ ์ํธ ์์ฉํ๋ฉฐ ํ๋ จ๋๊ณ ์๋์ง ํ์ธํ ์ ์๋ค. ํ์ง๋ง, ์๋ฎฌ๋ ์ด์ ์ด ํ๋ฉด์ ๋ ๋๋ง๋๋ฏ๋ก ํ๋ จ ํ๋ก์ธ์ค๊ฐ ๋๋ ค์ง ์ ์๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฉด ์ค๋ฅธ์ชฝ ํ๋จ์ ๋ํน๋ ์ฐฝ์์ ๋ค๋ฅธ ๋ ๋๋ง ๋ชจ๋ ๊ฐ์ ์ ํํ ์ ์๋ค.
$ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 64
๋ณ๋์ ํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ ์คํํ์ฌ ํ์ต ์งํ ์ํฉ์ ๋ชจ๋ํฐ๋งํ ์ ์๋ค.
$ ./isaaclab.sh -p -m tensorboard.main --logdir logs/sb3/Isaac-Cartpole-v0
ํ๋ จ์ด ์๋ฃ๋๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ํ๋ จ๋ ์์ด์ ํธ๋ฅผ Isaac Sim์์ ์๊ฐํํ ์ ์๋ค.
$ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Cartpole-v0 --num_envs 32 --use_last_checkpoint
4. Trained Agent Visualization
์์ด์ ํธ์ ํ๋ จ์ด ์๋ฃ๋๋ฉด ํฐ๋ฏธ๋์์ ๋ค์๊ณผ ๊ฐ์ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.
------------------------------------------
| rollout/ | |
| ep_len_mean | 293 |
| ep_rew_mean | 4.82 |
| time/ | |
| fps | 6365 |
| iterations | 2000 |
| time_elapsed | 321 |
| total_timesteps | 2048000 |
| train/ | |
| approx_kl | 0.0043435125 |
| clip_fraction | 0.0512 |
| clip_range | 0.2 |
| entropy_loss | -0.0181 |
| explained_variance | 0.57 |
| learning_rate | 0.0003 |
| loss | 0.0119 |
| n_updates | 39980 |
| policy_gradient_loss | -0.00246 |
| std | 0.247 |
| value_loss | 0.017 |
------------------------------------------
Saving model checkpoint to /workspace/isaaclab/logs/sb3/Isaac-Cartpole-v0/2025-02-07_07-05-22/model_2048000_steps.zip
์๋๋ ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ์ฌ์ฉํ์ฌ ์์ด์ ํธ์ ํ๋ จ ์ค ํ๋์ ์คํ 0, 2000, 30000์์ ์ ์ฅ๋ ์์๊ณผ, ์ต์ข ํ๋ จ๋ ๋ชจ๋ธ์ ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ก๋ํ์ฌ ํ๊ฒฝ์์ ์์ด์ ํธ๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํ ์์์ด๋ค.
- Step 0: Initial agent behavior at the beginning of training
- Step 2000: Agentโs progress after 2000 steps of training
- Step 30000: Agentโs behavior after 30000 steps, nearing the end of training
- Final Model Execution: Agent performance after loading the final trained model checkpoint.
๋ค์ ํฌ์คํ ์์๋ ๊ธฐ๋ณธ ํ๊ฒฝ ์ค์ ์ ๋ค๋ฃฌ ํ ๊ฐ์ฒด(rigid object), ๊ด์ (articulation), ๋ณํ ๊ฐ๋ฅํ ๊ฐ์ฒด(deformable object)์์ ์ํธ์์ฉ์ ๋ํ ํํ ๋ฆฌ์ผ์ ์งํํ ์์ ์ด๋ค.