Skip to content

wellkilo/DRL_MuJoCo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

89 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿค– DRL MuJoCo

ๅˆ†ๅธƒๅผๆทฑๅบฆๅผบๅŒ–ๅญฆไน ่ฎญ็ปƒๆก†ๆžถ

ๅŸบไบŽ Ray ็š„ Actor-Learner ๆžถๆž„๏ผŒ้ขๅ‘ MuJoCo ็Žฏๅขƒ่ฟ›่กŒๅนถ่กŒ้‡‡ๆ ทไธŽ็ญ–็•ฅไผ˜ๅŒ–

Next.js React Tailwind CSS Python PyTorch Ray Rust FastAPI


โœจ ๆ ธๅฟƒ็‰นๆ€ง

๐Ÿš€ ๅˆ†ๅธƒๅผ่ฎญ็ปƒ

  • Actor-Learner ๆžถๆž„๏ผšRay ้ฉฑๅŠจ็š„ๅนถ่กŒ้‡‡ๆ ท
  • Parameter Server๏ผšๅผ‚ๆญฅๅ‚ๆ•ฐๅŒๆญฅ
  • PPO ็ฎ—ๆณ•๏ผš่ฃๅ‰ชๆœบๅˆถ + ่‡ช้€‚ๅบ”็†ต็ณปๆ•ฐ
  • GAE๏ผšๅนฟไน‰ไผ˜ๅŠฟไผฐ่ฎก
  • ่‡ชๅŠจ่ฎพๅค‡้€‰ๆ‹ฉ๏ผšCUDA โ†’ MPS โ†’ CPU

๐Ÿ“Š ๅฎžๆ—ถๅฏ่ง†ๅŒ–

  • Next.js 15 + React 19 + Tailwind CSS 3
  • 4 ๆ ธๅฟƒๆŒ‡ๆ ‡๏ผšSPSใ€ๅนณๅ‡ๅ›žๆŠฅใ€ๆŸๅคฑใ€Buffer ๅคงๅฐ
  • WebSocket ๅฎžๆ—ถๆŽจ้€๏ผš่‡ชๅŠจ้‡่ฟžๆœบๅˆถ
  • ๆ€ง่ƒฝๅฏนๆฏ”๏ผšๅˆ†ๅธƒๅผ vs ๅ•ๆœบ่ฎญ็ปƒ
  • ไธ€้”ฎ็”Ÿๆˆ่ง†้ข‘๏ผšๆ™บ่ƒฝไฝ“่กจ็Žฐๆผ”็คบ

โšก Rust ้ซ˜ๆ€ง่ƒฝ็ผ“ๅ†ฒๅŒบ

  • SoA ๅ†…ๅญ˜ๅธƒๅฑ€๏ผš่ฟž็ปญๅ†…ๅญ˜๏ผŒ็ผ“ๅญ˜ๅ‹ๅฅฝ
  • Rayon ๅนถ่กŒ GAE๏ผšๅคš็บฟ็จ‹ไผ˜ๅŠฟๅ‡ฝๆ•ฐ่ฎก็ฎ—
  • PyO3 ็ป‘ๅฎš๏ผšๆ— ็ผ้›†ๆˆ Python
  • ็›ฎๆ ‡ 10-50x ๅ†…ๅญ˜ๆ“ไฝœๅŠ ้€Ÿ

๐Ÿง  PPO ไผ˜ๅŒ–

  • ๅ…จๅฑ€ Advantage ๆ ‡ๅ‡†ๅŒ–
  • ๅญฆไน ็އ็บฟๆ€ง่กฐๅ‡
  • ๆขฏๅบฆ่ฃๅ‰ช + KL ๆ•ฃๅบฆๆ—ฉๅœ
  • ไปทๅ€ผๅ‡ฝๆ•ฐ่งฃ้‡Šๆ–นๅทฎ็›‘ๆŽง
  • Clip Fraction ๅฎžๆ—ถ่ฟฝ่ธช

๐Ÿ†• ๅคš GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ

  • ๐Ÿ”ฅ ๅคš Learner ๅนถ่กŒ๏ผšๆฏ GPU ็‹ฌๅ  1 Learner + 8 Actors๏ผŒ็บฟๆ€งๆ‰ฉๅฑ•ๅžๅ
  • ๐Ÿ”„ ๅ‚ๆ•ฐๅนณๅ‡ๅŒๆญฅ๏ผšParameterServer ๅ‘จๆœŸๆ€งๅนณๅ‡ๆ‰€ๆœ‰ Learner ๅ‚ๆ•ฐ๏ผŒไฟๆŒ็ญ–็•ฅไธ€่‡ด
  • ๐Ÿ“ ่‡ชๅŠจ็ผฉๆ”พ้…็ฝฎ๏ผšbatch_size / buffer_capacity ้š GPU ๆ•ฐ็ญ‰ๆฏ”ๆ‰ฉๅฑ•
  • ๐Ÿ–ฅ๏ธ Web UI ้›†ๆˆ๏ผš้›†็พค GPU ไฟกๆฏๅฑ•็คบ + ไธ€้”ฎๅฏๅŠจๆ‰ฉๅฑ•ๅฎž้ชŒ + SSH ็ซฏๅฃ่ฝฌๅ‘
  • ๐Ÿ“ฆ ๆ‰น้‡ๅฎž้ชŒๆไบค๏ผš4 / 8 / 16 / 32 GPU ไธ€้”ฎๅฏนๆฏ”ๅฎž้ชŒ + ็ป“ๆžœๆฑ‡ๆ€ปๅˆ†ๆž

