f 人工智能-大模子干货 | 怎样利用Unsloth框架对Llama举行微调? - Powered by qidao123.com技术社区

大模子干货 | 怎样利用Unsloth框架对Llama举行微调?

打印 上一主题 下一主题

主题 1857|帖子 1857|积分 5571


本文泉源于布博士----擎创科技产品解决方案专家

今年4月份,Meta 公司发布了功能强盛的大型语言模子(LLM)Llama-3,为从事各种 NLP 任务的开发职员提供了功能强盛可以在普通机器上运行的开源LLM。然而,传统的 LLM 微调过程既耗时又耗费资源。但是,Unsloth 的出现改变了这一局面,大大加快了 Llama-3 的微调速率。
以是,本文将详细怎样利用Unsloth框架举行LLaMA 3.1-8B模子的微调,资助快速构建微调情况,并相识微调流程的根本步骤。内容比力细致,得当新手小白学习。
假如大家以为本文有资助到你,希望可以动动小手给博主来一个一键三连,感谢大家鼓励~




一、什么是Unsloth

Unsloth是一个开源的大模子训练加速项目,旨在显着提升大模子的训练速率和减少显存占用。它的上风包罗:


  • 提升训练速率:最高可达5倍,Unsloth Pro版本乃至可以达到30倍。
  • 减少显存占用:最大可减少80%的显存占用。
  • 广泛兼容性:与HuggingFace生态兼容,支持多种主流GPU设备。




二、怎样在Windows上安装Unsloth

刚开始,我在Windows 11情况下安装并运行了Unsloth,安装过程顺遂,但在模子微调过程中遇到了各种错误,只管大部分题目都通过逐一解决了,但一些关键的GPU加速库仍然无法正常运行,因为这些库要求在Linux体系上才能正常运行并充实发挥其性能。
由于对Linux体系不敷认识,尝试通过编译工具在Windows上重新编译这些库,但依然行不通。终极,选择通过Windows上的WSL(Windows Subsystem for Linux)安装Ubuntu的方式来解决这些兼容性题目。这样既避免了完全切换到Linux的麻烦,又可以或许利用Linux情况来举行模子微调。



Step1:通过WSL安装UBUNTU

假如是Linux操纵体系(建议利用Ubuntu),可以跳过这一部分内容,直接进入后续步骤。同时,确保在Linux体系上安装了显卡驱动,以便正常利用GPU举行加速。
假如在Windows上通过WSL安装Ubuntu,由于WSL是一种假造化技能,您无需在WSL的Ubuntu体系中再次安装显卡驱动。只要Windows宿主机上已经准确安装并配置了显卡驱动,WSL内的Ubuntu体系将自动利用这些驱动配置,支持GPU加速。
windows11体系下,进入命令行工具,执行如下指令,即可快速安装完Ubuntu:
  1. wsl -install
复制代码

从windows中进入Ubuntu体系,同样需要打开命令行,执行如下指令:
  1. wsl -d ubuntu
复制代码

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


后续登录体系,会直接进入,而不必每次都输入用户名和暗码:
  1. (base) C:\Users\username>wsl -d ubuntu
  2. wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。 (base) root@WANG***-4090:/mnt/c/Users/username#
复制代码



Step2:升级体系相关组件

安装完ubuntu体系后,需要对相关的组件举行升级:
  1. apt-get update
  2. apt-get install -y curl
  3. apt-get install -y sudo
  4. apt-get install -y gpg
复制代码



Step3:安装Anaconda

建议安装Anaconda,安装相关的python包会非常方便,同时也便于对python情况举行管理。
  1. wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh
  2. sudo sh Anaconda3-2024.06-1-Linux-x86_64.sh
复制代码

建议的安装目录:
  1. /home/userName/anaconda3
复制代码

安装完成之后需要手动将其加入到情况变量中。需要在~/.bashrc的文件尾部增长如下内容:
  1. export PATH="/home/wangjye/anaconda3/bin:$PATH"
复制代码



Step4:安装CUDA

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


最大的坑是选择了不被支持的CUDA版本(如CUDA 12.6),导致PyTorch及TensorFlow都无法兼容4090显卡。因此选择低于12.6版本的CUDA。在这里我安装的是稳固版本的12.1。
  1. wget https://developer.download.nvidia.com/
  2. compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
  3. sudo sh cuda_12.1.0_530.30.02_linux.run
复制代码
安装过程会中断N次,提示少这样那样的文件,少什么文件按提示装什么。
然后再次安装CUDA,直接安装完成。
安装完成之后,假如运行nvcc --version查看是否安装乐成,这里提示找不到指令。主要原因是因为CUDA的安装路径没有写入情况变量中,需要对~/.bashrc文件举行编辑,以下内容视差别操纵体系的安装路径而差别:
  1. export PATH=/usr/local/cuda/bin:$PATH
  2. export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
