minimind - 从零开始训练小型语言模型

embedded/2025/2/3 18:41:00/

大语言模型(LLM)领域,如 GPT、LLaMA、GLM 等,虽然它们效果惊艳, 但动辄10 Bilion庞大的模型参数个人设备显存远不够训练,甚至推理困难。 几乎所有人都不会只满足于用Lora等方案fine-tuing大模型学会一些新的指令, 这约等于在教牛顿玩21世纪的智能手机,然而,这远远脱离了学习物理本身的奥妙。 此外,卖课付费订阅的营销号漏洞百出的一知半解讲解AI的教程遍地, 让理解LLM的优质内容雪上加霜,严重阻碍了学习者。

因此,本项目的目标是把上手LLM的门槛无限降低, 直接从0开始训练一个极其轻量的语言模型。

7200 Stars 750 Forks 32 Issues 4 贡献者 Apache-2.0 License Python 语言

代码: GitHub - jingyaogong/minimind: 🚀🚀 「大模型」3小时完全从0训练26M的小参数GPT!🌏 Train a 26M-parameter GPT from scratch in just 3 hours!

主页: MiniMind Project

更多AI开源软件:AI开源 - 小众AI

Tip

(截至2024-9-17)MiniMind系列已完成了3个型号模型的预训练,最小仅需26M(0.02B),即可具备流畅的对话能力!

模型 (大小)tokenizer长度推理占用release主观评分(/100)
minimind-v1-small (26M)64000.5 GB2024.08.2850'
minimind-v1-moe (4×26M)64001.0 GB2024.09.1755'
minimind-v1 (108M)64001.0 GB2024.09.0160'

该分析在具有Torch 2.1.2、CUDA 12.2和Flash Attention 2的2×RTX 3090 GPU上进行。

主要功能

  • 公开MiniMind模型代码(包含Dense和MoE模型)、Pretrain、SFT指令微调、LoRA微调、DPO偏好优化的全过程代码、数据集和来源。
  • 兼容transformers​、accelerate​、trl​、peft​等流行框架。
  • 训练支持单机单卡、单机多卡(DDP、DeepSpeed)训练,使用wandb可视化训练流程。支持在任意位置停止,及在任意位置继续训练。
  • 在Ceval数据集上进行模型测试的代码。
  • 实现Openai-Api基本的chat接口,便于集成到第三方ChatUI使用(FastGPT、Open-WebUI等)。

安装和使用

环境参考:

CPU: Intel(R) Core(TM) i9-10980XE CPU @ 3.00GHz
内存:128 GB
显卡:NVIDIA GeForce RTX 3090(24GB) * 2
环境:python 3.9 + Torch 2.1.2 + DDP单机多卡训练
  • Ubuntu == 20.04
  • Python == 3.9
  • Pytorch == 2.1.2
  • CUDA == 12.2
  • requirements.txt
📌 开始训练
  • 0、克隆项目代码

    git clone https://github.com/jingyaogong/minimind.git
    cd minimind
    
  • 1、环境安装

    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    # 测试torch是否可用cuda
    import torch
    print(torch.cuda.is_available())
    

    如果不可用,请自行去torch_stable 下载whl文件安装。参考链接

  • 2、如果你需要自己训练

    • 2.1 下载数据集下载地址放到./dataset​目录下

    • 2.2 python data_process.py​处理数据集,例如pretrain数据提前进行token-encoder、sft数据集抽离qa到csv文件

    • 2.3 在./model/LMConfig.py​ 中调整model的参数配置

      这里仅需调整dim和n_layers和use_moe参数,分别是(512+8)​或(768+16)​,对应于minimind-v1-small​和minimind-v1​

    • 2.4 python 1-pretrain.py​ 执行预训练,得到 pretrain_*.pth​ 作为预训练的输出权重

    • 2.5 python 3-full_sft.py​ 执行指令微调,得到 full_sft_*.pth​ 作为指令微调的输出权重

    • 2.6 python 4-lora_sft.py​ 执行lora微调(非必须)

    • 2.7 python 5-dpo_train.py​ 执行DPO人类偏好强化学习对齐(非必须)

  • 3、测试模型推理效果

    • 确保需要使用的,训练完成的参数权重*.pth​文件位于./out/​目录下

    • 也可以直接去训练完成的模型权重下载使用我训练好的*.pth​权重文件

      minimind/out
      ├── multi_chat
      │   ├── full_sft_512.pth
      │   ├── full_sft_512_moe.pth
      │   └── full_sft_768.pth
      ├── single_chat
      │   ├── full_sft_512.pth
      │   ├── full_sft_512_moe.pth
      │   └── full_sft_768.pth
      ├── pretrain_768.pth
      ├── pretrain_512_moe.pth
      ├── pretrain_512.pth
      
    • ​python 0-eval_pretrain.py​测试预训练模型的接龙效果

    • ​python 2-eval.py​测试模型的对话效果

      2-eval

      minimind/images/2-eval.png at master · jingyaogong/minimind · GitHub

