minimind - 從零開始訓練小型語言模型

大語言模型(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.pswp.cn/web/67622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67622.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++動態規劃 離散化】1626. 無矛盾的最佳球隊|2027

本文涉及知識點 C動態規劃 離散化 LeetCode1626. 無矛盾的最佳球隊 假設你是球隊的經理。對于即將到來的錦標賽,你想組合一支總體得分最高的球隊。球隊的得分是球隊中所有球員的分數 總和 。 然而,球隊中的矛盾會限制球員的發揮,所以必須選…

CSS 值和單位詳解:從基礎到實戰

CSS 值和單位詳解:從基礎到實戰 1. 什么是 CSS 的值?示例代碼:使用顏色關鍵字和 RGB 函數 2. 數字、長度和百分比2.1 長度單位絕對長度單位相對長度單位 2.2 百分比 3. 顏色3.1 顏色關鍵字3.2 十六進制 RGB 值3.3 RGB 和 RGBA 值3.4 HSL 和 H…

Privacy Eraser,電腦隱私的終極清除者

Privacy Eraser 是一款專為保護用戶隱私而設計的全能型軟件,它不僅能夠深度清理計算機中的各類隱私數據,還提供了多種系統優化工具,幫助用戶提升設備的整體性能。通過這款軟件,用戶可以輕松清除瀏覽器歷史記錄、緩存文件、Cookie、…

Android 啟動流程

一 Bootloader 階段 在嵌入式系統中,Bootloader的引導過程與傳統的PC環境有所不同,主要是因為嵌入式系統的硬件配置和應用場景更加多樣化。以下是嵌入式系統中Bootloader被引導的一般流程: 1. 硬件復位 當嵌入式設備上電或復位時&#xff…

【數據結構與算法】AVL樹的插入與刪除實現詳解

文章目錄 前言Ⅰ. AVL樹的定義Ⅱ. AVL樹節點的定義Ⅲ. AVL樹的插入Insert一、節點的插入二、插入的旋轉① 新節點插入較高左子樹的左側(左左):右單旋② 新節點插入較高右子樹的右側(右右):左單旋③ 新節點插…

SCRM開發為企業提供全面客戶管理解決方案與創新實踐分享

內容概要 在當今的商業環境中,客戶關系管理(CRM)變得越來越重要。而SCRM(社交客戶關系管理)作為一種新興的解決方案,正在幫助企業徹底改變與客戶的互動方式。快鯨SCRM是一個引人注目的工具,它通…

AI應用部署——streamlit

如何把項目部署到一個具有公網ip地址的服務器上,讓他人看到? 可以利用 streamlit 的社區云免費部署 1、生成requirements.txt文件 終端輸入pip freeze > requirements.txt即可 requirements.txt里既包括自己安裝過的庫,也包括這些庫的…

【C/C++】區分0、NULL和nullptr

🦄個人主頁:小米里的大麥-CSDN博客 🎏所屬專欄:C_小米里的大麥的博客-CSDN博客 🎁代碼托管:C: 探索C編程精髓,打造高效代碼倉庫 (gitee.com) ??操作環境:Visual Studio 2022 目錄 1. 0 和空指針 2. NULL 3. nullptr 總結 …

【Numpy核心編程攻略:Python數據處理、分析詳解與科學計算】2.1 NumPy高級索引:布爾型與花式索引的底層原理

2.1 NumPy高級索引:布爾型與花式索引的底層原理 目錄 #mermaid-svg-NpcC75NxxU2mkB3V {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NpcC75NxxU2mkB3V .error-icon{fill:#552222;}#mermaid-svg-NpcC75…

云原生(五十二) | DataGrip軟件使用

文章目錄 DataGrip軟件使用 一、DataGrip基本使用 二、軟件界面介紹 三、附件文件夾到項目中 四、DataGrip設置 五、SQL執行快捷鍵 DataGrip軟件使用 一、DataGrip基本使用 1. 軟件界面介紹 2. 附加文件夾到項目中【重要】 3. DataGrip配置 快捷鍵使用:C…

【Elasticsearch】match_bool_prefix 查詢 vs match_phrase_prefix 查詢

Match Bool Prefix Query vs. Match Phrase Prefix Query 在 Elasticsearch 中,match_bool_prefix 查詢和 match_phrase_prefix 查詢雖然都支持前綴匹配,但它們的行為和用途有所不同。以下是它們之間的主要區別: 1. match_bool_prefix 查詢…

算法基礎——存儲

引入 基礎理論的進步,是推動技術實現重大突破,促使相關領域的技術達成跨越式發展的核心。 在發展日新月異的大數據領域,基礎理論的核心無疑是算法。不管是技術設計,還是工程實踐,都必須仰仗相關算法的支持&#xff0…

正則表達式入門

入門 1、提取文章中所有的英文單詞 //1.先創建一個Pattern對象,模式對象,可以理解成就是一個正則表達式對象 Pattern pattern Pattern.compile("[a-zA-Z]"); //2.創建一個匹配器對象 //理解:就是 matcher匹配器按照p…

分布式架構中的事務管理:需要了解的常見解決方案

前言 在現代互聯網應用中,分布式架構越來越常見。隨著系統規模的擴大,越來越多的業務和數據被分布到不同的服務和數據庫中。雖然分布式架構帶來了諸多優勢,但也引入了一個新的問題:分布式事務。 一、什么是分布式事務&#xff1…

《TCP 網絡編程實戰:開發流程、緩沖區原理、三次握手與四次揮手》

一、 TCP 網絡應用程序開發流程 學習目標 能夠知道TCP客戶端程序的開發流程1. TCP 網絡應用程序開發流程的介紹 TCP 網絡應用程序開發分為: TCP 客戶端程序開發TCP 服務端程序開發說明: 客戶端程序是指運行在用戶設備上的程序 服務端程序是指運行在服務器設備上的程序,專門…

新年新挑戰:如何用LabVIEW開發跨平臺應用

新的一年往往伴隨著各種新的項目需求,而跨平臺應用開發無疑是當前備受矚目的發展趨勢。在眾多開發工具中,LabVIEW 以其獨特的圖形化編程方式和強大的功能,為開發跨平臺應用提供了有效的途徑。本文將深入探討如何運用 LabVIEW 開發能夠在不同操…

C 語言實現計算一年中指定日期是第幾天?題】

引言 在編程的世界里,處理日期和時間相關的問題是非常常見的。比如在日歷應用、任務管理系統、數據分析等場景中,經常需要計算某個日期在一年中是第幾天。本文將詳細介紹如何使用 C 語言來實現這一功能,通過分析代碼的結構、邏輯以及可能存在…

rsync安裝與使用-linux015

使用 rsync 可以非常高效地將文件或目錄從一個服務器傳輸到另一個服務器。 能力: 支持 64 位文件、64 位 inode、64 位時間戳、64 位長整型支持套接字對、符號鏈接、符號鏈接時間、硬鏈接、硬鏈接特殊文件、硬鏈接符號鏈接支持 IPv6、訪問時間(atimes&…

UE5.3 C++ CDO的初步理解

一.UObject UObject是所有對象的基類,往上還有UObjectBaseUtility。 注釋:所有虛幻引擎對象的基類。對象的類型由基于 UClass 類來定義。 這為創建和使用UObject的對象提供了 函數,并且提供了應在子類中重寫的虛函數。 /** * The base cla…

Pandas基礎06(異常值的檢測與過濾/抽樣/常用聚合函數/數據聚合)

Pandas基礎06 異常值的檢測與過濾 在數據分析中,異常值(Outliers)是指與其他數據點顯著不同的值。這些值可能由于數據錄入錯誤、設備故障或極端情況而產生,因此在進行數據分析之前,需要對其進行檢測與過濾。本文將介紹…