国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LLM - Baichuan7B Lora 訓(xùn)練詳解

這篇具有很好參考價(jià)值的文章主要介紹了LLM - Baichuan7B Lora 訓(xùn)練詳解。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一.引言

二.環(huán)境準(zhǔn)備

三.模型訓(xùn)練

1.依賴引入與 tokenizer 加載

2.加載 DataSet 與 Model

3.Model 參數(shù)配置

4.獲取 peft Model

5.構(gòu)造 Trainer 訓(xùn)練

6.訓(xùn)練完整代碼

四.Shell 執(zhí)行

1.腳本構(gòu)建

2.訓(xùn)練流程

3.訓(xùn)練結(jié)果

五.總結(jié)


一.引言

LLM - Baichuan7B Tokenizer 生成訓(xùn)練數(shù)據(jù)?上文我們介紹了如何將 QA 式的樣本構(gòu)造為訓(xùn)練可用的 DataSet,本文我們基于該訓(xùn)練數(shù)據(jù)進(jìn)行 Baichuan7B 的 lora 微調(diào)。本文也會盡量把每一個(gè) API 每一個(gè)參數(shù)的含義大致搞懂,以供自己和大家學(xué)習(xí)了解。

二.環(huán)境準(zhǔn)備

??主要依賴

python 3.9.11
numpy==1.23.5
torch==2.0.1
transformers==4.29.1

可以將上述依賴版本放入 requirements.txt。

??激活并配置環(huán)境

conda create -n baichuan python=3.9
conda activate baichuan

pip install -r requirements.txt

??Baichuan7B 模型下載?

baichuan-inc/Baichuan-7B at main,主要模型文件大概 14G:

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

三.模型訓(xùn)練

下面對主要代碼與功能進(jìn)行解釋,并在最后給出完整代碼。

1.依賴引入與 tokenizer 加載

from transformers.integrations import TensorBoardCallback
from torch.utils.tensorboard import SummaryWriter
from transformers import TrainingArguments
from transformers import Trainer, HfArgumentParser
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers import DataCollatorForLanguageModeling
import torch
import torch.nn as nn
from peft import get_peft_model, LoraConfig, TaskType
from dataclasses import dataclass, field
import datasets
import os
from pprint import pprint as print

模型加載需要下載對應(yīng)的 Baichuan7B 模型,通過 AutoTokenizer 類加載預(yù)訓(xùn)練模型得到 tokenizer 用于后續(xù) encode 編碼:

# 讀取預(yù)訓(xùn)練模型
model_checkpoint = "/data3/model/baichuan-7B"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, trust_remote_code=True)
tokenizer.pad_token = tokenizer.unk_token

這里還規(guī)定了 pad_token 為 unk_token,下面簡單介紹下 tokenizer 幾種常用的 token 形式:

pad-token 填充標(biāo)記 [PAD]
eos_token 結(jié)束標(biāo)記 [SEP]
unk_token 不在詞匯表的單詞 [UNK]

根據(jù)不同的模型和設(shè)定,上面的 token 形式可能出現(xiàn)不同,除此之外還有 pad_first 參數(shù)用于設(shè)置是否將填充放到文本最前面。

2.加載 DataSet 與 Model

def main():
    # 獲取微調(diào)參數(shù)-輸入、輸入、Rank 訓(xùn)練參數(shù)-import by Transformers
    finetune_args, training_args = HfArgumentParser(
        (FinetuneArguments, TrainingArguments)
    ).parse_args_into_dataclasses()

    # 讀取訓(xùn)練數(shù)據(jù)地址
    dataset = datasets.load_from_disk('data/tokenized_data/'+finetune_args.tokenized_dataset)
    print(f"\n{len(dataset)=}\n")

    # 讀取并加載預(yù)訓(xùn)練模型,device_map 用于指定 GPU
    model = AutoModelForCausalLM.from_pretrained(
        model_checkpoint, load_in_8bit=False, trust_remote_code=True,
        device_map="auto" # 模型不同層會被自動分配到不同GPU上進(jìn)行計(jì)算
    )
    print(model.hf_device_map)