๐Ÿ–ผ๏ธ ็•Œ้ข้ข„่งˆ

๐Ÿ“Š ๅˆ†ๅธƒๅผ่ฎญ็ปƒ็›‘ๆŽง ๐Ÿ“ˆ ๅ•ๆœบ่ฎญ็ปƒ็›‘ๆŽง โš–๏ธ ๆ€ง่ƒฝๅฏนๆฏ”่ง†ๅ›พ
Distributed Single Comparison
Video Demo

๐ŸŽฌ ่ง†้ข‘ๆผ”็คบ๏ผšไธ€้”ฎ็”Ÿๆˆๅˆ†ๅธƒๅผ & ๅ•ๆœบ่ฎญ็ปƒ็ป“ๆžœๅฏนๆฏ”่ง†้ข‘


๐Ÿ—๏ธ ้กน็›ฎ็ป“ๆž„

DRL_MuJoCo/
โ”œโ”€โ”€ main.py                    # ่ฎญ็ปƒๅ…ฅๅฃ๏ผˆๆ”ฏๆŒๅคš GPU ๆ‰ฉๅฑ•๏ผ‰
โ”œโ”€โ”€ drl/                       # ๆ ธๅฟƒ DRL ๆจกๅ—
โ”‚   โ”œโ”€โ”€ config.py              # ้…็ฝฎ dataclass๏ผˆๅซ GPU ๆ‰ฉๅฑ•ๅญ—ๆฎต๏ผ‰
โ”‚   โ”œโ”€โ”€ config_loader.py       # YAML ้…็ฝฎๅŠ ่ฝฝ
โ”‚   โ”œโ”€โ”€ models.py              # Actor-Critic ๆจกๅž‹
โ”‚   โ”œโ”€โ”€ ray_components.py      # Ray ๅˆ†ๅธƒๅผ็ป„ไปถ๏ผˆLearner ๅฃฐๆ˜Ž num_gpus=1๏ผ‰
โ”‚   โ”œโ”€โ”€ logging_utils.py       # ๆ—ฅๅฟ—ๅทฅๅ…ท
โ”‚   โ””โ”€โ”€ video_generator.py     # ่ง†้ข‘็”Ÿๆˆ
โ”œโ”€โ”€ config/                    # ้…็ฝฎๆ–‡ไปถ
โ”‚   โ”œโ”€โ”€ config.yaml            # ๅˆ†ๅธƒๅผ่ฎญ็ปƒ (8 Actors)
โ”‚   โ”œโ”€โ”€ config_single.yaml     # ๅ•ๆœบ่ฎญ็ปƒ (1 Actor)
โ”‚   โ”œโ”€โ”€ walker2d.yaml          # Walker2d ๅˆ†ๅธƒๅผ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ walker2d_single.yaml   # Walker2d ๅ•ๆœบ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ halfcheetah.yaml       # HalfCheetah ๅˆ†ๅธƒๅผ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ halfcheetah_single.yaml # HalfCheetah ๅ•ๆœบ้…็ฝฎ
โ”‚   โ””โ”€โ”€ scaling/               # ๐Ÿ†• GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ้…็ฝฎ๏ผˆ่‡ชๅŠจ็”Ÿๆˆ๏ผ‰
โ”‚       โ”œโ”€โ”€ hopper_gpu4.yaml
โ”‚       โ”œโ”€โ”€ hopper_gpu8.yaml
โ”‚       โ””โ”€โ”€ ...
โ”œโ”€โ”€ web/                       # Web UI
โ”‚   โ”œโ”€โ”€ server.py              # FastAPI ๅŽ็ซฏ๏ผˆ๐Ÿ†• GPU ๆ‰ฉๅฑ• + ้›†็พค API๏ผ‰
โ”‚   โ”œโ”€โ”€ next.config.ts         # Next.js ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ tailwind.config.ts     # Tailwind ไธป้ข˜้…็ฝฎ
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ app/               # Next.js App Router
โ”‚       โ”œโ”€โ”€ components/        # React ็ป„ไปถ
โ”‚       โ”œโ”€โ”€ hooks/             # ่‡ชๅฎšไน‰ Hooks
โ”‚       โ”œโ”€โ”€ services/          # API & WebSocket
โ”‚       โ”œโ”€โ”€ stores/            # Zustand ็Šถๆ€
โ”‚       โ””โ”€โ”€ types/             # TypeScript ็ฑปๅž‹
โ”œโ”€โ”€ rust_buffer/               # Rust ้ซ˜ๆ€ง่ƒฝ็ผ“ๅ†ฒๅŒบ
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ buffer.rs          # SoA ๅ›žๆ”พ็ผ“ๅ†ฒๅŒบ
โ”‚   โ”‚   โ”œโ”€โ”€ gae.rs             # ๅนถ่กŒ GAE ่ฎก็ฎ—
โ”‚   โ”‚   โ””โ”€โ”€ lib.rs             # PyO3 ็ป‘ๅฎš
โ”‚   โ”œโ”€โ”€ Cargo.toml
โ”‚   โ””โ”€โ”€ pyproject.toml
โ”œโ”€โ”€ scripts/                   # ่พ…ๅŠฉ่„šๆœฌ
โ”‚   โ”œโ”€โ”€ build.sh               # ็Žฏๅขƒๆญๅปบ
โ”‚   โ”œโ”€โ”€ start.sh               # ไบคไบ’ๅผๅฏๅŠจๅ™จ
โ”‚   โ”œโ”€โ”€ plot_training.py       # ่ฎญ็ปƒๆ›ฒ็บฟ
โ”‚   โ”œโ”€โ”€ plot_comparison.py     # ๅฏนๆฏ”ๆ›ฒ็บฟ
โ”‚   โ”œโ”€โ”€ gen_scaling_configs.py # ๐Ÿ†• ็”Ÿๆˆ GPU ๆ‰ฉๅฑ•้…็ฝฎ
โ”‚   โ”œโ”€โ”€ analyze_scaling.py     # ๐Ÿ†• GPU ๆ‰ฉๅฑ•็ป“ๆžœๅˆ†ๆž
โ”‚   โ””โ”€โ”€ slurm/                 # Slurm ้›†็พค่„šๆœฌ
โ”‚       โ”œโ”€โ”€ setup_env.sh       #   Conda ็Žฏๅขƒๅˆ›ๅปบ + ๅ‰็ซฏๆž„ๅปบ
โ”‚       โ”œโ”€โ”€ run_webui.sh       #   ๐Ÿ†• Web UI (Slurm ่ฎก็ฎ—่Š‚็‚น)
โ”‚       โ”œโ”€โ”€ run_single.sh      #   ๅ•ๆœบ่ฎญ็ปƒ sbatch
โ”‚       โ”œโ”€โ”€ run_distributed.sh #   ๅˆ†ๅธƒๅผ่ฎญ็ปƒ sbatch
โ”‚       โ”œโ”€โ”€ run_all_envs.sh    #   ๆ‰น้‡ๆไบค 3็Žฏๅขƒร—2ๆจกๅผ
โ”‚       โ”œโ”€โ”€ run_scaling.sh     #   ๐Ÿ†• GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ sbatch
โ”‚       โ”œโ”€โ”€ run_gpu_experiments.sh # ๐Ÿ†• ไธ€้”ฎๆ‰น้‡ GPU ๅฏนๆฏ”ๅฎž้ชŒ
โ”‚       โ”œโ”€โ”€ run_plot.sh        #   ่ฎญ็ปƒๅŽ็ป˜ๅ›พ
โ”‚       โ””โ”€โ”€ monitor.sh         #   ไฝœไธš็›‘ๆŽงๅทฅๅ…ท
โ””โ”€โ”€ logs/                      # Slurm ๆ—ฅๅฟ—็›ฎๅฝ•

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

