深度学习 | 如何开发、部署 Serverless 应用?

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 本文将详细介绍如何开发和部署 Serverless 应用,并通过阿里云函数计算控制台与开发者工具 Serverless Devs 进行应用的初始化、部署;最后分享应用的调试,通过科学发布、可观测性等介绍应用的部署和运维总结,进而实现从应用初始化到调试、发布、运维基础流程、核心步骤的探索。

作者:阿里云云原生


本文将详细介绍如何开发和部署 Serverless 应用,并通过阿里云函数计算控制台与开发者工具 Serverless Devs 进行应用的初始化、部署;最后分享应用的调试,通过科学发布、可观测性等介绍应用的部署和运维总结,进而实现从应用初始化到调试、发布、运维基础流程、核心步骤的探索。


如何开发、部署 Serverless 应用


通过控制台进行函数创建


下面我们将基于 Serverless 架构,在 FaaS 平台上实现 Hello world 的输出,基本步骤可分为:


1)注册账号,并登录;


2)找到对应的 FaaS 产品:阿里云的函数计算;


3)单击“创建函数”按钮,进行函数的创建;


4)配置函数,包括函数名称、运行时(可以认为是要使用的编程语言,或者要使用的编程环境等);


5)完成创建,并测试。


以阿里云函数计算为例,当注册并登录阿里云账号之后,需要找到函数计算产品,并单击进入产品首页,如图所示。


1.png

阿里云函数计算产品首页


选择左侧的“服务及函数”,并进行服务的创建,如图所示。


2.png

阿里云函数计算创建服务页面


然后进行函数的创建,如图所示。


3.png

阿里云函数计算创建函数页面


相对于其他的云平台,在阿里云函数计算平台,我们不仅要为即将创建的函数设置函数名称、选择运行时等,还需要设置该函数所在的服务。在阿里云函数计算的体系中,引入服务的概念会带来一定的好处。


  • 相关联的函数可以放在一个服务下进行分类,这种分类实际上比标签分类更直观明了。 


  • 相关联的函数在同一个服务下共享一定的配置,例如 VPC 配置、NAS 配置,甚至某些日志仓库的配置等。 


  • 通过服务,我们可以很好地做函数环境的划分,例如对于一个相册项目,该项目可能存在线上环境、测试环境、开发环境,那么可以在服务层面做区分,即可以设定 album-release、album-test、album-dev 三个服务,进而做环境的隔离。  


  • 通过服务,我们可以很好地收纳函数。如果项目比较大,可能会产生很多函数,统一放在同一层级会显得非常混乱,这时就可以通过服务进行有效的收纳。 


完成函数的创建之后,我们可以进行代码的编辑。阿里云函数计算支持从对象存储上传代码,支持直接上传代码包,以及在线编辑。除此之外,阿里云函数计算还支持直接上传文件夹,如图所示。


4.png


保存代码之后,可以单击“执行”按钮进行函数的触发、测试。


5.png


可以看到,系统已经输出相关日志:Hello world。至此,一个非常简单的函数就创建成功了。


通过工具进行函数创建与部署


通过 Serverless 开发者工具入门 Serverless 应用开发、部署、运维是非常方便的,我们以 Serverless Devs 为例介绍阿里云函数计算应用的部署,并对工具侧的函数创建、部署以及其他相关功能进行探索。


Serverless Devs 是一个开源的 Serverless 开发者平台,致力于为开发者提供强大的工具链。通过该平台,开发者可以一键体验多云 Serverless 产品,极速部署 Serverless 项目。按照官方目前的描述,Serverless Devs 已经支持包括 AWS Lanbda、阿里云函数计算、百度智能云函数计算、腾讯云云函数、华为云函数工作流等在内的多个云厂商的 Serverless 相关产品。


下面通过 Serverless Devs 开发者工具,以阿里云函数计算为例进行实践,探索如何创建、部署 Serverless 应用。


