微调大模型的工具选择

工具1:LLaMAFactory

介绍

  • LLaMAFactory 是一个全栈微调工具,支持海量模型和各种主流微调方法,包括 LoRA。
  • 它提供了运行脚本微调和基于 Web 端微调的能力,自带基础训练数据集,并且支持增量预训练和全量微调。
  • LLaMAFactory 在使用 Alpaca 样式的数据集进行微调时,会自动在 prompt 添加 template,这对于微调大模型后使用 vllm 推理是必要的。

工具2:Hugging Face 的 PEFT 包

介绍

  • Hugging Face 提供了丰富的预训练模型和微调工具,支持大多数主流的 NLP 任务。
  • PEFT(Parameter-Efficient Fine-Tuning)是 Hugging Face 开源的微调基础工具,特别适合各种微调任务,包括 LoRA。
  • LoRA(Low-Rank Adaptation)是一种技术,通过低秩分解将权重更新表示为两个较小的矩阵,从而加速大型模型的微调,并减少内存消耗。

微调代码示例如下:

# 按照peft包、确定微调方法:LoraConfig, AdaptionPromptConfig, PrefixTuningConfig
from peft import LoraConfig, TaskType, get_peft_model, PeftModel
config = LoraConfig(target_modules=["query_key_value"], modules_to_save=["post_attention_layernorm"])

# 创建微调模型接下来训练
model = get_peft_model(model, config)
print(model.print_trainable_parameters())		# 打印all params、trainable params

# 配置训练参数
args = TrainingArguments(
    output_dir="./chatbot",
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,
    gradient_checkpointing=True,
    logging_steps=100,
    num_train_epochs=10,
    learning_rate=1e-4,
    remove_unused_columns=False,
    save_strategy="epoch"
)

# 创建训练器
trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_ds.select(range(10000)),
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
)

# 开始训练
trainer.train()

# 保存微调模型的参数和分词器
lora_path='./GLM4'
trainer.model.save_pretrained(lora_path)
tokenizer.save_pretrained(lora_path)

原模型加载LoRA权重进行推理代码如下:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from peft import PeftModel

mode_path = '/root/autodl-tmp/glm-4-9b-chat/ZhipuAI/glm-4-9b-chat'
lora_path = './GLM4_lora'

# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(mode_path, trust_remote_code=True)

# 加载原模型
model = AutoModelForCausalLM.from_pretrained(
    mode_path, 
    device_map="auto",
    torch_dtype=torch.bfloat16, 
    trust_remote_code=True).eval()

# 加载lora权重
model = PeftModel.from_pretrained(model, model_id=lora_path)

prompt = "你是谁?"
inputs = tokenizer.apply_chat_template([{"role": "system", "content": "你是关系抽取专家"},
                                        {"role": "user", "content": prompt}],
                                       add_generation_prompt=True,
                                       tokenize=True,
                                       return_tensors="pt",
                                       return_dict=True
                                       ).to('cuda')


gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1}
with torch.no_grad():
    outputs = model.generate(**inputs, **gen_kwargs)
    outputs = outputs[:, inputs['input_ids'].shape[1]:]
    print(tokenizer.decode(outputs[0], skip_special_tokens=True))

合并模型代码如下:

from transformers import AutoConfig, AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer, GenerationConfig
from peft import PeftModel
 
# 载入预训练模型
tokenizer = AutoTokenizer.from_pretrained(
    base_model, 
    use_fast=True, 
    padding_side="left", **config_kwargs)
    print("Tokenizer Load Success!")

config = AutoConfig.from_pretrained(base_model, **config_kwargs)

# Load and prepare pretrained models (without valuehead).
model = AutoModelForCausalLM.from_pretrained(
        base_model,
        config=config,
        torch_dtype=torch.float16,
        low_cpu_mem_usage=True,
        trust_remote_code=True,
        revision='main'
)

print('origin config =', model.config)

# 合并模型
lora_path = "./save_lora"
model = PeftModel.from_pretrained(model, lora_path)
model = model.merge_and_unload()
print('merge config =', model.config)

# 保存合并模型
save_path = "./save_merge_model
model.save_pretrained(save_path)
tokenizer.save_pretrained(save_path)

综合比较:

  • 易用性和社区支持:Hugging Face 的 transformers 库因其广泛的社区支持和丰富的文档而广受欢迎,适合进行快速实验和生产部署。
  • 功能丰富性:LLaMAFactory 提供了更多的功能,如增量预训练和全量微调,这可能对于需要更复杂微调策略的用户更有吸引力。
  • 性能和效率:两者都支持 LoRA 微调,这是一种参数高效的微调技术,可以减少模型微调所需的计算资源和时间。

如果需要一个功能丰富、支持多种微调方法的工具,并且希望有更多自定义选项,LLaMAFactory 可能是一个更好的选择。

如果更倾向于一个有着广泛社区支持、易于使用和部署的工具,Hugging Face 的 PEFT 包更适合。

### Hugging Face 中用于微调大模型工具和方法 Hugging Face 提供了一系列强大的工具和资源,支持开发者高效地微调大型语言模型(LLMs)。以下是主要的方法和工具: #### 1. 使用 Transformers 和 PEFT 进行参数高效微调 Hugging Face 的 `Transformers` 库提供了丰富的预训练模型集合,而 `PEFT`(Parameter-Efficient Fine-Tuning)库则专注于减少微调过程中所需的计算资源。通过 `AutoPeftModel` 类,可以方便地加载适合特定任务类型的 PEFT 模型[^3]。 例如,在微调一个文本分类模型时,可以通过以下方式实现: ```python from peft import AutoPeftModelForSequenceClassification, PeftConfig model_id = "your_model_name" peft_config = PeftConfig.from_pretrained(model_id) model = AutoPeftModelForSequenceClassification.from_pretrained( model_id, config=peft_config, torch_dtype=torch.bfloat16 # 可选:加速推理并降低内存消耗 ) ``` #### 2. 利用 Trainer API 实现端到端微调流程 Hugging Face 的 `Trainer` 是一种高级封装接口,简化了模型训练过程中的复杂操作。它内置了许多功能,如自动保存检查点、日志记录以及分布式训练支持。对于 LLMs 的微调,可以直接利用该 API 完成数据准备、模型定义及优化器设置等工作[^1]。 下面是一个简单的例子展示如何使用 `Trainer` 来调整 BERT 文本分类模型: ```python from transformers import TrainingArguments, Trainer training_args = TrainingArguments(output_dir="./results", num_train_epochs=3) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, tokenizer=tokenizer, compute_metrics=lambda p: {"accuracy": (p.predictions.argmax(-1) == p.label_ids).mean()} ) trainer.train() ``` #### 3. 借助 Hugging Face Hub 获取社区贡献的最佳实践方案 除了官方文档外,Hugging Face 社区还分享了大量的教程和技术博客文章,帮助用户更好地理解不同场景下的最佳做法。这些资料通常会详细介绍具体案例的应用细节,并附带完整的代码片段以便快速上手尝试[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值