如何微调Meta Llama-3 8B
AI魔法学院
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

© THE END

转载请联系本网站获得授权

投稿或版权问题请加微信:skillupvip