1๏ธโƒฃ ็Žฏๅขƒๆญๅปบ

๐Ÿง macOS / Linux
bash scripts/build.sh
๐ŸชŸ Windows

ๅช้œ€็กฎไฟๅทฒๅฎ‰่ฃ… Miniforge๏ผˆๆŽจ่๏ผ‰ๆˆ– Miniconda๏ผŒ่„šๆœฌไผš่‡ชๅŠจๅˆๅง‹ๅŒ– conda ็Žฏๅขƒ

scripts\build.bat

Windows ้ขๅค–ๆณจๆ„ไบ‹้กน๏ผš

  • MuJoCo ้œ€่ฆ Visual C++ Redistributable๏ผŒไธ€่ˆฌ Windows 10/11 ๅทฒ้ข„่ฃ…
  • ๅฆ‚้œ€ๆž„ๅปบ Rust Buffer๏ผŒ้œ€ๅฎ‰่ฃ… Visual Studio Build Tools๏ผˆๅ‹พ้€‰ "C++ build tools"๏ผ‰ๅ’Œ Rust
  • Ray ๅœจ Windows ไธŠๆ”ฏๆŒๅ•ๆœบๅคš่ฟ›็จ‹ๅˆ†ๅธƒๅผ่ฎญ็ปƒ๏ผˆๆœฌ้กน็›ฎๆจกๅผ๏ผ‰๏ผŒไฝ†ไธๆ”ฏๆŒๅคš่Š‚็‚น้›†็พค

่ฏฅ่„šๆœฌๅฐ†่‡ชๅŠจ๏ผš

  • โœ… ๆฃ€ๆŸฅ & ๅˆ›ๅปบ conda ็Žฏๅขƒ (drl-arm)
  • โœ… ๅฎ‰่ฃ… Python ไพ่ต– (PyTorch, Ray, MuJoCo...)
  • โœ… ๅฏ้€‰ๆž„ๅปบ Next.js ๅ‰็ซฏ
  • โœ… ๅฏ้€‰ๆž„ๅปบ Rust ๅ›žๆ”พ็ผ“ๅ†ฒๅŒบ

2๏ธโƒฃ ๅฏๅŠจ่ฎญ็ปƒ

๐Ÿง macOS / Linux
bash scripts/start.sh
๐ŸชŸ Windows

่„šๆœฌไผš่‡ชๅŠจๅˆๅง‹ๅŒ– conda๏ผŒ็›ดๆŽฅๅœจ CMD ไธญ่ฟ่กŒๅณๅฏ