1)安装 Serverless Devs 开发者工具(执行npm install -g @Serverless-devs/s命令)。


2)设置阿里云凭证信息(执行s config add --AccessKeyID AccessKeyID --AccessKeySecret AccessKeySecret --AccountID AccountID命令)。


3)建立模板项目(执行s init node.js12-http -d fc-hello-world-demo命令),初始化过程如图所示。


6.png

通过 Serverless Devs 创建项目图


4)进入项目目录(执行 cd fc-hello-world-demo 命令),并部署(执行 s deploy 命令),部署后的结果如图所示。


7.png

通过 Serverless Devs 部署项目


项目部署成功之后,可以进行更多操作,具体如下。


触发函数(执行s invoke命令),结果如图所示。


8.png

通过 Serverless Devs 触发函数


查看线上函数详情(执行s info命令),结果如图所示。


9.png

通过 Serverless Devs 查看函数详情


Serverless Devs 还拥有比较完善的桌面客户端。开发者可以通过桌面客户端进行应用的创建、管理以及相关配套功能的使用,示例如下。


查看应用列表,并快速创建应用,如图所示。


10.png

通过 Serverless Devs 桌面客户端查看应用列表


创建应用之后,可以进行应用的管理。下图是 Serverless Devs 桌面客户端管理应用界面。


11.png

通过 Serverless Devs 桌面客户端管理应用


其他配套功能的使用如下。如图所示为一键压测函数性能。


12.png

通过 Serverless Devs 桌面客户端一键压测函数性能


一键对函数资源进行调试,如图所示。


13.png

通过Serverless Devs桌面客户端一键对函数资源进行调试


一键查看函数多维度指标信息,如图所示。


14.png

通过 Serverless Devs 桌面客户端一键查看函数多维度指标信息


除此之外,Serverless Devs 还拥有较为方便的 Yaml 可视化配置功能,如下图所示。


15.png

通过Serverless Devs桌面客户端进行Yaml可视化配置


如何对 Serverless 应用进行调试


在应用开发过程中,或者应用开发完成后,当执行结果不符合预期时,通常要进行一定的调试。但是在 Serverless 架构下,调试往往会受到极大的考验,尤其在受环境因素限制时,通常会出现这样的情况:所开发的应用在本地可以健康、符合预期地运行,但是在 FaaS 平台上则有一些不可预测的问题;或者在一些特殊环境下,本地没有办法模拟线上环境,难以进行应用的调试。Serverless 应用的调试一直备受诟病,但是各个云厂商并没有因此放弃在调试方向上的深入探索,下面我们介绍几种方式。


在线调试


  • 简单调试
     

所谓的简单调试,就是在控制台进行调试。以阿里云函数计算为例,可以在控制台通过“代码执行”按钮进行基本的调试,如下图所示。


16.png

函数计算代码编辑页面


必要的时候也可以通过设置 Event 来模拟一些事件。


17.png

阿里云函数计算事件页面


在线调试的好处是可以使用一些线上环境进行代码的测试。当线上环境拥有 VPC 等资源时,在本地环境是很难进行调试的。


  • 断点调试
     

除了简单的在线调试之外,部分云厂商还支持断点调试,例如阿里云函数计算的远程调试。我们以阿里云函数计算远程调试为例,可以实现通过控制台进行函数的在线调试。当创建好函数之后,可以选择远程调试,并单击“开启调试”按钮,如图所示。


18.png

函数计算远程调试页面


开启调试之后,稍等片刻,系统将会进入远程调试界面,如图所示。


19.png

函数计算远程调试开始页面当出现图


当出现下图所示界面,我们可以进行断点调试。


20.png

函数计算远程调试断点调试页面


端云联调


在本地进行 Serverless 应用开发时,往往会涉及一些线上资源,例如通过对象存储触发器触发函数执行,通过 VPC 访问数据库等,此时线上和线下环境不一致会让线下开发、调试面临极大的挑战。Serverless Devs 开发者工具通过搭建 Proxy 辅助函数的方法将线上和线下资源打通,可以快速帮助开发者在本地进行应用的开发与调试,这种调试方式称为端云联调。