? 微調(diào)訓(xùn)練參數(shù)

@dataclass
class FinetuneArguments:
    tokenized_dataset: str = field(default=" ") # tokenized之后的數(shù)據(jù)集文件夾
    model_path: str = field(default=" ") # 存儲模型地址
    lora_rank: int = field(default=8) # lora 微調(diào) emb rank

finetune_args 來自于自定義類,training_args 來自于 Transformer 類,前者主要包含了微調(diào)的基礎(chǔ)數(shù)據(jù)路徑和模型路徑,后者包含一些訓(xùn)練相關(guān)參數(shù)。

? DataSet 加載

上文中我們 token 后的數(shù)據(jù)存放在 /data/toenized_data 目錄下,如果有修改改為自己的樣本目錄即可。通過調(diào)用 dataset.load_from_disk?方法并傳入文件夾路徑,可以將之前保存的數(shù)據(jù)集重新加載到內(nèi)存中,并返回一個(gè)可直接使用的數(shù)據(jù)集對象。加載后的數(shù)據(jù)集可以在后續(xù)的數(shù)據(jù)處理、模型訓(xùn)練或其他任務(wù)中使用。

? Model 加載

通過 transformers 提供的?AutoModelForCausalLM.from_pretrained API 加載預(yù)訓(xùn)練模型。?

AutoModelForCausalLM 引自 Transformers ,用于自動化選擇和加載適合特定任務(wù)的預(yù)訓(xùn)練語言模型 [LM] 的工具。該類是由 Hugging Face 提供的 "Auto" 系列類之一,旨在簡化使用和處理不同類型的預(yù)訓(xùn)練模型,例如生成式語言建模 [Causal Language Modeling]。

通過使用 ?AutoModelForCausalLM 類,無需手動選擇和加載特定的語言模型,而是僅提供預(yù)訓(xùn)練模型的標(biāo)識符或名稱,庫將根據(jù)您提供的提示自動選擇最佳模型,并加載相應(yīng)的權(quán)重和配置。除了我們自己下載的模型外,一些早期的 LM 我們可以直接加載,以 GPT-2 為例:

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "gpt2"  # 指定預(yù)訓(xùn)練模型的標(biāo)識符或名稱
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 使用加載的模型進(jìn)行后續(xù)的生成式語言建模任務(wù)

? load_in_8bit

load_in_8bit 顧名思義該參數(shù)是指在加載預(yù)訓(xùn)練模型時(shí),將權(quán)重參數(shù)轉(zhuǎn)換為使用 8 位精度進(jìn)行存儲和計(jì)算。當(dāng)設(shè)置 load_in_8bit=True 時(shí),預(yù)訓(xùn)練模型的權(quán)重參數(shù)會以更低的精度 [8位] 進(jìn)行存儲,從而減少了模型所需的內(nèi)存空間。這可以幫助降低模型加載時(shí)間、減少內(nèi)存開銷,并使模型能夠在較低的設(shè)備或資源受限的環(huán)境中運(yùn)行。

盡管 8 位精度相對于默認(rèn)的 32 位精度會引入一定程度的數(shù)值損失,但在大多數(shù)情況下,這種損失是可以接受的,并且可以獲得顯著的性能提升。需要注意的是,load_in_8bit?參數(shù)的可用性可能取決于所選的預(yù)訓(xùn)練模型和庫的版本,例如 Baichuan7B 就支持該參數(shù)。

? Lora Rank

lorarank 即在原始預(yù)訓(xùn)練模型的基礎(chǔ)上增加旁路,旁路訓(xùn)練參數(shù)的低維維度。

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

關(guān)于 Lora 的基礎(chǔ)知識我主要參考了?LORA:大模型輕量級微調(diào)?一文。

3.Model 參數(shù)配置

??模型啟用梯度檢查點(diǎn)功能

    model.gradient_checkpointing_enable()

