使用Hugging Face Optimum GraphCore模型训练自定义MNLI数据集时遭遇pyarrow.lib.ArrowInvalid错误的技术咨询
解决pyarrow.lib.ArrowInvalid: Failed to parse string: ' ' as a scalar of type int64错误
这个错误我之前帮朋友排查过,本质是pyarrow读取CSV时,试图把一个空格字符串转换成整数类型(int64)失败了。结合你的MNLI任务场景,大概率是数据集的label列存在异常值,或者自动类型识别出错导致的,咱们一步步来解决:
1. 优先排查label列的异常值
这是最常见的原因:你的train.csv/validation.csv/test.csv里,label列可能存在空单元格、空格字符串(比如单元格填了' '而非空值),或者其他非整数内容。
你可以用Python快速定位问题:
import pandas as pd # 读取训练集 train_df = pd.read_csv("train.csv") # 查看label列当前的数据类型 print("Label列当前类型:", train_df['label'].dtype) # 筛选出label列无法转成整数的异常行 invalid_rows = train_df[~train_df['label'].astype(str).str.strip().isdigit()] print("异常行数:", len(invalid_rows)) print("异常内容示例:\n", invalid_rows[['premise', 'hypothesis', 'label']])
找到异常行后,要么把label修正为MNLI对应的合法整数(0=entailment、1=neutral、2=contradiction),要么直接删除这些无效行,再重新保存CSV。
2. 强制指定数据集列类型
如果确认所有label都是合法整数,但pyarrow还是识别错了类型,可以手动指定列类型来规避自动识别的偏差。你需要修改run_glue.py脚本里的数据集加载逻辑:
找到脚本中使用load_dataset加载CSV的部分,修改为:
from datasets import load_dataset # 强制指定列类型:premise和hypothesis为字符串,label为整数 dataset = load_dataset( "csv", data_files={ "train": "train.csv", "validation": "validation.csv", "test": "test.csv" }, dtype={ "premise": "string", "hypothesis": "string", "label": "int64" } )
这样脚本就会严格按照你指定的类型解析数据集,避免类型不匹配的问题。
3. 检查CSV的基础格式
有时候CSV的分隔符、引号格式也会导致解析错误:
- 确认CSV用的是逗号分隔,如果是制表符或其他分隔符,需要在
load_dataset里加上delimiter='\t'(对应制表符)参数,或者运行脚本时添加--delimiter参数(如果脚本支持的话)。 - 检查单元格里的特殊字符(比如逗号)是否被双引号包裹,避免列被错误拆分。
4. 预转换数据集格式
如果上面的方法都觉得麻烦,你可以先用Pandas把数据集转换成完全正确的格式再保存:
import pandas as pd # 批量处理所有数据集文件 for file in ["train.csv", "validation.csv", "test.csv"]: df = pd.read_csv(file) # 强制转换文本列类型为字符串 df['premise'] = df['premise'].astype(str) df['hypothesis'] = df['hypothesis'].astype(str) # 先清洗label列的空格,再转成整数 df['label'] = df['label'].astype(str).str.strip().astype(int) # 保存修复后的文件 df.to_csv(f"{file.split('.')[0]}_fixed.csv", index=False)
然后用生成的train_fixed.csv等文件替换原文件,重新运行训练命令即可。
内容的提问来源于stack exchange,提问作者Siman
相关产品推荐
相关产品推荐

