用Serverlss部署一个基于深度学习的古诗词生成API

anycodes7个月前日常分享11170

第六篇:用Serverlss部署一个基于深度学习的古诗词生成API

前言

古诗词是中国文化殿堂的瑰宝,记得曾经在韩国做Exchange Student的时候,看到他们学习我们的古诗词,有中文的还有翻译版的,自己发自内心的骄傲,甚至也会在某些时候背起一些耳熟能详的诗词。

本文将会通过深度学习为我们生成一些古诗词,并将模型部署到Serverless架构上,实现基于Serverless的古诗词生成API。

项目构建

古诗词生成实际上是文本生成,或者说是生成式文本。关于基于深度学习的文本生成,最入门级的读物包括Andrej Karpathy的博客。他使用例子生动讲解了Char-RNN(Character based Recurrent Neural Network)如何用于从文本数据集里学习,然后自动生成像模像样的文本。

上图直观展示了Char-RNN的原理。以要让模型学习写出“hello”为例,Char-RNN的输入输出层都是以字符为单位。输入“h”,应该输出“e”;输入“e”,则应该输出后续的“l”。输入层我们可以用只有一个元素为1的向量来编码不同的字符,例如,h被编码为“1000”、“e”被编码为“0100”,而“l”被编码为“0010”。使用RNN的学习目标是,可以让生成的下一个字符尽量与训练样本里的目标输出一致。在图一的例子中,根据前两个字符产生的状态和第三个输入“l”预测出的下一个字符的向量为<0.1, 0.5, 1.9, -1.1>,最大的一维是第三维,对应的字符则为“0010”,正好是“l”。这就是一个正确的预测。但从第一个“h”得到的输出向量是第四维最大,对应的并不是“e”,这样就产生代价。学习的过程就是不断降低这个代价。学习到的模型,对任何输入字符可以很好地不断预测下一个字符,如此一来就能生成句子或段落。

本文项目构建参考了Github已有项目:https://github.com/norybaby/poet

通过Clone代码,并且安装相关依赖:

pip3 install tensorflow==1.14 word2vec numpy

通过训练:

python3 train.py

可以看到训练结果:

此时会生成多个模型在output_poem文件夹下,我们只需要保留最好的即可,例如我的训练之后生成的json文件:

{
  "best_model""output_poem/best_model/model-20390",
  "best_valid_ppl"21.441762924194336,
  "latest_model""output_poem/save_model/model-20390",
  "params": {
    "batch_size"16,
    "cell_type""lstm",
    "dropout"0.0,
    "embedding_size"128,
    "hidden_size"128,
    "input_dropout"0.0,
    "learning_rate"0.005,
    "max_grad_norm"5.0,
    "num_layers"2,
    "num_unrollings"64
  },
  "test_ppl"25.83984375
}

此时,我只需要保存output_poem/best_model/model-20390模型即可。

部署上线

在项目目录下,安装必要依赖:

pip3 install word2vec numpy -t ./

由于tensorflow等是腾讯云云函数内置的package,所以这里无需安装,另外numpy这个package需要在CentOS+Python3.6环境下打包。也可以通过之前制作的小工具打包:https://www.serverlesschina.com/35.html

完成之后,编写函数入口文件:

import uuid, json
from write_poem import WritePoem, start_model

writer = start_model()


def return_msg(error, msg):
    return_data = {
        "uuid": str(uuid.uuid1()),
        "error": error,
        "message": msg
    }
    print(return_data)
    return return_data


def main_handler(event, context):
    # 类型
    # 1: 自由
    # 2: 押韵
    # 3: 藏头押韵
    # 4: 藏字押韵

    style = json.loads(event["body"])["style"]
    content = json.loads(event["body"]).get("content"None)

    if style in '34' and not content:
        return return_msg(True"请输入content参数")

    if style == '1':
        return return_msg(False, writer.free_verse())
    elif style == '2':
        return return_msg(False, writer.rhyme_verse())
    elif style == '3':
        return return_msg(False, writer.cangtou(content))
    elif style == '4':
        return return_msg(False, writer.hide_words(content))
    else:
        return return_msg(True"请输入正确的style参数")

同时需要准备好Yaml文件:

getUserIp:
  component: "@serverless/tencent-scf"
  inputs:
    name: autoPoem
    codeUri: ./
    exclude:
      - .gitignore
      - .git/**
      - .serverless
      - .env
    handler: index.main_handler
    runtime: Python3.6
    region: ap-beijing
    description: 自动古诗词撰写
    namespace: serverless_tools
    memorySize: 512
    timeout: 10
    events:
      - apigw:
          name: serverless
          parameters:
            serviceId: service-8d3fi753
            protocols:
              - http
              - https
            environment: release
            endpoints:
              - path: /auto/poem
                description: 自动古诗词撰写
                method: POST
                enableCORS: true

此时,我们就可以通过Serverless Framework CLI部署项目。部署完成之后,我们可以通过PostMan测试我们的接口:

总结

本文通过已有的深度学习项目,在本地进行训练,保存模型,然后将项目部署在腾讯云云函数上,通过与API网关的联动,实现了一个基于深度学习的古诗词撰写的API。

工具体验



作者简介:刘宇,毕业于浙江大学,硕士学历,目前在腾讯工作,著有《Serverless 架构》一书,是Serverless架构的热衷者,曾做一款叫Anycodes的软件,目前下载超过100万次。

相关文章

serverless-git和serverless-cicd

serverless-git和serverless-cicd

前言 传统情况下,我们写完代码,可能面对两个事情:发布到代码仓库以及部署到线上,传统的我们会手动实现这些操作,出现误操作的概率也是蛮高的,相对来说也是比较机械化的工作。CICD的引入,大大改善了持续继...

利与弊-多个接口要分成多个函数还是写到一个函数中

利与弊-多个接口要分成多个函数还是写到一个函数中

我们在做一个项目的时候,会有多个函数/方法,这个是一个很常见的事情,就算不按照函数/方法来划分,也通常会有多个功能,以一个简单的博客为例,可能拥有最基础的: 获取分类列表 获取文章列表(默认/...

基于Serverless的验证码识别API

基于Serverless的验证码识别API

前言 之前和大家分享了很多的CV相关的例子,被很多小伙伴吐槽说我是调包侠,还连累了Serverless被很多人误以为也仅仅能"调包玩一玩",其实在Serverless中,开发者的自由度还是非常大的,除...

云函数中使用Python-ORM: Peewee

云函数中使用Python-ORM: Peewee

前言 ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复...

基于Serverless架构的Git代码统计工具

基于Serverless架构的Git代码统计工具

前言 自己毕业也有一年多了,很想统计一下过去一年自己贡献了多少的代码。想了一下,可能要用git log,简单的做了一下,感觉不是很爽,正直自己想通过Serverless做一个工具合集,就想能不能...

利与弊-传统框架要不要部署在Serverless架构上

利与弊-传统框架要不要部署在Serverless架构上

Serverless架构发展的速度可以说是非常的迅速,而且Serverless的发展也是有一套自己的独特的打法,这种打法在一定程度上,让很多开发者不适应,尤其是传统的Web框架无法在Serverles...

2020年函数计算的冷启动怎么样了

2020年函数计算的冷启动怎么样了

前言 自从Serverless架构被提出,函数计算这个名词变得越发的火热,甚至在很多时候有人会认为Serverless就是函数计算。 作为Serverless架构中的一个重要组成部分,云函数确实值得...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
嘿,一起Serverless