Unsloth微调环境搭建与LLaMA 3.1-8B模型微调实践指南

本文将详细介绍如何使用Unsloth框架进行LLaMA 3.1-8B模型的微调,帮助您快速构建微调环境,并了解微调流程的基本步骤。本教程适合初学者,旨在帮助您在短时间内实现自己的专属模型微调。对于更复杂的微调参数和细节设置,将在后续文章中进一步阐述。

文将涵盖以下内容:

1. Unsloth环境搭建: 指导您从零开始搭建Unsloth微调环境。

2. 微调第一个LLaMA模型: 一步步教您如何通过Unsloth框架对LLaMA 3.1-8B进行微调,涵盖关键配置。

Unsloth环境搭建

最初,我在Windows 11环境下安装并运行了Unsloth,虽然安装过程顺利,但在模型微调过程中遇到了各种错误。尽管大部分问题都通过逐一解决了,但一些关键的GPU加速库仍然无法正常运行。这些库要求在Linux系统上才能正常运行并充分发挥其性能。

由于对Linux系统不够熟悉,我尝试通过编译工具在Windows上重新编译这些库,但问题依然未能解决。最终,我选择通过Windows上的WSL(Windows Subsystem for Linux)安装Ubuntu的方式来解决这些兼容性问题。这样既避免了完全切换到Linux的麻烦,又能够使用Linux环境来进行模型微调。

第一步:在WINDOWS上通过WSL安装UBUNTU

如果您使用的是Linux操作系统(建议使用Ubuntu),可以跳过这一部分的内容,直接进入后续步骤。同时,确保您在Linux系统上安装了显卡驱动,以便正常使用GPU进行加速。

如果您在Windows上通过WSL安装Ubuntu,由于WSL是一种虚拟化技术,您无需在WSL的Ubuntu系统中再次安装显卡驱动。只要Windows宿主机上已经正确安装并配置了显卡驱动,WSL内的Ubuntu系统将自动使用这些驱动配置,支持GPU加速。

windows11系统下,进入命令行工具,执行如下指令,即可快速安装完Ubuntu:

wsl -install

从windows中进入Ubuntu系统,同样需要打开命令行,执行如下指令:

wsl -d ubuntu

初次登录,会要求输入一个新的用户名、密码:

图片

后续登录系统,会直接进入,而不必每次都输入用户名和密码:

在这里插入图片描述

第二步:升级系统相关组件

安装完ubuntu系统后,需要对相关的组件进行升级:

在这里插入图片描述

第三步:安装Anaconda

建议安装Anaconda,安装相关的python包会非常方便,同时也便于对python环境进行管理。​​​​​​​

在这里插入图片描述

建议的安装目录:

/home/userName/anaconda3

安装完成之后需要手动将其加入到环境变量中。需要在~/.bashrc的文件尾部增加如下内容:

export PATH="/home/wangjye/anaconda3/bin:$PATH"

第四步:安装CUDA

这是最容易出错的过程,如果已经安装完驱动了,则需要在WINDOWS宿主机上运行命令 nvidia-smi 来查看硬件支持的CUDA版本,不论是WINDOWS还是LINUX一定要注意查看,不能安装错了。

图片

最大的坑是选择了不被支持的CUDA版本(如CUDA 12.6),导致PyTorch及TensorFlow都无法兼容4090显卡。因此选择低于12.6版本的CUDA。在这里我安装的是稳定版本的12.1。​​​​​​​

在这里插入图片描述

安装过程会中断N次,提示少这样那样的文件,少什么文件按提示装什么。

然后再次安装CUDA,直接安装完成。

安装完成之后,如果运行nvcc --version查看是否安装成功,这里提示找不到指令。主要原因是因为CUDA的安装路径没有写入环境变量中,需要对~/.bashrc文件进行编辑,以下内容视不同操作系统的安装路径而不同:​​​​​​​
在这里插入图片描述

再次运行nvcc --version时,提示的结果如下,代表安装完成 :

图片

第五步:安装pytorch

执行如下指令,完成python环境创建、安装python、安装pytorch对应的nvidia版本:​​​​​​​

在这里插入图片描述

安装完成之后,还要验证一下安装的pytorch版本能否正常识别本机上安装的GPU,执行如下代码即可:​​​​​​​

在这里插入图片描述

返回结果如下:

2.4.0

True

1

NVIDIA GeForce RTX 4090

