个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

news2025/2/26 19:31:23

最近看到Github上开源了一个小模型的repo,是真正拉低LLM的学习门槛,让每个人都能从理解每一行代码, 从零开始亲手训练一个极小的语言模型。开源地址:
GitHub - jingyaogong/minimind: 🚀🚀 「大模型」2小时完全从0训练26M的小参数GPT!🌏 Train a 26M-parameter GPT from scratch in just 2h!

虽然Github上给出了教程(only text),但还是感觉如果对于纯新手来说还是需要一个图文教程来展示一下。而且对于真小白来说,一些步骤还是需要出详解来解释一下的。

文章下面的操作都是在服务器上进行的,使用的IDE是VSCode的套壳Cursor。因为这个模型比较小,如果不介意的话可以部署在个人电脑上进行实验。

第0步 Clone仓库

使用命令

git clone https://github.com/jingyaogong/minimind.git

将代码clone下来,命令行窗口如下:

打开其中的minimind/requirements.txt,如下图所示

里面是后面要用到的库。

因为后面要训练,就不从huggingface上下模型体验了,直接跳过readme中的“测试已有模型效果”。

第1步 配置环境

对于一个研究牲来说,好的代码管理习惯至关重要。尤其是环境配置方面,本人就因为在一个环境上一直实验装很多东西,导致不兼容等问题。所以建议为一个repo单独开一个环境去跑,这样不影响其他代码。下面配置环境在conda环境下:

# readme中提到了要使用python>=3.10
conda create -n minimind python=3.10

# 进入虚拟环境
conda activate minimind

# 安装需要的库
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

因为是使用清华镜像下载库,所以相对来说会很快。安装后测试一下Torch是否可用cuda,因为可能安装的Torch的版本与cuda版本不适配。

上面输出True就代表cuda可用。

第2步 数据下载

readme中给出了数据的下载地址:

魔搭社区

作者也提供了huggingface的下载地址:

https://huggingface.co/datasets/jingyaogong/minimind_dataset/tree/main

下载方式有多种,这里直接命令行下载所有数据集(建议还是modelscope下载,huggingface有时候太慢):

git lfs install

git clone https://www.modelscope.cn/datasets/gongjy/minimind_dataset.git

数据下载下来就是这个样子:

这样下载的数据文件夹的名字是minimind_dataset,需要改成dataset

可以直接UI界面上改,也可以使用命令:

mv minimind_dataset dataset

第3步 预训练

运行命令

python train_pretrain.py

预训练过程可以学习一下大佬写的代码,毕竟只是去训练不学习一个模型的底层实在有点亏,辜负大佬repo中写的“拉低LLM的学习门槛,让每个人都能从理解每一行代码开始, 从零开始亲手训练一个极小的语言模型”的初衷,下面部分建议配合代码食用。

预训练主流程大致可以分为这几步:

  1. 参数解析设置:一大段phaser的设置,方便后面选择
  2. 模型配置初始化:这里是用一个类LMConfig,来自Model文件夹中LMConfig.py,用于存储模型的超参数和配置信息。除此之外还包含:创建输出目录、设置随机种子、计算每次迭代的token数量。
  3. 训练环境设置:这里设置了根据设备类型来决定是否使用自动混合精度上下文的操作。nullcontext()可能是一个不进行任何特殊操作的上下文管理器,而torch.cuda.amp.autocast()用于在 GPU 上进行自动混合精度计算,可以提高计算效率和减少内存使用。接着尝试从环境变量中获取 “RANK” 的值并转换为整数,如果获取到的值不是 - 1,说明这可能是一个分布式数据并行(Distributed Data Parallel,简称 DDP)运行的场景。这里设置的两个东西都可以提高训练效率。
  4. Wandb配置(如果启用):初始化 wandb,设置项目名称为 args.wandb_project 的值,运行名称为 args.wandb_run_name 的值。
  5. 模型和数据初始化:初始化模型和tokenizer这里用到了上面定义的init_model函数和Model文件夹中dataset.py中PretrainDataset类。
  6. 优化器设置:创建梯度缩放器(用于混合精度训练)。只有当参数 “args.dtype” 的值为 “float16” 或 “bfloat16” 时才启用这个缩放器,目的是在使用低精度数据类型进行训练时,帮助稳定梯度更新,防止梯度下溢或上溢。
  7. 训练循环:训练过程使用余弦调度器动态调整学习率;使用梯度缩放器(scaler)进行反向传播;支持混合精度训练(通过ctx上下文管理器)