在深度神經(jīng)網(wǎng)絡(luò) [deep neural network] 訓(xùn)練時(shí),計(jì)算梯度是一項(xiàng)極其耗費(fèi)計(jì)算資源的操作。梯度檢查點(diǎn)技術(shù)通過分解長序列的計(jì)算圖為多個(gè)子圖,并在每個(gè)子圖上進(jìn)行反向傳播和梯度計(jì)算,從而減少了計(jì)算梯度所需的內(nèi)存和計(jì)算量。

優(yōu)劣:使用梯度檢查點(diǎn)可以節(jié)省內(nèi)存,但代價(jià)是向后傳遞速度較慢。

??模型啟用計(jì)算輸入梯度的功能

model.enable_input_require_grads()

在深度神經(jīng)網(wǎng)絡(luò) [deep neural network] 訓(xùn)練時(shí),需要對每個(gè)參數(shù)或權(quán)重 [parameter/weight] 計(jì)算其對損失函數(shù) [loss function] 的梯度 [gradient],從而進(jìn)行反向傳播 [back propagation] 和優(yōu)化[optimization]。默認(rèn)情況下不會計(jì)算輸入數(shù)據(jù) [input data] 的梯度,即使它們在計(jì)算中起到了關(guān)鍵的作用。但是,在某些應(yīng)用場景中,例如圖像生成 [image generation]、注意力機(jī)制 [attention mechanism] 等,需要計(jì)算輸入數(shù)據(jù)的梯度。此時(shí),可以通過啟用計(jì)算輸入梯度的功能,對輸入數(shù)據(jù)進(jìn)行求導(dǎo)并利用其梯度信息進(jìn)行優(yōu)化。

作用: 啟用該功能這對于在保持模型權(quán)重固定的同時(shí)微調(diào)適配器權(quán)重非常有用。

??模型并行

model.model_parallel = False

設(shè)置為 True 之后,可能會啟動模型并行化,且關(guān)閉數(shù)據(jù)并行,讓一個(gè)模型分塊在多塊 GPU 上。一般設(shè)置為 False 主要基于以下幾個(gè)原因:

? ? ? ?-?硬件資源有限

? ? ? ?- 任務(wù)規(guī)模較小

? ? ? ?- 庫或者框架不支持

這里我們設(shè)置為 False 主要因?yàn)楦F。

? 獲取 Linear 層

model.lm_head = CastOutputToFloat(model.lm_head)

lm_head 可以獲取其線性變換層或者頭部網(wǎng)絡(luò)的參數(shù)。對于一個(gè)語言模型來說,其任務(wù)通常是通過輸入一個(gè)文本序列,輸出該序列的下一個(gè)單詞或者完成一個(gè)文本生成任務(wù)。在實(shí)現(xiàn)上,通常會采用一個(gè)多層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),其中最后一層就是線性變換層或者頭部網(wǎng)絡(luò),用來將上一層的特征表示映射為最終的輸出結(jié)果。這些層的參數(shù)包括權(quán)重矩陣和偏置向量,可以通過 model.lm_head 屬性來獲取。

class CastOutputToFloat(nn.Sequential):
    def forward(self, x):
        return super().forward(x).to(torch.float32)

CastOutputToFloat 類為自定義類,用于定義 lm_head 前向傳播時(shí)的精度。

4.獲取 peft Model

peft_config = LoraConfig(
        task_type=TaskType.CAUSAL_LM, # 因果語言模型可以被看作是自回歸語言模型的一種擴(kuò)展,在每個(gè)時(shí)間步上,它不僅考慮之前的文本序列,還>考慮了未來可能出現(xiàn)的單詞信息,從而更好地捕捉語句的因果結(jié)構(gòu)。
        inference_mode=False,
        r=finetune_args.lora_rank,
        lora_alpha=32,
        lora_dropout=0.1,
        target_modules = ["W_pack"] # 把model打印出來,找跟attention相關(guān)的模塊
    )

# 獲取 Lora 微調(diào)模型
model = get_peft_model(model, peft_config)

