微调大型语言模型:根据您的需求定制Llama 3 8B
自2022年11月发布以来,ChatGPT引发了关于大型语言模型(LLMs)和一般人工智能能力的广泛讨论。现在很少有人没听说过ChatGPT或尝试过它。尽管像GPT、Gemini或Claude这样的工具非常强大,拥有数百(甚至数千)亿的参数,并在大量文本语料库上进行预训练,但它们并非万能。有些特定任务这些模型无法胜任。然而,我们并非没有解决这些任务的办法。我们可以利用小型开源模型的力量,将它们适应到我们的特定问题上。
本博客旨在简要概述一些较小的开源LLMs,并解释两个关键的LLM微调概念:量化和LoRA。此外,我们将介绍一些最受欢迎的微调库以及代码示例,以便您能快速将这些概念应用到您的用例中。让我们深入了解微调。
目录
1、“小”型大型语言模型 2、量化 3、低秩适应(LoRA) 4、Unsloth 5、监督微调训练器(SFT) 6、优势比偏好优化(ORPO) 7、结论 8、参考文献
“小”型大型语言模型
微调LLMs可能代价昂贵,尤其是对于参数数量庞大的模型。根据经验法则,通常参数在100亿以下的模型可以进行微调而不会碰到显著的基础设施挑战。然而,对于像Llama 3 70B这样的大型模型,则需要大量资源。对一个700亿参数的模型如Llama 3进行微调大约需要1.5TB的GPU显存。为了直观比较,这个数量级的显存相当于一个大约有20块Nvidia A100组成的集群,每块有80GB的显存。假设硬件是可用的,这样的设置成本约为40万美元。
或者,人们可以使用云服务提供商,如AWS、Azure或GCP,但这种方法同样成本高昂。例如,使用AWS上的一块Nvidia A100 GPU一小时的成本是40美元。如果你要在20个GPU上对700亿参数模型进行5天的微调,费用大约会是10万美元。
由于这些成本,大多数实践者主要使用参数少于100亿的较小LLMs。这些模型可以更经济地训练,只需要16GB到24GB的显存(用于更大的批量大小和更快的训练)。例如,我在AWS上使用一块Nvidia A100将Mistral 7B微调为塞尔维亚语,不到10小时就完成了,成本不到20美元。
当然,如果没有量化,特别是4位量化,一个70亿参数的模型仍然无法在这么大的显存中完成训练。
量化如果使用完整的32位参数,我们仍然需要大量的显存来训练LLM——大约需要150GB,这对于人类来说是一个荒谬的数字.
量化通过将模型参数转换为低精度数据类型(如8位或4位)来提供解决方案,显著降低了内存消耗并提高了执行速度。概念很直接:所有可能的32位值都被映射到一个较小的有限值范围(例如,对于8位转换是256)。这个过程可以被视为围绕几个固定点的高精度值分组,这些固定点代表了它们附近的值。
**低秩适应(LoRA)**LoRA是一种通过使用矩阵维数约简来更新模型权重的技术。这项技术尤其相关,因为广泛应用于LLMs的变压器严重依赖矩阵。关于LoRA在低层次工作的详细解释可以在Jay Alammar的博客文章中找到。
在更新模型权重时,需要调整这些矩阵内的参数。从概念上讲,这种调整可以被视为将一个权重更新矩阵加到原始矩阵上:W’ = W + ΔW。LoRA引入了一种新颖的方法,通过将这个更新矩阵分解成两个较小的矩阵,当这两个矩阵相乘时,接近更新矩阵。在微调过程中,LoRA不是创建然后分解更新矩阵,而是直接创建这两个较小的矩阵用于乘法运算。
下面几张图片中可以看到常规微调和使用LoRA进行微调之间的直观比较。
LoRA的关键好处是,尽管近似稍微不那么精确,但它显著提高了内存和计算效率。例如,考虑一个有1000x1000参数的矩阵,总共有100万参数。通过使用分解后(略微不精确)的1000x100乘以100x1000矩阵的版本,参数数量减少到只有2*100k,实现了80%的参数减少。
量化和LoRA通常结合使用,形成了所谓的QLoRA。
Unsloth如果我重新开始进行LLM微调,我会选择Unsloth Python库。Unsloth提供了一系列针对LLM微调的优化,并支持包括Mistral、Llama 3、Gemma等在内的多种流行的LLMs。例如,他们的免费层级包括了12种不同的针对Mistral的微调优化,提供了显著的2.2倍加速。
以下是使用Unsloth库微调Llama 3 8B的代码片段。所有这些代码块都取自Unsloth的GitHub,完整的用于微调Llama 3 8B的笔记本可以在这里找到。
以4位精度导入模型:
model, tokenizer = FastLanguageModel.from_pretrained(` `model_name = "unsloth/llama-3-8b-bnb-4bit",` `max_seq_length = max_seq_length,` `dtype = dtype,` `load_in_4bit = load_in_4bit,` `# token = "hf_...", # use one if using gated models like meta-llama/Llama-2-7b-hf``)
安装LORA:
model = FastLanguageModel.get_peft_model(` `model,` `r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128` `target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",` `"gate_proj", "up_proj", "down_proj",],` `lora_alpha = 16,` `lora_dropout = 0, # Supports any, but = 0 is optimized` `bias = "none", # Supports any, but = "none" is optimized` `# [NEW] "unsloth" uses 30% less VRAM, fits 2x larger batch sizes!` `use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context` `random_state = 3407,` `use_rslora = False, # We support rank stabilized LoRA` `loftq_config = None, # And LoftQ``)
初始化Hugging Face的监督微调训练器:
trainer = SFTTrainer(` `model = model,` `tokenizer = tokenizer,` `train_dataset = dataset,` `dataset_text_field = "text",` `max_seq_length = max_seq_length,` `dataset_num_proc = 2,` `packing = False, # Can make training 5x faster for short sequences.` `args = TrainingArguments(` `per_device_train_batch_size = 2,` `gradient_accumulation_steps = 4,` `warmup_steps = 5,` `max_steps = 60,` `learning_rate = 2e-4,` `fp16 = not torch.cuda.is_bf16_supported(),` `bf16 = torch.cuda.is_bf16_supported(),` `logging_steps = 1,` `optim = "adamw_8bit",` `weight_decay = 0.01,` `lr_scheduler_type = "linear",` `seed = 3407,` `output_dir = "outputs",` `),``)``
训练模型:
trainer_stats = trainer.train()``
**监督微调训练器(SFT)**在预训练一个LLM之后,下一个关键步骤是监督微调。这个过程对于开发一个能够理解并生成连贯响应的模型至关重要,而不仅仅是完成句子。
像Hugging Face的SFT(监督微调训练器)和PEFT(参数高效微调),以及Tim Dettmers的BitsAndBytes等工具,极大地简化了将LoRA、量化和微调等技术应用到模型的过程。这些库简化了高级优化方法的实施,使它们对开发者和研究人员更加易于访问和高效。
下面,你会注意到Unsloth、SFT和ORPO的代码非常相似。这种相似性源于这些库背后的基本思想大致相同,差异主要在于库本身以及可能的一些超参数。
以4位精度导入模型:
# Hugging Face model id``model_id = "meta-llama/Meta-Llama-3-8B"``model_id = "mistralai/Mistral-7B-v0.1"`` ``# BitsAndBytesConfig int-4 config` `bnb_config = BitsAndBytesConfig(` `load_in_4bit=True,` `bnb_4bit_use_double_quant=True,` `bnb_4bit_quant_type="nf4",` `bnb_4bit_compute_dtype=torch.bfloat16 if use_flash_attention2 else torch.float16``)`` ``# Load model and tokenizer``model = AutoModelForCausalLM.from_pretrained(` `model_id,`` quantization_config=bnb_config, `` use_cache=False, `` device_map="auto",` `token = os.environ["HF_TOKEN"], # if model is gated like llama or mistral` `attn_implementation="flash_attention_2" if use_flash_attention2 else "sdpa"``)``model.config.pretraining_tp = 1`` ``tokenizer = AutoTokenizer.from_pretrained(` `model_id,` `token = os.environ["HF_TOKEN"], # if model is gated like llama or mistral``)``tokenizer.pad_token = tokenizer.eos_token``tokenizer.padding_side = "right"``
安装LORA
# LoRA config based on QLoRA paper``peft_config = LoraConfig(` `lora_alpha=16,` `lora_dropout=0.1,` `r=64,` `bias="none",` `task_type="CAUSAL_LM",` `target_modules=[` `"q_proj",` `"k_proj",` `"v_proj",` `"o_proj",` `"gate_proj",`` "up_proj", `` "down_proj",` `]``)`` ``# Prepare model for training``model = prepare_model_for_kbit_training(model)
初始化Hugging Face的监督微调训练器:
args = TrainingArguments(` `output_dir="mistral-int4-alpaca",` `num_train_epochs=1,` `per_device_train_batch_size=6 if use_flash_attention2 else 2, # you can play with the batch size depending on your hardware` `gradient_accumulation_steps=4,` `gradient_checkpointing=True,` `optim="paged_adamw_8bit",` `logging_steps=10,` `save_strategy="epoch",` `learning_rate=2e-4,` `bf16=use_flash_attention2,` `fp16=not use_flash_attention2,` `tf32=use_flash_attention2,` `max_grad_norm=0.3,` `warmup_steps=5,` `lr_scheduler_type="linear",` `disable_tqdm=False,` `report_to="none"``)`` ``model = get_peft_model(model, peft_config)``
trainer = SFTTrainer(` `model=model,` `train_dataset=dataset,` `peft_config=peft_config,` `max_seq_length=2048,` `tokenizer=tokenizer,` `packing=True,` `formatting_func=format_instruction,`` args=args,``)
训练模型
trainer.train()``
**优势比偏好优化(ORPO)**在这篇博客文章中,我们专注于大型语言模型(LLMs)的预训练和监督微调。然而,所有最先进的LLMs都经历了另一个关键步骤:偏好对齐。这一步骤发生在预训练和微调之后,你告知模型哪些生成的输出是可取的,哪些不是。流行的偏好对齐方法包括来自人类反馈的强化学习(RLHF)和直接偏好优化(DPO)。
一种名为优势比偏好优化(ORPO)的新方法于2024年3月出现,结合了监督微调和偏好对齐。
这里我们有一部分使用ORPO进行微调和偏好对齐的代码。完整代码可以在此处找到(https://colab.research.google.com/drive/1eHNWg9gnaXErdAa8_mcvjMupbSS6rDvi?usp=sharing)。
以4位精度导入模型:
# Model``base_model = "meta-llama/Meta-Llama-3-8B"``new_model = "OrpoLlama-3-8B"`` ``# QLoRA config``bnb_config = BitsAndBytesConfig(` `load_in_4bit=True,` `bnb_4bit_quant_type="nf4",` `bnb_4bit_compute_dtype=torch_dtype,` `bnb_4bit_use_double_quant=True,``)`` ``# Load tokenizer``tokenizer = AutoTokenizer.from_pretrained(base_model)`` ``# Load model``model = AutoModelForCausalLM.from_pretrained(` `base_model,` `quantization_config=bnb_config,` `device_map="auto",` `attn_implementation=attn_implementation``)
配置LORA:
# LoRA config``peft_config = LoraConfig(` `r=16,` `lora_alpha=32,` `lora_dropout=0.05,` `bias="none",` `task_type="CAUSAL_LM",` `target_modules=['up_proj', 'down_proj', 'gate_proj', 'k_proj', 'q_proj', 'v_proj', 'o_proj']``)`` ``model = prepare_model_for_kbit_training(model)
翻译为:初始化Hugging Face的ORPO训练器:
orpo_args = ORPOConfig(` `learning_rate=8e-6,` `beta=0.1,` `lr_scheduler_type="linear",` `max_length=1024,` `max_prompt_length=512,` `per_device_train_batch_size=2,` `per_device_eval_batch_size=2,` `gradient_accumulation_steps=4,` `optim="paged_adamw_8bit",` `num_train_epochs=1,` `evaluation_strategy="steps",` `eval_steps=0.2,` `logging_steps=1,` `warmup_steps=10,` `report_to="wandb",` `output_dir="./results/",``)
trainer = ORPOTrainer(` `model=model,` `args=orpo_args,` `train_dataset=dataset["train"],` `eval_dataset=dataset["test"],` `peft_config=peft_config,` `tokenizer=tokenizer,``)
训练模型
trainer.train()``
结论尽管像GPT、Gemini或Claude这样的大型语言模型(LLMs)功能强大,但它们的大规模和资源需求使它们在许多任务中不切实际。为了解决这个问题,可以使用量化和低秩适应(LoRA)等技术对较小的开源LLMs进行微调和定制以满足特定需求。这些技术减少了内存消耗并提高了计算效率,使得训练模型更加经济,尤其是对于那些参数少于100亿的模型。
像Unsloth、监督微调训练器(SFT)和优势比偏好优化(ORPO)这样的工具简化了微调过程,使其更加易于访问。例如,Unsloth提供的优化可以显著加速训练,而ORPO结合了监督微调和偏好对齐,以提高模型性能。
通过利用这些技术和工具,开发人员和研究人员可以根据特定需求定制LLMs,而无需承担与训练大型模型相关的高昂成本。这种方法使得高级语言模型的访问民主化,并在不同领域启用了广泛的应用。
如何系统的去学习大模型LLM ?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业
?”“谁的饭碗又将不保了?
”等问题热议不断。
事实上,抢你饭碗的不是AI,而是会利用AI的人。
继科大讯飞、阿里、华为
等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?
与其焦虑……
不如成为「掌握AI工具的技术人
」,毕竟AI时代,谁先尝试,谁就能占得先机!
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈
一、LLM大模型经典书籍
AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。
二、640套LLM大模型报告合集
这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
三、LLM大模型系列视频教程
四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)
LLM大模型学习路线 ↓
阶段1:AI大模型时代的基础理解
-
目标:了解AI大模型的基本概念、发展历程和核心原理。
-
内容:
- L1.1 人工智能简述与大模型起源
- L1.2 大模型与通用人工智能
- L1.3 GPT模型的发展历程
- L1.4 模型工程
- L1.4.1 知识大模型
- L1.4.2 生产大模型
- L1.4.3 模型工程方法论
- L1.4.4 模型工程实践
- L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
-
目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
-
内容:
- L2.1 API接口
- L2.1.1 OpenAI API接口
- L2.1.2 Python接口接入
- L2.1.3 BOT工具类框架
- L2.1.4 代码示例
- L2.2 Prompt框架
- L2.3 流水线工程
- L2.4 总结与展望
阶段3:AI大模型应用架构实践
-
目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
-
内容:
- L3.1 Agent模型框架
- L3.2 MetaGPT
- L3.3 ChatGLM
- L3.4 LLAMA
- L3.5 其他大模型介绍
阶段4:AI大模型私有化部署
-
目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
-
内容:
- L4.1 模型私有化部署概述
- L4.2 模型私有化部署的关键技术
- L4.3 模型私有化部署的实施步骤
- L4.4 模型私有化部署的应用场景
这份 LLM大模型资料
包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