https://exnrt.com/blog/ai/finetune-llama3-8b/  Meta 推出了 Meta Llama 3 系列 LLM,包括 8 和 70B 大小的预训练和指令调整的生成文本模型。这些指令调整模型针对对话进行了优化,在行业基准测试中优于许多开源聊天模型。在开发过程中,我们特别注意优化实用性和安全性。目录概览: 微调是机器学习中使用的一种技术,尤其是大型语言模型 (LLM)。这是一种利用现有模型的知识并针对特定任务进行定制的方法。开始微调Llama-3 8B 第 1 步:安装库pip install huggingface_hub ipython:这将安装两个库:用于从 Hugging Face Hub 访问模型和用于交互式编码。huggingface_hubipython
"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]
export HF_TOKEN=xxxxxxxxxxxxx:可能用于为 Hugging Face Hub 设置身份验证令牌,但出于安全原因,实际令牌值是隐藏的。
pipinstallhuggingface_hubipython"unsloth[colab]@git+https://github.com/unslothai/unsloth.git""unsloth[conda]@git+https://github.com/unslothai/unsloth.git"exportHF_TOKEN=xxxxxxxxxxxxx 安装Wandb安装 Wandb 库:安装与 Wandb 交互所需的库。pip install wandb - 登录:提示您输入 Wandb 凭据(可能是 API 密钥),以便您可以使用该服务。
wandb login
pipinstallwandbwandblogio 导入库importosfromunslothimportFastLanguageModelimporttorchfromtrlimportSFTTrainerfromtransformersimportTrainingArgumentsfromdatasetsimportload_dataset 加载数据集设置最大序列长度:定义每个训练示例中允许的最大标记数。这有助于在训练期间管理内存和计算资源。max_seq_length = 2048 定义数据 URL:以 JSONL 格式存储数据集的 Web 地址,可能包含文本数据。url - 加载数据集:使用库从提供的 URL 加载数据。
dataset = load_dataset("json", data_files = {"train" : url}, split = "train")datasets
load_dataset("json")将数据格式指定为 JSON。
data_filesdictionary 使用键“train”和 URL 作为其值定义训练数据位置。
split="train"表示我们正在加载数据集的训练部分。
max_seq_length=2048url="https://huggingface.co/datasets/laion/OIG/resolve/main/unified_chip2.jsonl"dataset=load_dataset("json",data_files={"train":url},split="train")加载 Llama-3-8B#2.LoadLlama3modelmodel,tokenizer=FastLanguageModel.from_pretrained(model_name="unsloth/llama-3-8b-bnb-4bit",#指定Unsloth库中的确切模型。“Llama3”可能是型号名称,“8b”表示80亿个参数,“bnb”可能是指特定的架构,“4bit”表示使用内存效率高的格式。max_seq_length=max_seq_length,#设置最大序列长度(前面定义)以限制模型可以处理的输入长度。dtype=None,#(假设它设置为None)允许库选择最合适的数据类型load_in_4bit=True,#允许以内存高效的4位格式加载模型(如果模型和硬件支持)) defgenerate_text(text):inputs=tokenizer([text],return_tensors="pt").to("cuda")outputs=model.generate(**inputs,max_new_tokens=20,use_cache=True)tokenizer.batch_decode(outputs)print("Beforetraining\n")进行模型参数设置和快速 LoRA 权重和训练model=FastLanguageModel.get_peft_model(model,r=16,target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj",],lora_alpha=16,lora_dropout=0,#Supportsany,but=0isoptimizedbias="none",#Supportsany,but="none"isoptimizeduse_gradient_checkpointing=True,random_state=3407,max_seq_length=max_seq_length,use_rslora=False,#RankstabilizedLoRAloftq_config=None,#LoftQ) 开始训练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=nottorch.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() 测试模型print("\n########\nAftertraining\n")generate_text("<human> istthetop5mostpopularmoviesofalltime.\n<bot>:")保存模型model.save_pretrained("lora_model")model.save_pretrained_merged("outputs",tokenizer,save_method="merged_16bit",)model.push_to_hub_merged("YOURUSERNAME/llama3-8b-oig-unsloth-merged",tokenizer,save_method="merged_16bit",token=os.environ.get("HF_TOKEN"))model.push_to_hub("YOURUSERNAME/llama3-8b-oig-unsloth",tokenizer,save_method="lora",token=os.environ.get("HF_TOKEN"))
|