代表已经正确安装,并能够检测到GPU。

第六步:安装Unsloth

官方文档安装方法如下:

pip install "unsloth[cu121-torch240] @ git+https://github.com/unslothai/unsloth.git"

通过如上指令安装会有时候会提示网络错误,实际上通过浏览器我是可以正常访问github.com的。

因此,改为手动安装的方法,登录http://github.com/unslothai/unsloth,手动下载zip压缩包,如下图所示:

图片

解压缩,并进入unsloth的解压缩目录,执行如下指令:

pip install ".[cu121-torch240]"

安装成功,这里当时未截屏。至此,我们可以尝试进行模型训练,以验证unsloth是否能够正常工作。

微调第一个LLaMA模型

模型的微调一共包括如下5个大的步骤:

  • 下载待微调的模型

  • 模型加载

  • 数据处理

  • 模型参数配置

  • 模型训练

  • 模型推理测试

第一步:下载待微调的模型

这是非常重要的一步,登录unsloth官方网站可以直接复制使用,如果对llama3.1进行微调,还要在huggingface上申请该模型的使用权,申请需要至少几个小时才会回复,我申请失败,如下图所示:

图片

因此,直接从huggingface上的模型文件下载到本地文件系统并进行加载的,注意以下模型相关的文件,都要手动下载下来,刚开始只下载了.safetensors模型文件,结果报了一大堆错误,他需要从config.json还有tokenizer.json中读取很多配置,所以全部都下载下来了。

图片

现在,待微调的模型已经下载完成。

注意: 如果你已经通过了 Hugging Face 的审核,下载步骤可以省略。你可以直接通过 Hugging Face 的接口下载相应的模型文件。下载完成后,模型会被缓存到本地文件系统,下次微调时无需重复下载。此外,获得模型使用权后,你还需要从 Hugging Face 获取一个 API Key,并将该模型与 API Key 关联。

不过,手动下载模型相对简单,建议直接下载以简化流程。

第二步,模型加载

通过vscode或pycharm之类的IDE新建一个jupyter文件(方便调试,调试过程中会提示你缺少这样那样的库,需要安装),复制以下代码:​​​​​​​

在这里插入图片描述在这里插入图片描述

注意如下代码:

model_path ="/mnt/d/02-LLM/LLM-APP/00-models/unsloth-llama-3.1-8b-bnb-4bit"  

由于代码是在wsl中的ubuntu系统内运行,因此这里不能使用windows本地的文件路径,要改为ubuntu mnt之后的文件路径。

还有要注释掉token行,因为我们没有通过hugging face网站加载模型。

至此,模型已经加载完成,会有如下图所示的提示:

图片

第三步,数据处理

一般在进行微调时,大模型都有自己的接入数据的格式 ,因此,需要对数据进行格式转换,如下为原始的数据格式,是标准的json文档 :​​​​​​​

在这里插入图片描述

而模型需要的训练数据模式如下:​​​​​​​

[
  {"text":"Instruction: 请把现代汉语翻译成古文\nInput: 世界及其所产生的一切现象,都是来源于物质。\nOutput: 天地与其所产焉,物也。"},
  {"text":"Instruction: 请把现代汉语翻译成古文\nInput: 世界及其所产生的一切现象,都是来源于物质。\nOutput: 天地与其所产焉,物也。"}
]

因此,需要 对其进行格式转换,数据处理代码如下:​​​​​​​

在这里插入图片描述
在这里插入图片描述

运行结果如下:​​​​​​​

载入本地数据:start...
处理后的训练数据集大小: 457124

第四步,模型参数配置

这是非常重要的一步,需要配置各种参数,如max_steps、per_device_train_batch_size、r、lora_alpha等,在这里不进行详细说明,后续会有单独的文章内容进行详细介绍,代码如下:​​​​​​​

from trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported 

