從零實現Llama3中文版

1.前言

一個月前,Meta 發布了開源大模型 llama3 系列,在多個關鍵基準測試中優于業界 SOTA 模型,并在代碼生成任務上全面領先。

此后,開發者們便開始了本地部署和實現,比如 llama3 的中文實現、llama3 的純 NumPy 實現等。

幾天前,有位名為「Nishant Aklecha」的開發者發布了一個從零開始實現 llama3 的存儲庫,包括跨多個頭的注意力矩陣乘法、位置編碼和每個層在內都有非常詳細的解釋,幫助我們理解大語言模型是如果構建和工作的。

在這里插入圖片描述

該項目得到了大神 Karpathy 的稱贊,他表示項目看起來不錯,完全展開后,通過模塊嵌套和相互調用,可以更容易看到實際的情況。

項目地址:https://github.com/naklecha/llama3-from-scratch

2.從零實現Llama3中文版

詳細實現見倉庫地址:wdndev/llama3-from-scratch-zh: 從零實現一個 llama3 中文版

項目主要翻譯「Nishant Aklecha」的 llama3-from-scratch 倉庫,并對中文版做了特殊的適配,使該項目能在一臺 16G RAM 的筆記本電腦上運行

  1. 將英文翻譯為中文,文中的 Youtube 視頻也替換為 Bilibili鏈接,方便查看;
  2. 將原版 Llama3-8B模型上傳至Modescope社區,方便國內下載;
  3. 因原版 Llama3-8B 模型采用32層 Transformers,且大佬「Nishant Aklecha」使用CPU加載,如果加載全部的參數,16G內存機器加載失敗,故選取原版 Llama3-8B 模型權重的前2層,重新保存,大小約占為2.7G,此教程也可以直接加載,實際測試內存占用約4~5G,唯一缺點是后續推理結果不對,但不影響學習矩陣變換等其他知識;
  4. Jupyter文件,可直接在 16G RAM 筆記本電腦運行;

2.1 實現細節

  1. 分詞器(Tokenizer):
    • 使用tiktoken庫進行文本分詞。
    • 定義了一些特殊標記,如文本開始<|begin_of_text|>、文本結束<|end_of_text|>等。
    • 通過tokenizer.encode將文本轉換為標記序列,通過tokenizer.decode將標記序列轉換回文本。
  2. 模型權重和配置:
    • 加載Llama3-8B模型Pytorch格式權重。
    • 加載Llama3-8B模型配置,包括:
      • 維度dim: 4096
      • 層數n_layers: 32
      • 注意力頭數n_heads: 32
      • 鍵值頭數n_kv_heads: 8
      • 詞匯表大小vocab_size: 128256
      • 其他參數如multiple_offfn_dim_multipliernorm_epsrope_theta等。
  3. 文本到標記(Tokenization):
    • 使用分詞器將輸入文本轉換為標記序列。
    • 將標記轉換為對應的標記ID。
  4. 標記嵌入(Embeddings):
    • 使用torch.nn.Embedding層將標記ID轉換為詞嵌入向量。
    • 將詞嵌入向量進行歸一化處理。
  5. Transformer層:
    • 實現了Transformer模型的一個層,包括:
      • 歸一化: 使用RMS歸一化對輸入進行歸一化。
      • 注意力機制:
        • 使用模型權重初始化查詢(Query)、鍵(Key)、值(Value)矩陣。
        • 對查詢矩陣進行拆分,得到每個注意力頭的查詢向量。
        • 通過點積計算查詢向量與鍵向量的關系,得到注意力分數矩陣。
        • 對注意力分數應用掩碼,防止未來信息的泄露。
        • 使用Softmax函數對注意力分數進行歸一化。
        • 將歸一化的注意力分數與值向量相乘,得到加權的值向量。
      • 多頭注意力: 對每個注意力頭重復上述過程,并將結果合并。
      • 輸出權重: 使用模型權重將注意力輸出映射到最終的輸出向量。
  6. 前饋網絡(Feed-Forward Network):
    • 使用SwiGLU網絡架構,增加模型的非線性表達能力。
    • 通過矩陣乘法實現前饋網絡的計算。
  7. 多層堆疊:
    • 將上述Transformer層和前饋網絡堆疊32層。
    • 每一層都會對輸入進行更復雜的變換和抽象。
  8. 輸出解碼:
    • 使用模型的輸出層權重將最終的嵌入向量映射到詞匯表上。
    • 通過取最大值獲取預測的下一個標記ID。
    • 使用分詞器將標記ID解碼回文本。

