首页 > 编程知识 正文

python搭建环境(python编译环境)

时间:2023-05-05 18:49:57 阅读:78919 作者:4508

本指南介绍如何构建自动完成任何文本录入的web APP应用程序。

作者| Dev Sharma

译者|苏本如,责任篇|可靠的歌曲

出品(id:csdn news )。

以下是译文:

在本文中,我们使用OpenAI的新一代表语言模型GPT-2创建模型,并使用Panel框架构建网页仪表板。 本指南分为两部分。 第一部分加载模型并创建预测函数。 第二部分,构建web APP应用。

自动生成文本的APP应用程序示例。 构建此web APP应用程序的更简单变体。

准备工作

本教程假定您安装了Python 3.7并了解语言模型。 虽然本教程中的所有步骤都可以在Jupyter以外执行,但强烈建议您使用jupyter notebook。

使用PyTorch作为我们选择的深度学习库。 PyTorch使用transformers库部署预培训的OpenGPT-2模型。 要安装这些库,请在bash命令行中键入以下命令:

pipinstalltorchpipinstalltransformers我们的web APP应用程序使用一个名为Panel的窗口容器/框架。 这是一个很好的工具,可以通过jupyter notebooks或常规Python脚本创建易于维护的仪表板。 可以使用以下命令安装Panel :

PipInstallPanel )。

第1部分:创建模型

OpenAI的GPT是一种基于transformer的语言模型,在生成类似人类语言的文本方面引起了很多关注。 如果以前没有尝试过的话,读完的时候有可能会有同样的看法。

加载模型

首先,需要引入必要的包。 详细情况如下。

importnumpyasnpimporttorchimporttorch.nn.functionalasffromtransformersimportgpt2tokenizer,gp T2 lmheadmodelfromrandomimimportor (如果是首次运行,下载预培训的模型可能需要几分钟时间。)

Tok=gp T2 tokenizer.from _ pre trained (gp T2 ) ) model=gp T2 lmheadmodel.from _ pre trained (gp T2 ) )预测函数

在这个阶段,大部分工作已经结束了。 我们的模型是预先训练的,所以不需要再次训练或修改。 只需在模型中输入文本并创建生成预测文本的函数。

