使用datasets进行数据集预处理和加载
🚨 弃用说明
本文档已过时,不再进行维护,并将在 1.6.0 版本下架,其中可能包含过时的信息或已被更新的功能替代。建议参考最新的 官方文档 ,以获取准确的信息。
如果您仍需使用本文档中的内容,请仔细核对其适用性,并结合最新版本的相关资源进行验证。
如有任何问题或建议,请通过 社区Issue 提交反馈。感谢您的理解与支持!
目的
接入魔乐仓库、HuggingFace仓库,在线加载数据集,扩大数据集来源。
使用dataset增强数据集加载和处理能力。
对接HuggingFace开源社区
1、环境准备
环境变量 HF_ENDPOINT可以控制开源社区huggingFace实际使用的远程仓库,未配置时默认为 https://huggingFace.co,针对国内环境,需要配置成镜像地址 https://hf-mirror.com
2、安装依赖
git clone https://gitee.com/openmind-ai/openmind-hub.git
cd openmind-hub
pip install -e .
cd ..
pip install datasets==2.18.0
git clone https://gitee.com/openmind-ai/openmind-extension-for-datasets.git
cd openmind-extension-for-datasets
pip install -e .
cd ..
对接魔乐开源社区
1、环境准备
环境变量 OPENMIND_HUB_ENDPOINT可以控制魔乐开源社区实际使用的远程仓库,未配置时默认为 https://telecom.openmind.cn。
2、安装依赖
git clone https://gitee.com/openmind-ai/openmind-hub.git
cd openmind-hub
pip install -e .
cd ..
pip install datasets==2.18.0
git clone https://gitee.com/foundation-models/openmind-datasets.git
cd openmind-datasets
pip install -e .
cd ..
3、注意事项
当环境安装了openmind-datasets三方件时,默认对接的是魔乐开源社区,如果这是想对接HuggingFace,环境变量USE_OM可以控制具体对接哪个社区,默认值为ON为魔乐社区,修改为OFF对接HuggingFace社区
CommonDataLoader方式加载数据集
功能
CommonDataLoader定义了通用的流程步骤:1、加载远端数据集(支撑huggingFace、魔乐社区)得到开源的datasets数据集;2、自定义数据处理DataHandler模块(可选:支持用户对加载到的数据集做定制逻辑转换);3、开源的datasets转换为ms.datasets
参数
加载远端数据集使用的时huggingFace提供datasets三方件dataset.load_dataset()方法,用户可以使用所有load_dataset支持的参数进行传递,具体使用指导可以参考https://huggingface.co/docs/datasets/package_reference/loading_methods 对应的国内镜像地址https://hf-mirror.com/docs/datasets/package_reference/loading_methods 以下是一些常见字段的说明
- type: 必填,数据加载的处理方式,支持3种方式:MindDataset、CommonDataLoader、自定义XXXDataLoader
- path: 必填,对接远端数据集路径,
- shuffle: 必填,数据集是否打乱
- handler:可选,自定义数据处理,配套type为CommonDataLoader时使用
- input_columns:可选,datasets转换为ms.datasets时,使用哪些字段转换,默认为
["input_ids", "labels"]
自定义datahandler
用户可以使用自定义的dataHandler逻辑,对加载到的远端数据集进行数据预处理定制逻辑
参数
- type: 必填,自定义数据处理handler名称,自定义handler必须继承BaseInstructDataHandler
- tokenizer_name: 必填,使用的tokenizer分词器名称
- seq_length: 必填,序列长度
- output_columns: 必填,数据预处理后输出的数据列
- prompt_key: 可选,增加prompt处理后数据列名称
- tokenizer: 可选,tokenizer配置参数, 可以是字典或者字符串,也可以直接配置tokenizer对象。
开发样例
自定义dataHandler一般放在mindformers/dataset/handler目录下,自定义的需要继承抽象基类base_handler,需要实现format_func、tokenize_func两个方法,可以参考alpaca_handler.py
@MindFormerRegister.register(MindFormerModuleType.DATA_HANDLER)
class AlpacaInstructDataHandler(BaseInstructDataHandler):
format_func用于实现如何从原始数据中,转换成你所需要的数据格式,
def format_func(self, data):
# 自定义处理逻辑
tokenize_func方法用于把处理后的数据进行按自定义分词
def tokenize_func(self, messages):
# 自定义处理逻辑
alpaca数据集示例
训练流程直接从远端仓库加载
修改任务配置文件 finetune_llama2_7b.yaml。
修改如下参数:
train_dataset:
input_columns: &input_columns ["input_ids", "labels"]
data_loader:
type: CommonDataLoader
shuffle: True
split: "train"
path: "AI_Connect/alpaca"
input_columns: *input_columns
handler:
type: AlpacaInstructDataHandler
tokenizer_name: llama2_13b
seq_length: 4096
prompt_key: "conversations"
output_columns: *input_columns
# 参数说明
input_columns: 必填,输入的数据的列名
data_loader.type: 必填,数据加载处理的类名
data_loader.shuffle: 必填,数据集是否打乱
data_loader.path: 可选,加载数据集的远端路径
data_loader.input_columns:可选,datasets转换为ms.datasets时,使用哪些字段转换,默认为["input_ids", "labels"]
data_loader.handler: 可选,数据预处理类配置,为空时不做数据处理
data_loader.handler.type: 数据预处理类的类名
data_loader.handler.tokenizer_name: 分词器名称
data_loader.handler.seq_length: 序列长度
data_loader.handler.prompt_key: 可选,增加prompt处理后数据列名称
data_loader.handler.output_columns: 可选,数据预处理后输出的数据列
ADGEN数据集示例
训练流程直接从远端仓库加载
修改任务配置文件 run_glm3_6b_finetune_2k_800T_A2_64G.yaml。
修改如下参数:
train_dataset: &train_dataset
data_loader:
type: CommonDataLoader
path: "xxx/ADGEN"
split: "train"
shuffle: True
input_columns: ["prompt", "answer"]
handler:
type: AdgenInstructDataHandler
output_columns: ["content", "summary"]
tokenizer:
type: ChatGLM3Tokenizer
vocab_file: "/data/z00827078/GLM3/tokenizer.model"
input_columns: ["input_ids", "labels"]
max_source_length: 1024
max_target_length: 1023
ignore_pad_token_for_loss: True
num_parallel_workers: 8
python_multiprocessing: False
drop_remainder: True
batch_size: 8
repeat: 1
numa_enable: False
prefetch_size: 1
phase: "train"
version: 3
seed: 0
# 参数说明
data_loader.type: 必填,数据加载处理的类名
data_loader.path: 必填,加载数据集路径
data_loader.shuffle: 必填,数据集是否打乱
data_loader.split: 可选,数据集子集,默认加载train集
data_loader.input_columns:可选,datasets转换为ms.datasets时,使用哪些字段转换,默认为["input_ids", "labels"]
data_loader.handler: 可选,自定义数据处理器
data_loader.handler.type: 可选,自定义数据处理器类型名称
data_loader.handler.output_columns: 可选,处理完后输出的数据集列名
Qwen-VL数据集示例
训练流程直接从远端仓库加载
修改任务配置文件 finetune_qwenvl_9.6b_bf16.yaml。
修改如下参数:
train_dataset: &train_dataset
data_loader:
type: CommonDataLoader
path: "xxx"
input_columns: ["conversations"]
shuffle: False
handler:
type: LlavaInstructDataHandler
image_dir: "xxxx"
output_columns: ["conversations"]
# 参数说明
data_loader.type: 必填,数据加载处理的类名
data_loader.path: 必填,加载数据集路径
data_loader.shuffle: 必填,数据集是否打乱
data_loader.input_columns: 可选,datasets转换为ms.datasets时,使用哪些字段转换,默认为["input_ids", "labels"]
data_loader.handler: 可选,自定义数据处理器
data_loader.handler.type: 可选,自定义数据处理器类型名称
data_loader.handler.image_dir: 必填,图片目录路径
data_loader.handler.output_columns: 可选,处理完后输出的数据集列名
code_alpaca(DeepSeek-Coder)数据集示例
训练流程直接从远端仓库加载
修改任务配置文件 finetune_deepseek_33b.yaml。
修改如下参数:
train_dataset: &train_dataset
data_loader:
type: CommonDataLoader
shuffle: False
path: 'AI_Connect/CodeAlpaca-20K'
split: 'train'
handler:
type: CodeAlpacaInstructDataHandler
tokenizer_name: ''
seq_length: 4096
prompt_key: "conversations"
output_columns: ["input_ids", "labels"]
tokenizer:
unk_token: None
bos_token: '<|begin▁of▁sentence|>'
eos_token: '<|EOT|>'
pad_token: '<|end▁of▁sentence|>'
vocab_file: None
tokenizer_file: "path/to/deepseek/tokenizer.json" # tokenizer.json
type: LlamaTokenizerFast
# 参数说明
data_loader.type: 必填,数据加载处理的类名
data_loader.path: 必填,加载数据集的远端路径
data_loader.shuffle: 必填,数据集是否打乱
data_loader.split: 可选,数据集子集,默认加载train集
data_loader.handler: 可选,数据预处理类配置,为空时不做数据处理
data_loader.handler.type: 数据预处理类的类名
data_loader.handler.tokenizer_name: 分词器名称
data_loader.handler.seq_length: 序列长度
data_loader.handler.prompt_key: 可选,增加prompt处理后数据列名称
data_loader.handler.tokenizer: 必填,tokenizer的详细配置