训练过程就是如下图所示了:

从这张图中可以看出,epoch设置为1,batch_size为100,loss和学习率都在降低,训练时间大概是两个小时。训练结束后,会在out文件夹中存在一个名为pretrain_512.pth的模型。

第4步 SFT

SFT(Supervised Fine-Tuning,监督微调)是一种在机器学习和深度学习领域中常用的技术。在监督微调中,通常先使用一个在大规模数据上预训练好的模型,然后在特定的有标注的小数据集上进行进一步的训练调整,以适应特定的任务或领域。但是这里的SFT数据可不小,数据文件的大小高达7G,所以微调时间也比较长。

SFT和预训练代码差不多,其中最主要的差别是学习率和epoch数。

# 预训练
learning_rate = 5e-4
accumulation_steps = 8
epochs = 1  # 默认1轮

# SFT微调
learning_rate = 5e-5  # 学习率更小
accumulation_steps = 1
epochs = 6  # 默认6轮

上面差异中积累部署变小是因为需要精细调整,避免过拟合,使用较小的批次更有利于学习细节。这就相当于预训练只是用大刀给木头雕了一个形,后面SFT则是用小刀精雕细琢出细节。

SFT时间比较长,结束后会多出一个full_sft_512.pth文件,大小为98.56M。

第5步 测试效果

运行命令

python eval_model.py --model_mode 1 # 默认为0:测试pretrain模型效果,设置为1:测试full_sft模型效果

预训练模型:

👶: 马克思主义基本原理
🤖️: 是整个社会和文化结构的平衡点,也就是说,哈克思主义主义者在面对危机时被广泛传播,而哈克思主义之路并没有实际化。因此,我们认为,这是一个现实主义的基础概念,因为哈克思主义主义者的思想和行为将永远存在。哈克思主义中的一个重要思想是,即德学派思主义者在面对危机时,大力引发斯坦章的积极影响。因此,马克思主义者在面对危机时也被广泛传播,并成为整个社会文化的基础。
基于以上这段文本内容回答:为什么“哈克思主义”在当时的“威胁”是正确的?
哈克思主义是一种现实主义思想,它在社会和文化结构上具有广泛的应用,因为它是现代社会和文化背景的重要组成部分。虽然哈克思主义者的看法是不同的,它在哲学和物理学方面都被广泛传播。相反,“哈克思主义”在社会文化中扮演着重要的角色,因为它在某些方面扮演着重要的角色。此外,哈克思主义的传播也存在着一些挑战,例如如何控制或攻击人类的利益和创造力等问题。因此,“哈克思主义”在当时的“威胁”是正确的。

👶: 人类大脑的主要功能
🤖️: 包括:工作、生活、工作、家庭、社交、社交、人际、工作、人际、家庭、人际、沟通、情感、娱乐、社交、社交、沟通、人际、友、社交、社交、人际关系。

在我们的生活中,许多人都对工作、生活、工作和家庭、家庭和工作都产生了紧张、不开忐、忽略的感受。我们与同事、家人、朋友、同事、商务、客户、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通、沟通

👶: 万有引力原理是
🤖️: 恒星,但它们都是由于恒星的引力而形成的。根据物理学中的第二个宇宙行星,恒星和行星围绕着恒星旋转,并相互融合,形成了一个类似于恒星的行星。而行星围绕恒星的运动,通常有不同的视觉位置,每个星球都在宇宙中形成了一个新的轨道。

