当前位置: 首页 > news >正文

GPT2代码拆解+生成实例

本文代码来自博客,GPT2模型解析参考
在这里插入图片描述

import torch
import copy
import torch.nn as nn
import torch.nn.functional as F
from torch.nn.modules import ModuleList
from torch.nn.modules.normalization import LayerNorm
import numpy as np
import os
from tqdm import tqdm_notebook, trange
import logging
logging.basicConfig(level = logging.INFO)
logger = logging.getLogger()

在每个decoder block中有Masked self-attention和feed forward 两个操作,其中每部进行两个linear projection

在Attention中首先将输入的embedding经过conv1D将维度变成3embd
self.c_attn = Conv1D(d_model, d_model
3)
attention计算完毕后在最后再进行一次转换
self.c_proj = Conv1D(d_model, d_model)

linear projection

class Conv1D(nn.Module):def __init__(self, nx, nf):super().__init__()self.nf = nfw = torch.empty(nx, nf)nn.init.normal_(w, std=0.02)self.weight = nn.Parameter(w)self.bias = nn.Parameter(torch.zeros(nf))def forward(self, x):size_out = x.size()[:-1] + (self.nf,)x = torch.addmm(self.bias, x.view(-1, x.size(-1)), self.weight)x = x.view(*size_out)return x

FFD
在ffd中首先进行emb->emb x 4的转换然后再进行emb x 4->emb的转换

class FeedForward(nn.Module):def __init__(self, dropout, d_model=768, nx=768*4):super().__init__()self.c_fc    = Conv1D(d_model, nx)self.c_proj  = Conv1D(nx, d_model)self.act     = F.geluself.dropout = nn.Dropout(dropout)def forward(self, x):return self.dropout(self.c_proj(self.act(self.c_fc(x))))

Masked Self Attention

class Attention(nn.Module):def __init__(self, d_model=768, n_head=12, n_ctx=1024, d_head=64, bias=True, scale=False):super().__init__()self.n_head  = n_headself.d_model = d_modelself.c_attn  = Conv1D(d_model, d_model*3)self.scale   = scaleself.softmax = nn.Softmax(dim=-1)self.register_buffer("bias", torch.tril(torch.ones(n_ctx, n_ctx)).view(1, 1, n_ctx, n_ctx))self.dropout = nn.Dropout(0.1)self.c_proj  = Conv1D(d_model, d_model)def split_heads(self, x):"return shape [`batch`, `head`, `sequence`, `features`]"new_shape = x.size()[:-1] + (self.n_head, x.size(-1)//self.n_head) x = x.view(*new_shape)return x.permute(0, 2, 1, 3) def _attn(self, q, k, v, attn_mask=None):scores  = torch.matmul(q, k.transpose(-2, -1))if self.scale: scores = scores/math.sqrt(v.size(-1))nd, ns  = scores.size(-2), scores.size(-1)if attn_mask is not None: scores = scores + attn_maskscores  = self.softmax(scores)scores  = self.dropout(scores)outputs = torch.matmul(scores, v)return outputsdef merge_heads(self, x):x         = x.permute(0, 2, 1, 3).contiguous()new_shape = x.size()[:-2] + (x.size(-2)*x.size(-1),)return x.view(*new_shape)def forward(self, x):x        = self.c_attn(x) #new `x` shape - `[1,3,2304]`q, k, v  = x.split(self.d_model, dim=2)q, k, v  = self.split_heads(q), self.split_heads(k), self.split_heads(v)out      = self._attn(q, k, v)out      = self.merge_heads(out)out      = self.c_proj(out)return out

Decoder Block

class TransformerBlock(nn.Module):def __init__(self, d_model=768, n_head=12, dropout=0.1):super(TransformerBlock, self).__init__()self.attn = Attention(d_model=768, n_head=12, d_head=64, n_ctx=1024, bias=True, scale=False)self.feedforward = FeedForward(dropout=0.1, d_model=768, nx=768*4)self.ln_1 = LayerNorm(d_model)self.ln_2 = LayerNorm(d_model)def forward(self, x):x = x + self.attn(self.ln_1(x))x = x + self.feedforward(self.ln_2(x))return x

在这里插入图片描述

GPT2 architecture

def _get_clones(module, n):return ModuleList([copy.deepcopy(module) for i in range(n)])class GPT2(nn.Module):def __init__(self, nlayers=12, n_ctx=1024, d_model=768, vcb_sz=50257):super(GPT2, self).__init__()self.nlayers = nlayersblock        = TransformerBlock(d_model=768, n_head=12, dropout=0.1)self.h       = _get_clones(block, 12)self.wte     = nn.Embedding(vcb_sz, d_model)self.wpe     = nn.Embedding(n_ctx, d_model)self.drop    = nn.Dropout(0.1)self.ln_f    = LayerNorm(d_model)self.out     = nn.Linear(d_model, vcb_sz, bias=False)self.loss_fn = nn.CrossEntropyLoss()self.init_weights()def init_weights(self):self.out.weight = self.wte.weightself.apply(self._init_weights)def _init_weights(self, module):if isinstance(module, (nn.Linear, nn.Embedding, Conv1D)):module.weight.data.normal_(mean=0.0, std=0.02)if isinstance(module, (nn.Linear, Conv1D)) and module.bias is not None:module.bias.data.zero_()elif isinstance(module, nn.LayerNorm):module.bias.data.zero_()module.weight.data.fill_(1.0)def forward(self, src, labels=None, pos_ids=None):if pos_ids is None: pos_ids = torch.arange(0, src.size(-1)).unsqueeze(0)inp = self.drop((self.wte(src)+self.wpe(pos_ids)))for i in range(self.nlayers): inp = self.h[i](inp)inp     = self.ln_f(inp)logits  = self.out(inp)outputs = (logits,) + (inp,)if labels is not None:shift_logits = logits[..., :-1, :].contiguous()shift_labels = labels[..., 1:].contiguous()loss = self.loss_fn(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))outputs = (loss,) + outputsreturn outputsreturn logits

其中 loss = self.loss_fn(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
参考文档
在这里插入图片描述
如果target包含class的indices,则输入的shape要以三种形式,其中N就是input的第一维
通常我们的logits是(B,T,C)形式,其实B为batch,T为length,C为channel也就是embd维度,为768,N=BxT,而数据input和target为(B,T)形式,所以target的维度要与shift_logits.view(-1, shift_logits.size(-1))的第一维N一致

Example

model = GPT2()
# load pretrained_weights from hugging face
# download file https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-pytorch_model.bin to `.`model_dict = model.state_dict() #currently with random initialization
state_dict = torch.load("./gpt2-pytorch_model.bin") #pretrained weightsold_keys = []
new_keys = []
for key in state_dict.keys(): if "mlp" in key: #The hugging face state dict references the feedforward network as mlp, need to replace to `feedforward` be able to reuse these weightsnew_key = key.replace("mlp", "feedforward")new_keys.append(new_key)old_keys.append(key)for old_key, new_key in zip(old_keys, new_keys): state_dict[new_key]=state_dict.pop(old_key)pretrained_dict = {k: v for k, v in state_dict.items() if k in model_dict}model_dict.update(pretrained_dict)
model.load_state_dict(model_dict)
model.eval()
from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
context   = torch.tensor([tokenizer.encode("The planet earth")])def generate(context, ntok=20):for _ in range(ntok):out = model(context)logits = out[:, -1, :]indices_to_remove = logits < torch.topk(logits, 10)[0][..., -1, None]logits[indices_to_remove] = np.NINFnext_tok = torch.multinomial(F.softmax(logits, dim=-1), num_samples=1).squeeze(1)context = torch.cat([context, next_tok.unsqueeze(-1)], dim=-1)return contextout = generate(context, ntok=20)
tokenizer.decode(out[0])

相关文章:

GPT2代码拆解+生成实例

本文代码来自博客&#xff0c;GPT2模型解析参考 import torch import copy import torch.nn as nn import torch.nn.functional as F from torch.nn.modules import ModuleList from torch.nn.modules.normalization import LayerNorm import numpy as np import os from tqd…...

基于android的即时通讯APP 聊天APP

基于android的即时通讯APP 或者 聊天APP 一 项目概述 该项目是基于Android 的聊天APP系统&#xff0c;该APP包含前台&#xff0c;后台管理系统&#xff0c;前台包含用户通讯录,用户详情&#xff0c;用户聊天服务&#xff0c;用户二维码,发现功能,发现详情 , 个人中心, 个人信…...

【C++】二叉树之力扣经典题目1——详解二叉树的递归遍历,二叉树的层次遍历

如有错误&#xff0c;欢迎指正。 如有不理解的地方&#xff0c;可以私信问我。 文章目录题目1&#xff1a;根据二叉树创建字符串题目实例思路与解析代码实现题目2&#xff1a;二叉树的层序遍历题目思路与解析代码实现题目1&#xff1a;根据二叉树创建字符串 点击进入题目链接—…...

MySQL数据库调优————SQL性能分析

TIPS 本文基于MySQL 8.0 本文探讨如何深入SQL内部&#xff0c;去分析其性能&#xff0c;包括了三种方式&#xff1a; SHOW PROFILEINFORMATION_SCHEMA.PROFILINGPERFORMANCE_SCHEMA SHOW PROFILE SHOW PROFILE是MySQL的一个性能分析命令&#xff0c;可以跟踪SQL各种资源消耗。…...

sql数据库高级编程总结(一)

1、数学函数&#xff1a;操作一个数据&#xff0c;返回一个结果 &#xff08;1&#xff09;取上限 ceiling 如果有一个小数就取大于它的一个最小整数 列如9.5 就会取到 10 select code,name,ceiling(price) from car &#xff08;2&#xff09;取下限 floor 如果有一个小数就…...

软件工程(5)--喷泉模型

前言 这是基于我所学习的软件工程课程总结的第五篇文章。 迭代是软件开发过程中普遍存在的一种内在属性。经验表明&#xff0c;软件过程各个阶段之间的迭代或一个阶段内各个工作步骤之间的迭代&#xff0c;在面向对象范型中比在结构化范型中更常见。 一般说来&#xff0c;使用…...

SM2数字签名

文章目录6. 签名流程7. 验签流程实现参考资料6. 签名流程 M’ ZA || Msge Hash(M’)&#xff0c;并转为大数&#xff1b;生成随机数k&#xff0c;范围0<k<n&#xff1b;计算kG (x1, y1)r (e x1) mod n, 若r0或(rkn)则重新生成k&#xff1b;s (k-rd) / (1d) mod n&…...

RPA+保险后台部门擦出不一样“火花” | RPA案例

在保险行业中&#xff0c;后台业务线主要是为前台和中台等提供支持&#xff0c;提供公司整体运营服务&#xff0c;包括财务、信息、人力、综合办等。相对于中前台部门&#xff0c;后台部门离核心价值链更远一些&#xff0c;更偏支持部门&#xff0c;其中某些岗位与业务相关度强…...

设备树相关概念的理解

设备树 定义 设备树是描述硬件信息的一种树形结构&#xff0c;设备树文件会在内核启动后被内核解析得到对应设备的具体信息。 树形结构就自然会存在节点&#xff0c;硬件设备信息就存储再设备树中的节点上&#xff0c;即设备节点。而一个设备节点中可以存储硬件的多个不同属性…...

ubuntu20.04下配置深度学习环境GPU

卸载子系统 C:\Users\thzn>wsl --list 适用于 Linux 的 Windows 子系统分发版: docker-desktop (默认) docker-desktop-data Ubuntu-18.04 Ubuntu-22.04 Ubuntu-20.04 C:\Users\thzn>wsl --unregister Ubuntu-18.04 ubuntu 换源 https://www.cnblogs.com/Horizon-asd/p…...

用egg.js来写一个api管理系统(一)

Egg.js是一个基于Node.js的企业级开发框架&#xff0c;非常适合构建API服务。 安装egg.js 首先&#xff0c;您需要安装Node.js和npm&#xff08;Node Package Manager&#xff09;。然后&#xff0c;您可以通过运行以下命令来安装Egg.js&#xff1a; npm i egg --save然后&a…...

企业数字化转型和升级:架构设计方法与实践

目录 企业架构整体结构 企业架构的驱动力 企业架构的基本概念 企业架构的发展 企业架构框架理论 主流企业架构框架之对比 企业架构整体结构 图例&#xff1a;企业架构整体结构 企业架构整体结构从战略层、规划层、落地层这三层来分别对应企业架构中 业务、架构和实施的各种重要…...

【LeetCode】环形链表 II [M](链表)

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链…...

Unity之如何实现一个VR任务(剧情)系统

一.前言 最近再做一个VR项目,里面有大量的剧情和VR操作任务。 比如: 1.张三说了什么话,干了什么事,然后,李四又说了什么,做了什么动画,完了之后,场景中某个物体高亮,让我们触摸或者射线点击(pc的话鼠标点击)和其发生交互。 2.我们使用VR手柄或者鼠标与场景中的一个…...

k8s核心概念与kubectl命令行工具的使用

k8s官方文档Kubernetes 文档 | Kubernetes作用&#xff1a;kubernetes用于容器化应用程序的部署&#xff0c;扩展和管理。目标&#xff1a;是让部署容器化应用简单高效。Kubernetes集群架构与组件 Master组件 kube-apiserverkubernetes API&#xff0c;集群的统一入口&#xff…...

【零基础入门前端系列】—无序列表、有序列表、定义列表(四)

一、HTML无序列表 无序列表是一个项目的列表&#xff0c;此列项目使用粗体圆点&#xff08;典型的小黑圆圈&#xff09;进行标记。 无序列表使用 <ul> 标签 <ul> <li>Coffee</li> <li>Milk</li> </ul>嵌套结构&#xff1a; <…...

为什么重写equals还要重写hashcode方法

目录equals方法hashCode方法为什么要一起重写&#xff1f;总结面试如何回答重写 equals 时为什么一定要重写 hashCode&#xff1f;要想了解这个问题的根本原因&#xff0c;我们还得先从这两个方法开始说起。 以下是关于hashcode的一些规定&#xff1a; 两个对象相等&#xff0…...

电子技术——电流镜负载的差分放大器

电子技术——电流镜负载的差分放大器 目前我们学习的差分放大器都是使用的是差分输出的方式&#xff0c;即在两个漏极之间获取电压。差分输出主要有以下优势&#xff1a; 降低了共模信号的增益&#xff0c;提高了共模抑制比。降低了输入偏移电压。提升了差分输入的增益。 由于…...

go面试题

1.json包在使用的时候&#xff0c;结构体里的变量不加tag能不能正常转成json里的字段&#xff1f; 如果变量首字母小写&#xff0c;则为private。无论如何不能转&#xff0c;因为取不到反射信息。如果变量首字母大写&#xff0c;则为public。 不加tag&#xff0c;可以正常转为j…...

攻防世界-Confusion1

题目 访问题目场景 某天&#xff0c;Bob说&#xff1a;PHP是最好的语言&#xff0c;但是Alice不赞同。所以Alice编写了这个网站证明。在她还没有写完的时候&#xff0c;我发现其存在问题。(请不要使用扫描器) 然后结合图片我们知道&#xff0c;这个网址是python写的&#xff0…...

配置nginx访问本地静态资源、本地图片、视频。

配置nginx访问本地静态资源、本地图片、视频。 1、进入nginx安装目录2、打开conf文件夹下的nginx.conf文件&#xff0c;进行配置。 步骤&#xff1a;①打开文件后找到http中的server ②再添加一个server配置&#xff0c;将需要从其他电脑访问的本地路径进行配置。配置内容如下&…...

鸿蒙生态崛起:深度解析鸿蒙开发人员职责、技能要求与面试指南

前言随着万物互联时代的加速到来&#xff0c;鸿蒙操作系统&#xff08;HarmonyOS&#xff09;作为面向未来的全场景分布式操作系统&#xff0c;正展现出强大的生命力和广阔的发展前景。其“一次开发&#xff0c;多端部署”的理念&#xff0c;以及对分布式能力的原生支持&#x…...

DriverStore Explorer:Windows驱动管理效率工具的5大突破与实战指南

DriverStore Explorer&#xff1a;Windows驱动管理效率工具的5大突破与实战指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows系统随着使用时间增长&#xff0c;驱动存…...

MATLAB实战:高斯与椒盐噪声的针对性滤波策略及效果可视化对比

1. 从“噪声”说起&#xff1a;图像处理中的两个“捣蛋鬼” 大家好&#xff0c;我是老张&#xff0c;在图像处理这个行当里摸爬滚打十来年了。今天咱们不聊那些高深莫测的算法理论&#xff0c;就聊聊图像处理里最基础&#xff0c;也最让人头疼的两个问题&#xff1a;高斯噪声和…...

SDXL 1.0在电商领域的应用:基于YOLOv5的商品主图智能生成

SDXL 1.0在电商领域的应用&#xff1a;基于YOLOv5的商品主图智能生成 1. 引言 电商行业每天都有成千上万的新商品上架&#xff0c;每件商品都需要高质量的主图来吸引顾客。传统的商品拍摄需要专业的摄影师、昂贵的设备和复杂的后期处理&#xff0c;成本高且周期长。一个小型电…...

(技术解析)CLIP:如何用自然语言监督重塑视觉模型的零样本泛化边界

1. 从“看图识字”到“看图说话”&#xff1a;CLIP如何颠覆了传统视觉AI的玩法 如果你玩过AI绘画&#xff0c;或者用过一些“以图搜图”的工具&#xff0c;那你很可能已经间接体验过CLIP的威力了。但你可能不知道&#xff0c;这个听起来有点酷的名字背后&#xff0c;藏着一个彻…...

translategemma-12b-it效果实测:技术文档扫描件翻译准确率惊人

translategemma-12b-it效果实测&#xff1a;技术文档扫描件翻译准确率惊人 1. 开篇&#xff1a;当翻译模型“看懂”了图片 如果你还在为翻译一份PDF扫描件而烦恼——先截图&#xff0c;再粘贴到OCR软件&#xff0c;最后把识别出的文字扔进翻译器&#xff0c;结果还常常词不达…...

Ubuntu系统下ZED2 SDK与ROS2环境高效配置指南

1. 环境准备&#xff1a;打好地基&#xff0c;事半功倍 大家好&#xff0c;我是老张&#xff0c;在AI和机器人视觉这块摸爬滚打了十来年&#xff0c;经手过的深度相机少说也有几十款。今天咱们不聊虚的&#xff0c;就手把手带你搞定Ubuntu系统下ZED2相机、SDK和ROS2环境的配置。…...

Linux电阻触摸屏驱动开发实战:从硬件采样到软件滤波优化

1. 从零开始&#xff1a;理解电阻触摸屏与Linux驱动的“握手” 大家好&#xff0c;我是老张&#xff0c;在嵌入式触控这块摸爬滚打了十来年&#xff0c;从早期的电阻屏到现在的电容屏&#xff0c;驱动都写过不少。今天咱们不聊那些高大上的&#xff0c;就聊聊最经典、最皮实耐用…...

vscode用remote ssh连接服务器的流程

以下是一套完整、可落地的 VS Code Remote-SSH 离线部署 连接服务器流程&#xff0c;整合了之前的所有要点&#xff0c;适配新版 VS Code&#xff08;高版本需 CLIServer 双包&#xff09;&#xff0c;覆盖从环境准备到验证连接的全环节&#xff1a; 一、前置准备 本地环境&…...