multiprocess.pool.RemoteTraceback 和 TypeError:加载 Hugging Face 数据集时无法将字符串类型的数组转换为 null

问题描述 投票:0回答:1

我在尝试使用 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()) 有人以前遇到过这个问题吗?或者有人对如何解决这个问题有建议吗?

python python-multiprocessing huggingface-datasets
1个回答
0
投票

错误消息表明正在尝试将字符串数组转换为 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()

我没有尝试重现您的问题,因此您需要检查这些步骤。

© www.soinside.com 2019 - 2024. All rights reserved.