1. 项目概述
最近在探索分布式强化学习框架时,发现openYuanrong这个工具非常有意思。作为一个专注于分布式计算的Python框架,它能让单机RL训练代码几乎无需修改就能实现分布式扩展。今天我就来分享一个完整的实操案例:在Docker容器中用openYuanrong训练一个CartPole倒立摆Agent。
这个项目特别适合想入门分布式RL的开发者,你只需要有一台Mac或Linux电脑,跟着步骤操作就能跑通整个流程。最终我们会得到一个可视化训练页面,直观展示Agent从零开始学习的过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具链选型
2.1 为什么选择Docker?
openYuanrong的whl包是manylinux_2_34_x86_64格式,这意味着它只能在Linux x86_64环境下运行。Docker的妙处在于:
- 环境隔离:创建一个干净的Linux环境,避免污染本机系统
- 跨平台:在Mac/Windows上也能运行Linux环境
- 可复现:镜像构建完成后可以随时重建相同环境
特别是对于使用Apple Silicon Mac(M1/M2/M3)的用户,Docker通过Rosetta 2可以模拟运行x86_64镜像,完美解决了ARM架构的兼容性问题。
2.2 基础工具清单
在开始前请确保安装以下工具:
| 工具 | 用途 | 安装方式 |
|---|---|---|
| Docker Desktop | 运行Linux容器 | 官网下载 |
| 终端 | 执行命令 | macOS自带Terminal或iTerm2 |
| 浏览器 | 查看可视化结果 | Chrome/Safari/Firefox |
Apple Silicon用户注意:虽然会看到platform警告,但这是正常现象,不影响使用。
3. 项目结构与核心组件
3.1 文件目录设计
我们采用以下目录结构,保持代码组织清晰:
code复制openYuanrong/
├── docker/
│ ├── Dockerfile
│ ├── docker-compose.yml
│ └── openyuanrong-0.7.0-cp39-cp39-manylinux_2_34_x86_64.whl
└── examples/
└── rl_agent/
├── config.py
├── policy.py
├── worker.py
├── learner.py
├── train.py
└── visualize.py
3.2 核心组件分工
- config.py:集中管理所有超参数
- policy.py:策略网络实现(纯NumPy)
- worker.py:分布式Worker,负责环境交互
- learner.py:中心化Learner,负责策略更新
- train.py:主训练脚本,串联所有组件
- visualize.py:生成训练可视化页面
4. Docker环境搭建详解
4.1 Dockerfile解析
我们的Dockerfile基于python:3.9-slim镜像,关键配置如下:
dockerfile复制FROM --platform=linux/amd64 python:3.9-slim
COPY openyuanrong-0.7.0-cp39-cp39-manylinux_2_34_x86_64.whl /tmp/
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple \
/tmp/openyuanrong-0.7.0-cp39-cp39-manylinux_2_34_x86_64.whl gymnasium numpy \
&& rm /tmp/openyuanrong-0.7.0-cp39-cp39-manylinux_2_34_x86_64.whl
WORKDIR /workspace
CMD ["bash"]
几个关键点:
--platform=linux/amd64:强制指定x86_64平台- 使用清华镜像源加速pip安装
- 安装完成后删除whl文件减小镜像体积
4.2 docker-compose配置
docker-compose.yml主要解决两个问题:
- 容器命名固定为yuanrong-dev,方便后续操作
- 挂载examples目录实现代码热更新
yaml复制services:
yuanrong:
build:
context: .
dockerfile: Dockerfile
container_name: yuanrong-dev
volumes:
- ../examples:/workspace/examples
stdin_open: true
tty: true
5. 核心代码实现
5.1 策略网络设计
我们采用两层全连接网络:
code复制状态(4维) → 全连接层(4×32) → ReLU激活 → 全连接层(32×2) → Softmax → 动作概率
选择纯NumPy实现而非PyTorch的原因:
- 减少依赖,CartPole不需要GPU加速
- 参数是普通dict,方便openYuanrong序列化传递
- 更聚焦展示分布式能力而非深度学习框架
5.2 分布式Worker实现
Worker使用@yr.instance装饰器变成可远程调用的有状态函数:
python复制@yr.instance
class RolloutWorker:
def __init__(self, env_name, state_dim, action_dim, hidden_dim):
import gymnasium
self.env = gymnasium.make(env_name)
self.policy = _WorkerPolicy(state_dim, action_dim, hidden_dim)
def rollout(self, policy_params, num_episodes=5):
self.policy.set_params(policy_params)
trajectories = []
# ...采样逻辑...
return trajectories
关键设计:
- 每个Worker维护独立的环境实例
- 内联轻量版Policy避免模块导入问题
- rollout方法返回完整的episode轨迹
5.3 训练流程控制
主训练脚本的核心循环:
python复制for iteration in range(1, MAX_ITERATIONS + 1):
# 广播最新策略参数
params_ref = yr.put(learner.get_params())
# 并行采样
traj_refs = [w.rollout.invoke(params_ref) for w in workers]
# 异步等待结果
ready, pending = yr.wait(traj_refs)
trajectories = yr.get(ready)
# 更新策略
learner.update(trajectories, iteration)
这种设计实现了:
- 参数集中管理
- 数据并行采集
- 异步训练流水线
6. 实操步骤与常见问题
6.1 完整训练流程
- 构建Docker镜像:
bash复制docker compose -f docker/docker-compose.yml build --no-cache
- 启动容器:
bash复制docker compose -f docker/docker-compose.yml up -d
- 安装curl(必须步骤):
bash复制docker exec -e http_proxy="" -e https_proxy="" yuanrong-dev \
bash -c "apt-get update && apt-get install -y curl"
- 执行训练:
bash复制docker exec -e PYTHONPATH=/workspace/examples/rl_agent \
yuanrong-dev \
python /workspace/examples/rl_agent/train.py
6.2 典型问题排查
问题1:openyuanrong.whl is not a valid wheel filename
原因:pip安装时文件名必须保持原始格式,不能修改。
解决:确保whl文件名为openyuanrong-0.7.0-cp39-cp39-manylinux_2_34_x86_64.whl
问题2:Worker报ModuleNotFoundError
原因:Python找不到模块路径。
解决:运行时设置PYTHONPATH=/workspace/examples/rl_agent
问题3:训练效果不理想
这是REINFORCE算法的固有局限。如需更好效果可以:
- 换用PPO算法
- 使用PyTorch实现
- 增加训练迭代次数
- 调整超参数
7. 可视化效果展示
训练完成后运行:
bash复制docker exec -e PYTHONPATH=/workspace/examples/rl_agent \
-w /workspace/examples/rl_agent \
yuanrong-dev \
python visualize.py /workspace/training_history.json
生成的HTML页面包含:
- CartPole动画回放
- 训练曲线图表
- 关键指标面板
- 回放控制功能
这个项目完整展示了如何使用openYuanrong实现分布式强化学习训练。虽然示例使用的是简单的CartPole环境和REINFORCE算法,但同样的架构可以扩展到更复杂的场景。openYuanrong让分布式计算变得异常简单,只需添加几个装饰器就能将单机代码转换为分布式版本。