scripts\start.bat
้€‰้กน ๆ่ฟฐ
1 ๅˆ†ๅธƒๅผ่ฎญ็ปƒ (8 Actors)
2 ๅ•ๆœบ่ฎญ็ปƒ (1 Actor)
3 ็ป˜ๅˆถ่ฎญ็ปƒๆ›ฒ็บฟ
4 ็ป˜ๅˆถๅฏนๆฏ”ๆ›ฒ็บฟ
5 ๅฏๅŠจ Web UI (็”Ÿไบงๆจกๅผ)
6 ๐ŸŒŸ ๅฏๅŠจ Next.js Dev Server + Web UI (ๆŽจ่)

3๏ธโƒฃ ่ฎฟ้—ฎ Web UI

้€‰ๆ‹ฉ้€‰้กน 6 ๅŽ๏ผŒๆ‰“ๅผ€ๆต่งˆๅ™จ่ฎฟ้—ฎ http://localhost:3000


โš™๏ธ ้…็ฝฎ่ฏดๆ˜Ž

็ผ–่พ‘ config/config.yaml ่ฐƒๆ•ด่ฎญ็ปƒ่ถ…ๅ‚๏ผš

ๅ‚ๆ•ฐ ้ป˜่ฎคๅ€ผ ่ฏดๆ˜Ž
env_name Hopper-v5 MuJoCo ็Žฏๅขƒๅ็งฐ
num_actors 8 ๅนถ่กŒ้‡‡ๆ ทๅ™จๆ•ฐ้‡
rollout_length 2048 ๅ•ๆฌก้‡‡ๆ ท่ฝจ่ฟน้•ฟๅบฆ
batch_size 256 ่ฎญ็ปƒๆ‰นๆฌกๅคงๅฐ
lr 0.0003 ๅญฆไน ็އ
gamma 0.99 ๆŠ˜ๆ‰ฃๅ› ๅญ
gae_lambda 0.95 GAE ฮป ๅ‚ๆ•ฐ
clip_ratio 0.15 PPO ่ฃๅ‰ชๆฏ”็އ
hidden_sizes [256, 256] ้š่—ๅฑ‚ๅคงๅฐ
max_iters 1000 ๆœ€ๅคง่ฎญ็ปƒ่ฟญไปฃๆ•ฐ
lr_schedule linear ๅญฆไน ็އ่ฐƒๅบฆ็ญ–็•ฅ
target_kl 0.015 KL ๆ•ฃๅบฆๆ—ฉๅœ้˜ˆๅ€ผ
num_gpus 1 ๐Ÿ†• GPU ๆ•ฐ้‡๏ผˆๆฏไธช GPU ่ฟ่กŒไธ€ไธช Learner๏ผ‰
actors_per_gpu 8 ๐Ÿ†• ๆฏ GPU ๅˆ†้…็š„ Actor ๆ•ฐ้‡
param_sync_interval 1 ๐Ÿ†• ๅคš Learner ๅ‚ๆ•ฐๅŒๆญฅ้—ด้š”

๐Ÿ“Š ๅ•ๆœบ vs ๅˆ†ๅธƒๅผๅฏนๆฏ”ๅฎž้ชŒ

# 1. ่ฟ่กŒๅ•ๆœบ่ฎญ็ปƒ
bash scripts/start.sh  # ้€‰ๆ‹ฉ 2

# 2. ่ฟ่กŒๅˆ†ๅธƒๅผ่ฎญ็ปƒ
bash scripts/start.sh  # ้€‰ๆ‹ฉ 1

# 3. ็ป˜ๅˆถๅฏนๆฏ”ๆ›ฒ็บฟ
bash scripts/start.sh  # ้€‰ๆ‹ฉ 4

็”Ÿๆˆ output/comparison_curves.png๏ผŒๅฏนๆฏ” ่ฎญ็ปƒ้€Ÿๅบฆ (SPS) ๅ’Œ ๅนณๅ‡ๅ›žๆŠฅใ€‚


๐ŸŒ Web UI ่ฏฆ็ป†่ฏดๆ˜Ž

ๅผ€ๅ‘ๆจกๅผ

bash scripts/start.sh  # ้€‰ๆ‹ฉ 6

่‡ชๅŠจๅฏๅŠจ๏ผš

  1. FastAPI ๅŽ็ซฏ โ†’ http://127.0.0.1:8000
  2. Next.js ๅผ€ๅ‘ๆœๅŠกๅ™จ โ†’ http://localhost:3000
  3. API ่ฏทๆฑ‚่‡ชๅŠจไปฃ็†ๅˆฐ FastAPI

็”Ÿไบงๆจกๅผ

cd web && npm install && npm run build && cd ..
bash scripts/start.sh  # ้€‰ๆ‹ฉ 5
# ่ฎฟ้—ฎ http://127.0.0.1:8000

ๅŠŸ่ƒฝๅˆ—่กจ

