目录

  1. 成果预览
  2. 踩坑记录
    1. 依赖安装
    2. 代码包过大
    3. 代码上传到NAS
    4. 测试
  3. 尝试部署

还有什么话要说,还有多少泪要流,还有多少坑要踩:Serverless Devs的函数计算踩坑日记,我是如何把一个非常非常非常大的人工智能的模型部署到线上的。

成果预览

image

主要就是这样的一个案例,用户只需要上传图片,就可以告诉用户图片的内容大概有啥,虽然说又是一个“调包侠”的操作,但是,在Serverless架构上,这是一个“高级的调包侠”操作,因为这里面会涉及到很多的坑。

踩坑记录

依赖安装

当我们把项目下载下来之后,我们可以看到里面有一个requirements.txt

1
2
3
4
5
6
7
8
9
10
tensorflow==1.13.1
numpy==1.19.4
scipy==1.5.4
opencv-python==4.4.0.46
pillow==8.0.1
matplotlib==3.3.3
h5py==3.1.0
keras==2.4.3
imageai==2.1.5
bottle==0.12.19

敲黑板,划重点:在Serverless架构上,虽然不需要我们关心环境的安装、配置等,但是却需要我们关心我们的所依赖的一些内容与环境适配。例如有一些不能跨平台使用的依赖,可能就需要在和线上环境一样的环境下进行依赖安装构建。

那么我们完全可以用阿里云函数计算团队提供的fc组件中的build指令,并且制定在docker镜像下安装依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ s build --use-docker


[2021-08-13T15:26:38.907] [INFO ] [S-CLI] - Start ...
✔ core-0.0.144.tgz file decompression completed
[2021-08-13T15:26:44.798] [INFO ] [FC-BUILD] - Build artifact start...
[2021-08-13T15:26:44.801] [INFO ] [FC-BUILD] - Use docker for building.
[2021-08-13T15:26:48.384] [INFO ] [FC-BUILD] - Build function using image: registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-python3.6:build-1.9.19
[2021-08-13T15:26:48.449] [INFO ] [FC-BUILD] - skip pulling image registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-python3.6:build-1.9.19...
[2021-08-13T15:30:28.826] [INFO ] [FC-BUILD] - Build artifact successfully.

Tips for next step
======================
* Invoke Event Function: s local invoke
* Invoke Http Function: s local start
* Deploy Resources: s deploy

此时安装好的依赖,就是和线上环境是适配的。

是的,只需要build就可以。

代码包过大

我们安装依赖之后要做啥?代码部署!但是在Serverless架构下进行代码部署并不是一个容易的事情,因为各个云厂商都对代码包大小有所限制,例如阿里云限制的是100M,所以超过100M的,系统就会报错,

image

此时,我们需要一个叫做.fcignore的文件来进行部分内容的处理:

1
2
./src/.s
./src/model

就是说,安装的依赖,以及模型,我都不放在代码中,我之后会把它上传到NAS等服务中,通过函数使用。

此时在进行Deploy即可:

image

代码上传到NAS

代码上传到NAS是一个技术活,我们可以通过阿里云提供的nas组件进行使用:

例如把当前的目录下的./src/model上传到nas:

1
s nas upload -r -n ./src/model  /mnt/auto/model

左侧是本地目录./src/model,右侧是nas的目录/mnt/auto/model

同样的道理将依赖上传到nas:

1
s nas upload -r -n ./.s/build/artifacts/ai-cv-image-prediction/server/.s/python /mnt/auto/.s/python

这里面,有趣的事情来了:

  1. ./.s/build/artifacts/ai-cv-image-prediction/server/.s/python是在哪里?这个是build操作之后,生成的.s目录,然后依赖会默认存到这个目录下;
  2. 直接上传会报错,找不到文件夹?部署之前还需要执行一个s nas command mkdir /mnt/auto/.s

上传完成之后:

image

测试

此时,我们打开刚刚项目部署完成的url,即可:

image

上传图片,感受一下Serverless * AI带来的力量吧

image

萌翻了,有没有….

尝试部署

虽然说,这个流程非常复杂,但是实际上也是非常简单的。我将这个东西,封装成了一个案例,你只需要这样几个过程:

  1. 初始化项目:s init image-prediction-app
  2. 进入项目:cd image-prediction-app
  3. 项目部署:s deploy

emmm,你很好奇build操作,上传依赖、模型到nas的操作,创建nas目录的操作在哪里是吧?

image

统统在s.yaml中:

1
2
3
4
5
6
7
8
9
10
actions: # 自定义执行逻辑
pre-deploy: # 在deploy之前运行
- run: s build --use-docker # 要运行的命令行
path: ./ # 命令行运行的路径
post-deploy: # 在deploy之后运行
- run: s nas upload -r -n ./.s/build/artifacts/ai-cv-image-prediction/server/.s/python /mnt/auto/.s/python # 要运行的命令行
path: ./ # 命令行运行的路径
- run: s nas upload -r -n ./src/model /mnt/auto/model # 要运行的命令行
path: ./ # 命令行运行的路径

actions是Serverless devs的规范之一,可以在这里面进行部署前后的一些特殊操作,例如上面的描述为:

  • 在部署之前
    • 在目录./下执行s build --use-docker
  • 在部署之后
    • 在目录./下执行s nas upload -r -n ./.s/build/artifacts/ai-cv-image-prediction/server/.s/python /mnt/auto/.s/python
    • 在目录./下执行s nas upload -r -n ./src/model /mnt/auto/model

这样的好处是,更简单,轻松的进行项目体验,以及和更多的CI/CD平台/工具进行结合。

欢迎您关注我的博客,也欢迎转载该博客,转载请注明本文地址: http://bluo.cn/serverless-devs-practice-1/ 。有关于Serverless等相关问题欢迎联系我:80902630

微信号抖音号