当前位置:   article > 正文

微调大型语言模型:根据您的需求定制Llama 3 8B_700亿参数大模型部署成本

700亿参数大模型部署成本

自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``)
  • 1

安装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``)
  • 1

初始化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",`    `),``)``   
  • 1

训练模型:

trainer_stats = trainer.train()``   
  • 1

监督微调训练器(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"``   
  • 1

安装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)
  • 1

初始化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)``   
  • 1
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,``)
  • 1

训练模型

trainer.train()``   
  • 1

优势比偏好优化(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``)
  • 1

配置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)
  • 1

翻译为:初始化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/",``)
  • 1
trainer = ORPOTrainer(`    `model=model,`    `args=orpo_args,`    `train_dataset=dataset["train"],`    `eval_dataset=dataset["test"],`    `peft_config=peft_config,`    `tokenizer=tokenizer,``)
  • 1

训练模型

trainer.train()``   
  • 1

结论尽管像GPT、Gemini或Claude这样的大型语言模型(LLMs)功能强大,但它们的大规模和资源需求使它们在许多任务中不切实际。为了解决这个问题,可以使用量化和低秩适应(LoRA)等技术对较小的开源LLMs进行微调和定制以满足特定需求。这些技术减少了内存消耗并提高了计算效率,使得训练模型更加经济,尤其是对于那些参数少于100亿的模型。

像Unsloth、监督微调训练器(SFT)和优势比偏好优化(ORPO)这样的工具简化了微调过程,使其更加易于访问。例如,Unsloth提供的优化可以显著加速训练,而ORPO结合了监督微调和偏好对齐,以提高模型性能。

通过利用这些技术和工具,开发人员和研究人员可以根据特定需求定制LLMs,而无需承担与训练大型模型相关的高昂成本。这种方法使得高级语言模型的访问民主化,并在不同领域启用了广泛的应用。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/810773
推荐阅读
相关标签
  

闽ICP备14008679号