首先追溯到workflow.py中的run_sft函数中,可以看到
dataset_module = get_dataset(model_args,
data_args, training_args, stage="sft", **tokenizer_module)
追溯函数get_dataset到data/loader.py
可以看到template登场,经过手动输出测试,这里的data_args.template就是我们在webui上advanced configuration中的数据模版.
这个template对象Template类的一个对象,整合了tokenizer。(也就是说这里的template可以直接看成tokenizer)
接下来在loader.py中找到加载原始数据集的代码
追溯函数_get_merged_dataset
发现关键代码datasets.append(_load_single_dataset())
追溯_load_single_dataset
在_load_single_dataset中找到对原始数据集路径拼接的代码
发现加载原始数据集的函数load_dataset()
load_dataset()是transformer库函数,不赘述。
这段代码对原始数据集进行分批次处理。
这里print的结果也说明这是原始数据集,内部数据的结构和json文件中的一摸一样
追溯关键函数align_dataset() 到data/aligner.py
这里的关键函数conver_alpaca定义了一个重要的功能函数
convert_func = partial(convert_alpaca,
dataset_attr=dataset_attr, data_args=data_args)
追溯到convert_alpaca
发现此函数是将Alpaca格式的数据集转换为标准数据集格式的函数
转换后的数据集结构由这五项组成。
最后align_dataset中的dataset.map方法返回转换为标准数据集格式的数据集。
回到data/loader.py中的get_dataset函数中的这段代码,获得标准数据集格式的数据集。
接下来对标准数据集格式的数据集进行预处理
函数_get_preprocessed_dataset()的流程与conver_alpaca类似,将标准数据集转换为template格式的数据集。
终端中的eval/training example数据就来自这里.
这里也是数据集的最终可读形式,之后会进行数据集分割和移动操作
总结:llamafactory目前支持两种数据集格式Alpaca和Sharegpt,自定义数据集时按这两种数据集格式建立,llamafactory在读入这两种格式的数据集后会将其转换为标准数据集格式,然后再根据指定的template格式将其转换为对应的template格式,以方便地实现数据集的复用。