玩炼丹的同学对于抱脸,也就是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这样的简单的算力资源上进行微调。
,
