基于以上这段文本内容回答:
什么是恒星?恒星和行星之间的引力作用是什么?
恒星是指恒星的引力作用,它们围绕恒星、行星围绕恒星旋转,以及它们相互融合的运动。恒星则由恒星的引力作用而形成的,它们在恒星中存在着几乎所有恒星。恒星和行星围绕恒星的引力影响了它强大的引力作用。
恒星的主要作用是恒星的质量,它的体积和质量大约是太阳系内最深的,质量也在上升到太阳系最远的轨道。恒星则是以恒星和行星绕恒星旋转,它们的演化出大量的能量,其形成和形成了一个独特的物体,形成了一个恒星。
通过黑洞的运动,恒星的引力作用产生了许多重要的特征,比如恒星的引力、质量和引力。因此,恒星在恒星和星球上存在着许多奇特的物理现象。

👶: 世界上最高的山峰是
🤖️: 珠穆朗玛峰。珠穆朗玛峰是世界上最高的山峰之一,但它们的高度影响范围非常广。珠穆朗玛峰高度深受人们喜爱,它们是世界上海平面最高峰之一,也是世界上海平面最高峰。珠穆朗玛峰的高度受到了影响。珠穆朗玛峰高度达到了8,848米,而珠穆朗玛峰是世界上最高的山峰。珠穆朗玛峰的高度可能因其高度、高度和高度的高来受影响而而受到其独特的威胁。珠穆朗玛峰的高度以及它的高度。珠穆朗玛峰是全球最高的峰峰,但也有其独特的特征。珠穆朗玛峰的高度可见。珠穆朗玛峰的高度可能因其高度、高度和高度而闻名。珠穆朗玛峰的高度,其中有许多高度,包括登山者们登顶珠穆朗玛峰。珠穆朗玛峰在珠穆朗玛峰的高度也会因其高度、高度、高度的高来收益而受到人们的喜爱。珠穆朗玛峰的高度可能是珠穆朗玛峰的高度,但是珠穆朗玛峰的高度可能与珠穆朗玛峰的高度相差10,848米。

👶: 二氧化碳在空气中
🤖️: 升起并提高了能源效率。这些成本可以帮助能源系统的生产和消费。通过大型数据分析,人们可以更快地适应和减少污染物的排放。此外,许多地区的污染物质和大量物种也在减少了废弃物的排放。
基于以上这段文本重新润色,保证意思一致。
二氧化碳是人类最常见的能源来源之一,它不仅能够释放大量的二氧化碳,而且还能够减少能源的成本。通过这些措施,能源系统能够满足人们的能源需求,并减少对化石燃料的依赖。此外,通过使用这些方法,人们可以更快地适应和减少污染物的排放。此外,大型数据分析也在减少碳排放。
二氧化碳的生产和消费方式将成为环保的重要组成部分,对环境和人类经济产生着不可或缺的作用。现代数据分析,个人的生产和消费量将减少,垃圾处理成本将减少。
除此之外,有许多地区的工业生产和消费,但在空气中升会释放大量的二氧化碳,这些碳通过引入它们来保持能源的可持续性。这不仅能减少二氧化碳的排放,还能提高人们的能源效率,从而降低环境污染物的排放。

👶: 地球上最大的动物有
🤖️: 体重:

地球上最大的动物是大熊,每只大熊都拥有1/2米的体重,且它们的体重可达到50倍。

在这一尺度下,大熊猫需要适当的蛋白质来源,包括根、茎、树、叶、斑马、老虎等。这些生物通常具有卵和繁殖能力,有很强的运动能力。

大熊猫需要进行许多任务才能生存,包括它们需要足够的蛋白质、维生素、矿物质等。

然而,这个动物还有很多其他类型的生物,比如大熊猫、狮子、长颈鹿、大熊猫等。

在这种情况下,大熊猫并不能成为濒危物种,因为它们通常被视为濒危物种。

虽然大熊猫只是一种大型猫,但它们的体重可以超过100倍。


虽然大熊猫不是大型猫,但大熊猫需要适当的蛋白质来生存。


尽管大熊猫也有一些共同点,例如大熊猫的体重超过了500倍。



但这个动物还有很多其他类型的生物,如大熊猫、狮子、长颈鹿等。


虽然大熊猫非常栖息,但大熊猫的繁殖能力非常好,因为它们通常被视为濒危物种。




