自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 LlamaFactory 結(jié)合開(kāi)源大語(yǔ)言模型實(shí)現(xiàn)文本分類(lèi):從數(shù)據(jù)集構(gòu)建到 LoRA 微調(diào)與推理評(píng)估

發(fā)布于 2024-12-11 10:37
瀏覽
0收藏

背景介紹

本文將一步一步地,介紹如何使用llamafactory框架利用開(kāi)源大語(yǔ)言模型完成文本分類(lèi)的實(shí)驗(yàn),以 LoRA微調(diào)qwen/Qwen2.5-7B-Instruct為例。

文本分類(lèi)數(shù)據(jù)集

按照 alpaca 樣式構(gòu)建數(shù)據(jù)集,并在將其添加到LLaMA-Factory/data/dataset_info.json文件中。如此方便直接根據(jù)自定義數(shù)據(jù)集的名字,獲取到數(shù)據(jù)集的數(shù)據(jù)。

[
  {
    "instruction": "",
    "input": "請(qǐng)將以下文本分類(lèi)到一個(gè)最符合的類(lèi)別中。以下是類(lèi)別及其定義:\n\n要求}}\nreason: \nlabel:",
    "output": "reason: 該文本主要討論的是xxx。因此,該文本最符合“社會(huì)管理”這一類(lèi)別。\n\nlabel: 社會(huì)管理"
  },
  ...
]

Lora 微調(diào)

llamafactory 框架支持網(wǎng)頁(yè)端訓(xùn)練,但本文選擇在終端使用命令行微調(diào)模型。

模型微調(diào)訓(xùn)練的參數(shù)較多,將模型訓(xùn)練的參數(shù)都存儲(chǔ)在 yaml 文件中。

qwen_train_cls.yaml的文件內(nèi)容如下:

### model
model_name_or_path: qwen/Qwen2.5-7B-Instruct

### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all

### dataset
# dataset_dir: data
dataset_dir: LLaMA-Factory/data/ 填寫(xiě)相應(yīng)路徑
dataset: 數(shù)據(jù)集名 
template: qwen
cutoff_len: 2048
# max_samples: 1000 若數(shù)據(jù)集較大,可隨機(jī)篩選一部分?jǐn)?shù)據(jù)微調(diào)模型
overwrite_cache: true
preprocessing_num_workers: 16

### output
output_dir: output/qwen2.5-7B/cls_epoch2 訓(xùn)練的LoRA權(quán)重輸出路徑
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true

### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 2.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000

### eval
# val_size: 0.1
# per_device_eval_batch_size: 1
# eval_strategy: steps
# eval_steps: 500

使用下述命令啟動(dòng)模型訓(xùn)練:

nohup llamafactory-cli train qwen_train_cls.yaml > qwen_train_cls.log 2>&1 &

nohup 作用是讓命令在退出終端后仍然運(yùn)行,防止因關(guān)閉終端或會(huì)話中斷導(dǎo)致進(jìn)程被終止。

模型部署與推理

模型訓(xùn)練完成后得到 Lora 權(quán)重。相關(guān)微調(diào)模型部署與推理,請(qǐng)瀏覽下述兩篇文章,相比llamafactory原本的模型推理速度更快。

  • 基于 LLamafactory 的異步API高效調(diào)用實(shí)現(xiàn)與速度對(duì)比.https://blog.csdn.net/sjxgghg/article/details/144176645
  • 基于 LlamaFactory 的 LoRA 微調(diào)模型支持 vllm 批量推理的實(shí)現(xiàn)

目前l(fā)lamafactory已經(jīng)支持 vllm_infer 推理,這個(gè)PR是筆者提交的:

  • llamafactory vllm.https://github.com/hiyouga/LLaMA-Factory/blob/main/scripts/vllm_infer.py

期待模型的輸出結(jié)果

下述是使用 llamafactory 推理出的數(shù)據(jù)格式,建議大家在做推理評(píng)估時(shí),也做成這個(gè)樣式,方便統(tǒng)一評(píng)估。

prompt 是大模型提示詞,predict 是大模型推理的結(jié)果,與真實(shí)的 label。