🍭「Tip」预训练和全参微调pretrain和full_sft均支持多卡加速

假设你的设备只有1张显卡,使用原生python启动训练即可:

  • 执行预训练或指令微调训练

    python 1-pretrain.py
    # and
    python 3-full_sft.py
    

假设你的设备有N (N>1) 张显卡:

  • 单机N卡启动训练(DDP)

    torchrun --nproc_per_node N 1-pretrain.py
    # and
    torchrun --nproc_per_node N 3-full_sft.py
    
  • 单机N卡启动训练(DeepSpeed)

    deepspeed --master_port 29500 --num_gpus=N 1-pretrain.py
    # and
    deepspeed --master_port 29500 --num_gpus=N 3-full_sft.py
    
  • 开启wandb记录训练过程(非必须)

    torchrun --nproc_per_node N 1-pretrain.py --use_wandb
    # and
    python 1-pretrain.py --use_wandb
    

    通过添加--use_wandb​参数,可以记录训练过程,训练完成后,可以在wandb网站上查看训练过程。通过修改wandb_project​ 和wandb_run_name​参数,可以指定项目名称和运行名称。


http://www.ppmy.cn/embedded/159241.html

相关文章

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 ,文末自助获取源码 \color{red}{T165,文末自助获取源码} T165,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

LeetCode435周赛T2贪心

题目描述 给你一个由字符 N、S、E 和 W 组成的字符串 s,其中 s[i] 表示在无限网格中的移动操作: N:向北移动 1 个单位。S:向南移动 1 个单位。E:向东移动 1 个单位。W:向西移动 1 个单位。 初始时&#…

ubuntu 下使用deepseek

安装Ollama sudo snap install ollama 执行 ollama run deepseek-coder 然后进行等待。。。

【apt源】RK3588 平台ubuntu20.04更换apt源

RK3588芯片使用的是aarch64架构,因此在Ubuntu 20.04上更换apt源时需要使用针对aarch64架构的源地址。以下是针对RK3588芯片在Ubuntu 20.04上更换apt源到清华源的正确步骤: 步骤一:打开终端 在Ubuntu 20.04中,按下Ctrl Alt T打…

Python学习之旅:进阶阶段(五)数据结构-双端队列(collections.deque)

在 Python 的进阶学习过程中,数据结构的掌握至关重要。今天要介绍的双端队列(deque,即 double-ended queue),是一种非常实用的数据结构,Python 的collections模块中的deque类为我们提供了强大的双端队列操作功能。接下来,就一起深入了解双端队列吧。 一、什么是双端队列…

解决国内服务器 npm install 卡住的问题

在使用国内云服务器时,经常会遇到 npm install 命令执行卡住的情况。本文将分享一个典型案例以及常见的解决方案。 问题描述 在执行以下命令时: mkdir test-npm cd test-npm npm init -y npm install lodash --verbose安装过程会卡在这个状态&#xf…

【B站保姆级视频教程:Jetson配置YOLOv11环境(六)PyTorchTorchvision安装】

Jetson配置YOLOv11环境(6)PyTorch&Torchvision安装 文章目录 1. 安装PyTorch1.1安装依赖项1.2 下载torch wheel 安装包1.3 安装 2. 安装torchvisiion2.1 安装依赖2.2 编译安装torchvision2.2.1 Torchvisiion版本选择2.2.2 下载torchvisiion到Downloa…

JavaFX - 3D 形状

在前面的章节中,我们已经了解了如何在 JavaFX 应用程序中的 XY 平面上绘制 2D 形状。除了这些 2D 形状之外,我们还可以使用 JavaFX 绘制其他几个 3D 形状。 通常,3D 形状是可以在 XYZ 平面上绘制的几何图形。它们由两个或多个维度定义&#…