如下图所示, Serverless Devs 开发者工具会根据 Yaml 配置文件,创建辅助服务和辅助函数,并通过辅助服务和辅助函数实现线上和线下资源打通,以及完整的端云联调。


21.png

Serverless Devs 端云联调原理示意图


Serverless Devs 开发者工具会根据 Yaml 配置文件的内容,创建辅助服务和辅助函数(辅助服务和 Yaml 中所声明的业务服务配置是一致的)。


通过触发器(包括通过 SDK、API、s proxied invoke 命令,或者其他触发器)触发辅助函数(函数计算 C),请求流量回到本地调试实例(本地环境 A),这时本地调试实例(本地函数执行环境容器)收到的 event 和 context 是真实来自线上的。


本地调试实例(本地环境 A)可以直接访问以下内容:


  • VPC 内网资源,比如 RDS、Kafka 内网地址等;
  • 一些云服务的内网地址;
  • 硬盘挂载服务(直接访问 NAS)。 


端云联调流程如下:


1)执行s proxied setup命令准备端云联调所需的辅助资源以及本地环境;


2)对于无触发器的普通事件函数或者 HTTP 触发器,准备工作完成后,启动另一个新的终端,切换到该项目路径下,执行s proxied invoke命令调用本地函数;


3)完成调试任务后,执行s proxied cleanup命令清理端云联调所需的辅助资源以及本地环境。


除了通过命令使用端云联调功能外,我们也可以在 VSCode 开发者工具中使用端云联调功能,如图所示。


22.png

在 VSCode 中使用端云联调功能


远程调试


端云联调在本地除了有一个通道服务容器外,还有一个函数计算容器,用来执行本地函数;远程辅助函数只是单纯将远程流量发送到本地。在实际调试过程中,需要登录到实例进行项目调试,此时可以选择使用远程调试。


相比于端云联调,远程调试在本地只有一个通道服务容器,执行过程全部依赖线上;远程函数将执行结果返回。远程调试整体架构简图如图所示。


23.png


除了通过上面远程调试架构简图所示的通道服务登录线上环境进行代码调试或问题定位之外,部分云厂商还提供了直接登录实例进行代码调试的功能。以 Serverless Devs 为例,当使用阿里云函数计算时,我们就可以直接通过 instance 命令进行线上实例登录。


尽管实例登录命令已经提供了便捷的登录体验,能帮助用户解决复杂场景下的应用异常定位等问题,但是登录实例后,用户无法直接通过函数日志、监控指标来具体定位问题,还需要借助例如 coredump、tcpdump、jmap 等工具进行问题的深入排查。


例如,某用户发现自己的线上程序最近出现一些函数错误提示,报错内容都是连接远程某服务时超时。该用户怀疑是函数实例与远端服务的网络连接不稳定,因此想进入实例内部,分析实例与远端服务的网络情况。此时,我们可以按照以下步骤进行问题的排查。


1)如图所示,登录实例内部后,需要执行 apt-get update 和 apt-get install tcpdump 两条命令,进行 tcpdump 工具的安装。


24.png

实例登录与安装软件效果图


2)安装完毕后,执行 tcpdump 命令,对远端服务 IP 的请求进行抓包,并将抓包结果保存在 tcpdump.cap 文件中。


3)抓包完毕后,借助 OSS 命令行工具 ossutil64,将 tcpdump.cap 文件上传到自己的 OSS,然后下载到本地借助分析工具 Wireshark 进行分析。


本地调试


  • 命令行工具
     