复制代码
再次运行nvcc --version时,提示的结果如下,代表安装完成 :





Step5:安装pytorch

执行如下指令,完成python情况创建、安装python、安装pytorch对应的nvidia版本:
  1. conda create --name unsloth_env \
  2.    python=3.10 \
  3.    pytorch-cuda=12.1 \
  4.    pytorch cudatoolkit xformers -c pytorch -c nvidia -c xformers \
  5.    -y
复制代码
安装完成之后,还要验证一下安装的pytorch版本可否正知识别本机上安装的GPU,执行如下代码即可:
  1. import torch
  2. print(torch.__version__)
  3. print(torch.cuda.is_available())
  4. print(torch.cuda.device_count())
  5. print(torch.cuda.get_device_name(0))
复制代码
返回结果如下的时间,代表已经准确安装,并可以或许检测到GPU。
   2.4.0
  True
  1
  NVIDIA GeForce RTX 4090
  


Step6:安装Unsloth

官方文档安装方法如下:
  1. pip install "unsloth[cu121-torch240] @ git+https://github.com/unslothai/unsloth.git"
复制代码
通过如上指令安装会有时间会提示网络错误,现实上通过欣赏器我是可以正常访问github.com的。
因此,改为手动安装的方法,登录http://github.com/unslothai/unsloth,手动下载zip压缩包,如下图所示:


解压缩,并进入unsloth的解压缩目录,执行如下指令,代表安装乐成。
  1. pip install ".[cu121-torch240]"
复制代码
至此,我们可以尝试举行模子训练,以验证unsloth是否可以或许正常工作。




三、微调LLaMA模子

模子的微调一共包罗如下5个大的步骤:


  • 下载待微调的模子
  • 模子加载
  • 数据处理
  • 模子参数配置
  • 模子训练
  • 模子推理测试




1.下载待微调的模子

这黑白常重要的一步,登录unsloth官方网站可以直接复制利用,假如对LLama3.1举行微调,还要在huggingface上申请该模子的利用权,利用权申请至少几个小时才会得到回复,博主第一申请失败。因此,博主直接将huggingface上的模子文件下载到当地文件体系并举行加载。


留意!!以下模子相关文件,都要手动下载下来,才能运行。刚开始博主只下载了.safetensors模子文件,结果体系不绝报错,因为它运行时需要从config.json还有tokenizer.json中读取很多配置。


如今,待微调的模子已经下载完成。(留意: 假如你已经通过了 Hugging Face 的考核,以上下载步骤可以省略。)
接下来直接通过 Hugging Face 的接口下载相应的模子文件。下载完成后,模子会被缓存到当地文件体系,下次微调时无需重复下载。此外,得到模子利用权后,你还需要从 Hugging Face 获取一个 API Key,并将该模子与 API Key 关联。
不外,手动下载模子相对简单,建议直接下载以简化流程。




2.模子加载

通过vscode或pycharm之类的IDE新建一个jupyter文件(方便调试,调试过程中会提示你缺少这样那样的库,需要安装),复制以下代码:
  1. [/code] 留意如下代码:
  2. [code]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网站加载模子。
至此,模子已经加载完成,会有如下图所示的提示:



3.数据处理

一样平常在举行微调时,大模子都有本身的接入数据的格式 ,因此,需要对数据举行格式转换,如下为原始的数据格式,是标准的json文档 :
  1. [/code] 而模子需要的训练数据模式如下:
  2. [code][
  3.   {"text":"Instruction: 请把现代汉语翻译成古文\nInput: 世界及其所产生的一切现象,都是来源于物质。\nOutput: 天地与其所产焉,物也。"},
  4.   {"text":"Instruction: 请把现代汉语翻译成古文\nInput: 世界及其所产生的一切现象,都是来源于物质。\nOutput: 天地与其所产焉,物也。"}
  5. ]
复制代码
因此,需要 对其举行格式转换,数据处理代码如下:
  1. [/code]
  2. 运行结果如下:
  3. [code]载入本地数据:start...
  4. 处理后的训练数据集大小: 457124
复制代码


