增量预训练旨在提升模型在特定领域或任务的能力。
XTuner 支持使用 HuggingFace Hub 数据集或自定义数据集进行 SFT(Supervised FineTune)。二者的主要区别在于,使用 HuggingFace Hub 数据集时需要将原始数据映射为 XTuner 定义的增量预训练数据格式。而对于自定义数据集则推荐用户按照增量预训练数据格式构造数据集。
由于不同数据集的格式各有不同,因此需要将原始数据映射为 XTuner 定义的增量预训练数据格式。XTuner 支持通过 map function 来实现格式的映射。下面以 oasst1 数据集为例介绍如何实现数据映射。
oasst1 数据集格式如下所示:
>>> from datasets import load_dataset
>>> ds = load_dataset(path='timdettmers/openassistant-guanaco')
>>> ds['train']
Dataset({
features: ['text'],
num_rows: 9846
})
由此可见,oasst1 train dataset 有 9846 行,1 列,列名为 'text','text' 这一列正是增量预训练需要用到的文本数据。增量预训练数据格式中介绍了增量预训练过程中,数据格式应该为:
[{
"conversation":[
{
"input": "",
"output": "xxx"
},
]
}]
因此,可以通过下面的 map function 将原始数据映射为标准格式:
# 假设将该函数存放在./map_fn.py文件中
def custom_map_fn(example):
"""
>>> train_ds = ds['train'].map(oasst1_map_fn)
>>> train_ds
Dataset({
features: ['text', 'conversation'],
num_rows: 9846
})
>>> train_ds[0]['conversation']
[{'input': '', 'output': 'xxx'}]
"""
return {'conversation': [{'input': '', 'output': example['text']}]}
XTuner 提供多个开箱即用的配置文件,用户可以通过下列命令查看:
xtuner list-cfg -p internlm
-p
为模糊查找,若想训练其他模型,可以修改internlm
为 XTuner 支持的其他模型名称。
如果所提供的配置文件不能满足使用需求,请导出所提供的配置文件并进行相应更改:
xtuner copy-cfg ${CONFIG_NAME} ${SAVE_DIR}
例如通过下列命令将名为 internlm_7b_qlora_oasst1_e3
的 config 导出至当前目录下:
xtuner copy-cfg internlm_7b_qlora_oasst1_e3 .
对 Step 3 复制得到的 config 文件需要进行如下修改:
- 导入 Step 1 中实现的映射函数
custom_map_fn
- 使用
custom_map_fn
替换train_dataset
中的dataset_map_fn
- 将
train_dataset
中的template_map_fn
置为None(因为无需将对话模板加入至增量预训练数据集中) - 调整原始数据集的路径,关于
load_dataset
的相关操作可以参考用户文档 - 关闭
EvaluateChatHook
。由于增量预训练时的模型只具备续写功能,不具备对话功能,如果开启EvaluateChatHook
打印对话结果的话,模型会无法正常停止生成。
from xtuner.dataset import process_hf_dataset
from datasets import load_dataset
- from xtuner.dataset.map_fns import oasst1_map_fn, template_map_fn_factory
+ from mmengine.config import read_base
+ with read_base():
+ from .map_fn import custom_map_fn
...
#######################################################################
# PART 1 Settings #
#######################################################################
- data_path = 'timdettmers/openassistant-guanaco'
- prompt_template = PROMPT_TEMPLATE.internlm_chat
+ data_path = 'path/to/your/data'
#######################################################################
# STEP 3 Dataset & Dataloader #
#######################################################################
train_dataset = dict(
type=process_hf_dataset,
dataset=dict(type=load_dataset, path=data_path),
tokenizer=tokenizer,
max_length=max_length,
- dataset_map_fn=oasst1_map_fn,
+ dataset_map_fn=custom_map_fn,
- template_map_fn=dict(
- type=template_map_fn_factory, template=prompt_template),
+ template_map_fn=None,
remove_unused_columns=True,
shuffle_before_pack=True,
pack_to_max_length=pack_to_max_length)
...
#######################################################################
# PART 5 Runtime #
#######################################################################
# Log the dialogue periodically during the training process, optional
custom_hooks = [
dict(type=DatasetInfoHook, tokenizer=tokenizer),
- dict(
- type=EvaluateChatHook,
- tokenizer=tokenizer,
- every_n_iters=evaluation_freq,
- evaluation_inputs=evaluation_inputs,
- system=SYSTEM,
- instruction=prompt_template.INSTRUCTION)
]
...
在修改配置文件后,可以运行xtuner/tools/check_custom_dataset.py
脚本验证数据集是否正确构建。
xtuner check-custom-dataset $CONFIG
其中 $CONFIG
是 Step 4 修改过的 config 的文件路径。
在使用自定义数据集进行增量预训练时,我们推荐将数据集构造为 XTuner 定义的增量预训练数据格式。若自定义数据集格式为 oasst1
等其他格式,可参考使用HuggingFace Hub数据集一节。
按照 XTuner 定义的增量预训练数据格式准备自定义数据:
[
{
"conversation":[
{
"input": "",
"output": "xxx"
},
]
},
{
"conversation":[
{
"input": "",
"output": "xxx"
},
]
}
]
xtuner list-cfg -p internlm
-p
为模糊查找,若想训练其他模型,可以修改 internlm
为 XTuner 支持的其他模型名称。
xtuner copy-cfg internlm_7b_qlora_oasst1_e3 .
对 Step 3 复制得到的 config 文件需要进行如下修改:
- 调整原始数据集的路径
- 由于数据集格式已经是标准格式了,需要将
train_dataset
中的dataset_map_fn
置为None
- 将
train_dataset
中的template_map_fn
置为None
,因为不需要将对话模板加入至增量预训练数据集中 - 关闭
EvaluateChatHook
。由于增量预训练时的模型只具备续写功能,不具备对话功能,如果开启EvaluateChatHook
打印对话结果的话,模型会无法正常停止生成。
from xtuner.dataset import process_hf_dataset
from datasets import load_dataset
- from xtuner.dataset.map_fns import oasst1_map_fn, template_map_fn_factory
...
#######################################################################
# PART 1 Settings #
#######################################################################
- data_path = 'timdettmers/openassistant-guanaco'
- prompt_template = PROMPT_TEMPLATE.internlm_chat
+ data_path = 'path/to/your/json/data'
...
#######################################################################
# STEP 3 Dataset & Dataloader #
#######################################################################
train_dataset = dict(
type=process_hf_dataset,
- dataset=dict(type=load_dataset, path=data_path),
+ dataset=dict(
+ type=load_dataset, path='json', data_files=dict(train=data_path)),
tokenizer=tokenizer,
max_length=max_length,
- dataset_map_fn=oasst1_map_fn,
+ dataset_map_fn=None,
- template_map_fn=dict(
- type=template_map_fn_factory, template=prompt_template),
+ template_map_fn=None,
remove_unused_columns=True,
shuffle_before_pack=True,
pack_to_max_length=pack_to_max_length)
...
#######################################################################
# PART 5 Runtime #
#######################################################################
# Log the dialogue periodically during the training process, optional
custom_hooks = [
dict(type=DatasetInfoHook, tokenizer=tokenizer),
- dict(
- type=EvaluateChatHook,
- tokenizer=tokenizer,
- every_n_iters=evaluation_freq,
- evaluation_inputs=evaluation_inputs,
- system=SYSTEM,
- instruction=prompt_template.INSTRUCTION)
]
...
在修改配置文件后,可以运行xtuner/tools/check_custom_dataset.py
脚本验证数据集是否正确构建。
xtuner check-custom-dataset $CONFIG
其中 $CONFIG
是 Step 4 修改过的 config 的文件路径。