ๅŠŸ่ƒฝ ๆ่ฟฐ
๐ŸŽฎ ่ฎญ็ปƒๆŽงๅˆถ ไธ€้”ฎๅฏๅŠจ/ๅœๆญขๅˆ†ๅธƒๅผ & ๅ•ๆœบ่ฎญ็ปƒ
๐Ÿ“ก ๅฎžๆ—ถ็›‘ๆŽง WebSocket ๆŽจ้€ SPSใ€ๅ›žๆŠฅใ€ๆŸๅคฑใ€Buffer ๅคงๅฐ
๐Ÿ“ˆ ๅœจ็บฟ็ป˜ๅ›พ Chart.js ๅฎžๆ—ถ่ฎญ็ปƒๆ›ฒ็บฟ
โš–๏ธ ๆ€ง่ƒฝๅฏนๆฏ” ๅˆ†ๅธƒๅผ vs ๅ•ๆœบๅŒๅฑๅฏนๆฏ”
๐ŸŽฌ ่ง†้ข‘็”Ÿๆˆ ไธ€้”ฎ็”Ÿๆˆๆ™บ่ƒฝไฝ“่กจ็Žฐ่ง†้ข‘๏ผŒๆ”ฏๆŒ้‡็”Ÿๆˆ

๐Ÿฆ€ Rust ๅ›žๆ”พ็ผ“ๅ†ฒๅŒบ

๐Ÿ“– ็‚นๅ‡ปๅฑ•ๅผ€่ฏฆๆƒ…

็‰นๆ€ง

  • Structure of Arrays (SoA) ๅ†…ๅญ˜ๅธƒๅฑ€ โ€” ่ฟž็ปญๅ†…ๅญ˜๏ผŒ็ผ“ๅญ˜ๅฑ€้ƒจๆ€งๆ›ดไผ˜
  • Rayon ๅนถ่กŒ GAE โ€” ๅคš็บฟ็จ‹ๅนถ่กŒ่ฎก็ฎ—ไผ˜ๅŠฟๅ‡ฝๆ•ฐ
  • PyO3 Python ็ป‘ๅฎš โ€” ๆ— ็ผ้›†ๆˆๅˆฐ็Žฐๆœ‰ Python ่ฎญ็ปƒไปฃ็ 
  • ็›ฎๆ ‡ 10-50x ๅ†…ๅญ˜ๆ“ไฝœ้€Ÿๅบฆๆๅ‡

ๆž„ๅปบ

# ๆ–นๅผไธ€๏ผš้€š่ฟ‡ๆž„ๅปบ่„šๆœฌ
bash scripts/build.sh  # ้€‰ๆ‹ฉๆž„ๅปบ Rust Buffer

# ๆ–นๅผไบŒ๏ผšๆ‰‹ๅŠจๆž„ๅปบ
cd rust_buffer
pip install maturin
maturin develop --release

โš ๏ธ ้œ€่ฆๅ…ˆๅฎ‰่ฃ… Rust๏ผšcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh


๐Ÿ› ๏ธ ๆŠ€ๆœฏๆ ˆ

ๅŽ็ซฏ ๅ‰็ซฏ ๆ€ง่ƒฝไผ˜ๅŒ–

Python PyTorch Ray FastAPI MuJoCo

Next.js React TypeScript Tailwind CSS Zustand Chart.js

Rust ndarray Rayon PyO3


๐Ÿ›๏ธ ๆžถๆž„ๆฆ‚่งˆ

