QLoRA微调后的Llama3模型在本地运行

简介

首先使用Llama-3-1-8B作为例子进行解析。如何Llama-3-1-8B想要在本地电脑运行,那么它需要多少GPU才能完美的运行起来了,大约需要19.2G的GPU才能运行。那么我们的机子最好是4090,哎。。。。。。。
这成本太高了,普通人是无法承受的。

因为很多人看到大模型运行成本这么高,所有都在想使用什么方式降低成本,又能达到接近的效果。参数高效微调后的大模型就是此产物,参数高效微调相关知识可以看我之前写的文章。

今天这篇文章目的不是讲解大模型的知识,今天的内容是怎么在自己的电脑上运行Llama-3-1-8B大模型。
例子中的模型是自己通过4bit量化训练的模型,可以在8G的以下的机子上可以运行。

这里插入一个如何计算大模型运行是需要消耗多少资源。
1)估算公式(该公式来自于Sam Stoelinga简化[1])
在这里插入图片描述

符号描述
M用千兆字节 (GB) 表示的 GPU 内存
P模型中的参数数量。例如,一个 7B 模型有 7 亿参数。
4B4 字节,即每个参数使用的字节数
324 字节中有 32 位
Q加载模型时应使用的位数,例如 16 位、8 位或 4 位。
1.2表示在 GPU 内存中加载额外内容的 20% 开销。

注意:该公式只是为了简化计算的估计,并未包含kvcache所需显存以及context大小的影响。

下面以运行16位精度的 Llama 70B 模型所需的 GPU 内存为例套用公式:

该模型有 700 亿参数。

M = (70 ∗ 4) / (32 / 16) ∗ 1.2 ≈ 168GB

由此可见,模型所需的 GPU 内存相当大。单个 80GB 的 A100 GPU 不足以满足需求,需要多个A100 GPU才能跑的起来。

运行模型

安装依赖

pip install transformers
pip install streamlit
pip install torch
pip install modelscope

下载模型

进入modelscope的https://modelscope.cn/models/ty200509/Llama-3.1-8B-bnb-4bit下载模型
也可以使用一下方式下载:

from modelscope import snapshot_download
model_dir = snapshot_download("ty200509/Llama-3.1-8B-bnb-4bit",cache_dir="下载模型到本地路径")
下载代码

代码地址:https://github.com/tangyi2005/Llama_chatbot.git
使用命令进来Llama_chatbot项目的llama_chat.py
执行以下命令:

# streamlit run llama_chat.py所在文件的路径如:D:\XXXX\XXXX --server.address 127.0.0.1 --server.port 6006

运行后的效果:
在这里插入图片描述

### 如何使用 QLoRALLaMA3 模型进行微调 #### 准备环境与依赖库安装 为了能够顺利运行QLoRA微调过程,需先准备合适的Python环境并安装必要的依赖包。这通常涉及PyTorch以及Transformers库的最新版本。 ```bash pip install torch transformers accelerate bitsandbytes ``` #### 加载基础模型和分词器 通过指定的基础模型路径来加载预训练好的LLaMA3模型及其对应的分词器[^2]: ```python from transformers import AutoModelForCausalLM, AutoTokenizer base_model_path = "llm/Meta-Llama-3.1-8B-Instruct/" tokenizer = AutoTokenizer.from_pretrained(base_model_path) model = AutoModelForCausalLM.from_pretrained(base_model_path) ``` #### 初始化 QLoRA 配置 QLoRA是一种基于LoRA的方法,在保持原有大模型性能的同时减少额外参数量。这里会创建一个适应于当前任务的新模型配置,并应用到原始的大规模语言模型上[^1]。 ```python import peft # 假设peft已正确安装 lora_config = peft.LoRAConfig( r=8, # 秩数(rank),一般取较小值即可 lora_alpha=32, target_modules=["q_proj", "v_proj"], # 被替换模块列表 ) qlora_model = peft.get_peft_model(model, lora_config) ``` #### 数据集准备 准备好用于微调的数据集非常重要。数据应当被处理成适合输入给定模型的形式,比如转换为token IDs序列等。 ```python def prepare_dataset(file_path): data = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f.readlines(): text = json.loads(line)['text'] tokens = tokenizer(text, truncation=True, padding="max_length", max_length=512).input_ids data.append(tokens) return data train_data = prepare_dataset('path_to_train_file.json') eval_data = prepare_dataset('path_to_eval_file.json') ``` #### 训练设置 定义优化器、学习率调度策略以及其他超参设定;同时也要考虑是否启用混合精度加速等功能以提高效率。 ```python optimizer = torch.optim.AdamW(qlora_model.parameters(), lr=5e-5) scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=len(train_data)) # 如果GPU可用,则移动模型至CUDA设备 device = "cuda" if torch.cuda.is_available() else "cpu" qlora_model.to(device) ``` #### 开始微调流程 利用之前准备的一切资源正式开启微调阶段的工作。期间可根据实际情况调整batch size大小、epoch数量等因素。 ```python for epoch in range(num_epochs): qlora_model.train() total_loss = 0. for batch_idx, input_ids in enumerate(batched_loader(train_data)): optimizer.zero_grad() outputs = qlora_model(input_ids=input_ids.to(device)) loss = compute_loss(outputs.logits, labels=input_ids.to(device)) # 自定义损失函数 loss.backward() optimizer.step() scheduler.step() total_loss += loss.item() avg_epoch_loss = total_loss / (batch_idx + 1) print(f'Epoch {epoch}, Loss: {avg_epoch_loss}') ``` #### 保存微调后的模型 完成所有迭代之后,记得将最终得到的最佳状态下的模型权重妥善保存下来以便后续部署或进一步改进。 ```python output_dir = "./fine_tuned_llama_3_qloara/" if not os.path.exists(output_dir): os.makedirs(output_dir) qlora_model.save_pretrained(output_dir) tokenizer.save_pretrained(output_dir) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值