270 lines
13 KiB
Python
270 lines
13 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
DiscoRL ↔ Gym 集成 - 快速参考
|
||
|
||
使用方式:
|
||
python scripts/QUICK_START.py
|
||
"""
|
||
|
||
quick_ref = """
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ DiscoRL × Gym 集成 - 快速参考卡 ║
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────┐
|
||
│ 1️⃣ 验证安装 (5 分钟) │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
|
||
$ python scripts/test_disco_setup.py
|
||
|
||
预期输出:
|
||
✓ All core components working!
|
||
✓ 所有 5 个测试通过
|
||
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────┐
|
||
│ 2️⃣ 在 CartPole 上训练 (1 分钟) │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
|
||
$ python scripts/train_disco_cartpole.py
|
||
|
||
配置:
|
||
- batch_size=4
|
||
- trajectory_length=32
|
||
- num_iterations=50
|
||
|
||
预期输出:
|
||
✓ Training Complete
|
||
✓ Final avg reward: ~0.97
|
||
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────┐
|
||
│ 3️⃣ 验证集成 (30 秒) │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
|
||
$ python scripts/poc_integration.py
|
||
|
||
预期输出:
|
||
✓ Success! DiscoRL ↔ Gym integration works!
|
||
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ 核心代码段
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────┐
|
||
│ A) 环境设置 │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
|
||
from disco_cartpole_env import DiscoCartPoleEnv
|
||
|
||
env = DiscoCartPoleEnv(batch_size=4, max_steps=500)
|
||
obs_spec = env.single_observation_spec()
|
||
act_spec = env.single_action_spec()
|
||
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────┐
|
||
│ B) 代理创建 │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
|
||
from disco_rl import agent as disco_agent
|
||
|
||
agent_settings = disco_agent.get_settings_disco()
|
||
agent = disco_agent.Agent(
|
||
single_observation_spec=obs_spec,
|
||
single_action_spec=act_spec,
|
||
agent_settings=agent_settings,
|
||
batch_axis_name=None,
|
||
)
|
||
|
||
learner_state = agent.initial_learner_state(rng_key)
|
||
actor_state = agent.initial_actor_state(rng_key)
|
||
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────┐
|
||
│ C) 数据收集 │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
|
||
state, timestep = env.reset(rng_key=subkey)
|
||
|
||
for t in range(trajectory_length):
|
||
# 代理推理
|
||
actor_timestep, actor_state = agent.actor_step(
|
||
learner_state.params,
|
||
rng,
|
||
timestep,
|
||
actor_state,
|
||
)
|
||
|
||
# 环境步进
|
||
state, timestep = env.step(state, actor_timestep.actions)
|
||
|
||
# 记录数据
|
||
observations.append(timestep.observation['observation'])
|
||
actions.append(actor_timestep.actions)
|
||
rewards.append(timestep.reward)
|
||
# ... 等
|
||
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────┐
|
||
│ D) 参数更新 │
|
||
└──────────────────────────────────────────────────────────────────────────┘
|
||
|
||
from disco_rl import types
|
||
|
||
rollout = types.ActorRollout(
|
||
observations=jnp.stack(observations),
|
||
actions=jnp.stack(actions),
|
||
rewards=jnp.stack(rewards),
|
||
discounts=jnp.stack(discounts),
|
||
agent_outs=agent_outs_stacked,
|
||
logits=jnp.stack(logits),
|
||
states=actor_state,
|
||
)
|
||
|
||
new_learner_state, new_actor_state, logs = agent.learner_step(
|
||
rng=rng,
|
||
rollout=rollout,
|
||
learner_state=learner_state,
|
||
agent_net_state=actor_state,
|
||
update_rule_params=update_rule_params,
|
||
is_meta_training=False,
|
||
)
|
||
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ 常见问题与答案
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
Q: 如何用于自定义环境?
|
||
A: 1. cp disco_cartpole_env.py disco_custom_env.py
|
||
2. 修改 __init__ 中的环境创建逻辑
|
||
3. 调整 action_spec 和 observation_spec
|
||
|
||
Q: 如何加载预训练权重?
|
||
A: 预训练权重加载目前在开发中
|
||
临时解决: 使用随机初始化的参数
|
||
|
||
Q: 如何扩展到多个 GPU?
|
||
A: 1. 移除 os.environ['JAX_PLATFORMS'] = 'cpu'
|
||
2. 使用 jax.device_count() 获取设备数
|
||
3. 在 agent.learner_step 中设置 batch_axis_name='devices'
|
||
|
||
Q: 性能太慢怎么办?
|
||
A: • 增加 batch_size (更多并行环境)
|
||
• 减少 trajectory_length
|
||
• 使用 GPU (移除 CPU-only 设置)
|
||
• 减少网络大小 (调整 agent_settings)
|
||
|
||
Q: CartPole 不难吗?
|
||
A: CartPole 是验证集成的好工具
|
||
一旦工作,应用到实际环境:
|
||
• gym_env_250326_erase.py (自定义任务)
|
||
• 或任何其他 Gym 兼容环境
|
||
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ 文件参考
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
核心文件 (必需):
|
||
disco_cartpole_env.py 环境适配器 ← 为自定义环境修改这个
|
||
|
||
工具文件:
|
||
disco_weights.py 权重加载
|
||
train_disco_cartpole.py 训练循环
|
||
test_disco_setup.py 测试套件
|
||
|
||
文档:
|
||
INTEGRATION_GUIDE.py 详细指南
|
||
COMPLETION_SUMMARY.py 完成报告
|
||
QUICK_START.py 本文件
|
||
|
||
配置文件 (如需):
|
||
config_*.json 在 configs/ 中
|
||
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ 关键数据类型
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
types.EnvironmentTimestep:
|
||
observation: dict {'observation': Array([B, ...], float32)}
|
||
step_type: Array([B], int32) 0=MID, 1=LAST
|
||
reward: Array([B], float32)
|
||
|
||
types.ActorTimestep:
|
||
observations: dict
|
||
actions: Array([B], int32) 动作索引
|
||
agent_outs: dict 策略网络输出
|
||
logits: Array([B, num_actions])
|
||
...
|
||
|
||
types.ActorRollout:
|
||
observations, actions, rewards, discounts, agent_outs, logits, states
|
||
(所有都在时间维度堆叠: [T, B, ...])
|
||
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ 环境规格 (CartPole)
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
观测空间: Box(4,) ← 杆角度、角速度、车位置、车速度
|
||
动作空间: Discrete(2) ← 0=向左推, 1=向右推
|
||
奖励: +1.0 ← 每一步 (最多 500 步)
|
||
完成: 当角度 > 24° 或位置超出界限
|
||
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ 常用命令
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
# 快速验证
|
||
python scripts/test_disco_setup.py
|
||
|
||
# 完整训练 (50 iter, 4 batch)
|
||
python scripts/train_disco_cartpole.py
|
||
|
||
# 端到端演示
|
||
python scripts/poc_integration.py
|
||
|
||
# 查看详细文档
|
||
python scripts/INTEGRATION_GUIDE.py | less
|
||
|
||
# 查看完成报告
|
||
python scripts/COMPLETION_SUMMARY.py | less
|
||
|
||
# 运行此快速参考
|
||
python scripts/QUICK_START.py
|
||
|
||
|
||
╔════════════════════════════════════════════════════════════════════════════╗
|
||
║ 总结
|
||
╚════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
✓ DiscoRL (JAX) ↔ Gym (任何环境)
|
||
|
||
✓ 完整的训练循环
|
||
|
||
✓ 预验证的代码
|
||
|
||
✓ 可立即复用的模板
|
||
|
||
准备开始? 运行:
|
||
python scripts/test_disco_setup.py
|
||
|
||
有问题? 查看:
|
||
python scripts/INTEGRATION_GUIDE.py
|
||
|
||
"""
|
||
|
||
print(quick_ref)
|
||
|
||
# 如果用户想保存
|
||
import sys
|
||
if len(sys.argv) > 1 and sys.argv[1] == '--save':
|
||
with open('/home/frank14f/Frank_LBM/scripts/QUICK_START.txt', 'w') as f:
|
||
f.write(quick_ref)
|
||
print("✓ Saved to QUICK_START.txt")
|