trajectory_tracker.py — 这个文件实现了轨迹追踪器(Trajectory Tracker)¶
模块路径: verl.utils.debug.trajectory_tracker
文件概述¶
这个文件实现了轨迹追踪器(Trajectory Tracker),用于在训练过程中保存中间结果到 HDFS,便于离线比较和调试。每个进程通过 Ray Actor 将数据异步上传到 HDFS。
需要通过环境变量 VERL_ENABLE_TRACKER=1 启用。
关键代码讲解¶
1. HDFS 保存函数¶
@ray.remote
def save_to_hdfs(data: io.BytesIO, name, hdfs_dir, verbose):
"""将数据保存到 HDFS(Ray remote 任务)"""
filename = name + ".pth"
with tempfile.TemporaryDirectory() as tmpdirname:
local_filepath = os.path.join(tmpdirname, filename)
with open(local_filepath, "wb") as f:
f.write(data.getbuffer())
copy(local_filepath, hdfs_dir) # 上传到 HDFS
2. TrajectoryTracker Actor¶
@ray.remote
class TrajectoryTracker:
"""Ray Actor:管理异步数据上传"""
def __init__(self, hdfs_dir, verbose):
self.hdfs_dir = hdfs_dir
makedirs(hdfs_dir)
self.handle = deque() # 未完成的上传任务队列
def dump(self, data, name):
self.handle.append(save_to_hdfs.remote(data, name, self.hdfs_dir, self.verbose))
def wait_for_hdfs(self):
"""等待所有上传任务完成"""
while len(self.handle) != 0:
future = self.handle.popleft()
ray.get(future)
3. 便捷接口¶
def dump_data(data, name):
"""保存数据的便捷函数(需要环境变量启用)"""
enable = os.getenv("VERL_ENABLE_TRACKER", "0") == "1"
if not enable:
return
buffer = io.BytesIO()
torch.save(data, buffer)
tracker = get_trajectory_tracker()
ray.get(tracker.dump.remote(buffer, name))
def get_trajectory_tracker():
"""获取或创建全局 Tracker Actor(单例模式)"""
tracker = TrajectoryTracker.options(
name="global_tracker", get_if_exists=True, lifetime="detached"
).remote(hdfs_dir, verbose)
return tracker
get_if_exists=True 确保多次调用获取同一个 Actor 实例。
核心类/函数列表¶
| 类/函数名 | 作用 |
|---|---|
TrajectoryTracker |
Ray Actor,管理异步数据上传 |
dump_data |
保存数据的便捷函数 |
get_trajectory_tracker |
获取/创建全局 Tracker |
save_to_hdfs |
HDFS 上传的 Ray task |
与其他模块的关系¶
- 使用
verl.utils.hdfs_io的copy和makedirs操作 HDFS - 使用 Ray Actor 实现异步上传
- 通过环境变量
VERL_ENABLE_TRACKER控制开关
小结¶
这是一个调试/分析工具,在训练中异步保存中间数据到 HDFS。Ray Actor 的使用使得上传不会阻塞训练。deque 管理未完成的任务,wait_for_hdfs 确保训练结束前所有数据都已上传。默认关闭,需要环境变量显式开启。