从JSON到Parquet视频问答数据集适配EasyR1框架全流程解析当你手头有一批精心标注的视频问答数据却苦于无法直接用于EasyR1框架训练时数据格式转换往往成为第一道门槛。本文将彻底解决这个痛点带你完整走通从原始JSON到适配EasyR1的Parquet格式转换全流程涵盖字段映射、路径处理、避坑指南等实战细节。1. 理解EasyR1的数据需求EasyR1作为多模态强化学习训练框架对输入数据有明确的结构化要求。核心字段包括prompt包含视频引用和问题的文本提示answer模型需要预测的正确答案videos视频文件路径或二进制数据原始JSON通常采用更自由的结构例如{ video_id: video_9431, messages: [ { content: video问题描述..., role: user } ], answer_id: 0 }关键差异在于字段命名不匹配如messagesvsprompt数据结构嵌套层级不同视频引用方式不一致2. 数据转换核心逻辑实现使用Python的datasets库进行格式转换主要步骤包括读取原始JSON处理可能存在的编码问题字段映射与提取重构数据结构路径处理确保视频引用正确保存为Parquet优化存储效率完整转换代码示例import json from datasets import Dataset, DatasetDict def convert_json_to_parquet(input_json, output_dir): with open(input_json) as f: raw_data json.load(f) def generate_examples(): for item in raw_data: yield { prompt: item[messages][0][content], answer: item[answer_id], videos: item[videos][0] # 取第一个视频路径 } dataset Dataset.from_generator(generate_examples) dataset.save_to_disk(output_dir, storage_formatparquet)3. 常见问题与解决方案3.1 字段缺失处理当原始数据缺少必要字段时可采用以下策略缺失字段解决方案prompt组合question和options生成answer使用answer_id映射到选项文本videos根据video_id自动构建路径3.2 视频路径处理典型问题包括相对路径与绝对路径混淆不同操作系统路径分隔符差异视频文件实际不存在推荐使用pathlib进行规范化处理from pathlib import Path video_path Path(./videos) / f{video_id}.mp4 if not video_path.exists(): raise FileNotFoundError(f视频文件缺失: {video_path})3.3 大规模数据分片当数据量较大时建议分片处理按比例拆分训练/验证/测试集每个分片保存为独立Parquet文件使用DatasetDict管理多分片dataset DatasetDict({ train: Dataset.from_dict(train_data), validation: Dataset.from_dict(val_data) }) dataset.save_to_disk(output_dir)4. 在EasyR1中加载转换后的数据配置config.yaml时需注意data: train_files: ./converted_datatrain val_files: ./converted_datavalidation prompt_key: prompt answer_key: answer image_key: videos关键配置项说明符号用于指定数据分片字段名需与Parquet中的列名完全匹配视频路径应为框架可访问的位置5. 性能优化技巧列式存储优化对文本字段启用字典编码对数值字段选择合适的压缩算法并行处理使用dask加速大规模数据转换设置合适的batch_size平衡内存使用缓存机制转换结果缓存到本地避免重复转换相同数据# 启用高效压缩 dataset dataset.map( lambda x: x, batchedTrue, writer_batch_size1000, load_from_cache_fileFalse )6. 质量验证流程转换完成后必须验证数据完整性检查无缺失值字段类型正确视频可正常加载一致性验证随机抽样对比原始JSON与Parquet数据确保信息无损转换框架兼容性测试在EasyR1中实际加载数据验证训练流程能否正常启动验证脚本示例import pyarrow.parquet as pq table pq.read_table(output/train-00000-of-00001.parquet) print(table.schema) # 检查字段类型 print(table.num_rows) # 验证数据量7. 高级应用场景7.1 多视频输入处理当单个问题对应多个视频时需要特殊处理videos: [ {video1: path1, video2: path2}, {video1: path3, video2: path4} ]7.2 动态提示生成根据视频内容动态生成promptdef generate_prompt(item): options \n.join(f{i}. {opt} for i, opt in enumerate(item[options])) return fvideo\nQuestion: {item[question]}\nOptions:\n{options}7.3 混合模态数据同时处理视频和图像输入{ prompt: ..., videos: [video1.mp4], images: [image1.png] }在实际项目中最耗时的往往不是代码编写而是处理各种边缘情况。建议先在小规模数据上验证完整流程再扩展到全量数据。