2.2 總結

  • 詳細展示了從頭開始構建大型語言模型的一個層的完整過程。
  • 通過分步實現文本分詞、標記嵌入、注意力機制、多頭注意力、前饋網絡等關鍵組件,讓讀者能夠深入理解模型的工作原理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16090.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16090.shtml

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

相關文章

數據結構——鏈式二叉樹知識點以及鏈式二叉樹數據操作函數詳解!!

引言&#xff1a;該博客將會詳細的講解二叉樹的三種遍歷方法&#xff1a;前序、中序、后序&#xff0c;也同時會講到關于二叉樹的數據操作函數。值得一提的是&#xff0c;這些函數幾乎都是建立在一個函數思想——遞歸之上的。這次的代碼其實寫起來十分簡單&#xff0c;用不了幾…

告別紅色波浪線:tsconfig.json 配置詳解

使用PC端的朋友&#xff0c;請將頁面縮小到最小比例&#xff0c;閱讀最佳&#xff01; tsconfig.json 文件用于配置 TypeScript 項目的編譯選項。如果配不對&#xff0c;就會在項目中顯示一波又一波的紅色波浪線&#xff0c;警告你這些地方的類型聲明存在問題。 一般我們遇到這…

在沒有dubbo-admin情況下如何判斷zk中注冊的dubbo服務是否注冊成功

通常我們都是通過dubbo-admin來查看dubbo服務是否注冊成功&#xff0c;那么如果沒有部署dubbo-admind的情況下&#xff0c;我們如何來判斷dubbo服務是否注冊成功&#xff1a; 一、首先我們進入到zookeeper bin目錄下使用以下指令連接到zk: ./zkCli.sh -server ip:port ip&…

Linux文件系統原理

Linux文件系統 馮諾依曼在1945年提出計算機的五大組成部分 運算器&#xff1a;CPU 控制器&#xff1a;CPU 存儲器&#xff1a;內存和硬盤 輸入設備&#xff1a;鼠標、硬盤 輸出設備&#xff1a;顯示器一、硬盤結構 機械硬盤結構 扇區&#xff1a;硬盤的最小存儲單位&#xff…

Transformer講解大綱,寫PPT的可參考

前言 在這個信息如星辰般璀璨的時代,我們被無數的語言和文字包圍。它們如同夜空中閃爍的繁星,每一顆都蘊藏著獨特的故事和知識。然而,如何解讀這些星辰的秘密,如何將它們的光芒匯聚成智慧的海洋,成為了我們這個時代的挑戰。今天,我們將一起探索一種名為Transformer的神秘…

【路徑規劃】基于遺傳算法GA實現最短距離 多起點多終點多旅行商問題求解附Matlab代碼

基于遺傳算法GA實現最短距離 多起點多終點多旅行商問題求解 研究背景:研究步驟:研究方法和技術路線:代碼研究背景: 多起點多終點多旅行商問題是旅行商問題(TSP)的一個擴展,該問題要求確定多個旅行商從各自的起點出發,分別經過一系列目標點最終回到各自的終點,使得總路…

IOT技術怎么落地?以寶馬,施耐德為例

物聯網技術 物聯網&#xff08;IoT&#xff09;技術正逐漸成為數字化工廠轉型的核心驅動力。本文將通過實際案例&#xff0c;探討IoT技術如何促進制造業的數字化轉型&#xff0c;提高生產效率&#xff0c;降低成本&#xff0c;并提升產品質量。 1. 物聯網技術簡介 物聯網技術通…

vue 模擬隨機經緯度(小數點后保留6位),直接可用

1.隨機生成經緯度 // 隨機生成經緯度的方法function generateRandomLatLng(latitudeRange, longitudeRange) {const randomLat (Math.random() * latitudeRange.max latitudeRange.min).toFixed(6)const randomLng (Math.random() * longitudeRange.max longitudeRange.mi…

MySQL數據庫基礎:使用、架構、SQL語句、存儲引擎