defget_pred(text,model,tok,p=0.7 ) : input _ ids=torch.tensor (Tok.encode ) text ) ).unsqueeze(0) dim=-1 ).squeezeidxs=torch.argsort ) probs,descending=True ) res, cumsum=0. foridxinidxs 3360 RES.append (idx ) cumsum=probs [ idx ] ifcumsump : pred _ idx=idxs.new _ tensor ] [ 所以,试着分解一下吧。 首先,为输入input_ids的文本添加标签(tokenize )和编码。 接下来,我们要求我们的模型为下一个单词/令牌生成logits向量。 应用softmax函数,按降序对这些可能的概率结果进行排序后,得到了向量idxs,其中按各自的概率顺序列出了每个token的索引。

在这个阶段,你可以选择概率最高的token。 但是,我们希望混合结果,以便同一输入文本可以生成各种文本。 为此,请添加随机元素,然后从以下最可能的token列表中选择随机token : 这样,你就不会每次都选择同样的预测token了。 为了实现这一点,

我们采用了Nucleus (Top-p) Sampling 方式。

我们通过循环遍历每个概率来执行此操作,直到循环遍历的所有概率之和大于p(这里的p是一个介于0到1之间的任意数字)。当p被超过前,所有遍历到的token都将被存储在列表res中。一旦p被超过,我们就从这个列表中随机选择一个token。请记住,我们正在遍历的概率列表包含了其按概率排序的索引。注意,p值越高,我们的列表中将包含更多的token。反之亦然。因此,如果每次都希望得到相同的结果,可以将p值设置为0。

现在,让我们测试一下我们的预测函数:

每次都会有不同的结果,这正是我们所期望的。现在,我们的预测功能准备好了。让我们开始构建我们的Web应用程序吧!

第二部分:构建web应用程序

Panel框架简介

如果你还不熟悉Panel框架,那请记住,Panel框架可以帮助我们创建一个web仪表板和web应用程序。简而言之,你需要知道的是它有三个主要组件:

Panel:可以包含一个或多个窗格(pane)对象的容器,面板(pane)对象是指文本、图像、图形、小部件等(也可以包含其他panel);

Pane:任何单个对象,例如文本、图像、数据帧等;

Widget(小部件):用户可以自行调整的项目,包括文本输入框、滑块、按钮、复选框,等等可以改变窗格的行为的小部件。

下一个也是最后一个你需要知道的事情是:我们有多种方法来定义不同的窗格和小部件之间的交互方式,我们称之为“callback(回调)”。例如,如果按下某个按钮,其他窗格应该如何更新呢?稍后我们将定义一个回调函数来演示它将如何准确地做到这一点。

Web应用程序简介

我们的文本生成器应用程序将有一个输入窗口,以便用户输入他们想要输入的文本。接下来,用户应该能够通过按下按钮生成新的token。在这之后,它将使用我们在第一部分中定义的预测函数来预测新的token来生成新文本。最后,用户应该能够在已经预测的token基础之上继续生成新的文本。

实施

让我们首先导入Panel并创建文本输入小部件:

import panel as pnpn.extension # loading panel's extension for jupyter compatibility text_input = pn.widgets.TextInput

现在,如果在jupyter中执行文本输入,我们将得到以下结果:

接下来,我们需要一个窗格,它会在越来越多的token生成时存储整个文本:

generated_text = pn.pane.Markdown(object=text_input.value)

注意,这里我们将文本对象设置为text_input的值。我们希望generated_text的值与text_input的值相同,因为我们将要在generated_text之上预测新文本。随着越来越多的token被添加到我们的序列中,我们将继续基于generated_text进行预测,直到用户改变了text_input。一旦用户改变了text_input,这个进程将重新启动。

然而,到这里事情还没有完全结束。尽管generated_text将在开始时接受text_input的值,但如果text_input值发生更改,generated_text值将不会自我更新。为此,我们需要像下面这样将这两个对象链接在一起:

text_input.link(generated_text, value='object')

这里,我们在text_input和generated_text之间形成了单向链接。因此,每当text_input的值发生更改时,generated_text值也将更改为新值。如下所示:

观察面板中文的text_input和generated_text之间的链接行为。注意:作为组件的pn.Row也是一个面板,即它是一个窗格和小部件的容器。

现在我们有了两个文本对象,让我们来创建按钮小部件:

button = pn.widgets.Button(name="Generate",button_type="primary")

很好,现在我们有了一个按钮,我们只需要把它和我们想要的行为链接起来。为此,我们将编写一个回调函数,该函数将在每次单击按钮时运行:

def click_cb(event):pred = get_pred(generated_text.object, model, tok)generated_text.object += pred

这里发生了两件事。首先,我们将generated_text作为输入传递给我们之前编写的预测函数,该函数将生成一个新的token。其次,将此token添加到generated_text中。每次新单击按钮时,这个过程都会重复。

到这里,我们仍然需要将按钮单击事件与回调函数绑定在一起。我们可以这样做:

button.on_click(click_cb)

我们现在已经完成了所有小部件、窗格和函数的创建。接下来我们需要做的只是把这些东西放在一个面板里,然后看看会发现什么:

app = pn.Column(text_input, button, generated_text); app

注:pn.Column与pn.Row类似,它是另一种类型的panel,即小部件、窗格甚至其他panel的容器。

让我们再添加一个标题和一个简短的描述,我们就大功告成了!

title = pn.pane.Markdown("# **Text Generator**")desc = pn.pane.HTML("<marquee scrollamount='10'><b>Welcome to the text generator! In order to get started, simply enter some starting input text below, click generate a few times and watch it go!</b></marquee>")final_app = pn.Column(title, desc ,app)

服务你的Web应用程序

Panel框架使得服务web应用程序变得非常容易。有两种方法可以用来做这件事。第一个是调用“.show”命令。这种方法通常用于调试,如下面所示。它将启动一个新窗口,在这个窗口中,一个名为final_app的 panel将作为一个web应用程序运行。

final_app.show

而为了让它在生产环境中运行,你需要使用“.servable”方法。但是,如果你以类似于show方法的方式运行此操作,你的笔记本上不会出现任何东西,你必须像下面这样在你的笔记本上运行bash脚本:

panel serve --show text_generation_app.ipynb

只要你的笔记本中有以下代码,这个操作将在本地端口上启动你的web应用:

final_app.servable

大功告成!

现在,你自己有能力构建一个自动生成文本的应用程序。你可以通过添加更多panel组件来进一步完善它。你甚至可以将此应用程序嵌入到其他项目中。像往常一样,你可以在github上找到我的代码库。注意:下面图片中的app是我在本教程中使用的app(text_generation_app.ipynb)的高级变体:。

原文:https://towardsdatascience.com/build-a-text-generator-web-app-in-under-50-lines-of-python-9b63d47edabb

本文为 CSDN 翻译,转载请注明来源出处。

【End】

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。