因此,尽管大熊猫在环境中扮演了重要的角色,但由于其特殊情况下,大熊猫的体重超过了200倍。

👶: 杭州市的美食有
🤖️: 哪些?
杭州市的美食有哪些?首先,杭州市的美食有多种不同的菜品。例如,浙江省的牛肉煲和牛肉煲,这些食材都是以烤制而成的,是人体最好的。另外,杭州的牛肉煲和牛肉煲都是杭州市最受欢迎的菜肴,每年都会放上浆果酱和牛肉煲,成为杭州市最受欢迎的菜肴之一。

最后,杭州市的美食也很有名,比如大蒜煲、西兰花煲和洋葱等。此外,杭州市的牛肉煲和牛肉煲都是以沙拉、西兰花、蘑菇等为主要食材。

因此,�杭州市最受欢迎的餐厅是杭州市的美食,除了您所喜欢的菜品,您可以选择自己喜欢的菜品,这是一道简单而美味的菜品。请按照以下步骤来选用“�杭州市的美食有多种不同:
1. �杭州市最受欢迎的菜肴之一:杭州市是一个非常受欢迎的餐厅,以小米肉煲、西兰花煲和意大利肉煲,在这里留下精美的味道,是�杭州市最受欢迎的菜肴之一。

2. 杭州市的牛肉煲:南州市最著名的价格是京都,在那里,我们会在那里举行各种菜肴,可以参观,还可以观赏到中式的牛肉煲、西兰花煲和洋葱等。

SFT模型:

👶: 请介绍一下自己。
🤖️: 我是一个语言模型,我的知识范围很广泛,可以被生成并归纳为自然语言处理、机器翻译、情感分析等相关领域。

👶: 你更擅长哪一个学科?
🤖️: 我是人工智能助手,不过我被编程来理解和回答各种问题。

👶: 鲁迅的《狂人日记》是如何批判封建礼教的?
🤖️: 《狂人日记》是我国的一部小说,主要讲述了一个普通农民福贵的一生。该书通过一系列的历史事件和人物展现了当时社会的种种弊病和道德困境,强调了人性中的矛盾和无常。在《狂人日记》中,他通过自己的智慧和善良,向读者展示了人性的复杂性和对于社会的负面影响。

👶: 我咳嗽已经持续了两周,需要去医院检查吗?
🤖️: 如果你不知道咳嗽的严重程度,并且已经变动了,建议尽快去医院进行检查。

👶: 详细的介绍光速的物理概念。
🤖️: 光速是指光在真空中,在真空中,光速在时间的平方之和之计算量的值。

👶: 推荐一些杭州的特色美食吧。
🤖️: 如果你喜欢西餐,我推荐你去尝试一下杭州的各种特色小吃。如果你想尝试一些口感较为辣的菜肴,我会推荐你尝试一下麻婆豆腐和宫保鸡丁。

👶: 请为我讲解“大语言模型”这个概念。
🤖️: 一般来说,自然语言模型是一种将自然语言转换为计算机可处理的形式。这种模型使用大量的语料库来训练模型,以处理各种语言任务。例如,我们可以使用语言模型来生成各种类型的文本,如文章、诗歌、段落等。

👶: 如何理解ChatGPT?
🤖️: 解释ChatGPT的关键是理解模板和数据结构的位置。ChatGPT是一种数据传输方式,它允许使用复杂的算法来访问数据。而数据结构则允许使用复杂的传输函数将数据传输到传输器上,从而实现数据的传输。

👶: Introduce the history of the United States, please.
🤖️: 你是一个开放型的AI助手,我能够生成各种类型的文本。您需要提供一些相关的信息吗?

可以看出SFT后的结果要优于预训练。但是,如果要自己手动输入问一个问题,比如我输入的是"范式"的英文是什么,这个问题可能超过了minimind模型的知识范围,就回答不出来。

👶: "范式"的英文是什么
🤖️: 中文的英文是 "reception`。

👶: "范式"的英文是什么
🤖️: “范式”的英文是中文。

👶: "范式"的英文是什么
🤖️: 通常的英文是指英语中的“Herit”在英语中的使用,而“Illusion”则是指英语中的一种语言,它的目的是将语言融入英语中,包括口语、阅读、写作和口语等。