文章目錄 什么是數據庫CS模式 基本使用安裝鏈接服務器服務器、數據庫、表關系簡單使用數據庫在Linux下的體現 MySQL架構連接器層客戶端層服務層存儲引擎層物理存儲層 SQL分類存儲引擎 什么是數據庫 mysql&#xff1a;數據庫服務的客戶端mysqld&#xff1a;數據庫服務的服務器端…

PLC_博圖系列?R_TRIG:檢測信號上升沿

PLC_博圖系列?R_TRIG&#xff1a;檢測信號上升沿 文章目錄 PLC_博圖系列?R_TRIG&#xff1a;檢測信號上升沿背景介紹R_TRIG&#xff1a; 檢測信號上升沿說明參數示例 關鍵字&#xff1a; PLC、 西門子、 博圖、 Siemens 、 R_TRIG 背景介紹 這是一篇關于PLC編程的文章&a…

[ C++ ] 類和對象( 中 ) 2

目錄 前置和后置重載 運算符重載和函數重載 流插入流提取的重載 全局函數訪問類私有變量 友員 const成員 取地址及const取地址操作符重載 前置和后置重載 運算符重載和函數重載 流插入流提取的重載 重載成成員函數會出現順序不同的情況&#xff08;函數重載形參順序必須相…

數據結構(五)樹與二叉樹

2024年5月26日一稿(王道P142) 基本概念 術語 性質 二叉樹 5.2.2 二叉樹存儲結構

Spring從零開始學使用系列(三)--Spring框架中@Value注解和配置管理詳解

如果各位老爺覺得可以&#xff0c;請點贊收藏評論&#xff0c;謝謝啦&#xff01;&#xff01; 文章中涉及到的圖片均由AI生成 公眾號在最下方&#xff01;&#xff01;&#xff01; 目錄 1. 如何在Spring中使用Value注解 1.1 基本用法 1.2提供默認值 2. 如何配置和使用Prop…

嵌入式進階——數碼管2

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 驅動封裝封裝的一些疑問數字走馬燈實現擴展知識 驅動封裝 根據前面的內容可以將代碼進行封裝&#xff0c;封裝后作為一個獨立的整…

貪心題目總結

1. 最長遞增子序列 我們來看一下我們的貪心策略體現在哪里&#xff1f;&#xff1f;&#xff1f; 我們來總結一下&#xff1a; 我們在考慮最長遞增子序列的長度的時候&#xff0c;其實并不關心這個序列長什么樣子,我們只是關心最后一個元素是誰。這樣新來一個元素之后&#xf…

HTML5 Web組件技術應用

目錄 Custom ElementsShadow DOMHTML TemplatesHTML ImportsHTML5 Web Components技術是一組相關標準和API的集合,旨在增強Web開發中的組件化能力,允許開發者創建可重用、封裝良好的自定義UI組件,這些組件擁有獨立的視圖層(樣式)、邏輯(行為)和結構(模板)。Web Compon…

【Week-R1】RNN實現心臟病預測,基于tensorflow框架

文章目錄 一、什么是RNN&#xff1f;二、準備環境和數據2.1 導入數據 三、構建模型四、訓練和預測五、其他&#xff08;1&#xff09;sklearn模塊導入報錯&#xff1a;ModuleNotFoundError: No module named sklearn&#xff08;2&#xff09;優化器改為SGD&#xff0c;accurac…

類和對象2

三、C對象模型和this指針 3.1 成員變量和成員函數分開存儲 在C中&#xff0c;類內的成員變量和成員函數分開存儲&#xff0c;只有非靜態成員變量才屬于類的對象上 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <string.h> using namespace …

Linux系統之GoAccess實時Web日志分析工具的基本使用

Linux系統之GoAccess實時Web日志分析工具的基本使用 一、GoAccess介紹1.1 GoAccess簡介1.2 GoAccess功能1.3 Web日志格式 二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹 三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本3.3 檢查系統鏡像源3.4 更新軟件列表…

JavaFX安裝與使用

前言 最近學習了javafx,開始時在配置環境和導包時遇到了一些麻煩,關于網上很多方法都嘗試過了,現在問題都解決了,和大家分享一下我是怎么實現javafx的配置,希望大家可以通過這個方法實現自己的環境配置! &#x1f648;個人主頁: 心.c &#x1f525;文章專題:javafx &#x1f49…