如果在训练最后遇到:PicklingError: Can't pickle <class 'trl.trainer.sft_config.SFTConfig'>: it's not the same object as trl.trainer.sft_config.SFTConfig,
则在训练正式开始之前加一段:
import sys
import trl.trainer.sft_config
import trl.trainer.sft_trainer
# 1. 获取 trainer.args 和 trainer 在内存中的真实类
real_config_cls = type(trainer.args)
real_trainer_cls = type(trainer)
# 2. 获取这些真实类所在的真实模块对象
real_config_module = sys.modules[real_config_cls.__module__]
real_trainer_module = sys.modules[real_trainer_cls.__module__]
# 3. 强制将 sys.modules 中的标准路径指向这些真实模块
# 这样 pickle 查找时就不会找错对象
sys.modules['trl.trainer.sft_config'] = real_config_module
sys.modules['trl.trainer.sft_trainer'] = real_trainer_module
# 4. 确保模块内的属性也指向正确的类
real_config_module.SFTConfig = real_config_cls
real_trainer_module.SFTTrainer = real_trainer_cls