近期,大语言模型(LLM)领域变化迅速。新一代 LLM 正在被设计得更小更智能,与超大模型相比,成本更低、使用更便捷。
随着 Llama 3.2 的发布,我们如今可以使用更小的模型,例如 1B 和 3B 变体。虽然这些小模型在通用任务上的准确性可能不及大模型,但通过微调,它们能在特定领域表现出色,比如客户支持交互中的情绪分类。这种能力使它们有望在这些场景中替代传统模型。
在本教程中,我们将探索 Llama 3.2 的视觉与轻量模型能力。我们将学习如何访问 Llama 3.2 3B 模型,在客户支持数据集上对其进行微调,随后将其合并并导出到 Hugging Face Hub。最后,我们会将模型转换为 GGUF 格式,并通过 Jan 应用在本地使用。
如果您是 AI 新手,强烈建议您先学习 AI 基础 技能路径,了解 ChatGPT、大语言模型、生成式 AI 等基础知识。
图片来源:作者
Llama 3.2 简介
开源的 Llama 3.2 模型家族包含 轻量 与 视觉 两类模型。视觉模型擅长图像推理与视觉-语言融合;轻量模型则在多语种文本生成与边缘设备工具调用方面表现突出。
轻量模型
轻量模型有两个更小的变体:1B 与 3B。它们擅长多语种文本生成与工具调用任务。由于体量小,能在设备端运行,确保数据不离开设备,并以低算力成本实现高速文本生成。
为打造这些高效的轻量模型,Llama 3.2 使用了剪枝与知识蒸馏技术。剪枝在保留性能的同时缩小模型尺寸;知识蒸馏则利用更大的网络将知识传递给小模型,从而提升小模型性能。
3B 模型在指令跟随、摘要、提示改写与工具使用等任务上优于 Gemma 2 (2.6B)与 Phi 3.5-mini 等模型。
来源: Llama 3.2: 用开放、可定制模型重塑边缘 AI 与视觉
视觉模型
视觉模型包含 11B 与 90B 两个变体,旨在支持图像推理。11B 与 90B 能理解和解读文档、图表与曲线图,并执行图像描述与视觉定位等任务。这些高级视觉能力得益于将预训练图像编码器与语言模型通过包含交叉注意力层的适配权重进行集成。
与 Claude 3 Haiku 和 GPT-4o mini 相比,Llama 3.2 视觉模型在图像识别与多种视觉理解任务上表现突出,是多模态 AI 应用的强大工具。
来源: Llama 3.2: 用开放、可定制模型重塑边缘 AI 与视觉
关于 Llama 3.2 的用例、基准、Llama Guard 3 与模型架构,您可以阅读我们的最新博文 Llama 3.2 指南:工作原理、用例与更多 。
在 Kaggle 访问 Llama 3.2 轻量模型
尽管 Llama 3.2 是免费开源的,您仍需在官网接受条款并提交表单。
要在 Kaggle 平台获取最新的 Llama 3.2 模型:
前往 llama.com 网站,填写您的信息,选择轻量与视觉模型。
来源: 下载 Llama
前往 Meta | Llama 3.2 模型页面,点击“Submit Form”。
来源: Meta | Llama 3.2 | Kaggle
接受所有条款与条件,并点击“Submit”。
来源: Meta | Llama 3.2 | Kaggle
等待几分钟,直到看到下载或创建新 Notebook 的选项。选择 Transformers 选项卡与模型变体,然后点击“+ New Notebook”。
Kaggle Notebook 将随最新 Llama 模型启动。为确保运行,将加速器改为“GPU T4 x2”。
更新 Transformers 与 Accelerate Python 包。
% % capture
% pip install - U transformers accelerate技术支持
使用 Transformers 包加载分词器与模型。我们不提供 Hugging Face 模型仓库链接,而是指定模型所在的本地目录。
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline, TextStreamer
import torch
base_model = "/kaggle/input/llama-3.2/transformers/3b-instruct/1"
tokenizer = AutoTokenizer. from_pretrained( base_model)
model = AutoModelForCausalLM. from_pretrained(
base_model,
return_dict= True ,
low_cpu_mem_usage= True ,
torch_dtype= torch. float16,
device_map= "auto" ,
trust_remote_code= True ,
) 技术支持
设置 pad_token_id 以避免警告信息。
if tokenizer. pad_token_id is None :
tokenizer. pad_token_id = tokenizer. eos_token_id
if model. config. pad_token_id is None :
model. config. pad_token_id = model. config. eos_token_id技术支持
使用模型与分词器创建文本生成管道。
pipe = pipeline(
"text-generation" ,
model= model,
tokenizer= tokenizer,
torch_dtype= torch. float16,
device_map= "auto" ,
) 技术支持
使用自定义提示运行管道。本例中我们询问 Vincent van Gogh。
messages = [ { "role" : "user" , "content" : "Who is Vincent van Gogh?" } ]
prompt = tokenizer. apply_chat_template(
messages, tokenize= False , add_generation_prompt= True
)
outputs = pipe( prompt, max_new_tokens= 120 , do_sample= True )
print ( outputs[ 0 ] [ "generated_text" ] ) 技术支持
答案相当准确。
我们提供系统指令,看看它是否能理解并遵循复杂提示。我们将把 Markdown 代码合并为 HTML 显示结果。
from IPython. display import Markdown, display
messages = [
{
"role" : "system" ,
"content" : "You are a skilled Python developer specializing in database management and optimization." ,
} ,
{
"role" : "user" ,
"content" : "I'm experiencing a sorting issue in my database. Could you please provide Python code to help resolve this problem?" ,
} ,
]
prompt = tokenizer. apply_chat_template(
messages, tokenize= False , add_generation_prompt= True
)
outputs = pipe( prompt, max_new_tokens= 512 , do_sample= True )
display(
Markdown(
outputs[ 0 ] [ "generated_text" ] . split(
"<|start_header_id|>assistant<|end_header_id|>"
) [ 1 ]
)
) 技术支持
结果非常准确。尽管只有 30 亿参数,该模型表现相当不错。
如果您在访问 Llama 3.2 轻量模型时遇到困难,请参考 Notebook: 访问 Llama 3.2 轻量模型 。
在 Kaggle 访问 Llama 3.2 视觉模型
访问视觉模型很简单,而且无需担心 GPU 显存,因为本指南将使用多块 GPU。
在 Meta | Llama 3.2 Vision 模型页面提交表单。接受所有条款并点击“Submit”。
来源: Meta | Llama 3.2 Vision | Kaggle
下拉,选择 Transformers 选项卡与视觉模型变体,然后点击“+ New Notebook”。
来源: Meta | Llama 3.2 Vision | Kaggle
确保使用“GPU T4 x2”作为加速器。
更新 Transformers 与 Accelerate Python 包。
% % capture
% pip install - U transformers accelerate技术支持
加载图像处理器与 Llama 3.2 视觉模型。
import torch
from transformers import MllamaForConditionalGeneration, AutoProcessor
base_model = "/kaggle/input/llama-3.2-vision/transformers/11b-vision-instruct/1"
processor = AutoProcessor. from_pretrained( base_model)
model = MllamaForConditionalGeneration. from_pretrained(
base_model,
low_cpu_mem_usage= True ,
torch_dtype= torch. bfloat16,
device_map= "auto" ,
) 技术支持
如图所示,它几乎占用 25 GB 显存。在笔记本电脑或 Google Colab 免费版上无法运行。
加载图像。我们使用了本教程的特色图片: OpenAI o1-preview 教程:构建机器学习项目 。
撰写消息并使用聊天模板将其转换为提示。撰写消息并使用聊天模板将其转换为提示。
同时处理图像与文本,并提供给模型以生成响应。
import requests
from PIL import Image
url = "https://media.datacamp.com/cms/google/ad_4nxcz-j3ir2begccslzay07rqfj5ttakp2emttn0x6nkygls5ywl0unospj2s0-mrwpdtmqjl1fagh6pvkkjekqey_kwzl6qnodf143yt66znq0epflvx6clfoqw41oeoymhpz6qrlb5ajer4aeniogbmtwtd.png"
image = Image. open ( requests. get( url, stream= True ) . raw)
messages = [
{ "role" : "user" , "content" : [
{ "type" : "image" } ,
{ "type" : "text" , "text" : "Describe the tutorial feature image." }
] }
]
input_text = processor. apply_chat_template( messages, add_generation_prompt= True )
inputs = processor( image, input_text, return_tensors= "pt" ) . to( model. device)
output = model. generate( ** inputs, max_new_tokens= 120 )
print ( processor. decode( output[ 0 ] ) ) 技术支持
最终我们得到对图像的详细描述,准确度相当高。
如果在运行上述代码时遇到问题,请参考 访问 Llama 3.2 视觉模型 Kaggle Notebook。
微调 Llama 3.2 3B Instruct
本节我们将学习如何使用 Transformers 库在客户支持数据集上微调 Llama 3.2 3B Instruct 模型。我们将使用 Kaggle 获取免费 GPU,并获得比 Colab 更高的内存。
1. 环境设置
在 Kaggle 启动新 Notebook 并设置环境变量。我们将使用 Hugging Face API 保存模型,并用 Weights & Biases 跟踪其性能。
安装并更新所有必要的 Python 包。
% % capture
% pip install - U transformers
% pip install - U datasets
% pip install - U accelerate
% pip install - U peft
% pip install - U trl
% pip install - U bitsandbytes
% pip install - U wandb技术支持
加载在微调与评估过程中将使用的 Python 包与函数。
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
HfArgumentParser,
TrainingArguments,
pipeline,
logging,
)
from peft import (
LoraConfig,
PeftModel,
prepare_model_for_kbit_training,
get_peft_model,
)
import os, torch, wandb
from datasets import load_dataset
from trl import SFTTrainer, setup_chat_format技术支持
使用 API Key 登录 Hugging Face CLI。
from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient( )
hf_token = user_secrets. get_secret( "HUGGINGFACE_TOKEN" )
login( token = hf_token) 技术支持
使用 API Key 登录 Weights & Biases,并创建新项目。
wb_token = user_secrets. get_secret( "wandb" )
wandb. login( key= wb_token)
run = wandb. init(
project= 'Fine-tune Llama 3.2 on Customer Support Dataset' ,
job_type= "training" ,
anonymous= "allow"
) 技术支持
设置基础模型、数据集与新模型名称等变量。我们将在多个位置使用它们,因此提前设置可避免混淆。
base_model = "/kaggle/input/llama-3.2/transformers/3b-instruct/1"
new_model = "llama-3.2-3b-it-Ecommerce-ChatBot"
dataset_name = "bitext/Bitext-customer-support-llm-chatbot-training-dataset" 技术支持
2. 加载模型与分词器
设置数据类型与注意力实现。
if torch. cuda. get_device_capability( ) [ 0 ] >= 8 :
!pip install - qqq flash- attn
torch_dtype = torch. bfloat16
attn_implementation = "flash_attention_2"
else :
torch_dtype = torch. float16
attn_implementation = "eager" 技术支持
通过提供本地模型目录加载模型与分词器。虽说模型较小,但完整加载并微调仍需时间。因此我们将以 4 位量化加载模型。
bnb_config = BitsAndBytesConfig(
load_in_4bit= True ,
bnb_4bit_quant_type= "nf4" ,
bnb_4bit_compute_dtype= torch_dtype,
bnb_4bit_use_double_quant= True ,
)
model = AutoModelForCausalLM. from_pretrained(
base_model,
quantization_config= bnb_config,
device_map= "auto" ,
attn_implementation= attn_implementation
)
tokenizer = AutoTokenizer. from_pretrained( base_model, trust_remote_code= True ) 技术支持
3. 加载与处理数据集
我们将从 Hugging Face Hub 加载 Bitext-customer-support-llm-chatbot 数据集。它是一个混合合成数据集,我们将用它来创建自定义客户支持聊天机器人。
我们会加载、打乱,并仅选择 1000 个样本。我们在小子集上微调以缩短训练时间,您也可选择使用完整数据。
接着,我们将使用系统指令、用户问题与助手回复创建 "text" 列,并将 JSON 响应转换为聊天格式。
dataset = load_dataset( dataset_name, split= "train" )
dataset = dataset. shuffle( seed= 65 ) . select( range ( 1000 ) )
instruction = """You are a top-rated customer service agent named John.
Be polite to customers and answer all their questions.
"""
def format_chat_template ( row) :
row_json = [ { "role" : "system" , "content" : instruction } ,
{ "role" : "user" , "content" : row[ "instruction" ] } ,
{ "role" : "assistant" , "content" : row[ "response" ] } ]
row[ "text" ] = tokenizer. apply_chat_template( row_json, tokenize= False )
return row
dataset = dataset. map (
format_chat_template,
num_proc= 4 ,
)
技术支持
如我们所见,已将客户提问与助手回复合并为聊天格式。
dataset[ 'text' ] [ 3 ] 技术支持
4. 模型设置
从模型中提取线性模块名称。
import bitsandbytes as bnb
def find_all_linear_names ( model) :
cls = bnb. nn. Linear4bit
lora_module_names = set ( )
for name, module in model. named_modules( ) :
if isinstance ( module, cls) :
names = name. split( '.' )
lora_module_names. add( names[ 0 ] if len ( names) == 1 else names[ - 1 ] )
if 'lm_head' in lora_module_names:
lora_module_names. remove( 'lm_head' )
return list ( lora_module_names)
modules = find_all_linear_names( model) 技术支持
使用线性模块名称创建 LoRA 适配器。我们只微调 LoRA 适配器,其余模型保持冻结,以节省内存并加快训练。
peft_config = LoraConfig(
r= 16 ,
lora_alpha= 32 ,
lora_dropout= 0.05 ,
bias= "none" ,
task_type= "CAUSAL_LM" ,
target_modules= modules
)
model, tokenizer = setup_chat_format( model, tokenizer)
model = get_peft_model( model, peft_config) 技术支持
我们正在配置适用于 Kaggle 环境的模型超参数。您可以参考 微调 Llama 2 教程了解各超参数,并根据您的系统优化训练。
training_arguments = TrainingArguments(
output_dir= new_model,
per_device_train_batch_size= 1 ,
per_device_eval_batch_size= 1 ,
gradient_accumulation_steps= 2 ,
optim= "paged_adamw_32bit" ,
num_train_epochs= 1 ,
eval_strategy= "steps" ,
eval_steps= 0.2 ,
logging_steps= 1 ,
warmup_steps= 10 ,
logging_strategy= "steps" ,
learning_rate= 2e-4 ,
fp16= False ,
bf16= False ,
group_by_length= True ,
report_to= "wandb"
) 技术支持
现在我们将设置监督式微调(SFT)训练器,并提供训练与评估数据集、LoRA 配置、训练参数、分词器与模型。
trainer = SFTTrainer(
model= model,
train_dataset= dataset[ "train" ] ,
eval_dataset= dataset[ "test" ] ,
peft_config= peft_config,
max_seq_length= 512 ,
dataset_text_field= "text" ,
tokenizer= tokenizer,
args= training_arguments,
packing= False ,
) 技术支持
5. 模型训练
开始训练过程,并监控训练与验证损失指标。
trainer. train( ) 技术支持
训练损失逐步下降,这是个好迹象。
在结束 Weights & Biases 运行后会生成详细的运行历史。
wandb. finish( ) 技术支持
您也可以随时访问 Weights & Biases 仪表盘,以更全面地查看模型指标。
6. 模型推理
为测试微调后的模型,我们将提供来自数据集的示例提示。
messages = [ { "role" : "system" , "content" : instruction} ,
{ "role" : "user" , "content" : "I bought the same item twice, cancel order {{Order Number}}" } ]
prompt = tokenizer. apply_chat_template( messages, tokenize= False , add_generation_prompt= True )
inputs = tokenizer( prompt, return_tensors= 'pt' , padding= True , truncation= True ) . to( "cuda" )
outputs = model. generate( ** inputs, max_new_tokens= 150 , num_return_sequences= 1 )
text = tokenizer. decode( outputs[ 0 ] , skip_special_tokens= True )
print ( text. split( "assistant" ) [ 1 ] ) 技术支持
微调后的模型已学到相应风格,并给出了准确的回复。
7. 保存分词器与模型
将微调后的模型本地保存,并推送至 Hugging Face Hub。push_to_hub 函数会创建新模型仓库并将模型文件推送到您的 Hugging Face 仓库。
trainer. model. save_pretrained( new_model)
trainer. model. push_to_hub( new_model, use_temp_dir= False ) 技术支持
来源: kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot
如需微调更大的 Llama 3 模型,请查看 微调 Llama 3.1 进行文本分类 教程。该教程很受欢迎,可帮助您完成 LLM 的完整任务。
8. 保存 Notebook
点击右上角的“Save Version”,选择快速保存选项,并将保存输出选项改为保存模型文件与全部代码。
查看 在客户支持上微调 Llama 3.2 Kaggle Notebook 以获取源代码、结果与输出。
本指南以代码为主。如果您在寻找零代码或低代码的 LLM 微调指南,请查看 LlaMA-Factory WebUI 新手指南:微调 LLM 。
合并并导出微调后的 Llama 3.2
我们将创建一个新 Notebook,并添加之前保存的 Notebook,以访问微调后的 LoRA 适配器,避免内存问题。
请确保同时添加基础模型 “Llama 3.2 3B Instruct”。
安装并更新所有必要的 Python 包。
% % capture
% pip install - U bitsandbytes
% pip install transformers== 4.44 .2
% pip install - U accelerate
% pip install - U peft
% pip install - U trl技术支持
登录 Hugging Face CLI,以将合并后的模型推送至 Hugging Face Hub。
from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient( )
hf_token = user_secrets. get_secret( "HUGGINGFACE_TOKEN" )
login( token = hf_token) 技术支持
提供基础模型与微调 LoRA 的位置。我们将用它们来加载基础模型并与适配器进行合并。
base_model_url = "/kaggle/input/llama-3.2/transformers/3b-instruct/1"
new_model_url = "/kaggle/input/fine-tune-llama-3-2-on-customer-support/llama-3.2-3b-it-Ecommerce-ChatBot/" 技术支持
加载分词器与完整模型。
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, pipeline
from peft import PeftModel
import torch
from trl import setup_chat_format
tokenizer = AutoTokenizer. from_pretrained( base_model_url)
base_model_reload= AutoModelForCausalLM. from_pretrained(
base_model_url,
low_cpu_mem_usage= True ,
return_dict= True ,
torch_dtype= torch. float16,
device_map= "auto" ,
) 技术支持
将聊天格式应用于模型与分词器。然后,将基础模型与 LoRA 适配器合并。
base_model_reload, tokenizer = setup_chat_format( base_model_reload, tokenizer)
model = PeftModel. from_pretrained( base_model_reload, new_model_url)
model = model. merge_and_unload( ) 技术支持
为验证模型是否成功合并,向其提供示例提示并生成响应。
instruction = """You are a top-rated customer service agent named John.
Be polite to customers and answer all their questions.
"""
messages = [ { "role" : "system" , "content" : instruction} ,
{ "role" : "user" , "content" : "I have to see what payment payment modalities are accepted" } ]
prompt = tokenizer. apply_chat_template( messages, tokenize= False , add_generation_prompt= True )
inputs = tokenizer( prompt, return_tensors= 'pt' , padding= True , truncation= True ) . to( "cuda" )
outputs = model. generate( ** inputs, max_new_tokens= 150 , num_return_sequences= 1 )
text = tokenizer. decode( outputs[ 0 ] , skip_special_tokens= True )
print ( text. split( "assistant" ) [ 1 ] ) 技术支持
如我们所见,微调后的模型工作良好。
本地保存分词器与模型。
new_model = "llama-3.2-3b-it-Ecommerce-ChatBot"
model. save_pretrained( new_model)
tokenizer. save_pretrained( new_model) 技术支持
将分词器与合并模型推送到 Hugging Face 模型仓库。
model. push_to_hub( new_model, use_temp_dir= False )
tokenizer. push_to_hub( new_model, use_temp_dir= False ) 技术支持
几分钟后,您即可在 Hugging Face 仓库中查看所有模型文件与元数据文件。
来源: kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot
您也可以在 合并并导出微调后的 Llama 3.2 Kaggle Notebook 中查看源代码,进一步了解如何合并模型并上传至 Hugging Face Hub。
本项目的下一步是将完整模型转换为 GGUF 格式并进行量化。之后,您可以通过 Jan、Msty 或 GPT4ALL 等喜爱的聊天应用在本地使用。请参考 微调 Llama 3 并在本地使用 指南,了解如何将所有 LLM 转换为 GGUF 格式并在笔记本本地使用。
将合并模型转换为 GGUF 格式
要在本地使用微调后的模型,我们首先需要将其转换为 GGUF 格式。为什么?因为这是 llama.cpp 的格式,几乎所有桌面聊天应用都支持。
将合并模型转换为 llama.cpp 格式非常容易。我们只需前往 GGUF My Repo 的 Hugging Face Hub。使用 Hugging Face 账号登录,输入微调模型仓库链接 “kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot”,并点击“Submit”。
来源: GGUF My Repo
几秒钟内,模型的量化版本会在新的 Hugging Face 仓库中创建。
来源: kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot-Q4_K_M-GGUF
点击 “Files” 选项卡,仅下载 GGUF 文件。
来源: llama-3.2-3b-it-ecommerce-chatbot-q4_k_m.gguf
在本地使用微调模型
我们将使用 Jan 聊天应用在本地使用我们的微调模型。前往官网 jan.ai 下载并安装应用。
来源: Jan
点击设置,选择 “My Models” 菜单,按下 “Import Model” 按钮。然后提供模型的本地目录。
前往聊天菜单,并选择微调后的模型,如下所示。
点击右侧面板的 “Assistant” 选项卡并输入系统提示。
系统提示: “You are a top-rated customer service agent named John. Be polite to customers and answer all their questions.”
点击 “Model” 选项卡(位于 “Assistant” 旁),将停止 token 修改为 “<|eot_id|>”
就是这样。现在只需向客户支持 AI 询问您遇到的问题即可。
提示: “How do I order multiple items from the same vendor?”
响应准确且速度极快——几乎 102 token 每秒。
结语
微调小型 LLM 能节省成本并提升推理速度。只要数据足够,您就能在特定任务上将模型性能提升到接近 GPT-4-mini 的水平。简言之,AI 的未来将是在主从式架构下以网格方式使用多个小型 LLM。
主模型将接收初始提示,并决定调用哪一个专用模型来生成答案。这将减少计算时间、提升结果并降低运行成本。
在本教程中,我们了解了 Llama 3.2 以及如何在 Kaggle 上访问它。我们还学习了如何在客户支持数据集上微调 Llama 3.2 轻量模型,使其学会以特定风格回复并提供准确的领域信息。随后,我们将 LoRA 适配器与基础模型合并,并将完整模型推送至 Hugging Face Hub。最后,我们将合并后的模型转换为 GGUF 格式,并通过 Jan 聊天应用在笔记本电脑本地使用。
参加我们的 Working with Hugging Face 交互式课程,学习使用该工具与微调模型。
近期,大语言模型(LLM)领域变化迅速。新一代 LLM 正在被设计得更小更智能,与超大模型相比,成本更低、使用更便捷。
随着 Llama 3.2 的发布,我们如今可以使用更小的模型,例如 1B 和 3B 变体。虽然这些小模型在通用任务上的准确性可能不及大模型,但通过微调,它们能在特定领域表现出色,比如客户支持交互中的情绪分类。这种能力使它们有望在这些场景中替代传统模型。
在本教程中,我们将探索 Llama 3.2 的视觉与轻量模型能力。我们将学习如何访问 Llama 3.2 3B 模型,在客户支持数据集上对其进行微调,随后将其合并并导出到 Hugging Face Hub。最后,我们会将模型转换为 GGUF 格式,并通过 Jan 应用在本地使用。
如果您是 AI 新手,强烈建议您先学习 AI 基础技能路径,了解 ChatGPT、大语言模型、生成式 AI 等基础知识。
图片来源:作者
Llama 3.2 简介
开源的 Llama 3.2 模型家族包含轻量与视觉两类模型。视觉模型擅长图像推理与视觉-语言融合;轻量模型则在多语种文本生成与边缘设备工具调用方面表现突出。
轻量模型
轻量模型有两个更小的变体:1B 与 3B。它们擅长多语种文本生成与工具调用任务。由于体量小,能在设备端运行,确保数据不离开设备,并以低算力成本实现高速文本生成。
为打造这些高效的轻量模型,Llama 3.2 使用了剪枝与知识蒸馏技术。剪枝在保留性能的同时缩小模型尺寸;知识蒸馏则利用更大的网络将知识传递给小模型,从而提升小模型性能。
3B 模型在指令跟随、摘要、提示改写与工具使用等任务上优于Gemma 2(2.6B)与 Phi 3.5-mini 等模型。
来源:Llama 3.2: 用开放、可定制模型重塑边缘 AI 与视觉
视觉模型
视觉模型包含 11B 与 90B 两个变体,旨在支持图像推理。11B 与 90B 能理解和解读文档、图表与曲线图,并执行图像描述与视觉定位等任务。这些高级视觉能力得益于将预训练图像编码器与语言模型通过包含交叉注意力层的适配权重进行集成。
与Claude 3 Haiku 和 GPT-4o mini相比,Llama 3.2 视觉模型在图像识别与多种视觉理解任务上表现突出,是多模态 AI 应用的强大工具。
来源:Llama 3.2: 用开放、可定制模型重塑边缘 AI 与视觉
关于 Llama 3.2 的用例、基准、Llama Guard 3 与模型架构,您可以阅读我们的最新博文Llama 3.2 指南:工作原理、用例与更多。
在 Kaggle 访问 Llama 3.2 轻量模型
尽管 Llama 3.2 是免费开源的,您仍需在官网接受条款并提交表单。
要在 Kaggle 平台获取最新的 Llama 3.2 模型:
来源:下载 Llama
来源:Meta | Llama 3.2 | Kaggle
来源:Meta | Llama 3.2 | Kaggle
pad_token_id以避免警告信息。答案相当准确。
结果非常准确。尽管只有 30 亿参数,该模型表现相当不错。
如果您在访问 Llama 3.2 轻量模型时遇到困难,请参考 Notebook:访问 Llama 3.2 轻量模型。
在 Kaggle 访问 Llama 3.2 视觉模型
访问视觉模型很简单,而且无需担心 GPU 显存,因为本指南将使用多块 GPU。
来源:Meta | Llama 3.2 Vision | Kaggle
来源:Meta | Llama 3.2 Vision | Kaggle
如图所示,它几乎占用 25 GB 显存。在笔记本电脑或 Google Colab 免费版上无法运行。
最终我们得到对图像的详细描述,准确度相当高。
如果在运行上述代码时遇到问题,请参考访问 Llama 3.2 视觉模型 Kaggle Notebook。
微调 Llama 3.2 3B Instruct
本节我们将学习如何使用 Transformers 库在客户支持数据集上微调 Llama 3.2 3B Instruct 模型。我们将使用 Kaggle 获取免费 GPU,并获得比 Colab 更高的内存。
1. 环境设置
在 Kaggle 启动新 Notebook 并设置环境变量。我们将使用 Hugging Face API 保存模型,并用 Weights & Biases 跟踪其性能。
安装并更新所有必要的 Python 包。
加载在微调与评估过程中将使用的 Python 包与函数。
使用 API Key 登录 Hugging Face CLI。
使用 API Key 登录 Weights & Biases,并创建新项目。
设置基础模型、数据集与新模型名称等变量。我们将在多个位置使用它们,因此提前设置可避免混淆。
2. 加载模型与分词器
设置数据类型与注意力实现。
通过提供本地模型目录加载模型与分词器。虽说模型较小,但完整加载并微调仍需时间。因此我们将以 4 位量化加载模型。
3. 加载与处理数据集
我们将从 Hugging Face Hub 加载Bitext-customer-support-llm-chatbot 数据集。它是一个混合合成数据集,我们将用它来创建自定义客户支持聊天机器人。
我们会加载、打乱,并仅选择 1000 个样本。我们在小子集上微调以缩短训练时间,您也可选择使用完整数据。
接着,我们将使用系统指令、用户问题与助手回复创建 "text" 列,并将 JSON 响应转换为聊天格式。
如我们所见,已将客户提问与助手回复合并为聊天格式。
4. 模型设置
从模型中提取线性模块名称。
使用线性模块名称创建 LoRA 适配器。我们只微调 LoRA 适配器,其余模型保持冻结,以节省内存并加快训练。
我们正在配置适用于 Kaggle 环境的模型超参数。您可以参考微调 Llama 2 教程了解各超参数,并根据您的系统优化训练。
现在我们将设置监督式微调(SFT)训练器,并提供训练与评估数据集、LoRA 配置、训练参数、分词器与模型。
5. 模型训练
开始训练过程,并监控训练与验证损失指标。
训练损失逐步下降,这是个好迹象。
在结束 Weights & Biases 运行后会生成详细的运行历史。
您也可以随时访问 Weights & Biases 仪表盘,以更全面地查看模型指标。
6. 模型推理
为测试微调后的模型,我们将提供来自数据集的示例提示。
微调后的模型已学到相应风格,并给出了准确的回复。
7. 保存分词器与模型
将微调后的模型本地保存,并推送至 Hugging Face Hub。
push_to_hub函数会创建新模型仓库并将模型文件推送到您的 Hugging Face 仓库。来源:kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot
如需微调更大的 Llama 3 模型,请查看 微调 Llama 3.1 进行文本分类 教程。该教程很受欢迎,可帮助您完成 LLM 的完整任务。
8. 保存 Notebook
点击右上角的“Save Version”,选择快速保存选项,并将保存输出选项改为保存模型文件与全部代码。
查看 在客户支持上微调 Llama 3.2 Kaggle Notebook 以获取源代码、结果与输出。
本指南以代码为主。如果您在寻找零代码或低代码的 LLM 微调指南,请查看 LlaMA-Factory WebUI 新手指南:微调 LLM。
合并并导出微调后的 Llama 3.2
我们将创建一个新 Notebook,并添加之前保存的 Notebook,以访问微调后的 LoRA 适配器,避免内存问题。
请确保同时添加基础模型 “Llama 3.2 3B Instruct”。
安装并更新所有必要的 Python 包。
登录 Hugging Face CLI,以将合并后的模型推送至 Hugging Face Hub。
提供基础模型与微调 LoRA 的位置。我们将用它们来加载基础模型并与适配器进行合并。
加载分词器与完整模型。
将聊天格式应用于模型与分词器。然后,将基础模型与 LoRA 适配器合并。
为验证模型是否成功合并,向其提供示例提示并生成响应。
如我们所见,微调后的模型工作良好。
本地保存分词器与模型。
将分词器与合并模型推送到 Hugging Face 模型仓库。
几分钟后,您即可在 Hugging Face 仓库中查看所有模型文件与元数据文件。
来源:kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot
您也可以在 合并并导出微调后的 Llama 3.2 Kaggle Notebook 中查看源代码,进一步了解如何合并模型并上传至 Hugging Face Hub。
本项目的下一步是将完整模型转换为 GGUF 格式并进行量化。之后,您可以通过 Jan、Msty 或 GPT4ALL 等喜爱的聊天应用在本地使用。请参考微调 Llama 3 并在本地使用 指南,了解如何将所有 LLM 转换为 GGUF 格式并在笔记本本地使用。
将合并模型转换为 GGUF 格式
要在本地使用微调后的模型,我们首先需要将其转换为 GGUF 格式。为什么?因为这是 llama.cpp 的格式,几乎所有桌面聊天应用都支持。
将合并模型转换为 llama.cpp 格式非常容易。我们只需前往 GGUF My Repo 的 Hugging Face Hub。使用 Hugging Face 账号登录,输入微调模型仓库链接 “kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot”,并点击“Submit”。
来源:GGUF My Repo
几秒钟内,模型的量化版本会在新的 Hugging Face 仓库中创建。
来源:kingabzpro/llama-3.2-3b-it-Ecommerce-ChatBot-Q4_K_M-GGUF
点击 “Files” 选项卡,仅下载 GGUF 文件。
来源:llama-3.2-3b-it-ecommerce-chatbot-q4_k_m.gguf
在本地使用微调模型
我们将使用 Jan 聊天应用在本地使用我们的微调模型。前往官网 jan.ai 下载并安装应用。
来源:Jan
点击设置,选择 “My Models” 菜单,按下 “Import Model” 按钮。然后提供模型的本地目录。
前往聊天菜单,并选择微调后的模型,如下所示。
点击右侧面板的 “Assistant” 选项卡并输入系统提示。
系统提示: “You are a top-rated customer service agent named John. Be polite to customers and answer all their questions.”
点击 “Model” 选项卡(位于 “Assistant” 旁),将停止 token 修改为 “<|eot_id|>”
就是这样。现在只需向客户支持 AI 询问您遇到的问题即可。
提示: “How do I order multiple items from the same vendor?”
响应准确且速度极快——几乎 102 token 每秒。
结语
微调小型 LLM 能节省成本并提升推理速度。只要数据足够,您就能在特定任务上将模型性能提升到接近 GPT-4-mini 的水平。简言之,AI 的未来将是在主从式架构下以网格方式使用多个小型 LLM。
主模型将接收初始提示,并决定调用哪一个专用模型来生成答案。这将减少计算时间、提升结果并降低运行成本。
在本教程中,我们了解了 Llama 3.2 以及如何在 Kaggle 上访问它。我们还学习了如何在客户支持数据集上微调 Llama 3.2 轻量模型,使其学会以特定风格回复并提供准确的领域信息。随后,我们将 LoRA 适配器与基础模型合并,并将完整模型推送至 Hugging Face Hub。最后,我们将合并后的模型转换为 GGUF 格式,并通过 Jan 聊天应用在笔记本电脑本地使用。
参加我们的Working with Hugging Face 交互式课程,学习使用该工具与微调模型。