Llam3系列2: 两分钟完成Llama3的中文训练
在定制化业务场景中,如果利用专属数据集,经过微调的大模型能够在多种任务上与GPT-4媲美,并支持本地部署,保护隐私,同时还能降低运算成本。最新推出的Llama3,作为当前性能最强的开源基础大模型,非常适用于自然语言处理、机器翻译、文本生成、问答系统、聊天机器人等多种应用场景。
通过微调这一技术,基础大模型如Llama3即使原生不支持中文,也能增加对中文的支持。本教程将展示如何使用LooPIN提供的GPU算力,从零开始为大模型添加新的训练素材,拓展其在原有能力基础上的新可能性。
准备工作
本教程将指导你如何配置环境、准备数据、训练模型、部署模型及保存模型。在8G显存的显卡上微调只需不到2分钟,且微调后的模型能被量化为4bit,在CPU上本地进行流畅的聊天推理。
我们将使用以下开源代码库:
Unsloth开源微调LLM工具
Unsloth: Github地址 - Unsloth GitHub
Unsloth是一款集成的模型微调工具。使用Unsloth微调Mistral、Gemma、Llama时,速度可提高2-5倍,内存使用可减少70%!
中文指令数据集
尽管LLM在中文指令调优方面还有不少进步空间,现有的数据集要么以英语为主,要么不适合现实中的中国用户交互模式。
为解决这一问题,由10家机构联合发布的研究提出了COIG-CQIA(全称Chinese Open Instruction Generalist - Quality Is All You Need),这是一个高质量的中文指令调优数据集。数据来源包括问答社区、维基百科、考试题目和现有的NLP数据集,经过了严格的过滤和处理。
我们将使用其中的8000条来自百度贴吧的弱智吧数据进行微调:
开始模型训练
配置GPU实例
请访问以下页面,获得详细的交互式指导:LooPIN流动性池
1. LooPIN流动性池:
前往LooPIN的流动性池(LooPIN Network Pool),使用$LOOPIN代币购买GPU时间。以RTX 3080 GPU为例,根据自身需求和预算,在GPU UserBenchmark 中选择合适的GPU型号。
2. 代币兑换GPU资源:
- 选择所需的$LOOPIN代币数量。
- 通过滑块选择GPU数量。
- 确认兑换量并完成交易。
3. 进入Jupyter Notebook:
交易成功后,进入Rented Servers下的Server区域,通过你的远程服务器访问Jupyter Notebook。通常,实例启动需要2-4分钟。
4. 用nvidia-smi验证GPU:
在Jupyter Notebook中,打开新的终端窗口,运行nvidia-smi命令,检查GPU是否已激活。
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 3080 Off | 00000000:01:00.0 Off | N/A |
| 0% 39C P8 21W / 350W | 12MiB / 12288MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+
安装Unsloth开源训练框架
1. 确认Unsloth安装版本
在Unsloth官方readme中找到对应的版本 (Unsloth GitHub)
import torch; print('cuda:', torch.version.cuda, '\nPytorch:', torch.__version__)
返回
cuda: 12.1
Pytorch: 2.2.0+cu121
pip install "unsloth[cu121-ampere-torch220] @ git+https://github.com/unslothai/unsloth.git"
注意:对于新型RTX 30xx或更高级的GPU,请使用"ampere"
路径。
2. Huggingface上下载Llama-7B基础模型
使用Unsloth快速加载预训练模型和分词器。
from unsloth import FastLanguageModel
import torch
max_seq_length = 2048 # 根据 需求选择,我们内部支持RoPE缩放!
dtype = None # 无需设置,自动检测。对于Tesla T4, V100使用Float16,对于Ampere+使用Bfloat16。
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3-8b-bnb-4bit",
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = True, # 使用4bit量化以减少内存使用。也可以设置为False。
)
等待模型下载完成
config.json: 100%
1.14k/1.14k [00:00<00:00, 72.1kB/s]
==((====))== Unsloth: Fast Llama patching release 2024.4
\\ /| GPU: NVIDIA GeForce RTX 3080. Max memory: 11.756 GB. Platform = Linux.
O^O/ \_/ \ Pytorch: 2.2.0+cu121. CUDA = 8.6. CUDA Toolkit = 12.1.
\ / Bfloat16 = TRUE. Xformers = 0.0.24. FA = True.
"-____-" Free Apache license: http://github.com/unslothai/unsloth
model.safetensors: 100%
5.70G/5.70G [00:52<00:00, 88.6MB/s]
generation_config.json: 100%
131/131 [00:00<00:00, 8.23kB/s]
tokenizer_config.json: 100%
50.6k/50.6k [00:00<00:00, 2.55MB/s]
tokenizer.json: 100%
9.09M/9.09M [00:00<00:00, 11.6MB/s]
special_tokens_map.json: 100%
449/449 [00:00<00:00, 28.4kB/s]
如需针对其他基础模型进行微调,可在此处找到并替换model_name
(Unsloth Huggingface)。
3. 准备Lora Adapter
我们在微调过程中只需更新1%-10%的模型参数。
model = FastLanguageModel.get_peft_model(
model,
r = 16, # 选择任意大于0的数字!推荐值为8, 16, 32, 64, 128。
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha = 16,
lora_dropout = 0, # 支持任意值,但0是最优。
bias = "none", # 支持任意值,但"none"是最优。
# [NEW] "unsloth"使用30%更少的VRAM,可以处理2倍大的批量大小!
use_gradient_checkpointing = "unsloth", # True或"unsloth"用于非常长的上下文。
random_state = 3407,
use_rslora = False, # 我们支持排名稳定的LoRA。
loftq_config = None, # 以及LoftQ。
)
等待输出
Unsloth 2024.4 patched 32 layers with 32 QKV layers, 32 O layers and 32 MLP layers.
4. 准备微调数据集
我们将使用一个高质量的中文指令调优数据集子集进行微调。
from datasets import load_dataset
dataset = load_dataset("kigner/ruozhiba-llama3-tt", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True)