大部分 FaaS 平台会为用户提供相对完备的命令行工具,如阿里云的 Funcraft,同时也有一些开源项目如 Serverless Framework、Serverless Devs 等支持多云厂商的 FaaS 平台。通过命令行工具进行代码调试的方法很简单。以 Serverless Devs 为例,本地调试阿里云函数计算方法为:首先确保本地拥有一个函数计算的项目,然后在项目下执行调试指令,例如在 Docker 中进行调试,如下面所示。


25.png

通过命令行进行本地调试


  • 编辑器插件
     

以 VSCode 插件为例,下载好阿里云函数计算的 VSCode 插件,并且配置好账号信息之后,在本地新建函数,并且在打点之后进行断点调试,如图所示。


26.png

编辑器插件中进行调试


其他调试方案


  • Web 框架的本地调试
     

以 Python 语言 Bottle 框架为例,若在阿里云 FaaS 平台开发传统 Web 框架,可以增加如下代码:


app = bottle.default_app()


并且对run()方法进行条件限制(if __name__ == '__main__'):


if __name__ == '__main__': 
    bottle.run(host='localhost', port=8080, debug=True)


例如:


# index.py
import bottle
@bottle.route('/hello/<name>')
def index(name): 
    return "Hello world"
app = bottle.default_app()
if __name__ == '__main__': 
    bottle.run(host='localhost', port=8080, debug=True)


和传统开发思路一样,我们可以在本地开发并在本地进行调试。当部署到线上时,只需要在入口方法处设置 index.app,即可实现平滑的部署。


  • 本地模拟事件调试
     

针对非 Web 框架,可以在本地构建一个方法,例如要调试对象存储触发器,代码如下:


import jsondef handler(event, context): print(event)def test(): event = { "events": [ { "eventName": "ObjectCreated:PutObject", "eventSource": "acs:oss", "eventTime": "2017-04-21T12:46:37.000Z", "eventVersion": "1.0", "oss": { "bucket": { "arn": "acs:oss:cn-shanghai:123456789:bucketname", "name": "testbucket",
"ownerIdentity": "123456789", "virtualBucket": "" }, "object": { "deltaSize": 122539, "eTag": "688A7BF4F233DC9C88A80BF985AB7329", "key": "image/a.jpg", "size": 122539 }, "ossSchemaVersion": "1.0", "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****" }, "region": "cn-shanghai", "requestParameters": { "sourceIPAddress": "140.205.***.***" }, "responseElements": { "requestId": "58F9FF2D3DF792092E12044C" }, "userIdentity": { "principalId": "123456789" } } ] } handler(json.dumps(event), None)if __name__ == "__main__": print(test())


这样通过构造一个 event 对象,即可实现模拟事件触发。


通过开发者工具进行依赖安装和项目构建


Serverless 架构下的应用开发和传统架构下的应用开发有一个比较大的区别是二者所关注的内容维度是不同的,例如理想状态下的前者并不需要人们关注服务器等底层资源。但是在当今的 Serverless 发展阶段,Serverless 架构下的应用开发真的不需要人们对服务器等额外关注吗?其实不是的,虽然 Serverless 架构强调的是 Noserver 心智,但是在实际生产中,有很多依赖等是无法跨平台使用的,例如 Python 语言中的某些依赖需要进行二进制编译,和操作系统、软件环境等有比较大的关系,所以项目中如果引入这类依赖,需要在和函数计算平台线上环境一致的环境中进行依赖的安装、代码的打包或项目的部署。


阿里云函数计算对自身的线上函数环境有比较细致的描述,提供了相应的文档,例如使用 C、C++ 、Go 编译的可执行文件,需要与函数计算的运行环境兼容。函数计算的 Python 运行环境如下。


  • Linux 内核版本:Linux 4.4.24-2.al7.x86_64。
  • Docker 基础镜像:docker pull python:2.7 ; docker pull python:3.6。 


但是,在实际应用开发过程中,依赖的打包依旧是让一众开发者头疼的事情。他们在很多 Serverless 应用开发过程中都会面临类似的挑战:项目在本地可以正常运行,一发布到线上就找不到某个依赖,但是实际上依赖是存在的,此时问题定位就成了非常困难的事情。