model = FastLanguageModel.get_peft_model(  
    model,   
    r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128   
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",   
                      "gate_proj", "up_proj", "down_proj",],  
    lora_alpha = 32,   
    lora_dropout = 0, # Supports any, but = 0 is optimized   
    bias = "none",    # Supports any, but = "none" is optimized   
    # [NEW] "unsloth" uses 30% less VRAM, fits 2x larger batch sizes!    use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context   
    random_state = 3407,   
    use_rslora = False,  # We support rank stabilized LoRA  
    loftq_config = None, # And LoftQ
)
trainer = SFTTrainer( 
    model = model,   
    tokenizer = tokenizer,   
    train_dataset = train_dataset,   
    dataset_text_field = "text",  
    max_seq_length = max_seq_length,  
    dataset_num_proc = 2,   
    packing = False, # Can make training 5x faster for short sequences.   
    args = TrainingArguments(   
        per_device_train_batch_size = 4,  
        gradient_accumulation_steps = 8,   
        warmup_steps = 500,  
        # num_train_epochs = 1, # Set this for 1 full training run.   
        max_steps = 3000,   
        learning_rate = 3e-5,  
        fp16 = not is_bfloat16_supported(),  
        bf16 = is_bfloat16_supported(), 
        logging_steps = 100,   
        optim = "adamw_8bit",  
        weight_decay = 0.01,   
        lr_scheduler_type = "linear",  
        seed = 3407,  
        output_dir = "outputs",  
    ),
)

第五步,模型训练

只有一行代码如下:​​​​​​​

# 5. 训练
trainer_stats = trainer.train()

下图为运行的第一步执行过程,以及运行完成之后的耗时统计。

图片

第六步,推理测试

模型微调完成之后,我们需要对模型进行推理测试,如下代码是构建了一个提示词模板,将system prompt指令以及用户输入的指令和古文内容,可以通过该提示词模板进行格式化处理,然后提供给微调后的模型进行推理使用:​​​​​​​​​​​​​​

alpaca_prompt = """你的任务是将给定的现代汉语文本转换为符合古文。请注意保持原文的核心思想和情感,同时运用适当的古文词汇、语法结构和修辞手法,使转换后的文本读起来如同古代文人的笔触一般。
翻译要求:避免句子重复,确保语言通顺,符合古文表达习惯。
例如:将“以正确的概念来校正不正确的概念,又以不正确的概念的失误之处,反过来探究正确的概念之所以正确的所在。”翻译为“以其所正,正其所不正;以其所不正,疑其所正。”,确保语言通顺,符合古文表达习惯。
### Instruction:
{} 
### Input:
{}  
### output:
{}"""` 

执行推理的代码如下:​​​​​​​

FastLanguageModel.for_inference(model) # Enable native 2x faster inference
inputs = tokenizer(
[  
    alpaca_prompt.format(   
        "请把现代汉语翻译成古文", # instruction   
        "这个管道昇在同时代人里也是极具个性和才华的。这时,赵孟頫在京城获得赏识,不再是那个只在吴兴有薄名,却不能靠书画养活自己,不得不去教私塾的教书先生。", # input   
        "", # output - leave this blank for generation!  
    )
], return_tensors = "pt").to("cuda")  

# Generate the output
outputs = model.generate(**inputs, max_new_tokens=64, use_cache=True)

# Decode the output
decoded_output = tokenizer.batch_decode(outputs, skip_special_tokens=True)
#print(decoded_output)
# 提取输出结果中原有的input文本
# 假设输出格式是一致的,古文在"### output:\n"后面
# print(decoded_output[0])
original_text = decoded_output[0].split("### Input:\n")[1].split("### output:\n")[0].strip()
# Extract the translated ancient Chinese text
# Assuming the output format is consistent and the ancient text starts after "### output:\n"
translated_text = decoded_output[0].split("### output:\n")[1].strip()
print("原始的现代汉语:" + original_text)
print("翻译后的古文:" + translated_text)

执行的结果如下:​​​​​​​

原始的现代汉语:这个管道昇在同时代人里也是极具个性和才华的。这时,赵孟頫在京城获得赏识,不再是那个只在吴兴有薄名,却不能靠书画养活自己,不得不去教私塾的教书先生。
翻译后的古文:管仲之才亦异于当世,时赵孟頫在京得赏识,乃非吴兴薄名,不能自养,负笈私门者也。

是翻译为古文了,但是将管道昇翻译为“管仲”了!!!先不管了,后续再对微调的过程进行参数优化。

总结

本文详细介绍了如何使用Unsloth框架在WSL环境下对LLaMA 3.1-8B模型进行微调的全过程。通过从环境搭建、微调过程等,读者可以一步步了解如何高效微调自己的专属模型,并通过实例演示了微调后模型的推理效果。本教程特别适合初学者,帮助他们快速掌握Unsloth框架的应用。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值