👶: "范式"的英文是什么
🤖️: 这个说法是错误的,但是它并不对应于英文。英文通常是使用英文表达方式,例如使用英语、中文或其他语言。

👶: "范式"的英文是什么
🤖️: 称为“范式”通常是指在计算机或电子设备上使用的一种语言。范式通常包含一些关键词,例如主语、谓语和宾语。在不同的上下文中,范式可以有不同的含义,例如在计算机科学中,范式可能指的是用于编程语言的语法结构。

测试模型的代码中比较重要的是:

parser.add_argument('--temperature', default=0.85)  # 生成温度
parser.add_argument('--top_p', default=0.85)       # 采样阈值
parser.add_argument('--history_cnt', default=0)     # 历史对话轮数
parser.add_argument('--model_mode', default=0)      # 模型类型
parser.add_argument('--lora_name', default='None')  # LoRA适配器
parser.add_argument('--max_seq_len', default=8192)  # 最大序列长度

一些生成过程中的参数,通过设置这些参数就可以:

  • 支持LoRA适配器加载
  • 支持多轮对话历史

这个时候就已经训练出一个回答还算靠谱的模型了,就只有接近100MB的大小。但微调并不是只有SFT这一种方法。

第6步 知识蒸馏(Knowledge Distillation, KD)

 知识蒸馏可以进一步优化模型的性能和效率,所谓知识蒸馏,即学生模型面向教师模型学习教师模型通常是经过充分训练的大模型,具有较高的准确性和泛化能力。 学生模型是一个较小的模型,目标是学习教师模型的行为,而不是直接从原始数据中学习。 在SFT学习中,模型的目标是拟合词Token分类硬标签(hard labels),即真实的类别标签(如 0 或 6400)。 在知识蒸馏中,教师模型的softmax概率分布被用作软标签(soft labels)。小模型仅学习软标签,并使用KL-Loss来优化模型的参数。 通俗地说,SFT直接学习老师给的解题答案。而KD过程相当于“打开”老师聪明的大脑,尽可能地模仿老师“大脑”思考问题的神经元状态。

 知识蒸馏的目的只有一个:让小模型体积更小的同时效果更好。 然而随着LLM诞生和发展,模型蒸馏一词被广泛滥用,从而产生了“白盒/黑盒”知识蒸馏两个派别。 GPT-4这种闭源模型,由于无法获取其内部结构,因此只能面向它所输出的数据学习,这个过程称之为黑盒蒸馏,也是大模型时代最普遍的做法。 黑盒蒸馏与SFT过程完全一致,只不过数据是从大模型的输出收集,因此只需要准备数据并且进一步FT即可。

蒸馏前我们需要先得到一个教师模型,蒸馏的代码中有用到维度为768的模型,所以重新训一个:

python train_pretrain.py --dim 768 --n_layers 16
python train_full_sft.py --dim 768 --n_layers 16

我这里获得的max_seq_len数据有1024和2048的,所以选择的是1024的版本。但是出现内存不够的错误:

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 1.56 GiB. GPU 3 has a total capacity of 31.73 GiB of which 742.19 MiB is free. Including non-PyTorch memory, this process has 31.00 GiB memory in use. Of the allocated memory 30.52 GiB is allocated by PyTorch, and 17.92 MiB is reserved by PyTorch but unallocated.

服务器上的卡是V100,显存是32G,sft的默认bath_size是128,可以减小bath_size让其跑起来。

再使用教师模型蒸馏一个学生模型,因为作者也提到了“MiniMind同系列本身并不存在强大的教师模型”,所以蒸馏出来的效果也没有保证:

python train_distillation.py --data_path ./dataset/sft_512.jsonl

这里添加一个sft的数据地址,因为默认的数据地址是"./dataset/sft_data.jsonl",数据文件中没有这个文件。

再看蒸馏的代码,蒸馏过程包括以下几个总体步骤

1. 前向传播:

  • 学生模型和教师模型都对输入数据进行前向传播,生成各自的输出(logits)。

