跳转至

py_functional.py — Python 通用函数式工具

文件路径: verl/utils/py_functional.py

文件概述

py_functional.py 提供纯 Python 的工具函数,不依赖 PyTorch 或其他深度学习库。主要处理嵌套数据结构的递归转换。

核心函数详解

1. 嵌套值转列表

def convert_nested_value_to_list_recursive(data):
    """递归地将嵌套结构中的 numpy 数组和 pandas Series 转换为 Python list"""
    if isinstance(data, np.ndarray):
        return [convert_nested_value_to_list_recursive(item) for item in data.tolist()]
    elif isinstance(data, dict):
        return {k: convert_nested_value_to_list_recursive(v) for k, v in data.items()}
    elif isinstance(data, list):
        return [convert_nested_value_to_list_recursive(item) for item in data]
    return data

这个函数解决了从 Parquet 文件读取数据时,pandas 可能将嵌套列表读成 numpy 数组的问题。Tokenizer 通常期望 Python 原生 list 作为输入。

2. 嵌套字典展平

def union_two_dict(dict1, dict2):
    """合并两个字典,对相同 key 的值进行相加"""

核心函数列表

函数 说明
convert_nested_value_to_list_recursive() 递归转换嵌套结构为 list
union_two_dict() 合并字典并累加值

与其他模块的关系

  • dataset/rl_dataset.py 和 dataset/multiturn_sft_dataset.py 用它处理 Parquet 读取的数据
  • 不依赖其他 verl 模块

小结

虽然代码量小,但 py_functional.py 解决了数据管道中常见的类型兼容问题。