AI魔法学院客服
如何微调Meta Llama-3 8B
Meta推出了优化的Llama 3系列LLM,包括8B和70B模型,针对对话进行了指令调整,并在基准测试中表现优异。文章详细指导了如何使用Unsloth库和Hugging Face工具对Llama-3 8B模型进行微调、加载数据集、设置参数、训练、测试及保存模型的过程。
 2024-09-11
收藏 复制地址分享海报

Meta 推出了 Meta Llama 3 系列 LLM,包括 8 70B 大小的预训练和指令调整的生成文本模型。这些指令调整模型针对对话进行了优化,在行业基准测试中优于许多开源聊天模型。在开发过程中,我们特别注意优化实用性和安全性。

目录概览:


微调微调是机器学习中使用的一种技术,尤其是大型语言模型 (LLM)。这是一种利用现有模型的知识并针对特定任务进行定制的方法。需要资源情况T4-14.7/16GB

开始微调Llama-3 8B

1 步:安装库

o   

pip install huggingface_hub ipython:这将安装两个库:用于从 Hugging Face Hub 访问模型和用于交互式编码。huggingface_hubipython

o   

"unsloth[colab] @ git+https://github.com/unslothai/unsloth.git" "unsloth[conda] @git+https://github.com/unslothai/unsloth.git":这将从 GitHub 安装 Unsloth 库,为 Google Colab()  conda 环境()指定不同的选项。[colab][conda]

o   

export HF_TOKEN=xxxxxxxxxxxxx:可能用于为 Hugging Face Hub 设置身份验证令牌,但出于安全原因,实际令牌值是隐藏的。

o   

1.pip install huggingface_hub ipython "unsloth[colab] @ git+https://github.com/unslothai/unsloth.git" "unsloth[conda] @ git+https://github.com/unslothai/unsloth.git"
2.export HF_TOKEN=xxxxxxxxxxxxx

安装Wandb

1、 安装 Wandb 库:安装与 Wandb 交互所需的库。pip install wandb

2、 登录:提示您输入 Wandb 凭据(可能是 API 密钥),以便您可以使用该服务。wandb login

·        

1.pip install
2.wandbwandb logio

导入库

·        

1.import os
2.from unsloth import FastLanguageModel
3.import torch
4.from trl import SFTTrainer
5.from transformers import TrainingArguments
6.from datasets import load_dataset

加载数据集

1.     

设置最大序列长度:定义每个训练示例中允许的最大标记数。这有助于在训练期间管理内存和计算资源。max_seq_length = 2048

2.     

定义数据 URL JSONL 格式存储数据集的 Web 地址,可能包含文本数据。url

  1. 加载数据集:使用库从提供的 URL 加载数据。dataset = load_dataset("json", data_files = {"train" : url}, split = "train")datasets

load_dataset("json")将数据格式指定为 JSON

data_filesdictionary 使用键“train” URL 作为其值定义训练数据位置。

split="train"表示我们正在加载数据集的训练部分。

·        

1.max_seq_length=2048
2.url="https://huggingface.co/datasets/laion/OIG/resolve/main/unified_chip2.jsonl"
3.dataset = load_dataset("json", data_files = {"train" : url}, split = "train")

加载 Llama-3-8B

·        

1.# 2. Load Llama3 model
2.model, tokenizer = FastLanguageModel.from_pretrained(
3.model_name = "unsloth/llama-3-8b-bnb-4bit", # 指定 Unsloth 库中的确切模型。“Llama3”可能是型号名称,“8b”表示 80 亿个参数,“bnb”可能是指特定的架构,“4bit”表示使用内存效率高的格式。
4.max_seq_length = max_seq_length, # 设置最大序列长度(前面定义)以限制模型可以处理的输入长度。
5.dtype = None, # (假设它设置为 None)允许库选择最合适的数据类型
6.load_in_4bit = True, # 允许以内存高效的 4 位格式加载模型(如果模型和硬件支持)
7.)

generate_text

·        

·        

1.def generate_text(text):
2.inputs = tokenizer( 
3.[ 
4.text 
5.], return_tensors="pt").to("cuda")
6.outputs = model.generate(**inputs, max_new_tokens=20, use_cache=True) 
7.tokenizer.batch_decode(outputs) 
8.print("Before training\n")