ๅ• GPU ๆžถๆž„๏ผˆ้ป˜่ฎค๏ผ‰

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Next.js Frontend                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚Distributedโ”‚ โ”‚  Single  โ”‚ โ”‚Comparisonโ”‚ โ”‚   Video   โ”‚  โ”‚
โ”‚  โ”‚   Tab     โ”‚ โ”‚   Tab    โ”‚ โ”‚   Tab    โ”‚ โ”‚  Section  โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”                            โ”‚
โ”‚                  โ”‚  Zustand  โ”‚                            โ”‚
โ”‚                  โ”‚   Store   โ”‚                            โ”‚
โ”‚                  โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜                            โ”‚
โ”‚            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                      โ”‚
โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”     โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”                โ”‚
โ”‚       โ”‚REST API โ”‚     โ”‚     โ”‚WebSocket โ”‚                โ”‚
โ”‚       โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜     โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚          โ”‚           โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚        โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”                  โ”‚
โ”‚        โ”‚       FastAPI Backend        โ”‚                  โ”‚
โ”‚        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ”‚                   โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”                             โ”‚
โ”‚                   โ”‚  Ray    โ”‚                             โ”‚
โ”‚                   โ”‚ Cluster โ”‚                             โ”‚
โ”‚        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”ดโ”€โ”€โ”              โ”‚
โ”‚   โ”‚ Actor 0 โ”‚ โ”‚Actor 1โ”‚ โ”‚Actor Nโ”‚ โ”‚Learnerโ”‚             โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”ฌโ”€โ”€โ”˜              โ”‚
โ”‚        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”                                  โ”‚
โ”‚              โ”‚  Param  โ”‚                                  โ”‚
โ”‚              โ”‚ Server  โ”‚                                  โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                  โ”‚
โ”‚                     Backend (Python)                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ†• ๅคš GPU ๆ‰ฉๅฑ•ๆžถๆž„๏ผˆGPU=4 ็คบไพ‹๏ผ‰

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        FastAPI Backend                          โ”‚
โ”‚              /api/scaling/*  /api/cluster/info                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Ray Cluster                                โ”‚
โ”‚                                                                โ”‚
โ”‚  โ”Œโ”€ Learnerโ‚€ (GPU:0) โ†โ†’ [Actorโ‚€..Actorโ‚‡]   โ† 8 CPU Actors   โ”‚
โ”‚  โ”œโ”€ Learnerโ‚ (GPU:1) โ†โ†’ [Actorโ‚ˆ..Actorโ‚โ‚…]                    โ”‚
โ”‚  โ”œโ”€ Learnerโ‚‚ (GPU:2) โ†โ†’ [Actorโ‚โ‚†..Actorโ‚‚โ‚ƒ]                   โ”‚
โ”‚  โ””โ”€ Learnerโ‚ƒ (GPU:3) โ†โ†’ [Actorโ‚‚โ‚„..Actorโ‚ƒโ‚]                   โ”‚
โ”‚                                                                โ”‚
โ”‚  ๅ…ฑไบซ: ParameterServer (ๅ‘จๆœŸๆ€งๅ‚ๆ•ฐๅนณๅ‡)                         โ”‚
โ”‚  ็‹ฌ็ซ‹: ๆฏไธช Learner ๆœ‰่‡ชๅทฑ็š„ ReplayBuffer                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆฏไธช Learner ็‹ฌๅ  1 ๅ— GPU + 8 ไธช CPU Actor ้‡‡ๆ ทใ€‚้€š่ฟ‡ ParameterServer ๆฏ่ฝฎๅ‚ๆ•ฐๅนณๅ‡๏ผˆParameter Averaging๏ผ‰ไฟๆŒๆ‰€ๆœ‰ Learner ็š„็ญ–็•ฅไธ€่‡ดใ€‚


๐Ÿ–ฅ๏ธ Slurm ้›†็พคไฝฟ็”จๆŒ‡ๅ—

้กน็›ฎๆไพ›ไบ†ๅฎŒๆ•ด็š„ Slurm ้›†็พค่ฎญ็ปƒ่„šๆœฌ๏ผŒๆ”ฏๆŒๅœจ GPU ้›†็พคไธŠๆไบคๅˆ†ๅธƒๅผ/ๅ•ๆœบ่ฎญ็ปƒไฝœไธš๏ผŒไปฅๅŠ ๐Ÿ†• Web UI ไบคไบ’ๅผ่ฎญ็ปƒ ๅ’Œ ๐Ÿ†• ๅคš GPU ๆ‰ฉๅฑ•ๅฎž้ชŒใ€‚

็ฌฌไธ€ๆญฅ๏ผšไธŠไผ ้กน็›ฎๅˆฐ้›†็พค

# ๅœจๆœฌๅœฐๆœบๅ™จไธŠ๏ผŒๅฐ†้กน็›ฎไธŠไผ ๅˆฐ้›†็พค
scp -r ./DRL_MuJoCo <็”จๆˆทๅ>@<้›†็พคๅœฐๅ€>:~/DRL_MuJoCo

็ฌฌไบŒๆญฅ๏ผšSSH ็™ปๅฝ•้›†็พค

ssh <็”จๆˆทๅ>@<้›†็พคๅœฐๅ€>
cd ~/DRL_MuJoCo

็ฌฌไธ‰ๆญฅ๏ผšๅˆ›ๅปบ Conda ็Žฏๅขƒ๏ผˆไป…้ฆ–ๆฌก้œ€่ฆ๏ผ‰

# ็›ดๆŽฅๅœจ็ฎก็†่Š‚็‚นไธŠ่ฟ่กŒ๏ผˆไธ้œ€่ฆ sbatch๏ผ‰
bash scripts/slurm/setup_env.sh

โš ๏ธ ่ฟ่กŒๅ‰ๅ…ˆๆฃ€ๆŸฅ้›†็พค CUDA ็‰ˆๆœฌ๏ผš

nvidia-smi  # ๆŸฅ็œ‹ๅณไธŠ่ง’ CUDA Version

ๅฆ‚ๆžœๆ˜ฏ CUDA 12.1๏ผŒ้œ€ๅ…ˆ็ผ–่พ‘ scripts/slurm/setup_env.sh ๅฐ† cu118 ๆ”นไธบ cu121ใ€‚

่ฟ™ไธ€ๆญฅๅฎŒๆˆๅŽ๏ผŒdrl_mujoco Conda ็Žฏๅขƒๅ’Œ Next.js ๅ‰็ซฏๅฐฑๆž„ๅปบๅฅฝไบ†๏ผŒไปฅๅŽไธ้œ€่ฆๅ†่ฟ่กŒใ€‚

ๆ–นๅผไธ€๏ผšWeb UI ไบคไบ’ๅผ่ฎญ็ปƒ๏ผˆๆŽจ่๏ผ‰

ๅœจ่ฎก็ฎ—่Š‚็‚นไธŠๅฏๅŠจ Web UI๏ผŒ้€š่ฟ‡ SSH ็ซฏๅฃ่ฝฌๅ‘ๅœจๆœฌๅœฐๆต่งˆๅ™จไธญ่ฎฟ้—ฎ๏ผš

# ๆไบค Web UI ไฝœไธš๏ผˆ1 GPU ๅŸบ็ก€ๆจกๅผ๏ผ‰
sbatch scripts/slurm/run_webui.sh

# ๆไบค Web UI ไฝœไธš๏ผˆ4 GPU ๆ‰ฉๅฑ•ๆจกๅผ๏ผ‰
sbatch --gres=gpu:4 --cpus-per-task=40 --mem=64G scripts/slurm/run_webui.sh

# ๆŸฅ็œ‹ๆ—ฅๅฟ—่Žทๅ–่ฟžๆŽฅๅ‘ฝไปค
cat logs/webui_<JOBID>.out

ๆ—ฅๅฟ—ไธญไผšๆ˜พ็คบ SSH ็ซฏๅฃ่ฝฌๅ‘ๅ‘ฝไปค๏ผŒๅœจๆœฌๅœฐ็ปˆ็ซฏๆ‰ง่กŒ๏ผš

ssh -N -L 8000:<่ฎก็ฎ—่Š‚็‚น>:8000 <็”จๆˆทๅ>@<้›†็พค็ฎก็†่Š‚็‚น>

็„ถๅŽๆต่งˆๅ™จๆ‰“ๅผ€ http://localhost:8000 ๅณๅฏไฝฟ็”จ Web UI๏ผš

  • ๐ŸŽฎ ไธ€้”ฎๅฏๅŠจ/ๅœๆญข่ฎญ็ปƒ
  • ๐Ÿ“ก ๅฎžๆ—ถ็›‘ๆŽง่ฎญ็ปƒๆ›ฒ็บฟ
  • ๐Ÿ†• ๆŸฅ็œ‹้›†็พค GPU ไฟกๆฏ
  • ๐Ÿ†• ๅฏๅŠจ GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ

ๆ–นๅผไบŒ๏ผšๅ‘ฝไปค่กŒๆไบค่ฎญ็ปƒไฝœไธš

ๅ•็‹ฌๆไบคไธ€ไธชไปปๅŠก๏ผš

# ๅ•ๆœบๆจกๅผ
sbatch scripts/slurm/run_single.sh

# ๅˆ†ๅธƒๅผๆจกๅผ
sbatch scripts/slurm/run_distributed.sh

# ๆŒ‡ๅฎšๅ…ถไป–็Žฏๅขƒ้…็ฝฎ
sbatch scripts/slurm/run_single.sh config/walker2d_single.yaml
sbatch scripts/slurm/run_distributed.sh config/walker2d.yaml

ไธ€้”ฎๆ‰น้‡ๆไบคๅ…จ้ƒจ 6 ไธชไปปๅŠก๏ผš

bash scripts/slurm/run_all_envs.sh --dry-run   # ้ข„่งˆ
bash scripts/slurm/run_all_envs.sh              # ๆไบค

๐Ÿ†• ๆ–นๅผไธ‰๏ผšGPU ๆ‰ฉๅฑ•ๆ€งๅฏนๆฏ”ๅฎž้ชŒ

ๆ”ฏๆŒ 4/8/16/32 GPU ็š„ๆ‰ฉๅฑ•ๆ€งๅฏนๆฏ”ๅฎž้ชŒ๏ผš

# 1. ็”Ÿๆˆ็ผฉๆ”พ้…็ฝฎ๏ผˆ่‡ชๅŠจ็ผฉๆ”พ actorsใ€batch_sizeใ€buffer๏ผ‰
python scripts/gen_scaling_configs.py --gpu_counts 4 8 16 32

# 2. ้ข„่งˆๅฎž้ชŒ
bash scripts/slurm/run_gpu_experiments.sh --dry-run

# 3. ๆไบคๅ…จ้ƒจๅฎž้ชŒ
bash scripts/slurm/run_gpu_experiments.sh

# 4. ไนŸๅฏไปฅๅช่ท‘้ƒจๅˆ†ๅฎž้ชŒ
bash scripts/slurm/run_gpu_experiments.sh --envs hopper --gpus 4 8

# 5. ๅˆ†ๆž็ป“ๆžœ
python scripts/analyze_scaling.py --input_dir output/scaling

GPU ๆ‰ฉๅฑ•่ต„ๆบ็ผฉๆ”พๅฏน็…ง่กจ๏ผš

GPU ๆ•ฐ้‡ ่Š‚็‚นๆ•ฐ (ๆฏ่Š‚็‚น 4 GPU) Actors ๆ€ปๆ•ฐ batch_size CPU ๆ ธๅฟƒ ๅ†…ๅญ˜
4 1 32 2048 40 64G
8 2 64 4096 40/่Š‚็‚น 64G/่Š‚็‚น
16 4 128 8192 40/่Š‚็‚น 64G/่Š‚็‚น
32 8 256 16384 40/่Š‚็‚น 64G/่Š‚็‚น

โš ๏ธ run_gpu_experiments.sh ไธญ็š„ GPUS_PER_NODE=4 ้œ€ๆ นๆฎๅฎž้™…้›†็พคไฟฎๆ”นใ€‚

็›‘ๆŽง่ฎญ็ปƒ่ฟ›ๅบฆ

# ๆŸฅ็œ‹ๆ‰€ๆœ‰ไฝœไธš็Šถๆ€
bash scripts/slurm/monitor.sh

# ๅฎžๆ—ถๆŸฅ็œ‹ๆŸไธชไฝœไธš็š„ๆ—ฅๅฟ—
bash scripts/slurm/monitor.sh <JOB_ID>

# ๅ–ๆถˆๆ‰€ๆœ‰ไฝœไธš
bash scripts/slurm/monitor.sh --cancel-all

่ฎญ็ปƒๅฎŒๆˆๅŽ็ป˜ๅ›พ

# ็ป˜ๅˆถๅ…จ้ƒจๅ›พ่กจ
sbatch scripts/slurm/run_plot.sh

# ๆˆ–ไป…็ป˜ๅˆถ็‰นๅฎš็ฑปๅž‹
sbatch scripts/slurm/run_plot.sh --training     # ่ฎญ็ปƒ่ฏฆๆƒ…ๅ›พ
sbatch scripts/slurm/run_plot.sh --comparison   # ๅคš็Žฏๅขƒๅฏนๆฏ”ๅ›พ

Slurm ่„šๆœฌ่ต„ๆบๅˆ†้…

่„šๆœฌ CPUs ๅ†…ๅญ˜ GPU ๆ—ถ้™ ่ฏดๆ˜Ž
run_single.sh 4 8G 1 7ๅคฉ ๅ•ๆœบ 1 Actor + 1 Learner
run_distributed.sh 12 32G 1 7ๅคฉ ๅˆ†ๅธƒๅผ 8 Actors + Ray ้›†็พค
run_plot.sh 2 4G 0 1ๅฐๆ—ถ ็บฏ CPU ็ป˜ๅ›พไปปๅŠก
๐Ÿ†• run_webui.sh 16 32G 1+ 7ๅคฉ Web UI + ่ฎญ็ปƒ๏ผˆๅฏ็”ณ่ฏทๅคš GPU๏ผ‰
๐Ÿ†• run_scaling.sh 16 32G 1+ 7ๅคฉ GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ๏ผˆๆ”ฏๆŒๅคš่Š‚็‚น๏ผ‰

ๆ‰ง่กŒๆต็จ‹ๆ€ป็ป“

้ฆ–ๆฌกไฝฟ็”จ:
  โ‘  bash scripts/slurm/setup_env.sh            โ† ไป…้œ€่ฟ่กŒไธ€ๆฌก

Web UI ๆจกๅผ (ไบคไบ’ๅผ):
  โ‘ก sbatch scripts/slurm/run_webui.sh          โ† ๆไบค Web UI ไฝœไธš
  โ‘ข ssh -N -L 8000:<node>:8000 user@gateway    โ† ๆœฌๅœฐ็ซฏๅฃ่ฝฌๅ‘
  โ‘ฃ ๆต่งˆๅ™จๆ‰“ๅผ€ http://localhost:8000            โ† ๅฏ่ง†ๅŒ–ๆ“ไฝœ

ๅ‘ฝไปค่กŒๆจกๅผ (ๅŽๅฐๆ‰น้‡):
  โ‘ก sbatch scripts/slurm/run_single.sh         โ† ๆไบคๅ•ๆœบ่ฎญ็ปƒ
     ๆˆ– sbatch scripts/slurm/run_distributed.sh โ† ๆไบคๅˆ†ๅธƒๅผ่ฎญ็ปƒ
     ๆˆ– bash scripts/slurm/run_all_envs.sh      โ† ไธ€้”ฎๆไบคๅ…จ้ƒจ6ไธชไปปๅŠก

GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ:
  โ‘ก python scripts/gen_scaling_configs.py      โ† ็”Ÿๆˆ็ผฉๆ”พ้…็ฝฎ
  โ‘ข bash scripts/slurm/run_gpu_experiments.sh  โ† ไธ€้”ฎๆไบคๅฏนๆฏ”ๅฎž้ชŒ

่ฎญ็ปƒไธญ:
  โ‘ค bash scripts/slurm/monitor.sh              โ† ็›‘ๆŽงไฝœไธš

่ฎญ็ปƒๅŽ:
  โ‘ฅ sbatch scripts/slurm/run_plot.sh           โ† ็ป˜ๅ›พ
  โ‘ฆ python scripts/analyze_scaling.py          โ† ๐Ÿ†• ๅˆ†ๆž GPU ๆ‰ฉๅฑ•็ป“ๆžœ

ๆ—ฅๅฟ—ๆ–‡ไปถ่‡ชๅŠจๅ†™ๅ…ฅ logs/ ็›ฎๅฝ•๏ผŒๆ ผๅผไธบ single_<JOBID>.outใ€dist_<JOBID>.outใ€webui_<JOBID>.outใ€scale_<JOBID>.outใ€‚

๐Ÿ†• Web UI ๆ–ฐๅขž API

็ซฏ็‚น ๆ–นๆณ• ่ฏดๆ˜Ž
/api/scaling/configs GET ่Žทๅ–ๆ‰€ๆœ‰ GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ้…็ฝฎ
/api/scaling/metrics?config_name=hopper_gpu4 GET ่Žทๅ–ๆ‰ฉๅฑ•ๅฎž้ชŒ่ฎญ็ปƒๆŒ‡ๆ ‡
/api/scaling/start?config_name=hopper_gpu4 POST ๅฏๅŠจ GPU ๆ‰ฉๅฑ•ๅฎž้ชŒ
/api/scaling/status GET ่Žทๅ–ๆ‰ฉๅฑ•ๅฎž้ชŒ่ฟ่กŒ็Šถๆ€
/api/cluster/info GET ่Žทๅ–้›†็พค GPU ไฟกๆฏ + Ray ่ต„ๆบ