目前来看,为 Serverless 应用安装依赖或者项目构建的方法通常有 3 种:


1)在本地创建项目之后,自行根据云厂商提供的环境数据进行线上环境搭建,进而进行依赖的安装。这种方法相对来说自主可控,但是难度非常大,操作较为繁琐。


2)用已有的开发者工具进行依赖的安装,如图所示:


27.png

通过工具安装依赖示意图


以 Serverless Devs 开发者工具以及阿里云函数计算产品为例,开发者只需要按照语言习惯准备对应语言的相关依赖安装文件即可,例如 Python 语言的requirements.txt,Node.js语言的package.json等。然后在当前项目下,执行s build --use-docker命令即可完成与阿里云函数计算平台线上环境一致的环境中的依赖的安装。以 Python 项目为例,开发者只需要在项目目录下完成如下操作。


  1. 开发源代码;
  2. 执行s build –use-docker命令之后,自动根据requirements.txt文件下载对应的依赖到本地,并且和源码一起组成交付物;
  3. 执行s deploy命令将整个交付物打包,创建函数,同时设置好依赖包的环境变量,让函数可以直接输入对应的代码依赖包。

3)目前,部分云厂商的 FaaS 平台控制台支持 WebIDE,阿里云的 WebIDE 拥有实现命令行程序的能力,所以也可以在控制台的 WebIDE 中直接进行依赖的安装。在线安装依赖示意图如图所示。


28.png

在线安装依赖示意图


新书推荐


阿里云、蚂蚁集团的 4 位专家刘宇、田初东、卢萌凯、王仁达(排名不分先后)系统梳理阿里在 Serverless 架构下的 AI 经验,联袂推出新书《Serverless 架构下的 AI 应用开发:入门、实战与性能优化》


29.jpeg


本书是关于 Serverless 架构下机器学习实战的技术书,我们希望通过简单明了的语言、真实的案例,以及开放的源代码,为读者介绍 Serverless 架构与机器学习相关的基础知识,帮助读者在 Serverless 架构下开发、上线机器学习项目。


作者介绍:

刘宇,阿里云 Serverless 产品经理
田初东,蚂蚁集团算法工程师
卢萌凯,阿里云 Serverless 高级解决方案架构师
王仁达,阿里云 Serverless 工具链技术负责人


