Chapter4.1 Coding an LLM architecture
文章目录
- 4 Implementing a GPT model from Scratch To Generate Text
- 4.1 Coding an LLM architecture
4 Implementing a GPT model from Scratch To Generate Text
-
本章节包含
- 编写一个类似于GPT的大型语言模型(LLM),这个模型可以被训练来生成类似人类的文本。
- Normalizing layer activations to stabilize neural network training
- 在深度神经网络中添加shortcut connections,以更有效地训练模型
- 实现 Transformer 模块以创建不同规模的 GPT 模型
- 计算 GPT 模型的参数数量及其存储需求
在上一章中,学习了多头注意力机制并对其进行了编码,它是LLMs的核心组件之一。在本章中,将编写 LLM 的其他构建块,并将它们组装成类似 GPT 的模型
4.1 Coding an LLM architecture
- 诸如GPT和Llama等模型,基于原始Transformer架构中的decoder部分,因此,这些LLM通常被称为"decoder-like" LLMs,与传统的深度学习模型相比,LLM规模更大,这主要归因于它们庞大的参数数量,而非代码量。因为它的许多组件都是重复的,下图提供了类似 GPT LLM 的自上而下视图
本章将详细构建一个最小规模的GPT-2模型(1.24亿参数),并展示如何加载预训练权重以兼容更大规模的模型。
-
1.24亿参数GPT-2模型的配置细节包括:
GPT_CONFIG_124M = {"vocab_size": 50257, # Vocabulary size"context_length": 1024, # Context length"emb_dim": 768, # Embedding dimension"n_heads": 12, # Number of attention heads"n_layers": 12, # Number of layers"drop_rate": 0.1, # Dropout rate"qkv_bias": False # Query-Key-Value bias }
我们使用简短的变量名以避免后续代码行过长
"vocab_size"
词汇表大小,由 BPE tokenizer 支持,值为 50,257。"context_length"
模型的最大输入标记数量,通过 positional embeddings 实现。"emb_dim"
token输入的嵌入大小,将每个token转换为 768 维向量。"n_heads"
多头注意力机制中的注意力头数量。"n_layers"
是模型中 transformer 块的数量"drop_rate"
是 dropout 机制的强度,第 3 章讨论过;0.1 表示在训练期间丢弃 10% 的隐藏单元以缓解过拟合"qkv_bias"
决定多头注意力机制(第 3 章)中的Linear
层在计算查询(Q)、键(K)和值(V)张量时是否包含偏置向量;我们将禁用此选项,这是现代 LLMs 的标准做法;然而,我们将在第 5 章将 OpenAI 的预训练 GPT-2 权重加载到我们的重新实现时重新讨论这一点。
-
下图中的方框展示了我们为实现最终 GPT 架构所需处理的各个概念的顺序。我们将从第一步开始,即一个我们称为 DummyGPTModel 的 GPT 骨架占位符:
import torch import torch.nn as nnclass DummyGPTModel(nn.Module):def __init__(self, cfg):super().__init__()self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"])self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"])self.drop_emb = nn.Dropout(cfg["drop_rate"])# Use a placeholder for TransformerBlockself.trf_blocks = nn.Sequential(*[DummyTransformerBlock(cfg) for _ in range(cfg["n_layers"])])# Use a placeholder for LayerNormself.final_norm = DummyLayerNorm(cfg["emb_dim"])self.out_head = nn.Linear(cfg["emb_dim"], cfg["vocab_size"], bias=False)def forward(self, in_idx):batch_size, seq_len = in_idx.shapetok_embeds = self.tok_emb(in_idx)pos_embeds = self.pos_emb(torch.arange(seq_len, device=in_idx.device))x = tok_embeds + pos_embedsx = self.drop_emb(x)x = self.trf_blocks(x)x = self.final_norm(x)logits = self.out_head(x)return logitsclass DummyTransformerBlock(nn.Module):def __init__(self, cfg):super().__init__()# A simple placeholderdef forward(self, x):# This block does nothing and just returns its input.return xclass DummyLayerNorm(nn.Module):def __init__(self, normalized_shape, eps=1e-5):super().__init__()# The parameters here are just to mimic the LayerNorm interface.def forward(self, x):# This layer does nothing and just returns its input.return x
DummyGPTModel
:简化版的 GPT 类模型,使用 PyTorch 的nn.Module
实现。- 模型组件:包括标记嵌入、位置嵌入、丢弃层、变换器块、层归一化和线性输出层。
- 配置字典:配置通过 Python 字典传入,如
GPT_CONFIG_124M
,用于传递模型配置。 forward
方法:描述数据从输入到输出的完整流程。计算嵌入 → 应用 dropout → 通过 transformer blocks 处理 → 应用归一化 → 生成 logits。- 占位符:
DummyLayerNorm
和DummyTransformerBlock
是待实现的组件。
-
数据流动:下图提供了 GPT 模型中数据流动的高层次概述。
使用 tiktoken 分词器对由 GPT 模型的两个文本输入组成的批次进行分词:
import tiktokentokenizer = tiktoken.get_encoding("gpt2")batch = []txt1 = "Every effort moves you" txt2 = "Every day holds a"batch.append(torch.tensor(tokenizer.encode(txt1))) batch.append(torch.tensor(tokenizer.encode(txt2))) batch = torch.stack(batch, dim=0) print(batch)"""输出""" tensor([[6109, 3626, 6100, 345],[6109, 1110, 6622, 257]])
接下来,我们初始化一个包含 1.24 亿参数的 DummyGPTModel 实例,并将 tokenized batch 输入其中。
torch.manual_seed(123) model = DummyGPTModel(GPT_CONFIG_124M)logits = model(batch) print("Output shape:", logits.shape) print(logits)"""输出""" Output shape: torch.Size([2, 4, 50257]) tensor([[[-0.9289, 0.2748, -0.7557, ..., -1.6070, 0.2702, -0.5888],[-0.4476, 0.1726, 0.5354, ..., -0.3932, 1.5285, 0.8557],[ 0.5680, 1.6053, -0.2155, ..., 1.1624, 0.1380, 0.7425],[ 0.0447, 2.4787, -0.8843, ..., 1.3219, -0.0864, -0.5856]],[[-1.5474, -0.0542, -1.0571, ..., -1.8061, -0.4494, -0.6747],[-0.8422, 0.8243, -0.1098, ..., -0.1434, 0.2079, 1.2046],[ 0.1355, 1.1858, -0.1453, ..., 0.0869, -0.1590, 0.1552],[ 0.1666, -0.8138, 0.2307, ..., 2.5035, -0.3055, -0.3083]]],grad_fn=<UnsafeViewBackward0>)
- 输出张量:输出张量有两行,分别对应两个文本样本。每个文本样本由 4 个标记组成;每个标记是一个 50,257 维的向量,这与标记器的词汇表大小一致。
- 嵌入维度:50,257 维对应词汇表中的唯一标记,后处理阶段将其转换回 token IDs 并解码为单词。
相关文章:
Chapter4.1 Coding an LLM architecture
文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture 4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型(LLM),这个模型可以被训练来生…...
Linux 端口知识全解析
Linux 端口知识全解析 在 Linux 系统的网络世界里,端口如同一个个小小的“窗口”,数据的进出都依赖它们有条不紊地运作。理解 Linux 端口知识,无论是对于系统管理员排查网络故障,还是开发者进行网络编程,都至关重要。…...
《Armv8-A virtualization》学习笔记
1.MAIR 的全称是 Memory Attribute Indirection Register。它是ARM架构中的一种寄存器,用于定义内存的属性,并提供一种间接访问内存属性的机制。MAIR寄存器包含多个字段,这些字段指示不同类型内存的属性,例如是否可以缓存、是否为…...
23. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算
在每个月发工资后很多人会对未来一个月的花销进行大致的计划,这个行为叫做预算。那么在这篇文章中我们将一起开发预算服务。 一、需求 预算需求就是简单的增删改查,虽然比较简单,但是也有几点需要注意。 编号需求说明1新增预算1. 针对每种…...
DOS攻击的原理和实现 (网络安全)hping3和Slowloris的运用
DoS攻击的原理和实现 DoS攻击(Denial of Service Attack,拒绝服务攻击)是指通过恶意手段使目标服务器、服务或网络资源无法正常提供服务,从而影响正常用户的访问。DoS攻击通常通过消耗目标系统的资源(如带宽、内存、处…...
十三、Vue 过渡和动画
文章目录 一、Vue过渡和动画概述1. 过渡的基本原理2. 动画的基本原理二、使用 CSS 过渡1. 单元素过渡2. 过渡模式in - out 模式out - in 模式三、使用 CSS 动画1. 单元素动画2. 动画结合过渡四、JavaScript 钩子函数实现过渡和动画1. 基本概念2. 示例五、列表过渡1. 基本原理2.…...
Dubbo 关键知识点解析:负载均衡、容错、代理及相关框架对比
1.Dubbo 负载均衡策略? Dubbo 是一个分布式服务框架,它提供了多种负载均衡策略来分发服务调用。在 Dubbo 中,负载均衡的实现是基于客户端的,即由服务消费者(Consumer)端决定如何选择服务提供者(…...
仿生的群体智能算法总结之三(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...
《量子比特大阅兵:不同类型量子比特在人工智能领域的优劣势剖析》
在科技的前沿,量子比特与人工智能的融合正开启一扇全新的大门。不同类型的量子比特,如超导、离子阱、光量子等,在与人工智能结合时展现出独特的优势与劣势。 超导量子比特 超导量子比特是目前应用较为广泛且研究相对成熟的量子比特类型。它…...
el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割
需求:一个输入框字段需要支持多次输入,最后传输给后台的字段值以逗号分割 解决方案:结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…...
机器人领域的一些仿真器
模拟工具和环境对于开发、测试和验证可变形物体操作策略至关重要。这些工具提供了一个受控的虚拟环境,用于评估各种算法和模型的性能,并生成用于训练和测试数据驱动模型的合成数据。 Bullet Physics Library 用于可变形物体模拟的一个流行的物理引擎是 B…...
前端-动画库Lottie 3分钟学会使用
目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…...
腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎
在当今数字化时代的汹涌浪潮中,数据已跃升为企业发展的关键要素,其高效、精准的处理成为企业在激烈市场竞争中脱颖而出的核心竞争力。腾讯云智能结构化 OCR 技术凭借其前沿的科技架构与卓越的功能特性,宛如一颗璀璨的明星,在交通、…...
【开源免费】基于SpringBoot+Vue.JS精品在线试题库系统(JAVA毕业设计)
本文项目编号 T 115 ,文末自助获取源码 \color{red}{T115,文末自助获取源码} T115,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
c# CodeFirst生成表字段加注释
前置:ORM框架工具使用的FreeSql 背景:开发环境中运行接口,所有的表字段以及备注会自动加上,但是在测试环境时运行就只生成了表,没有把每个字段的注释加上 问题检查: FreeSql CodeFirst 支持将 c# 代码内的注…...
MySQL8.0复制原理和部署配置步骤
1. mysql 主从复制原理 在从库上执行change master to;会将主库的信息保存到从库中的master.info文件中在从库执行start slave;开启io_thread, sql_thread线程;io_thread工作;io_thread通过master.info文件中主库的连接信息去连接主库;连接成…...
Unity热更新文件修改后缀并拷贝到指定路径的工具类
最近在学习Hybrid热更新。每次编译完,需要修改后缀名和拷贝到特定路径覆盖旧文件,就叫AI写了个工具类。现在记录一下,毕竟ai写完还需要修改。 代码如下,放到Assets/Editor/路径下即可。 可根据需求自行改变路径和文件名。 using…...
前端vue+el-input实现输入框中文字高亮标红效果(学习自掘金博主文章)
学习自掘金文章https://juejin.cn/post/7295169886177918985 该博主的代码基于原生textarea控件和js实现,基于该博主的代码和思路,在vue下实现了相应功能 思路 生成html字符串来实现文字高亮标红效果,但是input输入控件不能渲染html字符串…...
SAP系统中的标准价、移动平均价是什么?有何区别?物料分类账的优点
文章目录 前言一、SAP系统中的价格控制二、移动平均价、标准价是什么?三、S价(标准价)的优势四、S价(标准价)的劣势五、V价(移动平均价)的优势六、V价(移动平均价)的劣势…...
通往O1开源之路
“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发,深入分析了实现类似OpenAI o1模型性能的路线图,聚焦于策略初始化、奖…...
【QT】实现RestFul接口
在这个教程中,我们将介绍如何在 Qt 中使用 QHttpServer 类来创建一个简单的 HTTP 服务器。QHttpServer 是 Qt 6 引入的新类,用于提供 HTTP 服务。这个类非常适合快速开发restful接口。 准备工作 确保你的 Qt 版本是 Qt 6 或更高版本,因为 Q…...
ARP攻击的原理和实现 (网络安全)
ARP攻击的原理和实现 ARP(Address Resolution Protocol,地址解析协议)是一种网络协议,用于在局域网内将IP地址映射到MAC地址。在以太网中,设备通过广播ARP请求来查询目标IP地址对应的MAC地址,从而建立通信…...
大脑特训,自信 “满格”
编辑:念小艺 在追求自信的漫漫长路上,诸多因素如同闪耀的星光,为人们指引着方向。保持良好的饮食习惯,让身体摄取充足且均衡的营养,为精神的饱满提供坚实后盾;持续投身于锻炼之中,在挥洒汗水的…...
如何备份和恢复 PostgreSQL 数据库 ?
对于数据库管理员和开发人员来说,在 PostgreSQL 中创建数据库副本是一项至关重要的任务。此过程对于测试、备份、数据分析等都是必不可少的。在本指南中,我们将深入研究创建 PostgreSQL 数据库副本的步骤,以确保数据完整性和系统性能。 必要…...
逆向入门(6)汇编篇-外挂初体验
代码分析部分 游戏里面还是体验了不少自己CV来的外挂的,自己编写的程序还是头一次体验,程序源码如下 void startAcctack() {printf("开始攻击\n");// 获取当前系统时间time_t now time(0); // 获取当前时间的时间戳struct tm *local_time …...
HTML——77.网页编码及乱码处理
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>网页编码及乱码处理</title></head><body><!--网页编码:指网页中特定的字符编码,通过解析编码成为我们知道的文字--><!-…...
(leetcode算法题)382. 链表随机节点
如果给你一个 智能记录 k行内容的小笔记本,从一本你也不知道有多少行的 C Primer 中进行摘抄,你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中? 答:准备好一个公平的轮盘和一个巨大的摇奖机,…...
Git 如何在IDEA中进行使用
1. 2. 3....
【Pytorch报错】AttributeError: cannot assign module before Module.__init__() call
代码: import torch.nn as nnclass Model(nn.Module):def __init__(self, input_dim, output_dim):self.linear nn.Linear(input_dim, output_dim) def forward(self, x):out self.linear(x)return outmodel Model(1, 1)报错: --------------------…...
深入理解计算机系统—虚拟内存(一)
一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成特殊的挑战。随着对 CPU 需求的增长,进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的内存,那么它们中的一些就根本无法运行。 为了更加有效地管理内…...
[Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider
目录 输入类控件 1、Line Edit 录入个人信息 使用正则表达式验证输入框的数据 验证两次输入的密码一致 切换显示密码 2、Text Edit 获取多行输入框的内容 验证输入框的各种信号 3、Combo Box 使用下拉框模拟麦当劳点餐 从文件中加载下拉框的选项 4、Spin Box 调整…...
【信息系统项目管理师】高分论文:论信息系统项目的风险管理(数字化联合审查管理系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、全盘考虑,编制项目风险管理计划二、务实高效,做好项目的风险识别三、客观严谨,进行定性风险分析四、客观严谨,进行定量风险分析五、未雨绸缪,做好规划风险应对六、控制执行,实施风险应对七、做好…...
设计模式 结构型 外观模式(Facade Pattern)与 常见技术框架应用 解析
外观模式(Facade Pattern)是一种结构型设计模式,它的核心思想是将一个复杂的子系统封装在一个外观类中,为子系统提供一个统一的接口。通过这个接口,客户端可以简化对子系统的访问,而无需直接与子系统中的各…...
《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记
1.LPI(Locality-specific Peripheral Interrupts)是一种基于消息的中断(Message Signaled Interrupt,MSI),由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理&am…...
java 常量池详解
目录 java 常量池详解一 静态常量池(Static Constant Pool)1.1 概述1.2 存储内容1.3 特点1.4 示例 二 运行时常量池(Runtime Constant Pool)2.1 概述2.2 存储内容2.3 特点2.4 示例 三 基础类型常量池(Primitive Type C…...
aardio —— 虚表 —— 模拟属性框
写了个简单的属性框例程,抛砖引玉,期待你做出更丰富强大的功能。 可折叠行、可输入文本、可下拉选择、支持下拉选择图片、颜色等功能。 只有想不到,没有做不到,发挥你的想象力吧。 import win.ui; import godking.comboboxEx im…...
企业微信——智能表格学习
智能表格 应用限制条件 获取 token https://developer.work.weixin.qq.com/document/10013#%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4 开发步骤 你可以通过以下步骤,使用access_token来访问企业微信的接口。需要注意的是,所有的接口需使用Https协议、Js…...
2501d,jingo优化
原文 大家好,我重构和优化了一下jin.go这里: 我去掉了vibe.d依赖,因为它又慢又大,而且我无法与2版本交朋友.当仅运行1000个vibe纤程时,不仅应用崩溃,甚至图形系统驱动也崩溃一次,这需要重启笔记本电脑. 当前,我用小栈大小的本地流(4kb)解决. 我真很期待photon的稳定性,以恢复支…...
实景三维点云处理专业软件ArcGIS根据DSM生成地表点云集
常见的实景三维处理软件及其特色功能如下: 一、专业实景三维建模软件 Agisoft Metashape 高精度建模:能够生成高精度的三维模型,精度可以达到厘米级甚至毫米级,适用于需要详细测量和分析的项目,如文物保护和建筑测量。…...
山东大学人工智能导论期末复习概念汇总
人工智能概念汇总V2 —Nevertheless 简介 [!NOTE] 本文是在原版的基础上,面向期末而进行的删减版本 建议使用pdf版本,排版和图片显示完全。如有需要,可私信发送邮箱地址 PDF版本: 山东大学人工智能导论概念汇总pdf版 山东大学软…...
Ubuntu下安装Android Sdk
下载android sdk命令行工具 https://developer.android.com/studio?hlzh-cn#command-tools mkdir android-sdk cd android-sdk unzip commandlinetools-linux-11076708_latest.zip 添加环境变量到~/.bashrc export ANDROID_HOME$HOME/android-sdk export PATH$PATH:$ANDRO…...
c语言中GHashTable的使用
前言:最近在c代码中需要用到键值对的存储,由于没有map,需要自己实现或者使用库函数,g_hash_table_new是GLib中的库函数,但使用起来会有很多坑,记录一下 构建hash表g_hash_table_new GHashTable* g_hash_table_new(GH…...
Conda清理缓存
参考:1、2...
【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
1、HarmonyOS 无法导入cardEmulation? 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability;在src/main/syscap.json(此文件需要手动创建)中添加如下内容 {"devices": {"gen…...
【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写
文章目录 一、随机数1、Random.Next()生成随机整数示例:生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例:生成随机浮点数 3、 生成随机字母或字符示例:生成随机字母示例:生成随机小写字母 二、…...
深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)
深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时,例如执行命令: conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包,保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...
《Vue3实战教程》35:Vue3测试
如果您有疑问,请观看视频教程《Vue3实战教程》 测试 为什么需要测试 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…...
Mysql监视器搭建
Mysql监视器搭建 资源下载在:Mysql监视器资源包 查询问题:CPU、连接数、慢查询 --> 暴增 1、exporter进行Mysql信息采集 修改my.cnf [client] userroot password数据库密码 host:数据库URL port3306启动命令 mysqld_exporter.exe --config.my-c…...
Linux(centos)安装 MySQL 8 数据库(图文详细教程)
前言 前几天写了个window系统下安装Mysql的博客,收到很多小伙伴私信需要Linux下安装Mysql的教程,今天这边和大家分享一下,话不多说,看教程。 一、删除以前安装的MySQL服务 一般安装程序第一步都需要清除之前的安装痕迹ÿ…...
软件工程大作业——图书管理系统/图书个性化推荐与实现系统
目录 1 绪论 1.1研究背景 1.2研究现状 1.3研究内容 2 系统关键技术 2.1 Spring Boot框架 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2 系统性能分析 3.3 系统功能分析 3.4系统流程分析 3.4.1登…...