通過上面一系列操作我們已經(jīng)成功加載好預(yù)訓(xùn)練模型與對應(yīng) Tokenizer,接下來通過 peft 庫實(shí)現(xiàn) Lora 模型的獲取。PEFT 是一個(gè)面向高性能計(jì)算 [HPC] 系統(tǒng)的功耗估計(jì)和建??蚣?,可以在不需要硬件測量的情況下,通過基于任務(wù)圖的分析方法,對 HPC 應(yīng)用程序的功耗進(jìn)行精確建模和估計(jì)。

具體來說,PEFT 可以生成應(yīng)用程序的任務(wù)圖,并根據(jù)該圖推斷出任務(wù)之間的依賴關(guān)系和通信開銷等信息,從而對應(yīng)用程序的實(shí)際執(zhí)行過程進(jìn)行模擬和預(yù)測,最終得到應(yīng)用程序的功耗估計(jì)結(jié)果。

? LoraConfig

TaskType.CAUSAL_LM 表示構(gòu)建一個(gè)因果語言模型 [causal language model] 的任務(wù)類型,可以用于指定不同的模型參數(shù)和超參數(shù)等設(shè)置。

lora 微調(diào)需要設(shè)置兩個(gè)參數(shù)一個(gè)是 r,即中間層神經(jīng)元的個(gè)數(shù),另一個(gè) lora_alpha 是一個(gè) scale 參數(shù),lora_dropout 即為 dropout 比例。

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

? 模型加載與讀取

通過?get_peft_model API 與定義好的 LoraConfig 即可獲取對應(yīng)的 peft model。

model.print_trainable_parameters()

該方法可以打印訓(xùn)練參數(shù)信息。模型微調(diào)完畢后,額外加載 lora 參數(shù)即可實(shí)現(xiàn)模型加載:

model.load_state_dict(torch.load(peft_path), strict=False)

5.構(gòu)造 Trainer 訓(xùn)練

    # 初始化 trainer, 此處報(bào)錯(cuò): NotImplementedError: Cannot copy out of meta tensor; no data!
    trainer = ModifiedTrainer(
        model=model,
        train_dataset=dataset,
        args=training_args,
        callbacks=[TensorBoardCallback(writer)], # 回調(diào)將訓(xùn)練情況寫入 tensorboard
        data_collator=data_collator,
    )
    trainer.train()

??ModifiedTrainer?

class ModifiedTrainer(Trainer):
    # 根據(jù)輸入計(jì)算 Loss
    def compute_loss(self, model, inputs, return_outputs=False):
        return model(
            input_ids=inputs["input_ids"],
            labels=inputs["labels"],
        ).loss

    # 保存模型
    def save_model(self, output_dir=None, _internal_call=False):
        from transformers.trainer import TRAINING_ARGS_NAME

        os.makedirs(output_dir, exist_ok=True)
        torch.save(self.args, os.path.join(output_dir, TRAINING_ARGS_NAME))
        saved_params = {
            k: v.to("cpu") for k, v in self.model.named_parameters() if v.requires_grad
        }
        torch.save(saved_params, os.path.join(output_dir, "adapter_model.bin"))

Trainer 是 Hugging Face Transformers 庫中的一個(gè)類,它提供了一個(gè)簡便且強(qiáng)大的訓(xùn)練循環(huán)來訓(xùn)練和評估模型。其主要用于監(jiān)督學(xué)習(xí)任務(wù),如文本分類、命名實(shí)體識別、文本生成等。它幫助自動處理訓(xùn)練過程中的批量數(shù)據(jù)加載、優(yōu)化器設(shè)置、模型更新等常見任務(wù),以及記錄和輸出訓(xùn)練指標(biāo)和日志。本例中?compute_loss 方法指定計(jì)算 loss 的 input 與 label、?save_model 方法首先獲取需要更新的參數(shù),隨后將參與更新的參數(shù)存儲至 output 生成 .bin 文件,訓(xùn)練結(jié)束后讀取 .bin 即可獲取我們 lora 后的新模型。

下面是 Trainer 的常用 demo:

from transformers import Trainer, TrainingArguments

