程序员每天进步一点点

2020-05-31【腾讯云和阿里云Serverless体验对比

2020-05-31  本文已影响0人  桢桢claire
像向日葵一样心向阳光

今日鸡汤

我一直相信一句话:无论你遇见谁,他都是你生命该出现的人,绝非偶然,他一定会教会你什么。所以我也相信:无论我走到哪里,那都是我该去的地方,经历一些我该经历的事,遇见我该遇见的人。

最近在学习Serverless,分别尝试了一下腾讯云和阿里云提供的Serverless,选择几个场景做了实验,特来总结一下。由于篇幅和本宝宝精力限制,将分几篇来更。

今天先看阿里云的Serverless产品和使用体验。

阿里云的serverless产品

阿里云的Serverless相关产品主要有4个:

Serverless场景

推荐一篇Serverless应用场景的文章Serverless应用场景,介绍了Serverless的演进和四个场景(事件触发场景、视频直播多人连麦场景、物联网数据处理场景和共享派单场景)。

阿里云开发者社区的云体验平台内置了很多云产品的体验场景。关于Serverless的场景有四个:

  1. 基于函数计算实现快速建站: 使用Function Compute快速部署一个wordpress网站。
  2. 基于函数计算实现AI推理: 使用Function Compute 部署Tensorflow Serverless 平台,实现上传图片进行猫狗识别。
  3. 基于小程序Serverless开发个人相册小程序: 使用小程序Serverless的开发能力快速部署一个相册小程序。
  4. 快速搭建Serverless小商城: 使用Function Compute部署litemall商城。

场景2 基于函数计算实现AI推理

首先做了第二个实验,它是Serverless和AI结合的一个场景,通过使用阿里云的函数计算产品Function Compute来部署深度学习模型。对于AI 推理这样的 CPU 密集型任务,通过函数计算能够降低成本且保证弹性高可用,因此是Serverless的主要适用场景。

需要开通的服务

这个实验需要开通4项阿里云服务,依次是函数计算服务,文件存储服务NAS、专有网络VPC和日志服务。其中 NAS 用于存储函数计算需要的依赖包,日志服务用于记录运行时Log。

  1. 函数计算服务
    计费方式为按量计费,但目前还没有收费。

    函数计算控制台
  2. 文件存储服务NAS
    计费方式为按量1GB 0.42元/每月,可选通用型、极速型和CPFS,这里选了最便宜的通用型。

    NAS控制台
  3. 专有网络VPC
    VPC是云上私有网络,可以选择IP地址范围、配置路由表和网关等。每个VPC由一个路由器、至少一个私网网段和至少一个交换机组成。在初始化NAS的时候会使用已创建的VPC或新建一个VPC并与NAS关联。

    VPC控制台
  4. 日志服务
    计费方式为按量1 GB 0.18元,500M以下免费。

    日志服务控制台

命令行工具Fun

Fun是一个用于支持 Serverless 应用部署的工具,能管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),来进行开发、构建和部署操作。

  1. 安装
    可以使用npm、二进制安装和Homebrew三种方式来安装命令,还是比较方便的。

  2. 配置
    执行fun config命令配置已经开通的函数计算服务信息,

    fun config 配置函数计算服务信息

项目结构

项目源码在github cat-dog-classify,首先clone下来,查看代码结构。核心为三个文件:

  1. Funfile
    有点儿像docker file,定义了需要安装的依赖包。
RUNTIME python3
RUN fun-install pip install flask==1.1.1 -t /mnt/auto
RUN fun-install pip install scipy==1.1.0 -t /mnt/auto
RUN fun-install pip install Pillow -t /mnt/auto
RUN fun-install pip install scikit-learn -t /mnt/auto
RUN fun-install pip install scikit-image -t /mnt/auto
RUN fun-install pip install keras -t /mnt/auto
RUN fun-install pip install h5py -t /mnt/auto
RUN fun-install pip install tensorflow==1.13.1 -t /mnt/auto
COPY ./model /mnt/auto/model
  1. predict.py
    核心逻辑,有三个核心函数:
  1. template.yml
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  classify:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      NasConfig: Auto
      LogConfig:
        Project: 'claire-ai-pro'
        Logstore: 'fc-log'
    cat-dog:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Initializer: predict.initializer
        InitializationTimeout: 300
        Handler: predict.handler
        Runtime: python3
        CodeUri: './'
        EnvironmentVariables:
          model_path: /mnt/auto/model
        Timeout: 120
        MemorySize: 1024
      Events:
        http-test:
          Type: HTTP
          Properties:
            Qualifier: LATEST
            AuthType: ANONYMOUS
            Methods: ['GET', 'POST', 'PUT']

  claire-ai-pro:
    Type: 'Aliyun::Serverless::Log'
    Properties:
      Description: 'fc serverless ai project'
    fc-log:
      Type: 'Aliyun::Serverless::Log::Logstore'
      Properties:
        TTL: 10
        ShardCount: 1

  my_domain:
    Type: 'Aliyun::Serverless::CustomDomain'
    Properties:
      DomainName: Auto
      Protocol: HTTP
      RouteConfig:
        Routes: 
          '/*':
            ServiceName: classify
            FunctionName: cat-dog

FUN根据template.yml里面定义的来部署Serverless应用。可以看到,里面定义了一个Service(classify)、一个Function(cat-dog)和一个HTTP方式的event。其中,

服务信息

