一、先明确:自定义数据集的核心要求

Unsloth 微调对数据集的要求很简单:

  1. 格式:优先用 CSV/JSON(新手最易操作),也支持 JSONL/TXT;
  2. 内容:至少包含「输入(问题 / 指令)」和「输出(回答 / 结果)」两列 / 字段;
  3. 示例结构(以 CSV 为例):
question answer
介绍一下 Unsloth Unsloth 是一款低显存的 LLM 微调框架...
如何降低 LLM 微调显存? 可以使用 Unsloth 的 4bit 量化 + LoRA 优化...

二、自定义数据集加载(完整可运行代码)

下面以本地 CSV 文件为例(最通用),同时提供 JSON 格式的加载方式,你按需选择:

步骤 1:准备本地数据集文件

先在本地创建一个 custom_data.csv 文件(用 Excel / 记事本都能做),内容如下(参考格式):

question,answer
介绍一下Unsloth,Unsloth是一款专为LLM微调设计的开源框架,核心优势是低显存、高速度,适配消费级GPU。
Unsloth支持哪些模型,Unsloth支持Llama 2/3、Mistral、Phi-3、Gemma等主流开源LLM。
如何用Unsloth微调7B模型,首先安装Unsloth,加载4bit量化模型,配置LoRA,用自定义数据集训练即可。
步骤 2:加载并预处理自定义数据集(核心代码)
from unsloth import FastLanguageModel
import torch
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset  # 核心:加载数据集的库

# ======================
# 核心修改:加载自定义CSV数据集
# ======================
# 方式1:加载本地CSV文件(推荐,新手首选)
# 替换这里的 "custom_data.csv" 为你的数据集文件路径(比如 "D:/data/my_data.csv")
dataset = load_dataset(
    "csv",                # 数据集格式:csv/json/txt
    data_files="custom_data.csv",  # 你的数据集文件路径
    split="train"         # 数据集划分(只有训练集就写train)
)

# 方式2:如果你的数据集是JSON格式(示例)
# dataset = load_dataset(
#     "json",
#     data_files="custom_data.json",
#     split="train"
# )

# ======================
# 核心修改:格式化Prompt(适配你的字段名)
# ======================
# 关键:把 "question" 和 "answer" 替换成你数据集的列名!
# 比如你的数据集列名是 "instruction" 和 "output",就改成 sample['instruction']
def format_prompt(sample):
    # 适配Llama 3的官方Prompt格式(通用,大部分模型都兼容)
    return f"""<|begin_of_text|><|start_header_id|>user<|end_header_id|>

{sample['question']}  # 替换为你的输入字段名(比如 instruction/query)

<|start_header_id|>assistant<|end_header_id|>

{sample['answer']}  # 替换为你的输出字段名(比如 output/response)
<|end_of_text|>"""

# 对数据集应用格式化函数,生成模型能识别的文本
dataset = dataset.map(lambda x: {"text": format_prompt(x)})

# ======================
# 后续是模型加载和训练(无需改,仅作完整示例)
# ======================
# 加载模型(保持不变)
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-bnb-4bit",
    max_seq_length = 2048,
    dtype = torch.float16,
    load_in_4bit = True,
)

# 配置LoRA(保持不变)
model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_alpha = 16,
    lora_dropout = 0,
    bias = "none",
    use_gradient_checkpointing = "unsloth",
    random_state = 42,
)

# 训练器配置(仅需调整batch_size适配显存)
trainer = SFTTrainer(
    model = model,
    train_dataset = dataset,  # 用你的自定义数据集
    dataset_text_field = "text",  # 固定值:对应上面格式化后的 "text" 字段
    max_seq_length = 2048,
    tokenizer = tokenizer,
    args = TrainingArguments(
        per_device_train_batch_size = 1,  # 8GB显存改1,16GB改2
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        max_steps = 60,
        learning_rate = 2e-4,
        fp16 = not torch.cuda.is_bf16_supported(),
        bf16 = torch.cuda.is_bf16_supported(),
        logging_steps = 1,
        output_dir = "unsloth-custom-finetuned",
        optim = "adamw_8bit",
    ),
)

# 开始训练
trainer.train()

三、关键修改说明(你只需要改这 3 处)

  1. 数据集文件路径:把 data_files="custom_data.csv" 改成你的文件路径(比如 Windows:"D:/AI/data/my_qa_data.csv",Linux/Mac:"/home/user/data/my_qa_data.csv");
  2. 字段名替换:如果你的数据集列名不是 question/answer,而是 instruction/output(Alpaca 格式)、query/response(对话格式),就把 sample['question']sample['answer'] 换成对应的列名;
  3. Prompt 格式(可选):如果微调的是 Llama 2/Mistral/Phi-3,可保留当前格式;如果是其他模型,可替换成对应的 Prompt 格式(比如 ChatGLM 的格式)。

四、常见问题解决

  1. 数据集编码错误:如果加载 CSV 时提示编码错误,添加 encoding="utf-8"
    dataset = load_dataset("csv", data_files="custom_data.csv", split="train", encoding="utf-8")
    
  2. 字段名错误:如果提示 KeyError: 'question',说明你写的字段名和数据集实际列名不一致,核对 Excel/CSV 里的列名;
  3. 数据集太大:先取 10% 数据测试,避免训练时间过长:
    dataset = dataset.select(range(100))  # 只取前100条数据测试
    

总结

  1. 自定义数据集优先用CSV 格式,只需包含「输入字段」和「输出字段」两列;
  2. 核心修改点:替换数据集文件路径、替换字段名、适配 Prompt 格式;
  3. 测试阶段先取少量数据(比如前 100 条)跑通代码,再用全量数据训练。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