使用单块低配GPU微调Llama-2-13B

使用单块低配GPU微调Llama-2-13B

首页音乐舞蹈B and D更新时间:2024-04-29

玩炼丹的同学对于抱脸,也就是Hugging Face无人不知无人不晓。Hugging Face是一个为自然语言处理(NLP)社区提供开源工具和资源的平台,它汇集了大量的预训练模型和相关的代码库。在这个平台上,用户可以方便地访问、下载和使用各种NLP模型,包括Llama-2-13b。

Llama-2-13b作为Llama-2系列模型的一员,在Hugging Face上同样展现了其独特的技术特点和强大的性能。该模型拥有13B个参数,采用了多层Transformer架构,使其在处理复杂的语言结构和语义理解方面具有出色的能力。

在Hugging Face上,用户不仅可以获取Llama-2-13b的模型权重和代码,还可以找到相关的使用教程、示例代码以及社区讨论。这使得用户可以更轻松地集成该模型到自己的项目中,并进行进一步的微调和应用。

此外,Hugging Face还提供了丰富的工具和库,如Transformers库,帮助用户更方便地进行模型的加载、微调和推理等操作。用户可以利用这些工具对Llama-2-13b进行定制化的开发,以满足自己特定的需求。

接下来我们来看一看在单个GPU上完成微调Llama-2-13b模型的大致的过程和基本的步骤。这里我们将使用collab笔记本,但你完全可以使用你的本地电脑完成这些工作,它只需要有大约12 Gb的VRAM。

可以通过在笔记本中运行下面的命令来安装所需的库:

!pip install -q transformers trl peft huggingface_hub datasets bitsandbytes accelerate

首先登录你的Hugging Face账户:

from huggingface_hub import login login("<your token here>")

下面是加载令牌标记器:

model_id = "meta-llama/Llama-2-13b-chat-hf" import torch device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, BitsAndBytesConfig tokenizer = AutoTokenizer.from_pretrained(model_id) tokenizer.pad_token = tokenizer.eos_token

这里是一个非常重要的步骤,我们以量化形式加载模型,这减少了适合模型的内存需求,因此它可以在单个GPU上运行。

bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=False)

如果你有更多的GPU,你可以加载8位模型。根据您的硬件规格使用此配置。

model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, use_cache=False)

下面的代码行为4位或8位训练准备了模型,如果不这样做的话,您将得到一个错误:

from peft import prepare_model_for_kbit_training, get_peft_model, LoraConfig, TaskType model.gradient_checkpointing_enable() model = prepare_model_for_kbit_training(model)

然后定义LoRA配置,主要使用两个参数——rank和lora_alpha。要了解更多细节,您可以阅读此处的内容:https://huggingface.co/docs/peft/main/en/conceptual_guides/lora

peft_config = LoraConfig( task_type=TaskType.CAUSAL_LM, inference_mode=False, r=64, lora_alpha=32, lora_dropout=0.1, ) model = get_peft_model(model, peft_config)peft_config = LoraConfig( task_type=TaskType.CAUSAL_LM, inference_mode=False, r=64, lora_alpha=32, lora_dropout=0.1, ) model = get_peft_model(model, peft_config)

下面的代码是一个辅助函数,它显示有多少个可训练的参数:

def print_trainable_parameters(model): """ Prints the number of trainable parameters in the model. """ trainable_params = 0 all_param = 0 for _, param in model.named_parameters(): all_param = param.numel() if param.requires_grad: trainable_params = param.numel() print( f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}" ) print_trainable_parameters(model) >>> trainable params: 52428800 || all params: 6724408320 || trainable%: 0.7796790067620403

我们可以看到,在LoRA中,需要训练的参数很少。

准备你的数据,你可以拥有任何你想要的形式,只要是数据集,你可以在训练时传递一个格式化函数,它可以组合数据的所有文本部分。

在这里,你可以改变训练配置,对于LoRA,你可以从一个更高的学习率开始,因为原始权重是固定的,所以你不必担心灾难性的遗忘。您想要使用的参数是per_device_train_batch_size和gradient_accumulation_steps,因为当内存耗尽时,可以降低per_device_train_batch_size并增加gradient_accumulation_steps。

max_seq_length = 512 from transformers import TrainingArguments, EarlyStoppingCallback from trl import SFTTrainer output_dir = "./results" optim = "paged_adamw_32bit" training_args = TrainingArguments( output_dir=output_dir, overwrite_output_dir=True, optim=optim, learning_rate=1e-4, logging_steps=10, max_steps=300, warmup_ratio=0.3, per_device_train_batch_size=8, gradient_accumulation_steps=4, gradient_checkpointing=True, save_total_limit = 5, fp16=True )

这里有一个格式化函数的例子。其中的数据已经有一个文本字段,字段内包含有所有的文本数据:

def format_function(example): return example['text']

但如果你没有文本字段,你可以使用它,让函数返回所有文本。现在我们定义训练器:

from trl import SFTTrainer peft_trainer = SFTTrainer( model=model, train_dataset=dataset, peft_config=peft_config, max_seq_length=max_seq_length, tokenizer=tokenizer, args=training_args, formatting_func=format_function) peft_trainer.train()

一旦模型被训练,你可以将其存储在本地或将其推送到Hugging Face社区上面。模型量化通过减少模型参数的比特数,显著降低了模型占用的存储空间。例如,将32位浮点数模型量化为8位整数模型,可以将模型体积降低为原来的四分之一。这不仅有利于模型的存储,还使得模型在部署和更新时更加高效。

计算速度提升:由于量化后的模型参数占用更少的存储空间,因此在进行计算时所需的资源也更少。此外,许多处理器对低比特数据的处理速度更快,进一步提高了模型的计算速度。这种速度提升在实时处理、大规模数据处理等场景中尤为重要。通过这个例子我们就可以清晰了解量化后的模型完全可以在像单个GPU这样的简单的算力资源上进行微调。

,
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved