用Transformers实现简单的大模型文本生成

2024-05-14 06:36

本文主要是介绍用Transformers实现简单的大模型文本生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根据输入的prompt,生成一段指定长度的文字。Llama跑起来太慢了,这里用GPT-2作为列子。

from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torchtokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2", pad_token_id=tokenizer.eos_token_id)prompt_text = "This is a nice story that makes me"
max_gen_len = 9
input_ids = tokenizer.encode(prompt_text, return_tensors="pt")
prompt_len = input_ids.shape[-1]
print(f'length of prompt: {prompt_len}, length of generation: {max_gen_len}')print('>>> Way 1: Use `model.generate()` to generate tokens with KV cache')
generated_ids = model.generate(input_ids, max_length=prompt_len+max_gen_len, pad_token_id=tokenizer.eos_token_id)
print('generated_ids:', generated_ids)
generated_text = tokenizer.decode(generated_ids[0], skip_special_tokens=True)
print('generated_text:', generated_text)print('>>> Way 2: Use `for loop` to generate tokens with KV cache')
past_key_values = None
print('Prefill Stage..')
outputs = model(input_ids=input_ids, past_key_values=past_key_values, use_cache=True)
past_key_values = outputs.past_key_values
pred_token_idx = outputs.logits[:, -1, :].argmax(dim=-1).unsqueeze(1)
generated_ids = [pred_token_idx.item()]
print('Decoding/Generating Stage..')
for _ in range(max_gen_len - 1):outputs = model(input_ids=pred_token_idx, past_key_values=past_key_values, use_cache=True)past_key_values = outputs.past_key_values  # if use_cache=False, past_key_values=Nonepred_token_idx = outputs.logits[:, -1, :].argmax(dim=-1).unsqueeze(1)generated_ids.append(pred_token_idx.item())
print('generated_ids:', generated_ids)
generated_text = tokenizer.decode(torch.Tensor(generated_ids), skip_special_tokens=True)
print('generated_text:', prompt_text + generated_text)

这里提供了两种方法实现文本生成:

  • model.generate():给模型输入prompt,一次性得到所有输出的token,最方便的写法
  • for loop:这是StreamingLLM中给的代码例子,也揭示了自回归生成的原理。首先是prefill阶段,输入prompt,得到KV cache和生成的第一个token;然后是decoding/generating阶段,开始自回归生成token,每次生成的模型输入是当前新token和KV cache,每生成一个token都会自动更新KV cache

最终,可以看到两种方法生成的文本是一模一样的:

在这里插入图片描述

进一步探究自回归过程中维度的变化:

在这里插入图片描述

这个就是标准的自回归生成任务了,不管是GPT还是Llama,都是如此(至少PyTorch版本都是这样的,Flax版本的KV cache有点奇怪,用的lax.dynamic_update_slice(cached_key.value, key, indices),KV cache的维度并没有随着token的生成而增加…不太明白)。

这篇关于用Transformers实现简单的大模型文本生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988011

相关文章

一键接入大模型:One-Api本地安装配置实操,POSTMAN、APIFOX调用CURL

前言 最近准备学习一下 Semantic Kernel, OpenAI 的 Api 申请麻烦,所以想通过 One-api 对接一下国内的在线大模型,先熟悉一下 Semantic Kernel 的基本用法,本篇文章重点记录一下OneApi安装配置的过程。 讯飞星火有 3.5 模型的 200w 个人免费 token,可以拿来学习。 讯飞星火申请链接 什么是 One-Api? 通过标准的 Op

C#通过ADB和UiAutomator实现对安卓手机的控制(一)

从事安卓开发的朋友应该都知道adb和UiAutomator是什么了,前者是安卓调试桥(Android Debug Bridge),通过它我们可以调试安卓设备中的程序;后者是一款安卓ui的自动化测试工具,它可以对安卓设备实现自动化的点击、滑动、输入等操作。 通过这两个工具我们可以控制安卓设备 安装/卸载/打开/关闭 某个应用,也可以让手机自动执行浏览、点击、输入文字等操作。但是这两款工具是通过命令

一句话记录:Winform编程中Label文本不显示“”的奇葩问题

今天工作中遇到一个很奇怪的问题,在一个Label上显示一个包含“&”的字符串,结果“&”这个符号死活不显示,百度查也没查到,后来翻墙上google总算找到点端倪,必须用“&&”才能显示,至于为什么这样还不清楚,后面继续研究。 参考:http://bbs.csdn.net/topics/370128043 PS:虽然我很支持国产,但真的忍不住吐槽下百度对技术内容的展现能力。上面的资料是在

Python 文件操作指南:使用 open 和 with open 实现高效读写

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 本系列文章主要分享文件操作,了解如何使用 Python 进行文件的读写操作,介绍常见文件格式的读取和写入方法,包括TXT、 CSV、JSON、XML 等,以及如何使用相应的 Python 库来处理这些文件格式,同时对数据进行持久化操作。本章节就从最常见的TXT文件开始。

linux下使用doxygen和grapviz生成函数调用关系图

1,参考链接 https://jasoncc.github.io/doc_tools/doxygen.html 2,操作流程 以ubuntu为例,执行如下命令来生成doxygen $ sudo apt-get install doxygen$ sudo apt-get install graphviz$ mkdir /tmp/doxygen && cd /tmp/doxygen$

语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(一)音频数据编码与预处理

前言 深度学习技术在当今技术市场上面尚有余力和开发空间的,主流落地领域主要有:视觉,听觉,AIGC这三大板块。目前视觉板块的框架和主流技术在我上一篇基于Yolov7-LPRNet的动态车牌目标识别算法模型已有较为详细的解说。与AIGC相关联的,其实语音模块在近来市场上面活跃空间很大。从智能手机的语音助手到智能家居中的语音控制系统,再到银行和电信行业的语音身份验证,语音技术的应用日益广泛。那么对应

快速生成sql

增加快速开发速度

Qt 之自定义界面(实现无边框、可移动)

简述 UI设计是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性、有品位,还要让软件的操作变得舒适简单、自由,充分体现软件的定位和特点。 爱美之心人皆有之。其实软件界面就像工业造型一样,是产品的重要卖点。一个产品拥有美观的界面会给人带来舒适的视觉享受,拉近人与产品的距离,是建立在科学性之上的艺术设计。 检验一个界面的标准-既不是某个项目开发组领导的意见,也

Qt 之国际化(系统文本 - QMessageBox 按钮、QLineEdit 右键菜单等)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮、QLineEdit、QSpinBox、QScrollBar中的右键菜单等。通常情况下,我们软件都不会是纯英文的,那么如何处理这些问题呢?其实这也属于国际化的一部分。 下面,以中英文切换为例来为大家分享,其它语言切换类似。 查找翻

基于Netty实现安全认证的WebSocket(wss)服务端

1.Netty服务端 服务端代码参考【基于Netty实现WebSocket服务端-CSDN博客】中的第一种简单方式。 新增如下逻辑:添加SSLHandler SSLContext sslContext = SslUtil.createSSLContext("JKS","D:\\workSpace\\daydayup\\cert\\wss2\\mystore.jks", "1234567");