4.模子参数配置
这黑白常重要的一步,需要配置各种参数,如max_steps、per_device_train_batch_size、r、lora_alpha等,在这里不举行详细阐明,后续会有单独的文章内容举行详细介绍,代码如下:
  1. from trl import SFTTrainer
  2. from transformers import TrainingArguments
  3. from unsloth import is_bfloat16_supported
  4. model = FastLanguageModel.get_peft_model(
  5.   model,
  6.   r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
  7.   target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
  8.                    "gate_proj", "up_proj", "down_proj",],
  9.   lora_alpha = 32,
  10.   lora_dropout = 0, # Supports any, but = 0 is optimized
  11.   bias = "none",  # Supports any, but = "none" is optimized
  12.   # [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,
  13.   use_rslora = False, # We support rank stabilized LoRA
  14.   loftq_config = None, # And LoftQ
  15. )
  16. trainer = SFTTrainer(
  17.   model = model,
  18.   tokenizer = tokenizer,
  19.   train_dataset = train_dataset,
  20.   dataset_text_field = "text",
  21.   max_seq_length = max_seq_length,
  22.   dataset_num_proc = 2,
  23.   packing = False, # Can make training 5x faster for short sequences.
  24.   args = TrainingArguments(
  25.     per_device_train_batch_size = 4,
  26.     gradient_accumulation_steps = 8,
  27.     warmup_steps = 500,
  28.     # num_train_epochs = 1, # Set this for 1 full training run.
  29.     max_steps = 3000,
  30.     learning_rate = 3e-5, fp16 = not is_bfloat16_supported(),
  31.     bf16 = is_bfloat16_supported(),
  32.     logging_steps = 100,
  33.     optim = "adamw_8bit",
  34.     weight_decay = 0.01,
  35.     lr_scheduler_type = "linear",
  36.     seed = 3407, output_dir = "outputs",
  37.   ),
  38. )
复制代码


5.模子训练

只有一行代码如下:
  1. # 5. 训练 trainer_stats = trainer.train()
复制代码
下图为运行的第一步执行过程,以及运行完成之后的耗时统计。




6.推理测试

模子微调完成之后,我们需要对模子举行推理测试,如下代码是构建了一个提示词模板,将system prompt指令以及用户输入的指令和古文内容,可以通过该提示词模板举行格式化处理,然后提供给微调后的模子举行推理利用:
  1. alpaca_prompt = """你的任务是将给定的现代汉语文本转换为符合古文。请注意保持原文的核心思想和情感,同时运用适当的古文词汇、语法结构和修辞手法,使转换后的文本读起来如同古代文人的笔触一般。
  2. 翻译要求:避免句子重复,确保语言通顺,符合古文表达习惯。
  3. 例如:将“以正确的概念来校正不正确的概念,又以不正确的概念的失误之处,反过来探究正确的概念之所以正确的所在。”翻译为“以其所正,正其所不正;以其所不正,疑其所正。”,确保语言通顺,符合古文表达习惯。
  4. ### Instruction:
  5. {}
  6. ### Input:
  7. {}
  8. ### output:
  9. {}"""
复制代码

执行推理的代码如下:
  1. FastLanguageModel.for_inference(model) # Enable native 2x faster inference
  2. inputs = tokenizer(
  3. [
  4.     alpaca_prompt.format(
  5.        "请把现代汉语翻译成古文", # instruction
  6.        "这个管道昇在同时代人里也是极具个性和才华的。这时,赵孟頫在京城获得赏识,不再是那个只 在吴兴有薄名,却不能靠书画养活自己,不得不去教私塾的教书先生。", # input
  7. "", # output - leave this blank for generation!
  8.     )
  9. ], return_tensors = "pt").to("cuda")
  10. # Generate the output
  11. outputs = model.generate(**inputs, max_new_tokens=64, use_cache=True)
  12. # Decode the output
  13. decoded_output = tokenizer.batch_decode(outputs, skip_special_tokens=True) #print(decoded_output)
  14. # 提取输出结果中原有的input文本
  15. # 假设输出格式是一致的,古文在"### output:\n"后面
  16. # print(decoded_output[0])
  17. original_text = decoded_output[0].split("### Input:\n")[1].split("### output:\n")[0].strip()
  18. # Extract the translated ancient Chinese text
  19. # Assuming the output format is consistent and the ancient text starts after "### output:\n"
  20. translated_text = decoded_output[0].split("### output:\n")[1].strip()
  21. print("原始的现代汉语:" + original_text)
  22. print("翻译后的古文:" + translated_text)
复制代码

执行的结果如下:
  1. 原始的现代汉语:这个管道昇在同时代人里也是极具个性和才华的。这时,赵孟頫在京城获得赏识,不再是那个只在吴兴有薄名,却不能靠书画养活自己,不得不去教私塾的教书先生。
  2. 翻译后的古文:管仲之才亦异于当世,时赵孟頫在京得赏识,乃非吴兴薄名,不能自养,负笈私门者也。
复制代码
是将现代汉语翻译为古文了,但是将管道昇翻译为“管仲”了,这些可以在微调的过程举行参数优化。

以上就是本日的分享的全部内容了,大家假如有疑问或者不懂的地方,接待评论区留言讨论。




擎创科技,Gartner一连保举的AIOps领域标杆供应商。公司专注于通过提升企业客户对运维数据的洞见能力,为运维降本增效,充实表现科技运维对业务运营的影响力。

  行业龙头客户的共同选择


相识更多运维干货与行业前沿动态

可以右上角一键关注

我们是深耕智能运维领域近十年的

一连多年获Gartner保举的AIOps标杆供应商

下期我们不见不散~



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表