进行模型参数设置和快速 LoRA 权重和训练

·        

1.model = FastLanguageModel.get_peft_model(
2.model,
3.r = 16,
4.target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
5."gate_proj", "up_proj", "down_proj",], 
6.lora_alpha = 16,
7.lora_dropout = 0, # Supports any, but = 0 is optimized
8.bias = "none", # Supports any, but = "none" is optimized 
9.use_gradient_checkpointing = True,
10.      random_state = 3407,
11.      max_seq_length = max_seq_length,
12.      use_rslora = False,  # Rank stabilized LoRA 
13.      loftq_config = None, # LoftQ
14.      )

开始训练

·        

trainer = SFTTrainer(    model = model,    train_dataset = dataset,    dataset_text_field = "text",    max_seq_length = max_seq_length,    tokenizer = tokenizer,    args = TrainingArguments(        per_device_train_batch_size = 2,        gradient_accumulation_steps = 4,        warmup_steps = 10,        max_steps = 60,        fp16 = not torch.cuda.is_bf16_supported(),        bf16 = torch.cuda.is_bf16_supported(),        logging_steps = 1,        output_dir = "outputs",        optim = "adamw_8bit",        weight_decay = 0.01,        lr_scheduler_type = "linear",        seed = 3407,    ),)trainer.train()

测试模型

·        

1.print("\n ######## \nAfter training\n")
2.generate_text("<human>: List the top 5 most popular movies of all time.\n<bot>: ")

保存模型

·        

1.model.save_pretrained("lora_model")
2.model.save_pretrained_merged("outputs", tokenizer, save_method = "merged_16bit",)
3.model.push_to_hub_merged("YOURUSERNAME/llama3-8b-oig-unsloth-merged", tokenizer, save_method = "merged_16bit", token = os.environ.get("HF_TOKEN"))
4.model.push_to_hub("YOURUSERNAME/llama3-8b-oig-unsloth", tokenizer, save_method = "lora", token = os.environ.get("HF_TOKEN"))

出自:https://mp.weixin.qq.com/s/mwaCtibKkFjQzPhDRKtCOw

本文档由网友提供,仅限参考学习,如有不妥或产生版权问题,请联系我们及时删除。 客服请加微信:skillupvip
评论
1 评论
小蜗牛2024/9/11 10:03:55
哇,Meta这波操作简直是给AI圈投了个深水炸弹啊!Llama 3系列一出,感觉对话AI的门槛又被拉高了好几个level。8B到70B的飞跃,不仅仅是数字上的增长,更是智能对话体验的质变。

说到微调LLama-3 8B,Unsloth库和Hugging Face简直是黄金搭档,操作起来估计能省不少力气。不过,我脑洞一开,想了个小点子:咱们能不能尝试跨领域微调?比如用科幻小说数据集去训练,看看LLama-3能不能成为最懂科幻迷的聊天伙伴?

参数设置这块,我一直觉得是个艺术活。不同的参数配置,出来的模型性格迥异,有的温柔细腻,有的则直接犀利。我建议大家可以多尝试几组配置,说不定能培养出“人格分裂”的多面手LLama,适应更多元化的对话场景。

还有,训练过程中的loss曲线,简直就是AI成长的晴雨表。咱们可以搞个实时监控系统,一旦发现loss异常波动,立刻调整策略,像养孩子一样细心呵护LLama的成长。

最后,模型保存这块,别忘了给咱们的LLama宝贝起个酷炫的名字,再配上专属的模型卡片,以后在AI江湖上也能混个脸熟不是?

总之,Meta这波LLama 3系列,让我们看到了对话AI的无限可能。接下来就是各位开发者大展拳脚,创造出更多意想不到的惊喜了!
20秒读懂全文
伴读
### 1. 一句话总结文章摘要
Meta发布了优化的Llama 3系列LLM,包括8B和70B模型,强调对话优化、实用性和安全性,并提供了详细的微调、加载、训练、测试及保存模型步骤。

### 2. 生成关键词和可能相关的关键词

**关键词**:
- Meta
- Llama 3系列
- LLM(大型语言模型)
- 预训练
- 指令调整
- 微调
-
One More Thing
One More Thing again ...

找组织,加入AI魔法学院群