{
    "prompt": "請(qǐng)將以下文本分類(lèi)到一個(gè)最符合的類(lèi)別中。以下是類(lèi)別及其定義:...", 
    "predict": "\nreason: 該文本主要討論了改革創(chuàng)新發(fā)展、行政區(qū)劃調(diào)整、行政管理體制等方面的內(nèi)容,涉及到體制機(jī)制的改革與完善,旨在推動(dòng)高質(zhì)量發(fā)展和提升生活品質(zhì)。這些內(nèi)容與社會(huì)管理和經(jīng)濟(jì)管理密切相關(guān),但更側(cè)重于行政管理和社會(huì)治理的改革,因此更符合“社會(huì)管理”這一類(lèi)別。\n\nlabel: 社會(huì)管理",       
    "label": "reason: 該文本主要討論的是改革創(chuàng)新、行政區(qū)劃調(diào)整、體制機(jī)制障礙的破除以及行政管理體制等與政府治理和社會(huì)管理相關(guān)的內(nèi)容,強(qiáng)調(diào)了與高質(zhì)量發(fā)展和生活品質(zhì)的關(guān)系。這些內(nèi)容顯示出對(duì)社會(huì)管理和行政管理的關(guān)注,尤其是在推動(dòng)城鄉(xiāng)一體化和適應(yīng)高質(zhì)量發(fā)展要求方面。因此,該文本最符合“社會(huì)管理”這一類(lèi)別。\n\nlabel: 社會(huì)管理"
}

文本分類(lèi)評(píng)估代碼

import os
import re
import json


from sklearn.metrics import classification_report, confusion_matrix

# 文本類(lèi)別
CLASS_NAME = [
    "產(chǎn)業(yè)相關(guān)",
    ...
    "法律法規(guī)與行政事務(wù)",
    "其他",
]


def load_jsonl(file_path):
    """
    加載指定路徑的 JSON 文件并返回解析后的數(shù)據(jù)。

    :param file_path: JSON 文件的路徑
    :return: 解析后的數(shù)據(jù)(通常是字典或列表)
    :raises FileNotFoundError: 如果文件未找到
    :raises json.JSONDecodeError: 如果 JSON 格式不正確
    """
    data = []
    try:
        with open(file_path, "r", encoding="utf-8") as file:
            for line in file:
                tmp = json.loads(line)
                data.append(tmp)
    except FileNotFoundError as e:
        print(f"文件未找到:{file_path}")
        raise e
    except json.JSONDecodeError as e:
        print(f"JSON 格式錯(cuò)誤:{e}")
        raise e
    return data


def parser_label(text: str):
    pattern = r"label[::\s\.\d\*]*([^\s^\*]+)"
    matches = re.findall(pattern, text, re.DOTALL)
    if len(matches) == 1:
        return matches[0]
    return None


def trans2num(item):
    predict = parser_label(item["predict"])
    label = parser_label(item["label"])

    predict_idx = -1
    label_idx = -1
    for idx, cls_name in enumerate(CLASS_NAME):
        if predict == cls_name:
            predict_idx = idx

        if label == cls_name:
            label_idx = idx

    return predict_idx, label_idx

def cls_eval(input_file):
    data = load_jsonl(file_path=input_file)
    predicts = []
    labels = []

    for item in data:
        predict, label = trans2num(item)
        if label == -1:
            continue

        predicts.append(predict)
        labels.append(label)

    return classification_report(predicts, labels, output_dict=False)

本文使用了大模型生成式預(yù)測(cè)文本類(lèi)別,我沒(méi)有使用結(jié)構(gòu)化輸出的方式,大家可以使用結(jié)構(gòu)化的json格式輸出,這樣在提取大模型預(yù)測(cè)結(jié)果的時(shí)候會(huì)方便很多。

大家按照自己模型的輸出結(jié)果,修改parser_label函數(shù),這個(gè)函數(shù)用于從大模型的輸出結(jié)果提取label。

cls_eval("xxx/generated_predictions.jsonl")

就會(huì)得到下述的輸出結(jié)果:

-1代表模型預(yù)測(cè)的類(lèi)別不在給定的類(lèi)別中。

使用 LlamaFactory 結(jié)合開(kāi)源大語(yǔ)言模型實(shí)現(xiàn)文本分類(lèi):從數(shù)據(jù)集構(gòu)建到 LoRA 微調(diào)與推理評(píng)估-AI.x社區(qū)本文轉(zhuǎn)載自??AI悠閑區(qū)??,作者: jieshenai ????

收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