【李宏毅-生成式 AI】Spring 2024, HW5:LLM Fine-tuning 实验记录

这个实验主要是 fine-tune 一个 LLM,让一个 LLM 能够写唐诗。

相关链接:

1. Task Overview

给 AI 一首唐诗的前两个 sentences,我们希望它能够完成剩下的部分:

在这里插入图片描述
但是,原来的 LLM 可能并不具备这样的能力,我们希望经过 fine tune 之后,它能够最起码接一句像样的诗词:

在这里插入图片描述

2. Overall Workflow

LLM 使用 MediaTek-Research/Breeze-7B-Instruct-v0_1

MediaTek Research Breeze-7B (hereinafter referred to as Breeze-7B) is a language model family that builds on top of Mistral-7B, specifically intended for Traditional Chinese use.

数据集是一堆唐诗,一个 data point 的 example 如下:

在这里插入图片描述

总共有 5000 条数据。

微调的思路是:将一个 data point 的 instruction、input 和 output 填入 prompt template 中,形成一个 text,用来训练 LLM。

微调完成后,将 instruction、input 形成一个 prompt 输入给 LLM,让其完成剩下部分的唐诗。

3. Dataset 介绍

dataset 主要包含两个 JSON 文件:

  • Tang_testing_data.json:测试集,包含 15 条数据
  • Tang_training_data.json:训练集,包含 5001 条数据

其中训练集每一条数据的格式都是前面 example 展示的,而测试集只包含 instruction 和 input 字段,答案在 Tang_testing_gt.txt 文件中:

在这里插入图片描述

4. 代码介绍

4.1 环境介绍

Python 3.10,torch 2.3.1

其他依赖如下:

!pip install bitsandbytes==0.43.0
!pip install datasets==2.10.1
!pip install transformers==4.38.2
!pip install peft==0.9.0
!pip install sentencepiece==0.1.99
!pip install -U accelerate==0.28.0
!pip install colorama==0.4.6

具体的代码可以下载课程给的 notebook,并查看其中的代码。

4.2 下载 dataset

git clone https://github.com/CheeEn-Yu/GenAI-Hw5.git

4.3 下载并加载模型

由于从 HuggingFace 下载模型可能会失败,所以可以从镜像站先下载模型:

HuggingFace 镜像站:https://hf-mirror.com/

这里介绍如何使用 huggingface-cli 下载模型。

  • 安装依赖:pip install -U huggingface_hub
  • 设置 mirror 环境变量:export HF_ENDPOINT=https://hf-mirror.com
  • 设置 huggingface 的缓存目录:export HF_HOME=/root/autodl-tmp/cache/
  • 下载模型:huggingface-cli download --resume-download MediaTek-Research/Breeze-7B-Instruct-v0_1

下载完成后,可以在目录中看到下载的预训练模型:

所在的目录就是 ${HF_HOME}/hub/ 中,之后代码需要从这个目录中加载模型。

4.2 Notebook 代码

1)import 部分
import os
import sys
import argparse
import json
import warnings
import logging
warnings.filterwarnings("ignore")

import torch
import torch.nn as nn
import bitsandbytes as bnb
from datasets import load_dataset, load_from_disk
import transformers, datasets
from peft import PeftModel
from colorama import *

from tqdm import tqdm
from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM, BitsAndBytesConfig
from transformers import GenerationConfig
from peft import (
    prepare_model_for_int8_training,
    LoraConfig,
    get_peft_model,
    get_peft_model_state_dict,
    prepare_model_for_kbit_training
)
2)固定 seed

固定住 seed 从而防止训练的不确定性:

seed = 42
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.manual_seed(seed)
if torch.cuda.is_available():
    torch.cuda.manual_seed_all(seed)
3)加载 LLM

这里使用 transformers 库的 AutoModelForCausalLM 来加载模型,并需要将 cache_dir 设置为下载的模型的目录。

cache_dir = "/root/autodl-tmp/cache/hub"

nf4_config = BitsAndBytesConfig(
   load_in_4bit=True,
   bnb_4bit_quant_type="nf4",
   bnb_4bit_use_double_quant=True,
   bnb_4bit_compute_dtype=torch.bfloat16
)

# 從指定的模型名稱或路徑載入預訓練的語言模型
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    cache_dir=cache_dir,
    quantization_config=nf4_config,
    low_cpu_mem_usage = True
)
4)加载 tokenizer

加载 LLM 对应的 tokenizer:

# 創建 tokenizer 並設定結束符號 (eos_token)
logging.getLogger('transformers').setLevel(logging.ERROR)
tokenizer = AutoTokenizer.from_pretrained(
    model_name,
    add_eos_token=True,
    cache_dir=cache_dir,
    quantization_config=nf4_config
)
tokenizer.pad_token = tokenizer.eos_token

将 tokenizer 的 padding token 设定为 0:

tokenizer.pad_token_id = 0
5)设置解码参数

设置模型做 inference 时的 decoding 参数:

# 設定模型推理時需要用到的decoding parameters
max_len = 128
generation_config = GenerationConfig(
    do_sample=True,
    temperature=0.1,
    num_beams=1,
    top_p=0.3,
    no_repeat_ngram_size=3,
    pad_token_id=2,
)
6)⭐ LLM 和 tokenizer 使用示例

这里使用一个 data point example 来展示一下 LLM 和 tokenizer 的使用示例。

下面的代码使用 instruction 和 poem 组成一个 prompt:

instruction = '以下是一首唐詩的第一句話,請用你的知識判斷並完成整首詩。'
poem = '相見時難
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值