llamafactory 技巧

  • 恢复训练的时候设置overwrite_output_dir: falseresume_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_pretrainedmodel_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_vocabFalse,则将其设置为 True 并发出警告
          • 如果提供了 add_special_tokens,将其添加到 tokenizer 的词汇表中(作为特殊 token),并记录日志。同样,如果添加成功且 resize_vocabFalse,则设置为 True 并警告
        • AutoProcessor.from_pretrained加载处理器
          • 处理器一般是用在多模态模型里面的
        • patch_processor对处理器打补丁(暂时还没有细看这个函数)
      • tokenizer_module是一个字典,包含两个键
        • "tokenizer":类型为 PreTrainedTokenizer(预训练 tokenizer)
        • "processor":类型为 `Optional["ProcessorMixin"]``(可选的处理器,用于多模态模型)
    • template = get_template_and_fix_tokenizer(tokenizer, data_args)
      • 执行步骤:
        1. 检查模板参数:如果 data_args.template 为 None,则尝试从 tokenizer 的 chat_template 解析模板(如果tokenizer.chat_template不是字符串则使用默认的 "empty" 模板)

        2. 验证指定模板:如果 data_args.template 不为 None,检查它是否存在于预定义的 TEMPLATES 字典中;如果存在则直接使用,若不存在,则抛出 ValueError

          • TEMPLATES是每次运行的时候都会加载的一个字典,初始为空
          • 在导入get_template_and_fix_tokenizer的时候,会触发各种register_template的执行,此时就会注册一个对话模板
        3. 兼容性检查:如果启用了 train_on_prompt 但模板不支持 efficient_eos,则抛出 ValueError。

          • train_on_prompt表示将prompt也计算损失
          • efficient_eos表示模板中是否显式添加EOS token,默认为False,表示要添加
        4. 配置工具格式(这部分没细看):如果 data_args.tool_format 不为 None,根据模板的 efficient_eos 设置 format_functionformat_tools

        5. 设置默认系统消息:如果 data_args.default_system 不为 None,将其赋值给模板的 default_system

        6. 启用推理模式:将 data_args.enable_thinking 赋值给模板的 enable_thinking 属性。

        7. 修复特殊token:调用 fix_special_tokens(tokenizer),添加或替换 EOS 和 PAD token,并添加停止词。正常设置不用管这个函数

        8. 修复Jinja模板:调用 fix_jinja_template(tokenizer),根据模板生成并设置 tokenizer 的 chat_template。正常设置不用管这个函数。这个函数以及上一个函数的主要作用都是根据template去修改tokenizer。如果分词器的配置文件本身是完善的,那么我们应该注册一个兼容分词器配置的对话模板,从而让这两个函数不起作用

        9. 返回模板:返回配置好的 Template 对象。

    • dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module)
posted @ 2025-12-12 09:12  最爱丁珰  阅读(10)  评论(0)    收藏  举报