开始识别猫狗啦~

  1. 安装依赖
    使用fun install -v根据Funfile里定义的逻辑安装依赖。整个过程基于docker,最后会把所有内容打包成一个docker image。
fun install (1)
fun install (2)
运行完后会生成一个docker image
  1. 将第三方依赖上传到NAS
    一般来说,NAS上会存放一些体积比较大且不易变动的资源。因此很适合使用NAS存放这些比较大的依赖资源。在 Fun 2.16.0 有一个新的配置项NasConfig: Auto 。通过该属性,可以一键将 NAS 及其依赖的 VPC 资源一同创建出来。

第一步, 首先使用fun nas init命令初始化NAS,FUN会根据.env中的信息自动获取或创建NAS。

(base) localhost:cat-dog-classify claire$ fun nas init
using template: template.yml

start fun nas init...
checking if _FUN_NAS_classify needs to be deployed...
Waiting for service _FUN_NAS_classify to be deployed...
    make sure role 'aliyunfcgeneratedrole-cn-beijing-classify' is exist
    role 'aliyunfcgeneratedrole-cn-beijing-classify' is already exist
    attaching police 'AliyunECSNetworkInterfaceManagementAccess' to role: aliyunfcgeneratedrole-cn-beijing-classify
    attached police 'AliyunECSNetworkInterfaceManagementAccess' to role: aliyunfcgeneratedrole-cn-beijing-classify
    using 'VpcConfig: Auto', Fun will try to generate related vpc resources automatically
        vpc already generated, vpcId is: vpc-2z************************owkgsl
        vswitch already generated, vswitchId is: vsw-2z************rpcq1skano
        security group already generated, security group is: sg-2z*************9k9yn
    generated auto VpcConfig done:  {"vpcId":"vpc-2z************wkgsl","vswitchIds":["vsw-2z************kano"],"securityGroupId":"sg-2z************9yn"}
    using 'NasConfig: Auto', Fun will try to generate related nas file system automatically
        nas file system already generated, fileSystemId is: 16f************3e
        nas file system mount target is already created, mountTargetDomain is: 16f************3e-wlt63.cn-beijing.nas.aliyuncs.com
    generated auto NasConfig done:  {"UserId":10003,"GroupId":10003,"MountPoints":[{"ServerAddr":"16************3e-wlt63.cn-beijing.nas.aliyuncs.com:/classify","MountDir":"/mnt/auto"}]}
    Checking if nas directories /classify exists, if not, it will be created automatically
    Checking nas directories done ["/classify"]
    Waiting for function fun-nas-function to be deployed...
        Waiting for packaging function fun-nas-function code...
        The function fun-nas-function has been packaged.
        Waiting for HTTP trigger httpTrigger to be deployed...
        triggerName: httpTrigger
        methods: [ 'POST', 'GET' ]
        url: https://13************7166.cn-beijing.fc.aliyuncs.com/2016-08-15/proxy/_FUN_NAS_classify/fun-nas-function/
        Http Trigger will forcefully add a 'Content-Disposition: attachment' field to the response header, which cannot be overwritten 
        and will cause the response to be downloaded as an attachment in the browser. This issue can be avoided by using CustomDomain.

        trigger httpTrigger deploy success
    function fun-nas-function deploy success
service _FUN_NAS_classify deploy success

Create local NAS directory of service classify:
    /Users/claire/Innovation/serverless/Ali/cat-dog-classify/.fun/nas/auto-default/classify
fun nas init Success

第二步, 使用fun nas sync命令将本地NAS中的内容上传到NAS中的目录中。

(base) localhost:cat-dog-classify claire$ fun nas sync
using template: template.yml
starting upload /Users/claire/Innovation/serverless/Ali/cat-dog-classify/.fun/nas/auto-default/classify to nas://classify/mnt/auto/

start fun nas init...
checking if _FUN_NAS_classify needs to be deployed...
skip deploying _FUN_NAS_classify, which has been deployed
fun nas init Success

zipping /Users/claire/Innovation/serverless/Ali/cat-dog-classify/.fun/nas/auto-default/classify
✔ upload done
unzipping file
✔ unzip done
✔ upload completed!

Tips for next step
======================
$ fun nas info      # Show NAS info
$ fun nas ls        # List NAS files
$ fun nas sync      # Synchronize files to nas
$ fun deploy        # Deploy Resources
  1. 部署
    执行fun deploy将service和函数部署到阿里云。
Request a new temporary domain ...
The assigned temporary domain is 20902385-138**********166.test.functioncompute.com,expired at 2020-06-10 13:19:45, limited by 1000 per day.
Waiting for custom domain my_domain to be deployed...
custom domain my_domain deploy success
  1. 测试
    在浏览器打开log中显示的temporary domain,可以看到经过了漫长的冷启动(主要在花时间import Karas)后打开了网页。在上传照片点击predict后,可以看到发送了一个POST请求给函数计算服务器,之后调用我们部署的函数,返回并显示计算结果。
    image.png

冷启动优化——预留实例方式

函数计算提供了两种类型的资源:按量实例和预留实例

本来想试一下,结果告诉我我的账号不支持预留资源的功能,心塞。


image.png

那就看看视频吧,预留操作视频在这里。

还是需要根据日常的访问量来确定最合适的预留实例数,是阿里比较推荐的消除冷启动的方式,有机会可以试试看做个压测。

打算再做一个小程序的场景体验一下,再写总结。

(未完待续)

上一篇 下一篇

猜你喜欢

热点阅读