点击上方蓝字关注我们
一、介绍
一、介绍
1.1、商用模型在企业应用的劣势
1.1、商用模型在企业应用的劣势
投入成本:像OpenAI的GPT-4和Google的PaLm 2模型这样的LLM提供商是LLM性能的顶尖者,但是他们的顶级模型相当昂贵。GPT-4以及Google PaLm 2每1000个令牌(约600个单词)的费用在3到6美分之间。想象一下,如果你有一家有1000名员工的公司——每个员工每天发送大约25个提示——你每天就要花费750到1500美元!这还不算有成千上万的客户与你的LLM增强的应用程序互动了。 数据隐私:Google和OpenAI都不是在数据隐私保护方面做的特别不错的公司。从去年GPT模型爆发开始,大家的关注点都被模型本身的能力吸引了,没有太关注数据本身的安全问题,实际上经过这么一段时间全球用户的使用正好在给OpenAI做免费模型训练,虽然官方说的是通过API接口调用不会存储和训练你传输的数据。但如果你的数据保密要求高,显然放在别人那里总归是不够踏实的。 模型训练数据。虽然现有的LLM在日常语言任务方面非常精通,但它们仍然是基于广泛、庞大的数据集进行训练,这些数据集可能与你的数据不重叠。一旦你想让模型根据你自己的数据或特定用例表现出特定的行为或回答特定问题,你就需要考虑拥有自己微调过的模型。
所以,为了避免这些问题,我们有一个选择,那就是运行我们自己完全可控制的LLM模型。我们可以决定什么被审查,我们可以根据我们自己公司非常特定的知识来决定如何回答特定问题。那怎么做呢?这就需要用到“迁移学习”的基础知识。它是一种使用已经预先训练、测试过的模型,并添加你特定需求到它们上面的技术。此外,我们还将演示如何使用迁移学习来微调我们的模型,使其表现出我们需要它表现出来的行为。别担心——我们不需要大量的数据——也可以使用较小的数据集。
总之,LLM虽然很厉害,但是成本和数据隐私问题确实需要我们思考。如果你想要更低成本地做LLM微调,并且保护好自己的数据隐私,那么自己训练LLM就是一个不错的选择!
二、什么是迁移学习?
初始化预先训练好的模型 :首先,我们下载并初始化预先训练好的LLM。初始化模型涉及加载之前在大量文本语料上训练过的预先训练好的权重和架构。 微调预先训练好的LLM :接下来,我们使用较小的、特定任务的数据集来微调预先训练好的LLM,以适应特定任务。这涉及使用反向传播和梯度下降来更新预先训练好的LLM的权重,同时保持模型下层的权重固定。 评估微调后的LLM :最后,我们在测试集上评估微调后的LLM,以确定其在任务上的性能。
2.1、QLoRA:高效地微调LLM
通常,微调LLM是一个资源消耗较大的过程,需要进行许多参数调整。然而,开源社区已经开发出一种名为QLoRA的方法,它是一种高效的微调方法,可以减少内存使用量,并能够在单个48GB GPU上微调一个65B参数模型,同时保持完整的16位微调任务性能。
三、选择合适的基础模型
Hugging Face方便地提供了当前最佳开源LLM模型的排行榜,您可以点击以下链接查看:
-
ARC(AI推理挑战):包含7787个自然的、小学科学水平的问题,旨在评估模型的知识和推理能力。 -
HellaSwag:评估常识语言推断能力,模型得分越高,说明其更好地理解语言的含义和意图。 -
MMLU(大规模多任务语言理解能力):涵盖57个任务,包括初等数学、美国历史、计算机科学、法律等,要在这个测试中获得高准确率,模型必须具备广泛的世界知识和问题解决能力。 -
TruthfulQA:包含817个问题,涵盖38个类别,包括健康、法律、金融和政治等,用于判断模型输出的真实性。
-
“指令”模型:例如 falcon-40b-instruct 模型,这些模型是专门为指令/聊天场景进行大量训练的,不适合进一步训练和微调。 -
模型大小:LLM模型由层和参数组成,参数越多,模型越复杂。较小的模型更容易进行微调,并且运行成本更低。根据经验法则,目前65亿参数的模型需要大约48GB或更多的GPU内存。出于经济原因,建议选择最小的能够满足您用例需求的模型。 -
许可证:与任何软件一样,我们需要注意可以做什么和不能做什么。要找到适用的许可证,请点击基准中的模型,并查找许可证部分。一般而言,Hugging Face上的模型可以用于研究目的。所有基于Llama的模型都禁止商业用途。而”falcon“模型家族是在宽松的Apache 2.0许可证下发布的,对于商业应用来说也是一个不错的起点。
3.1、模型选择的基本原则
3.1、模型选择的基本原则
使用hugging face排行榜并按平均基准结果排序。 排除任何”指导”模型。 检查模型的许可证以及它是否适合您的商业用例。 使用参数较少的模型,以便更容易地训练和降低成本。
四、如何准备模型训练数据
输入 |
输出 |
---|---|
创作一篇关于时尚穿搭的爆款小红书文案 |
|
写一篇引人注目的小红书文案,介绍如何做出完美妆容 |
|
撰写一篇有趣的小红书文案,推荐最新的美食热门地点 |
|
用于小红书文案微调的示例数据
输入 |
输出 |
---|---|
产品经理的主要职责是什么? |
产品经理的主要职责是负责产品的规划、设计和推广。他们需要与开发团队、设计师和市场团队合作,确保产品能够满足用户需求并取得商业成功。 |
产品经理需要具备哪些技能? |
产品经理需要具备技术背景、市场分析能力、项目管理技巧和用户体验设计知识。此外,沟通能力、问题解决能力和领导能力也是产品经理必备的技能。 |
如何有效地进行产品需求收集? |
要有效地进行产品需求收集,可以采用多种方法,如面对面访谈、用户调研、竞品分析和数据分析等。重要的是要与用户和利益相关者保持密切的沟通,确保产品需求能够准确地反映用户的需求和市场的需求。 |
用于Q&A机器人微调的示例数据
4.1、应该准备多少组数据集示例?
4.1、应该准备多少组数据集示例?
对于较简单的任务,例如 FAQ 聊天机器人,通常 100 个示例已经足够好。 对于任务和输出更复杂的情况,就需要提供更多的示例。例如,如果你想改变模型的写作风格,比如总是鲁迅的风格写作,那么你可能需要提供数千个示例。 一般而言,示例越多越好,只要这些示例之间不重复。但也不要过度。对于许多任务来说,拥有数百个示例可能就足够了。
4.2、如何创建数据集?
4.2、如何创建数据集?
4.3、数据集需要遵循什么格式?
五、如何选择模型训练环境
小型 GPU,如 Nvidia’s RTX series 的 GPU,适合模型开发、测试和小规模项目部署,或者用于初期实验。它们通常具有小于 24GB 的内存。 中型 GPU,如 Nvidia A40 GPU,适用于中到大型项目。这些 GPU 在成本和计算能力之间提供了平衡,通常是大多数 LLM 训练任务的理想选择。它们具有约 48GB 的内存。 大型 GPU,如 Nvidia A100 GPU,非常适合大规模和内存密集型的训练任务,如 LLM 所需的训练。这些 GPU 价格昂贵,但在关键项目中加速训练速度往往是值得的。A100 旗舰型号提供了 80GB 的内存。 GPU 集群:如果以上选项仍然不够,现代训练框架允许并行地利用多个 GPU,从而可以加载和训练庞大的 LLM。
7亿参数的模型可以在具有 12GB 内存的 GPU 上进行训练 30亿参数的模型适合在具有 24GB 内存的 GPU 上进行训练 65亿参数的模型可以在具有 48GB 内存的 GPU 上进行训练
5.1、具体在哪里获取这些 GPU?
5.1、具体在哪里获取这些 GPU?
Google Colab:由 Google 提供,Colab 是一个运行 Jupyter Notebook 的平台。由于我们的模型训练将在 Python 中完成,因此这是一个不错的选择。Colab 提供了强大的硬件资源,免费用户可以获得带有 12GB RAM 的 NVIDIA T4 GPU,足以训练 7 亿参数的模型。如果需要更好的硬件和更多内存,可以选择付费计划,每月费用为 12 美元。请参考 Google 的 Colab GPU 指南,了解如何启用 GPU。 RunPod:RunPod 是一个按需提供多种 NVIDIA GPU 的服务商,以非常具有吸引力的每小时价格提供服务。启动一个支持 GPU 的虚拟机非常简单,并提供 SSH 访问权限、功能强大的 Web 控制台和预安装的 Jupyter 服务器。尽管无法与 Google Colab 的免费定价相比,但 RunPod 提供了相当低廉的 GPU 价格和易用性,是训练模型的理想选择。 云服务提供商:大型云服务提供商如 Azure、GCP 和 AWS 都提供 GPU 机器。请参考它们的虚拟机页面以获取更多详细信息。对于模型训练而言,它们相对于 Colab 和 RunPod 这样的解决方案稍显复杂,而且您可能不需要长时间运行机器。 自建服务器:最后一个选项是购买 GPU 并在家里或公司运行。虽然这可能需要一开始的大量投资(例如,NVIDIA RTX 3080 被认为是进行真正的 LLM 训练的最低要求,价格约为 1000 美元,而 A100 的价格约为 4000 美元),但如果您计划进行大量的训练操作,这可能是值得的。请注意,考虑到您是否真的需要全天候进行模型训练,RunPod 的价格可能会高达每月 1300 欧元。
本文我们将使用 Google Colab,因为我们要训练一个具有 7 亿参数的模型。然而,我们将使用 Colab Pro,因为我们需要超过 13GB 的系统内存(免费 Colab 的内存限制为 13GB)。
请记住,更大、更快的 GPU 可以加速训练和推理性能,所以如果预算允许,考虑使用其他方法。
六、开始训练你的LLM模型
1)、首先,安装所需的依赖项。
pip install -qqq bitsandbytes
pip install -qqq datasets
!pip install-qqq git+https://github.com/huggingface/transformers@de9255de27abfcae4a 1f816b904915f0b1e2
!pip install-qqq git+https://github.com/huggingface/peft.git
!pip install -qqq git+https://github.com/huggingface/accelerate.git
!pip install -qqq einops
!pip install -qqq scipy
# 我们需要这个特定版本的transformers,因为当前的主分支存在一个bug,导致无法成功训练:
!pip install git+https://github.com/huggingface/transformers@de9255de27abfcae4a 1f816b904915f0b1e2
2)、导入所需的模块:
import bitsandbytes as bab
import torch
import torch.nn as nn
import transformers
from datasets import load_dataset
from peft import LoraConfig, PeftConfig, postmedial,
prepare_model_for_kbit_training, get_peft_model
from transformers import AutoTokenizer, BitsAndBytesConfig, AutoModelForCausalLM
3)、初始化模型:
model_name = "tiiuae/falcon-7b"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
model = AutoModelForCausalLM.from_pretrained(
model_name,
trust_remote_code=True,
quantization_config=bnb_config,
device_map="auto"
)
-
model_name:要使用的模型名称。请参考 Hugging Face 获取确切的模型名称。 -
load_in_4bit:以 4 位量化模式加载模型,以便在有限的 GPU 内存下进行训练。使用 QLoRA 技术,我们不会损失模型性能。 -
bnb_4bit_quant_type:fp4 或 nf4 之一。这设置了量化数据类型。nf4 是 QLoRA 特定的浮点类型,称为 NormalFloat。 -
bnb_4bit_compute_dtype:这设置了计算类型,它可能与输入类型不同。例如,输入可能是 fp32,但计算可以设置为 bf16 来加速。对于 QLoRA 调优,请使用 bfloat16。 -
trust_remote_code:为了加载 falcon 模型,需要执行一些 falcon 模型特定的代码(使其适合 transformer 接口)。涉及到的代码是configuration_RW.py和modelling_RW.py。 -
device_map:定义将工作负载映射到哪个 GPU 设备上。设置为 auto 以最佳方式分配资源。
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
model.gradient_checkpointing_enable()
model = prepare_model_for_kbit_training(model)
config = LoraConfig(
r=8,
lora_alpha=32,
target_modules=["query_key_value"], lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)
6.1、加载数据集
6.1、加载数据集
为了训练我们的模型,我将使用一个著名的电子商务 FAQ 数据集,其中包含关于一个假设的电子商务产品的信息。原始文件可以在这里找到:
https://www.kaggle.com/datasets/saadmakhdoom/ecommerce-faq-chatbot-dataset
[{
"question": "我应该怎么创建账号?",
"answer": "创建账号,在网站右上角点击[注册]按钮完成注册流程"
},...]
如果您想按照本示例进行操作,请从
# 加载JSON文件并将其转换为训练特征
data = load_dataset("json", data_files="ecommerce_faq.json")
def generate_prompt(question_answer):
return f"""
: {question_answer["question"]}
: {question_answer["answer"]}
""" .strip()
def tokenize_prompt(question_answer):
prompt = generate_prompt(question_answer)
tokenized_prompt = tokenizer(prompt, padding=True, truncation=True)
return tokenized_prompt
# 使用 shuffle 来重新排序列表,以消除潜在的排序偏差
data_prompt = data["train"].shuffle().map(tokenize_prompt)
6.2、训练配置和执行
6.2、训练配置和执行
请参考 Hugging Face Trainer API 文档了解更多细节:
trainer = transformers.Trainer(
model=model,
train_dataset=data_prompt,
args=transformers.TrainingArguments( per_device_train_batch_size=1,
gradient_accumulation_steps=4,
num_train_epochs=1,
warmup_ratio=0.05,
max_steps=80,
learning_rate=2e-4,
fp16=True,
logging_steps=1,
output_dir="outputs",
optim="paged_adamw_8bit",
lr_scheduler_type="cosine"
), data_collator=transformers.DataCollatorForLanguageModeling(tokenizer,
mlm=False),)
model.config.use_cache = False trainer.train()
model.save_pretrained("my-falcon")
参数(本例中为“my-falcon”)决定了你的模型文件将存储到哪个文件夹路径。
七、模型推理
# 从我们微调的模型中加载LoRA配置
lora_config = PeftConfig.from_pretrained('my-falcon')
# 实例化一个Transformer模型类,根据我们的模型自动推断
my_model = AutoModelForCausalLM.from_pretrained(
lora_config.base_model_name_or_path, return_dict=True,
quantization_config=bnb_config, device_map="auto",
trust_remote_code=True,
load_in_8bit=True #这个设置可能会将量化减少到8位
speed up inference and reduces memory footprint.
)
tokenizer=AutoTokenizer.from_pretrained( lora_config.base_model_name_or_path)
tokenizer.pad_token=tokenizer.eos_token
# 根据LoRA配置和权重实例化一个LoRA模型
my_model = PeftModel.from_pretrained(my_model, "my-falcon")
prompt = f"""
: 我应该怎么创建账号?
:
""" .strip()
配置模型推理参数:
gen_conf=my_model.generation_config
gen_conf.temperature=0
gen_conf.top_p=0.7
gen_conf.max_new_tokens=200
gen_conf.num_return_sequences=1
gen_conf.pad_token_id=tokenizer.eos_token_id gen_conf.eos_token_id=tokenizer.eos_token_id
-
temperature: 介于 0 和 1 之间,用于决定模型输出的 “创造力”。值越高,对相似问题的回答越多样化。值越低,输出越确定性。 -
top_p: 介于 0 和 1 之间,用于决定考虑下一个输出 token 的数量。例如,如果设置为 0.5,则只考虑概率质量最高的 50% 的 token。 -
max_new_tokens: 输出应该生成多少个 token -
num_return_sequences: 每个输入返回的序列候选数
inputs = tokenizer(prompt, return_tensors="pt").to("cuda:0")
with torch.inference_mode():
outputs = my_model.generate(
input_ids=inputs.input_ids,
attention_mask=inputs.attention_mask,
generation_config=gen_conf,
do_sample=False,
use_cache=True
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
到此,您的模型将需要几秒钟来生成 token,它会利用您训练它时使用的微调数据。
八、总结
最后,通过使用经过微调的 LLM 进行模型推理,我们能够部署一个强大的语言模型,在实际应用中进行准确的预测并生成有价值的洞察力。
如果你对这篇文章感兴趣,而且你想要学习更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。
来源:https://mp.weixin.qq.com/s/R-6ds1bFmOqPANIgVCs2Gg
本文地址:https://www.163264.com/4567