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。

运用单块低配GPU微调Llama213B

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

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

首先登录你的Hugging Face账户:

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

下面是加载令牌标记器:

model_id = "meta-llama/Llama-2-13b-chat-hf"import torchdevice = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, BitsAndBytesConfigtokenizer = 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, TaskTypemodel.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 = 512from transformers import TrainingArguments, EarlyStoppingCallbackfrom trl import SFTTraineroutput_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 SFTTrainerpeft_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这样的大略的算力资源上进行微调。
#AI大模型运用#