# 定義訓(xùn)練參數(shù)和配置
training_args = TrainingArguments(
    output_dir='./results',          # 指定訓(xùn)練結(jié)果保存的目錄
    num_train_epochs=3,              # 訓(xùn)練的輪次(epochs)
    per_device_train_batch_size=16,  # 每個(gè)設(shè)備的訓(xùn)練批次大小
    per_device_eval_batch_size=8,    # 每個(gè)設(shè)備的評估批次大小
    warmup_steps=500,                # 學(xué)習(xí)率預(yù)熱步數(shù)
    weight_decay=0.01,               # 權(quán)重衰減參數(shù)
    logging_dir='./logs',            # 日志保存的目錄
)

# 創(chuàng)建 Trainer 對象并進(jìn)行訓(xùn)練
trainer = Trainer(
    model=model,                     # 要訓(xùn)練的模型
    args=training_args,              # 訓(xùn)練參數(shù)和配置
    train_dataset=train_dataset,     # 訓(xùn)練數(shù)據(jù)集
    eval_dataset=eval_dataset        # 評估數(shù)據(jù)集
)

trainer.train()  # 開始訓(xùn)練

# 在評估集上進(jìn)行評估
trainer.evaluate()

# 保存訓(xùn)練好的模型
trainer.save_model("./saved_model")

? callback 回調(diào)

writer = SummaryWriter()

在 main 函數(shù)的最前面我們初始化 SummaryWriter 類,該類為工具類,用于將條目直接寫入 log_dir 中的時(shí)間文件以供 Tensorboard 使用,后面通過 callbacks 傳入 TensorBoardCallback 用于指標(biāo)記錄供后續(xù)展示。任務(wù)結(jié)束后記得調(diào)用 close 方法關(guān)閉 writer。

??DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer,mlm=False)

該類也是 Hugging Face Transformers 庫中的一個(gè)類,用于幫助組織和處理語言建模任務(wù)的訓(xùn)練數(shù)據(jù)。在自然語言處理和語言建模中,語言模型通常是通過對大量文本進(jìn)行預(yù)訓(xùn)練,并使用生成式任務(wù)來微調(diào)模型。DataCollatorForLanguageModeling 類提供了一個(gè)方便的方式來處理和準(zhǔn)備用于語言建模任務(wù)的訓(xùn)練數(shù)據(jù)。該類的主要功能包括:

? ? ? ? - 數(shù)據(jù)批次化 Batching: 將輸入文本數(shù)據(jù)按照指定的批次進(jìn)行大小劃分以便批量訓(xùn)練

? ? ? ? - 數(shù)據(jù)填充 Padding: 輸入文本長度不一致時(shí)可自動填充,以便樣本一致從而高效并行計(jì)算

? ? ? ? - 掩碼處理 Masking: 對于基于 mask 的語言任務(wù)例如 Bert,可以幫助生成掩碼標(biāo)簽

下面展示了如何使用 DataCollect 類準(zhǔn)備語言建模任務(wù)的訓(xùn)練數(shù)據(jù):

from transformers import DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=True)

# 準(zhǔn)備輸入文本數(shù)據(jù)
input_text = ["I love natural language processing.", "Transformers library is great!"]

# 根據(jù)指定的批次大小進(jìn)行數(shù)據(jù)批次化和填充
batch = data_collator(input_text)

# 使用批次進(jìn)行語言建模任務(wù)的訓(xùn)練
model.train_on_batch(batch)

6.訓(xùn)練完整代碼

from transformers.integrations import TensorBoardCallback
from torch.utils.tensorboard import SummaryWriter
from transformers import TrainingArguments
from transformers import Trainer, HfArgumentParser
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers import DataCollatorForLanguageModeling
import torch
import torch.nn as nn
from peft import get_peft_model, LoraConfig, TaskType
from dataclasses import dataclass, field
import datasets
import os
from pprint import pprint as print

import contextlib

autocast = contextlib.nullcontext

# 讀取預(yù)訓(xùn)練模型
model_checkpoint = "/data/model/baichuan-7b/"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, trust_remote_code=True)


