🤗 PEFT(Parameter-Efficient Fine-Tuning,参数高效 fine-tune)是一个库,用于高效地将大型预训练模型(如预训练 policy,例如 SmolVLA、π₀ 等)适配到新任务,而无需训练模型的所有参数,同时能获得相当的性能。
安装 lerobot[peft] 可选包以启用 PEFT 支持。
如需了解所有可能的适配方法,请参阅 🤗 PEFT 文档。
本节将展示如何在 libero dataset 上使用 PEFT 训练预训练的 SmolVLA policy。
为简洁起见,我们只训练 libero_spatial 子集。我们将使用 lerobot/smolvla_base 作为进行参数高效 fine-tune 的模型:
lerobot-train \
--policy.path=lerobot/smolvla_base \
--policy.repo_id=your_hub_name/my_libero_smolvla \
--dataset.repo_id=HuggingFaceVLA/libero \
--policy.output_features=null \
--policy.input_features=null \
--policy.optimizer_lr=1e-3 \
--policy.scheduler_decay_lr=1e-4 \
--env.type=libero \
--env.task=libero_spatial \
--steps=100000 \
--batch_size=32 \
--peft.method_type=LORA \
--peft.r=64 \
--peft.lora_alpha=64注意 --peft.method_type 参数,它让你选择使用哪种 PEFT 方法。这里我们使用 LoRA(Low-Rank Adapter,低秩适配器),这可能是迄今为止最流行的 fine-tune 方法。低秩适配意味着我们只 fine-tune 一个秩相对较低的矩阵,而不是完整的权重矩阵。该秩可通过 --peft.r 参数指定,LoRA 缩放因子通过 --peft.lora_alpha 指定(其中 scaling = lora_alpha / r)。秩越高,越接近完整 fine-tune
还有一些更复杂、参数更多的方法。这些方法目前尚不支持;如果你希望支持某个特定的 PEFT 方法,欢迎提出 issue。
默认情况下,PEFT 会针对 SmolVLA 中 LM expert 的 q_proj 和 v_proj 层。它还会针对 state 和 action 投影矩阵,因为它们很可能与任务相关。如果你需要针对不同的层,可以使用 --peft.target_modules 指定要针对的层。你可以参阅相应 PEFT 方法的文档,了解支持哪些输入(例如 LoRA 的 target_modules 文档)。
通常支持后缀列表或正则表达式。例如,要针对 lm_expert 的 MLP 而不是 q 和 v 投影,请使用:
--peft.target_modules='(model\.vlm_with_expert\.lm_expert\..*\.(down|gate|up)_proj|.*\.(state_proj|action_in_proj|action_out_proj|action_time_mlp_in|action_time_mlp_out))'如果你需要完整 fine-tune 某一层而不只是适配它,可以向 --peft.full_training_modules 参数提供一个层后缀列表:
--peft.full_training_modules=["state_proj"]学习率和计划的目标学习率通常可以比完整 fine-tune 所用的学习率放大 10 倍(例如,通常 1e-4,使用 LoRA 时为 1e-3)。
在 GitHub 上更新