2. 计算损失:

  • 使用教师模型的输出和学生模型的输出计算蒸馏损失(Distillation Loss),通常使用 Kullback-Leibler 散度(KL Divergence)来衡量两者之间的差异。

3. 反向传播:

  • 根据计算出的损失进行反向传播,更新学生模型的参数。

我画了个流程图:

蒸馏的时间很长,设置了5个epoch,如果不调其他参数,这个训练的时间会达到10个小时。

训练结束后就会获得一个full_dist_512.pth文件,这就是蒸馏后的模型, 我们来试试它的效果。

先修改一下评估模型代码中的这个地方:

运行下面命令

python eval_model.py --model_mode 4

很不幸,受限于参数体量本身就不大,所以效果依旧不怎么样

第7步 人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF)

运行命令

python train_dpo.py

在前面的训练步骤中,模型已经具备了基本的对话能力,但是这样的能力完全基于单词接龙,缺少正反样例的激励。 模型此时尚未知什么回答是好的,什么是差的。RLHF是希望它能够更符合人的偏好,降低让人类不满意答案的产生概率。 这个过程就像是让模型参加新的培训,从优秀员工的作为例子,消极员工作为反例,学习如何更好地回复。

代码中使用的是直接偏好优化(Direct Preference Optimization, DPO)。 与PPO(Proximal Policy Optimization)这种需要奖励模型、价值模型的RL算法不同; DPO通过推导PPO奖励模型的显式解,把在线奖励模型换成离线数据,Ref模型输出可以提前保存。 DPO性能几乎不变,只用跑 actor_model 和 ref_model 两个模型,大大节省显存开销和增加训练稳定性。

整个训练过程大致与sft相同,只是使用 DPO 方法计算损失,DPO 通过比较不同输出的概率来优化模型。它的代码如下:

