微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据集的详细指南

📖阅读时长:20分钟 🕙发布时间:2025-02-02 >近日热文:[全网最全的神经网络数学原理(代码和公式)直观解释](https://mp.weixin.qq.com/s/ITFeM-RUVs9k9Kw4njl9KQ?token=992101443&lang=zh_CN) 欢迎关注知乎和公众号的专栏内容 [LLM架构专栏](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU5OTk5OTg4Ng==&action=getalbum&album_id=3803710040624594945#wechat_redirect) [知乎LLM专栏](https://zhuanlan.zhihu.com/column/c_1860259327224446976) [知乎【**柏企**】](https://www.zhihu.com/people/cbq-91) 公众号【**柏企科技说**】【**柏企阅文**】# 微调DeepSeek LLM:使用监督微调(SFT)与Hugging Face数据集的详细指南 ### 介绍 DeepSeek LLM是一个强大的开源语言模型,但为了在特定应用中充分发挥其潜力,微调至关重要。在本指南中,我们将逐步介绍如何使用监督微调(SFT)和Hugging Face数据集对DeepSeek LLM进行微调,并提供在特定领域数据集上进行训练的代码详细讲解。我们还将讨论所使用的损失函数、为何使用数据子集,以及低秩适应(LoRA)技术如何实现高效内存的微调。 **来源**:DeepSeek AI ![](https://upload-images.jianshu.io/upload_images/17294212-3171a0ac076038b2.png) ### 监督微调(SFT)概述 监督微调(SFT)是在有标签的数据集上对预训练模型进行进一步训练的过程,目的是让模型在特定任务中更专业,比如客户支持、医疗问答或电商推荐等任务。 ### 微调的工作原理 微调需要在特定任务的有标签数据上训练模型,其中: - **输入(X)**:提供给模型的文本数据。 - **目标(Y)**:基于有标签数据的预期输出(例如,情感标签、聊天机器人回复或摘要文本)。 - **损失函数**:用于衡量模型的预测与预期输出的匹配程度。在文本生成中,最常用的损失函数是交叉熵损失。 例如,在IMDB情感数据集上进行微调时: - **输入(X)**:像 “这部电影视觉效果很棒,但情节很薄弱。” 这样的电影评论。 - **目标(Y)**:正确的标签,例如 “正面” 或 “负面” 情感。 对于文本生成任务,输入可以是一个问题,而目标则是模型生成的正确回复。 **使用的损失函数**:交叉熵损失 对于语言模型,我们使用交叉熵损失,它用于计算预测的词元分布与实际目标分布之间的差异, ![](https://upload-images.jianshu.io/upload_images/17294212-b161b5ac46eb291b.png) 目标是在训练过程中最小化这个损失,以便模型学习生成更准确的文本输出。 ### 为何使用数据子集? 在资源有限的硬件上对像DeepSeek LLM这样的大型语言模型进行微调时,使用完整数据集(例如包含25,000个样本的IMDB数据集)进行训练可能会导致训练时间过长和GPU内存问题。为了缓解这些问题,我们采取了以下措施: - **选择子集**:选取500个样本用于训练,100个样本用于评估。 - **保持代表性**:这个子集保留了足够的多样性,以实现合理的性能。 使用较小的数据集可以加快实验速度,同时有效地展示微调概念。对于生产级别的微调,应该在更强大的基础设施上使用更大的数据集。 ### 加载DeepSeek LLM 在微调之前,我们需要加载DeepSeek LLM并为训练做好准备。 **安装所需库** 首先,安装必要的依赖项: ```bash pip install -U torch transformers datasets accelerate peft bitsandbytes ``` **使用4位量化加载模型** 我们使用4位量化,使大型模型能够在有限的GPU内存下运行: ```python from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from peft import LoraConfig, get_peft_model model_name = "deepseek-ai/deepseek-llm-7b-base" bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16 ) tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, quantization_config=bnb_config, device_map="auto" ) lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() print("✅ DeepSeek LLM Loaded with LoRA and 4-bit Precision!") ``` ### 使用Hugging Face数据集进行训练 为了进行微调,我们需要一个高质量的数据集。Hugging Face提供了各种数据集的访问途径。 **选择数据集** 在这个示例中,我们使用IMDB数据集对DeepSeek LLM进行情感分类的微调: ```python from datasets import load_dataset dataset = load_dataset("imdb") ``` **预处理数据集** 将文本转换为模型可接受的分词输入: ```python def tokenize_function(examples): inputs = tokenizer( examples["text"], truncation=True, padding="max_length", max_length=512 ) inputs["labels"] = inputs["input_ids"].copy() return inputs tokenized_datasets = dataset.map(tokenize_function, batched=True) small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(500)) small_test_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(100)) print("Tokenized Sample:") print(small_train_dataset[0]) ``` ### 什么是LoRA(低秩适应)? LoRA(低秩适应)是一种旨在使像DeepSeek LLM这样的大型模型的微调在内存使用上更高效的技术,它通过以下方式实现: - **冻结模型的大部分权重**。 - **在关键层(例如注意力层)引入低秩可训练矩阵**。 这大大减少了可训练参数的数量,同时保留了模型的性能。LoRA使得在资源受限的硬件(例如Colab GPU)上对大型语言模型进行微调成为可能。 **LoRA的工作原理** - **将参数更新分解为低秩矩阵**:(这里需要使用公式编辑工具插入低秩矩阵分解公式,若无法直接插入公式,可使用文字描述:假设原始参数为W,LoRA将其更新分解为W' = W + BA,其中B和A是低秩矩阵)。 - **仅对分解后的矩阵(例如注意力投影)应用更新**。 - **与全量微调相比,减少了内存和计算成本**。 ### 代码详解:微调DeepSeek LLM **设置训练参数** ```python from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./results", evaluation_strategy="epoch", learning_rate=3e-4, per_device_train_batch_size=1, gradient_accumulation_steps=8, num_train_epochs=0.5, weight_decay=0.01, save_strategy="epoch", logging_dir="./logs", logging_steps=50, fp16=True, ) ``` **初始化训练器** ```python trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_test_dataset, ) print("🚀 Trainer Initialized!") ``` **开始微调** ```python print("🚀 Starting Fine-Tuning...") trainer.train() ``` **保存微调后的模型** ```python trainer.save_model("./fine_tuned_deepseek") tokenizer.save_pretrained("./fine_tuned_deepseek") print("✅ Fine-Tuned Model Saved Successfully!") ``` ### 文章参考资料 - **DeepSeek LLM**:[GitHub仓库](https://github.com/DeepSeek-AI/DeepSeek-LLM) - **IMDB数据集**:[Hugging Face数据集](https://huggingface.co/datasets/imdb) - **BitsAndBytes(量化)**:[官方仓库](https://github.com/TimDettmers/bitsandbytes) 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容