# 微調(diào)參數(shù)
@dataclass
class FinetuneArguments:
    tokenized_dataset: str = field(default=" ")  # tokenized之后的數(shù)據(jù)集文件夾
    model_path: str = field(default=" ")  # 存儲模型地址
    lora_rank: int = field(default=8)  # lora 微調(diào) emb rank


# 輸出轉(zhuǎn)換 IntToFloat
class CastOutputToFloat(nn.Sequential):
    def forward(self, x):
        return super().forward(x).to(torch.float32)


# 填充標(biāo)記 pad_token-填充標(biāo)記-[PAD] eos_token-結(jié)束標(biāo)記-[SEP] unk_token-用于填充不在詞匯表中的關(guān)鍵字-[unk] pad_first–是否將填充放到文本最前面 
tokenizer.pad_token = tokenizer.unk_token
# 數(shù)據(jù)函數(shù)隸屬于 Trainer,用 list of elements 來構(gòu)造一個(gè) batch
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)


class ModifiedTrainer(Trainer):
    # 根據(jù)輸入計(jì)算 Loss
    def compute_loss(self, model, inputs, return_outputs=False):
        return model(
            input_ids=inputs["input_ids"],
            labels=inputs["labels"],
        ).loss

    # 保存模型
    def save_model(self, output_dir=None, _internal_call=False):
        from transformers.trainer import TRAINING_ARGS_NAME

        os.makedirs(output_dir, exist_ok=True)
        torch.save(self.args, os.path.join(output_dir, TRAINING_ARGS_NAME))
        saved_params = {
            k: v.to("cpu") for k, v in self.model.named_parameters() if v.requires_grad
        }
        torch.save(saved_params, os.path.join(output_dir, "adapter_model.bin"))


def main():
    # 工具類: 用于將條目直接寫入 log_dir 中的時(shí)間文件以供 Tensorboard 使用
    writer = SummaryWriter()
    # 獲取微調(diào)參數(shù)-輸入、輸入、Rank 訓(xùn)練參數(shù)-import by Transformers
    finetune_args, training_args = HfArgumentParser(
        (FinetuneArguments, TrainingArguments)
    ).parse_args_into_dataclasses()

    # 讀取訓(xùn)練數(shù)據(jù)地址
    dataset = datasets.load_from_disk('data/tokenized_data/' + finetune_args.tokenized_dataset)
    # dataset = dataset.select(range(10000)) # 獲取數(shù)據(jù)集前10000個(gè)項(xiàng)目
    print(f"\n{len(dataset)=}\n")

    # 讀取并加載預(yù)訓(xùn)練模型,device_map 用于指定 GPU
    model = AutoModelForCausalLM.from_pretrained(
        model_checkpoint, load_in_8bit=False, trust_remote_code=True,
        device_map="auto"  # 模型不同層會被自動分配到不同GPU上進(jìn)行計(jì)算
    )
    print(model.hf_device_map)

    # 模型配置
    model.gradient_checkpointing_enable()
    model.enable_input_require_grads()
    model.lm_head = CastOutputToFloat(model.lm_head)

    # TaskType.CAUSAL_LM 表示構(gòu)建一個(gè)因果語言模型(causal language model)的任務(wù)類型,可以用于指定不同的模型參數(shù)和超參數(shù)等設(shè)置。
    peft_config = LoraConfig(
        task_type=TaskType.CAUSAL_LM,  # 因果語言模型可以被看作是自回歸語言模型的一種擴(kuò)展,在每個(gè)時(shí)間步上,它不僅考慮之前的文本序列,還考慮了未來可能出現(xiàn)的單詞信息,從而更好地捕捉語句的因果結(jié)構(gòu)。
        inference_mode=False,
        r=finetune_args.lora_rank,
        lora_alpha=32,
        lora_dropout=0.1,
        target_modules=["W_pack"]  # 把model打印出來,找跟attention相關(guān)的模塊
    )

    # 獲取 Lora 微調(diào)模型
    model = get_peft_model(model, peft_config)

    # 訓(xùn)練步驟
    model.save_pretrained(
        training_args.output_dir)  # 因?yàn)?adapter_config.json 只能通過這個(gè) save_pretrained 來生成,先這里生成一份,好在訓(xùn)練完之前就可以嘗試中間的checkpoint

    # 初始化 trainer, 此處報(bào)錯(cuò): NotImplementedError: Cannot copy out of meta tensor; no data! 
    trainer = ModifiedTrainer(
        model=model,
        train_dataset=dataset,
        args=training_args,
        callbacks=[TensorBoardCallback(writer)],  # 回調(diào)將訓(xùn)練情況寫入 tensorboard
        data_collator=data_collator,
    )
    trainer.train()
    writer.close()
    # save model
    model.save_pretrained(training_args.output_dir)


