在正式开始微调大语言模型之前,我们先来了解一下技术前提条件和设置要求。
微调大语言模型需要用到以下Python库和框架:
微调模型是一种让大语言模型的回答更结构化、更具领域针对性的技术,而且不需要对所有参数进行全面训练。不过,对于大多数普通计算机硬件来说,微调大型大语言模型仍然不太现实。因为所有可训练参数以及实际的大语言模型都要存储在GPU的虚拟随机存取存储器(vRAM)中,而大语言模型庞大的规模成了实现这一目标的主要障碍。
所以,在本文中,我们将微调一个相对较小的大语言模型——DeepSeek - R1 - Distill,它有47.4亿个参数。这个模型至少需要8 - 12GB的vRAM
微调大语言模型需要结构化且特定任务的数据。数据准备策略有很多,比如从社交媒体平台、网站、书籍或研究论文中收集数据。在本文中,我们会使用datasets库来加载Hugging Face Hub上的数据。具体来说,我们会使用Hugging Face上的yahma/alpaca - cleaned数据集
使用谷歌Colab进行微调任务有个很大的好处,就是大多数包已经预装好了。我们只需要安装一个包,那就是unsloth。安装包的代码如下:
- !pip install unsloth
-
我们将使用unsloth包来加载预训练模型,因为它提供了许多有用的技术,能帮助我们更快地下载和微调大语言模型。加载模型和分词器的代码如下:
- from unsloth import FastLanguageModel
-
- model, tokenizer = FastLanguageModel.from_pretrained(
- model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B-unsloth-bnb-4bit",
- max_seq_length = 2048,
- dtype = None,
- load_in_4bit = True
- )
-
这里解释一下代码:
我们要给预训练的大语言模型添加LoRA矩阵,这有助于微调模型的回答。使用unsloth,整个过程非常简单,只需要几行代码。具体实现如下:
- model = FastLanguageModel.get_peft_model(
- model,
- r = 64,
- target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
- "gate_proj", "up_proj", "down_proj",],
- lora_alpha = 32,
- lora_dropout = 0.05, # Can be set to any, but = 0 is optimized
- bias = "none", # Can be set to any, but = "none" is optimized
- use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context
- random_state = 3977,
- use_rslora = False, # unsloth also supports rank stabilized LoRA
- loftq_config = None # And LoftQ
- )
-
代码解释:
现在,我们已经在预训练的大语言模型上设置好了LoRA适配器,接下来就可以着手构建用于训练模型的数据了。为了构建数据,我们需要以特定的方式指定提示(prompt),使其包含输入、指令和响应。
提示的结构如下:
- alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.
- ### Instruction:
- {}
- ### Input:
- {}
- ### Response:
- {}"""
-
我们创建了一个函数,用于将所有数据按照alpaca_prompt的格式进行正确构建,代码如下:
- EOS_TOKEN = tokenizer.eos_token
- def formatting_prompts_func(examples):
- instructions = examples["instruction"]
- inputs = examples["input"]
- outputs = examples["output"]
- texts = []
- for instruction, input, output in zip(instructions, inputs, outputs):
- text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN
- texts.append(text)
- return { "text" : texts, }
-
现在,我们要加载用于微调模型的数据集,在我们的例子中是yahma/alpaca - cleaned。代码如下:
- from datasets import load_dataset
- dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
- dataset = dataset.map(formatting_prompts_func, batched = True,)
-
现在我们既有了结构化的数据,又有了带有LoRA适配器或矩阵的模型,接下来就可以开始训练模型啦。为了训练模型,我们需要初始化一些超参数,这些超参数不仅有助于训练过程,还会在一定程度上影响模型的准确性。
我们将使用SFTTrainer和超参数来初始化一个训练器,代码如下:
- from trl import SFTTrainer
- from transformers import TrainingArguments
- from unsloth import is_bfloat16_supported
-
- trainer = SFTTrainer(
- model = model,
- tokenizer = tokenizer,
- train_dataset = dataset,
- dataset_text_field = "text",
- max_seq_length = max_seq_length,
- dataset_num_proc = 2,
- packing = False,
- args = TrainingArguments(
- per_device_train_batch_size = 2,
- gradient_accumulation_steps = 4,
- warmup_steps = 5,
- max_steps = 120,
- learning_rate = 2e-4,
- fp16 = not is_bfloat16_supported(),
- bf16 = is_bfloat16_supported(),
- logging_steps = 1,
- optim = "adamw_8bit",
- weight_decay = 0.01,
- lr_scheduler_type = "linear",
- seed = 3407,
- output_dir = "outputs",
- report_to = "none",
- )
- )
-
现在,使用这个训练器来启动模型的训练,代码如下:
- trainer_stats = trainer.train()
-
运行这段代码后,模型就会开始训练,并在控制台记录所有步骤以及相应的训练损失。
模型训练完成后,接下来要做的就是对微调后的模型进行推理,评估它的回答。进行推理的代码如下:
- FastLanguageModel.for_inference(model)
- inputs = tokenizer(
- alpaca_prompt.format(
- "Continue the fibonnaci sequence.",
- "1, 1, 2, 3, 5, 8",
- ""
- ), return_tensors = "pt").to("cuda")
- outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
- tokenizer.batch_decode(outputs)
-
代码解释:
这一步完成了模型微调的整个过程,现在我们可以保存微调后的模型,以便将来进行推理或使用。我们还需要将分词器和模型一起保存。下面是将微调后的模型保存到Hugging Face Hub的方法:
- model.push_to_hub_merged("<YOUR_HF_ID>/<MODEL_NAME>", tokenizer, save_method = "merged_4bit", token = "<YOUR_HF_TOKEN>")
- model.push_to_hub_merged("<YOUR_HF_ID>/<MODEL_NAME>", tokenizer, save_method = "merged_16bit", token = "<YOUR_HF_TOKEN>")
-
这里需要注意:
本文主要讨论了以下几个要点:
DeepSeek无疑是2025开年AI圈的一匹黑马,在一众AI大模型中,DeepSeek以低价高性能的优势脱颖而出。DeepSeek的上线实现了AI界的又一大突破,各大科技巨头都火速出手,争先抢占DeepSeek大模型的流量风口。
DeepSeek的爆火,远不止于此。它是一场属于每个人的科技革命,一次打破界限的机会,一次让普通人也能逆袭契机。
DeepSeek的优点
掌握DeepSeek对于转行大模型领域的人来说是一个很大的优势,目前懂得大模型技术方面的人才很稀缺,而DeepSeek就是一个突破口。现在越来越多的人才都想往大模型方向转行,对于想要转行创业,提升自我的人来说是一个不可多得的机会。