def dpo_loss(ref_probs, probs, beta):
    # ref_probs 和 probs 都是 shape: (batch_size, seq_len)
    # 计算每个样本的平均概率
    ref_probs = ref_probs.mean(dim=1)
    probs = probs.mean(dim=1)

    # 将 chosen 和 rejected 数据分开
    batch_size = ref_probs.shape[0]
    chosen_ref_probs = ref_probs[:batch_size // 2]
    reject_ref_probs = ref_probs[batch_size // 2:]
    chosen_probs = probs[:batch_size // 2]
    reject_probs = probs[batch_size // 2:]

    pi_logratios = chosen_probs - reject_probs
    ref_logratios = chosen_ref_probs - reject_ref_probs
    logits = pi_logratios - ref_logratios
    loss = -F.logsigmoid(beta * logits)
    return loss.mean()
  • ref_probs:

这是参考模型(通常是一个预训练的教师模型)生成的输出概率。它表示参考模型对输入数据的预测概率,通常用于提供一个基准或参考。

  • probs:

这是当前训练模型(学生模型)生成的输出概率。它表示学生模型对输入数据的预测概率。

  • 偏好比较:

DPO 通过比较不同输出的概率来优化模型。具体来说,它将模型生成的输出分为“选择的”(chosen)和“拒绝的”(rejected)两类,并计算它们的概率。

  • 损失计算:

DPO 的损失函数通常基于对数几率(logits)之间的差异。通过最大化选择输出的概率和最小化拒绝输出的概率,模型能够学习到更符合人类偏好的输出。

第8步 LoRA (Low-Rank Adaptation)

LoRA是一种高效的参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)方法,旨在通过低秩分解的方式对预训练模型进行微调。 相比于全参数微调(Full Fine-Tuning),LoRA 只需要更新少量的参数。 LoRA 的核心思想是:在模型的权重矩阵中引入低秩分解,仅对低秩部分进行更新,而保持原始预训练权重不变。

repo作者代码中完全从0实现LoRA流程,不依赖第三方库的封装。

python train_lora.py

运行会出现错误:

Traceback (most recent call last):
  File "/home/zhanglj2023/lmh/minimind/train_lora.py", line 194, in <module>
    train_epoch(epoch, wandb)
  File "/home/zhanglj2023/lmh/minimind/train_lora.py", line 83, in train_epoch
    save_lora(model, f'{args.save_dir}/lora/{args.lora_name}_{lm_config.dim}.pth')
  File "/home/zhanglj2023/lmh/minimind/model/model_lora.py", line 49, in save_lora
    torch.save(state_dict, path)
  File "/home/zhanglj2023/anaconda3/envs/minimind/lib/python3.10/site-packages/torch/serialization.py", line 628, in save
    with _open_zipfile_writer(f) as opened_zipfile:
  File "/home/zhanglj2023/anaconda3/envs/minimind/lib/python3.10/site-packages/torch/serialization.py", line 502, in _open_zipfile_writer
    return container(name_or_buffer)
  File "/home/zhanglj2023/anaconda3/envs/minimind/lib/python3.10/site-packages/torch/serialization.py", line 473, in __init__
    super().__init__(torch._C.PyTorchFileWriter(self.name))
RuntimeError: Parent directory out/lora does not exist.

说明在训练开始之前,代码没有检查并创建保存模型所需的目录结构。如果 out/lora 目录未被创建,保存操作将失败,所以需要代out目录下创建一个lora的文件。

因为更新的参数量小,所以训练很快。

第9步 训练推理模型 (Reasoning Model)

因为DeepSeek-R1实在太火了,然而一个遗憾的共识是:参数太小的模型直接通过冷启动SFT+GRPO几乎不可能获得任何推理效果,所以作者以蒸馏的方式对模型进行推理训练。

python train_distill_reason.py

加一个模型读取:

运行

python eval_model.py --model_mode 5

可以看出有推理的过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具 功能&#xff1a;视频 音频 图片 文档PDF格式 各种转换&#xff0c;同格式调整压缩比例&#xff0c;调整大小 特色&#xff1a;果风图标 好看; 支持多任务队列&#xff0c;完成自动关机 下载地址&#xff1…

KafkaTool

Offset Explorer 第一次打开需要配置kafka相关配置连接 随便先启动一个Kafka(先启动zookeeper) 设置key value 记得刷新

基于C++“简单且有效”的“数据库连接池”

前言 数据库连接池在开发中应该是很常用的一个组件&#xff0c;他可以很好的节省连接数据库的时间开销&#xff1b;本文基使用C实现了一个简单的数据库连接池&#xff0c;代码量只有400行只有&#xff0c;但是压力测试效果很好&#xff1b;欢迎收藏 关注&#xff0c;本人将会…

国产编辑器EverEdit - 洞察秋毫!文件比较功能!

1 文件比较 1.1 应用场景 项目开发过程中&#xff0c;可能不同的部分会由不同的人在负责&#xff0c;存在一个文件多人编辑的情况&#xff0c;用户需要寻找差异&#xff0c;并将文档进行合并&#xff0c;比较专业的文本比较工具为BeyondCompare&#xff0c;WinMerge等。   如…

QARepVGG--含demo实现

文章目录 前言引入Demo实现总结 前言 在上一篇博文RepVGG中&#xff0c;介绍了RepVGG网络。RepVGG 作为一种高效的重参数化网络&#xff0c;通过训练时的多分支结构&#xff08;3x3卷积、1x1卷积、恒等映射&#xff09;和推理时的单分支合并&#xff0c;在精度与速度间取得了优…

kotlin 知识点 七 泛型的高级特性

对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的&#xff0c;因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化&#xff0c;就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前&#xff0c;Java 是没有泛型功能的&#xff0c;…

Transformer LLaMA

一、Transformer Transformer&#xff1a;一种基于自注意力机制的神经网络结构&#xff0c;通过并行计算和多层特征抽取&#xff0c;有效解决了长序列依赖问题&#xff0c;实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs&#xff0c;完全依靠 Attention的优…

Qt学习 网络编程 TPC通信

一 基本网络端口 1 网络编程基本概念 通讯方式&#xff1a;信息的通讯时通过网络来进行&#xff0c;通讯方式有两种&#xff0c;TCP和UDP通信&#xff0c;TCP通讯是专用通道&#xff0c;指定某个信息只能走某个通道&#xff0c;UDP则是非专用通道&#xff0c;比如一个车队&am…

ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析

一、基础知识 本篇我们使用 BOOT 按键来学习一下 GPIO 功能&#xff0c;首先补充一下相关术语介绍。 1、GPIO&#xff08;General Purpose Input/Output&#xff09; GPIO 是微控制器上的通用引脚&#xff0c;既可以作为输入&#xff08;读取外部信号&#xff09;&#xff0…

ssh配置 远程控制 远程协作 github本地配置

0.设备版本 windows11 ubuntu24.0.4 1.1 在 Linux 上启用 SSH 服务 首先&#xff0c;确保 Linux 计算机上安装并启用了 SSH 服务。 安装和启动 OpenSSH 服务&#xff08;如果未安装&#xff09; # 在终端安装 OpenSSH 服务&#xff08;如果尚未安装&#xff09; sudo apt …

C++知识整理day9——继承(基类与派生类之间的转换、派生类的默认成员函数、多继承问题)

文章目录 1.继承的概念和定义2.基类与派生类之间的转换3.继承中的作用域4.派生类的默认成员函数5.实现一个不能被继承的类6.继承与友元7.继承与静态成员8.多继承和菱形继承问题8.1 继承分类及菱形继承8.2 虚继承 1.继承的概念和定义 概念&#xff1a; 继承(inheritance)机制是⾯…

2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序

2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”&#xff0c;又称“盘龙”&#xff0c;是浙闽地区的传统地方民俗文化活动。人们将少则几十条&#xff0c;多则上百条的板凳首尾相连&#xff0c;形成蜿蜒曲折的板凳龙。盘龙时&#xff0c;龙头在前领头&#x…

华为认证考试证书下载步骤(纸质+电子版)

华为考试证书可以通过官方渠道下载相应的电子证书&#xff0c;部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下&#xff1a; ①访问华为培训与认证网站 打开浏览器&#xff0c;登录华为培训与认证官方网站 ②登录个人账号 在网站首页&#xff0c;点…

【Android】用 chrome://inspect/#devices 调试H5页面

通常做Android开发的过程中&#xff0c;不可避免的需要遇到去与H5交互&#xff0c;甚至有时候需要去调试H5的信息。 这里分享一下Android工程里如何调试H5页面信息&#xff1a; 直接在浏览器地址栏输入 &#xff1a; chrome://inspect/#devices 直接连接手机usb,打开开发者模式…

贪心算法精品题

1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…

WEB1~6通杀

##解题思路 这六道题&#xff0c;通杀了&#xff0c;只因为是PHP的特性 来&#xff0c;看web6&#xff0c;过滤最复杂的正则&#xff0c;而且不能解析成大于999的值&#xff0c;但是&#xff0c;php是弱类型的语言&#xff0c;我只要输入任意字符数字&#xff0c;最终值就为0&…

孜然单授权系统V2.0PHP授权系统

孜然单授权V1.0系统&#xff0c;延续了2022年开发的孜然多应用授权系统V2.0 变更&#xff1a;多应用变单系统&#xff0c;去除没用的垃圾代码&#xff0c;从0开发&#xff0c;去除了一些没用的功能 完善了开发文档&#xff0c;之前那套是我写着玩的屎山代码&#xff0c;V1.0将展…

Apache SeaTunnel 构建实时数据同步管道(最新版)

文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member&#xff0c;Apache SkyWalking Committer&#xff0c;多年平台研发经验&#xff0c;目前专注于数据集成领域。 导读 在当今数字化快速发展的时代&#xff0c;数据已然成为企业决策…

服务器离线部署DeepSeek

目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网&#xff0c;因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…

ComfyUI:Stable Diffusion 及 LoRA、VAE 、ControlNet模型解析

目录 Stable Diffusion流程 扩散过程 去噪过程 checkpoints LoRA LoRA 位置与结构 LoRA 层与原层的关系 LoRA 层的参数拆解 VAE 训练特定 VAE 时更新的参数部分 ControlNet ControlNet 位置与结构 ControlNet 的训练过程 ControlNet 的参数处理与信息融合 Contr…