if __name__ == "__main__":
    main()

四.Shell 執(zhí)行

1.腳本構(gòu)建

構(gòu)造下述 train.sh 的腳本,其中 train 的文件名為我們上文 tokenizer 生成的 DataSet 樣本,這里 lora_rank 設(shè)定為 4,batch_size 設(shè)定為 8,共訓(xùn)練 10 個(gè) epoch,由于訓(xùn)練數(shù)據(jù)很少,所以只是跑通流程,大家也可以構(gòu)建更多 QA 樣本,采用同樣流程訓(xùn)練。

train="simple_token_by_baichuan-7B"
output="simple_token_by_baichuan-7B"

CUDA_VISIBLE_DEVICES=0,1 python baichuan_lora_tuning.py \
     --tokenized_dataset $train \
     --lora_rank 4 \
     --per_device_train_batch_size 8 \
     --gradient_accumulation_steps 1 \
     --num_train_epochs 10 \
     --save_steps 200 \
     --save_total_limit 2 \
     --learning_rate 1e-4 \
     --fp16 \
     --remove_unused_columns false \
     --logging_steps 50 \
     --output_dir weights/$output

2.訓(xùn)練流程

我們一共構(gòu)造了 9 個(gè)樣本,所以訓(xùn)練 len(dataset) = 9,print(hf_device_map) 看各個(gè) layer 對應(yīng)的設(shè)備,如果能夠正常打印 metric 代表 demo 運(yùn)行正常。

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

?? 內(nèi)存不足

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

內(nèi)存不足時(shí)會報(bào)這個(gè)錯(cuò)誤,如果是公用卡集群,需要協(xié)調(diào)一下保證任務(wù)的內(nèi)存。

?? Cannot copy out of meta tensor; no data!

這個(gè)錯(cuò)誤其實(shí)和上面比較類似,大部分是由于資源不足導(dǎo)致,所以趕快沖卡吧!

3.訓(xùn)練結(jié)果

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

訓(xùn)練成功后會在 weights 文件夾下得到腳本對應(yīng) output 的模型地址,里面的 .bin 和 config.json 用于后續(xù)微調(diào)模型加載,除此之外文件夾內(nèi)可能也會包含 checkpoint 文件。

五.總結(jié)

目前博主主要遇到這兩個(gè)問題,當(dāng) V100 x 2 資源充足時(shí)訓(xùn)練沒有問題。

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

?顯存單卡大概 13-14 G 變化,樣本較少 GPU-Util 最高 80,然后很快回到 20+。

LLM - Baichuan7B Lora 訓(xùn)練詳解,LLM,AIGC,Baichuan7B,Lora

參考:

Baichuan7B:?baichuan-inc/Baichuan-7B at main

Baichuan7B 模型使用/訓(xùn)練:?https://zhuanlan.zhihu.com/p/637343740

Baichuan7B Lora:?https://github.com/baichuan-inc/baichuan-7B/issues/65

Lora 大模型微調(diào):?https://zhuanlan.zhihu.com/p/623543497文章來源地址http://www.zghlxwxcb.cn/news/detail-568316.html

到了這里,關(guān)于LLM - Baichuan7B Lora 訓(xùn)練詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包