llamafactory 技巧
- 恢复训练的时候设置
overwrite_output_dir: false和resume_from_checkpoint: true- 不用担心已经喂给模型训练过的数据会再次被训练,架构内部会自动对齐
- 在数据预处理的时候,如果报错
No sapce left on machine,可以尝试换一个TMPDIR- 这是所有Linux/Unix程序和Python标准库都遵守的指定临时文件的存储位置的环境变量
- 这是因为在数据预处理的时候,临时文件是存放在
TMPDIR里的,最后的缓存文件是存放在与HuggingFace相关的位置的
- 如果要在新阶段任务中使用已经训练好的权重,只需要:
- 在
if training_args.do_train and not training_args.do_predict:之前加上if training_args.do_train and finetuning_args.pretrained_weight_path is not None: if finetuning_args.pretrained_weight_type == "bin": weight_file = os.path.join(finetuning_args.pretrained_weight_path, "pytorch_model.bin") state_dict = torch.load(weight_file, map_location="cpu") elif finetuning_args.pretrained_weight_type == "safetensors": from safetensors.torch import load_file weight_file = os.path.join(finetuning_args.pretrained_weight_path, "model.safetensors") state_dict = load_file(weight_file, device="cpu") else: raise ValueError(f"Unsupported pretrained_weight_type: {finetuning_args.pretrained_weight_type}") model.load_state_dict(state_dict, strict=False) logger.info_rank0(f"Loaded stage-1 weights from {weight_file}") - 在
finetuning_args.py中加上pretrained_weight_path: Optional[str] = field( default=None, metadata={"help": "Path to the stage-1 checkpoint directory for loading pretrained weights."}, ) pretrained_weight_type: Optional[str] = field( default=None, metadata={"help": "Type of weight file: 'bin' for pytorch_model.bin, 'safetensors' for model.safetensors."}, )
- 逻辑是先加载好分词器,模板和模型之后,再在
trainer.train(resume_from_checkpoint=training_args.resume_from_checkpoint)中去对模型进行包装并且进行断点续传 - 无论模型的精度如何,都可以自动地将FP32转换成模型的精度
- 断点续传会覆盖初始化权重,所以不用担心会影响断点续传
- 在
workflow.py预处理的各个阶段tokenizer_module = load_tokenizer(model_args)- 函数步骤:
AutoTokenizer.from_pretrained从model_args.model_name_or_path中加载分词器patch_tokenizer对分词器打补丁- 如果 tokenizer 的
_pad方法不是标准的PreTrainedTokenizerBase._pad,则替换为标准方法 - 如果指定了
model_max_length且大于 tokenizer 当前的最大长度,则更新 tokenizer 的最大长度- 虽然在
model_args有这个参数,但是我们不要去指定他,model_max_length会根据cutoff_len自动初始化,一般与cutoff_len是相同的 tokenizer_config.json文件中的model_max_length就代表了模型上下文
- 虽然在
- 如果提供了
add_tokens,将其添加到 tokenizer 的词汇表中(非特殊 token),并记录日志。如果添加成功且resize_vocab为False,则将其设置为True并发出警告 - 如果提供了
add_special_tokens,将其添加到 tokenizer 的词汇表中(作为特殊 token),并记录日志。同样,如果添加成功且resize_vocab为False,则设置为True并警告
- 如果 tokenizer 的
AutoProcessor.from_pretrained加载处理器- 处理器一般是用在多模态模型里面的
patch_processor对处理器打补丁(暂时还没有细看这个函数)
tokenizer_module是一个字典,包含两个键"tokenizer":类型为PreTrainedTokenizer(预训练 tokenizer)"processor":类型为 `Optional["ProcessorMixin"]``(可选的处理器,用于多模态模型)
- 函数步骤:
template = get_template_and_fix_tokenizer(tokenizer, data_args)- 执行步骤:
-
检查模板参数:如果
data_args.template为 None,则尝试从 tokenizer 的chat_template解析模板(如果tokenizer.chat_template不是字符串则使用默认的 "empty" 模板) -
验证指定模板:如果
data_args.template不为 None,检查它是否存在于预定义的TEMPLATES字典中;如果存在则直接使用,若不存在,则抛出ValueErrorTEMPLATES是每次运行的时候都会加载的一个字典,初始为空- 在导入
get_template_and_fix_tokenizer的时候,会触发各种register_template的执行,此时就会注册一个对话模板
-
兼容性检查:如果启用了
train_on_prompt但模板不支持efficient_eos,则抛出 ValueError。train_on_prompt表示将prompt也计算损失efficient_eos表示模板中是否显式添加EOS token,默认为False,表示要添加
-
配置工具格式(这部分没细看):如果
data_args.tool_format不为 None,根据模板的efficient_eos设置format_function和format_tools。 -
设置默认系统消息:如果
data_args.default_system不为 None,将其赋值给模板的default_system。 -
启用推理模式:将
data_args.enable_thinking赋值给模板的enable_thinking属性。 -
修复特殊token:调用
fix_special_tokens(tokenizer),添加或替换 EOS 和 PAD token,并添加停止词。正常设置不用管这个函数 -
修复Jinja模板:调用
fix_jinja_template(tokenizer),根据模板生成并设置 tokenizer 的chat_template。正常设置不用管这个函数。这个函数以及上一个函数的主要作用都是根据template去修改tokenizer。如果分词器的配置文件本身是完善的,那么我们应该注册一个兼容分词器配置的对话模板,从而让这两个函数不起作用 -
返回模板:返回配置好的
Template对象。
-
- 执行步骤:
dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module)

浙公网安备 33010602011771号