我在尝试使用 Hugging Face 数据集库加载和处理 GAIR/MathPile 数据集时遇到错误。该错误似乎是在多处理环境中 pyarrow 中的类型转换期间发生的。以下是我正在使用的代码
from datasets import Dataset, load_dataset
import os
def get_hf_dataset_gair(path: str = '~/data/GAIR/MathPile/train/') -> Dataset:
path: str = os.path.expanduser(path)
dataset = load_dataset(path, split='train', num_proc=os.cpu_count())
print(dataset[0]) # Preview a single example from the dataset
# Remove unnecessary columns
all_columns = dataset.column_names
all_columns.remove('text')
dataset = dataset.remove_columns(all_columns)
# Shuffle and select 10k examples
dataset = dataset.shuffle(seed=42)
dataset = dataset.select(10_000)
return dataset
# get it
get_hf_dataset_gair()
下载GAIR
source $AFS/.bashrc
conda activate beyond_scale_2
mkdir -p ~/data/GAIR/MathPile
huggingface-cli download --resume-download --repo-type dataset GAIR/MathPile --local-dir ~/data/GAIR/MathPile --local-dir-use-symlinks False
cd ~/data/GAIR/MathPile/
find . -type f -name "*.gz" -exec gzip -d {} \;
运行代码时出现以下错误:
multiprocess.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/lfs/hyperturing1/0/brando9/miniconda/envs/beyond_scale_2/lib/python3.11/site-packages/datasets/builder.py", line 1869, in _prepare_split_single
writer.write_table(table)
...
TypeError: Couldn't cast array of type string to null
这是完整的堆栈跟踪:
Traceback (most recent call last):
File "/lfs/hyperturing1/0/brando9/miniconda/envs/beyond_scale_2/lib/python3.11/site-packages/datasets/builder.py", line 1869, in _prepare_split_single
writer.write_table(table)
File "/lfs/hyperturing1/0/brando9/miniconda/envs/beyond_scale_2/lib/python3.11/site-packages/datasets/arrow_writer.py", line 580, in write_table
pa_table = table_cast(pa_table, self._schema)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lfs/hyperturing1/0/brando9/miniconda/envs/beyond_scale_2/lib/python3.11/site-packages/datasets/table.py", line 2283, in table_cast
return cast_table_to_schema(table, schema)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
TypeError: Couldn't cast array of type string to null
这似乎与 pyarrow 类型之间的类型转换有关。我怀疑这与数据集架构有关,但我不确定如何解决该错误。我已经验证数据集已正确下载,并且我正在使用以下环境:
拥抱人脸数据集版本:2.x.x Python 3.11 操作系统:Linux(在服务器上运行) 多处理设置为使用所有可用的 CPU (num_proc=os.cpu_count()) 有人以前遇到过这个问题吗?或者有人对如何解决这个问题有建议吗?
错误消息表明正在尝试将字符串数组转换为 null 类型,这没有意义并会导致问题。
数据问题:您的数据中可能存在空值或与预期类型不匹配的值。检查数据集中是否有可能为空或包含意外值的行。
您可以通过下载数据集而不进行多重处理并检查数据来做到这一点:
dataset = load_dataset(path, split='train', num_proc=1)
print(dataset)
数据集架构问题:如果删除列,请确保至少有一列不为空。如果删除所有列,可能会导致错误。
试试这个方法:
from datasets import Dataset, load_dataset
import os
def get_hf_dataset_air(path: str = '~/data/GAIR/MathPile/train/') -> Dataset:
path: str = os.path.expanduser(path)
# Loading the dataset with num_proc=1 for verification
dataset = load_dataset(path, split='train', num_proc=1)
# Checking the data
print(dataset)
# Deleting empty lines or lines with null
dataset = dataset.filter(
lambda example: example['text'] is not None and example['text'] != ''
)
# Deleting unnecessary columns
all_columns = dataset.column_names
all_columns.remove('text')
dataset = dataset.remove_columns(all_columns)
# Shuffle and select 10k examples
dataset = dataset.shuffle(seed=42)
dataset = dataset.select(10_000)
return dataset
# Getting a data set
get_hf_dataset_gair()
我没有尝试重现您的问题,因此您需要检查这些步骤。