相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
19小时前
|
机器学习/深度学习 计算机视觉 网络架构
深度学习在图像识别中的应用与挑战
【5月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉进步的核心力量。特别是在图像识别领域,深度神经网络的引入极大地提高了系统的准确率和鲁棒性。本文旨在探讨深度学习技术在图像识别任务中的应用,分析其面临的主要挑战,并提出潜在的解决方案。我们将从卷积神经网络(CNN)的基本原理出发,进而讨论数据增强、迁移学习、模型压缩等关键技术,最后探讨计算资源限制、对抗性攻击以及模型泛化能力等挑战。
|
21小时前
|
机器学习/深度学习 计算机视觉
深度学习在图像识别中的创新应用
【5月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域前进的核心动力。本文旨在探讨深度学习技术在图像识别任务中的最新进展,并着重分析卷积神经网络(CNN)的优化策略和新兴变体如胶囊网络(CapsNets)在提高识别准确性方面的潜力。我们将讨论数据增强、迁移学习以及对抗训练等关键技术如何助力模型泛化能力的提升,同时梳理深度学习在处理复杂图像场景下的挑战与机遇。通过实验结果与案例研究,本文揭示了深度学习技术在图像识别领域的创新趋势,为未来研究提供参考方向。
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习已成为推动技术创新的核心动力。特别是在图像识别领域,深度学习模型已经展现出了超越传统算法的性能。本文聚焦于深度学习在自动驾驶系统中的应用,探讨其如何通过精确的图像识别提升车辆的环境感知能力。我们将介绍卷积神经网络(CNN)在处理车载摄像头数据中的关键作用,分析不同网络架构对识别效果的影响,并讨论集成多种传感器数据以增强系统鲁棒性的策略。
|
1天前
|
机器学习/深度学习 数据采集 监控
探索深度学习在图像识别中的应用
【5月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习已经成为推动计算机视觉进步的关键力量。本文将深入探讨深度学习在图像识别领域的应用,包括卷积神经网络(CNN)的基本原理、关键技术以及面临的挑战和解决方案。通过实例分析和技术讨论,旨在为读者提供一个关于如何利用深度学习技术提高图像识别准确性和效率的全面视角。
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第23天】 在本文中,我们将深入探讨深度学习技术在图像识别领域的最新进展及其在自动驾驶系统中的实际应用。随着卷积神经网络(CNN)和其他先进机器学习模型的发展,图像识别技术已达到新的高度,为自动驾驶车辆提供了更为精确和可靠的视觉感知能力。文章将首先回顾深度学习的基本原理和关键技术,然后分析当前自动驾驶领域所面临的挑战,并展示如何通过深度学习解决这些问题。此外,我们还将讨论数据增强、模型融合等策略在提升模型泛化能力方面的作用。最后,文章将总结深度学习在自动驾驶中的潜在影响,以及未来的研究方向。
|
1天前
|
机器学习/深度学习 自然语言处理 监控
探索深度学习在图像识别中的创新应用
【5月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域前进的关键力量。本文将深入探讨深度学习在图像识别任务中的应用,并展示如何通过创新的网络结构和训练策略提升模型的性能和效率。我们将分析卷积神经网络(CNN)的演变历程、数据增强的重要性以及迁移学习的实践案例,旨在为读者提供一个关于最新技术进展和实践方法的全面视角。
|
1天前
|
机器学习/深度学习 自动驾驶 安全
基于深度学习的图像识别技术在自动驾驶领域的应用
随着人工智能技术的不断发展,深度学习已经成为计算机视觉领域的重要研究方向。其中,基于深度学习的图像识别技术在自动驾驶领域的应用取得了显著的成果。本文将介绍深度学习的基本概念,重点分析卷积神经网络(CNN)在图像识别中的关键作用,并探讨如何将这些技术应用于自动驾驶系统,以提高其准确性和可靠性。
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在图像识别中的应用与挑战
本文主要探讨了深度学习技术在图像识别领域的应用及其面临的挑战。首先,介绍了深度学习的基本原理和关键技术,然后分析了其在图像识别中的优势和应用案例。接着,讨论了深度学习在图像识别中的一些挑战和问题,如数据不平衡、模型泛化能力差等。最后,对如何解决这些问题提出了一些建议和展望。
|
1天前
|
机器学习/深度学习 人工智能 算法
揭秘深度学习在图像识别中的核心技术与应用
【5月更文挑战第23天】 随着人工智能的飞速发展,深度学习技术在图像识别领域取得了突破性的进展。本文将深入探讨深度学习在图像识别中的应用,包括卷积神经网络(CNN)的原理、训练技巧以及优化策略。同时,我们将分析几种典型的图像识别任务,如物体检测、人脸识别和场景理解,并展示深度学习如何在这些任务中发挥关键作用。最后,本文还将讨论深度学习在图像识别领域的未来发展趋势和潜在挑战。
|
1天前
|
机器学习/深度学习 人工智能 算法
深度学习在图像识别中的应用与挑战
【5月更文挑战第23天】 随着人工智能的迅猛发展,深度学习技术在图像识别领域取得了显著成就。本文章将深入探讨卷积神经网络(CNN)在图像分类、目标检测和语义分割等任务中的应用,并剖析目前面临的主要挑战,如数据集偏差、模型泛化能力以及对抗性攻击等问题。同时,本文也将展望深度学习在图像识别领域的未来发展方向。
4 0

相关产品

  • 函数计算