huggingface已经成为自然语言处理任务中最常用的网站之一了,里面提供了很多与自然语言处理甚至多模态相关的套件,对模型训练、模型评估以及模型部署提升效率有很大帮助。其中,很多套件都依赖Datasets加载数据集进行训练或评估,因此,掌握自定义Datasets的技能还是比较重要的。

要学习Datasets部分,大概需要了解两个部分,一是huggingface-cli的使用,二是datasets本身的配置。为了方便查找,两个部分的文档链接如下: 1. huggingface cli文档 2. datasets文档

这边主要以上传一个数据集的示例,熟悉一下创建数据集的整个流程。

准备数据

要将数据集上传到hf上,首先得准备好数据。一般文本的数据集就是几个csv或者json能搞定,通过文件名区分不同的子集和划分。

这部分其实和hf关系不大,自己写python脚本准备即可。

创建数据集

虽然通过网页的GUI也可以创建仓库,但为了后续上传数据集的方便,这里也推荐使用huggingface-cli创建数据集。首先,检查一下huggingface装了没。另外就是检查一下版本,如果太久了就更新一下。之前huggingface-cli没更新导致upload功能没有,和文档对不上了,更新之后和文档才同步。

1
2
3
4
# 安装
pip install huggingface_hub
# 更新
pip install --upgrade huggingface_hub

确认安装好后,需要先在hf官网获取access token用于登录。在右侧框下拉可以看到获取这个token的选项,按你的需求创建一个即可。之后复制这个token用于登录。登录命令:

1
huggingface-cli login
填入之前的access token即可完成登录。

登录完成后,创建数据集:

1
huggingface-cli repo create my-cool-dataset --type dataset

这时候,一个空白数据集就已经创建好了。

组织数据集

之前准备数据阶段我们准备了一些csv或者其他格式的数据文件,如果是csv的话其实hf能够自动加载,因此可以使用非脚本部署的形式。

非脚本部署可以有两种形式,一种是让hf自己识别,这样做不到精准控制。另一种则是手动指定,需要在README.md的metadata区域指定,一个示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
language:
- zh
license:
- cc-by-sa-4.0
source_datasets:
- original
task_categories:
- question-answering
task_ids:
- open-domain-qa
- multiple-choice-qa
pretty_name: MJEE
dataset_info:
- config_name: logic_2023
features:
- name: ID
dtype: int64
- name: Question
dtype: string
- name: Answer
dtype: string
configs:
- config_name: logic_2023
data_files:
- split: validation
path: logic_2023/val.csv
主要也就是指定数据集的一些元信息,以及明确告知子集和划分情况。

如果使用脚本部署,则需要创建一个和数据集同名的python文件。注意,如果数据集能格式化成csv, json, jsonl, Parquet等格式的话,hf一般是可以正常加载,因此大多数情况一般不需要写这个脚本。但也有例外,如果数据集中子集特别多,而且子集之间又有比较多共性。如果在readme里逐一去写会很麻烦也难以维护,这时候写个脚本会便于阅读和维护。

具体的步骤可以参见:创建数据集加载脚本。一般有添加数据集属性、下载数据集、组织子集和划分、生成样本等事情需要处理。

上传数据集

组织好数据集后,上传即可。

1
huggingface-cli upload my-cool-dataset ./data . --repo-type dataset
后续要更新数据集也是这个操作。

有时候我们在本地做了一些删除操作,使用upload命令不会同步删除的操作,如果希望同步可以在上传时使用--delete="*"操作。

1
huggingface-cli upload my-cool-dataset ./data . --repo-type dataset --delete="*"

到这里,就完成了一个数据集的创建,可以任意指定子集和划分,而且可以使用hf的datasets库远程加载。