还有什么话要说,还有多少泪要流,还有多少坑要踩:Serverless Devs的函数计算踩坑日记,我是如何把一个非常非常非常大的人工智能的模型部署到线上的。
成果预览
主要就是这样的一个案例,用户只需要上传图片,就可以告诉用户图片的内容大概有啥,虽然说又是一个“调包侠”的操作,但是,在Serverless架构上,这是一个“高级的调包侠”操作,因为这里面会涉及到很多的坑。
踩坑记录
依赖安装
当我们把项目下载下来之后,我们可以看到里面有一个requirements.txt
:
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
镜像下安装依赖:
$ 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的,系统就会报错,
此时,我们需要一个叫做.fcignore
的文件来进行部分内容的处理:
./src/.s
./src/model
就是说,安装的依赖,以及模型,我都不放在代码中,我之后会把它上传到NAS等服务中,通过函数使用。
此时在进行Deploy即可:
代码上传到NAS
代码上传到NAS是一个技术活,我们可以通过阿里云提供的nas组件进行使用:
例如把当前的目录下的./src/model
上传到nas:
s nas upload -r -n ./src/model /mnt/auto/model
左侧是本地目录./src/model
,右侧是nas的目录/mnt/auto/model
同样的道理将依赖上传到nas:
s nas upload -r -n ./.s/build/artifacts/ai-cv-image-prediction/server/.s/python /mnt/auto/.s/python
这里面,有趣的事情来了:
-
./.s/build/artifacts/ai-cv-image-prediction/server/.s/python
是在哪里?这个是build操作之后,生成的.s目录,然后依赖会默认存到这个目录下; - 直接上传会报错,找不到文件夹?部署之前还需要执行一个
s nas command mkdir /mnt/auto/.s
上传完成之后:
测试
此时,我们打开刚刚项目部署完成的url,即可:
上传图片,感受一下Serverless * AI带来的力量吧
萌翻了,有没有....
尝试部署
虽然说,这个流程非常复杂,但是实际上也是非常简单的。我将这个东西,封装成了一个案例,你只需要这样几个过程:
- 初始化项目:
s init image-prediction-app
- 进入项目:
cd image-prediction-app
- 项目部署:
s deploy
emmm,你很好奇build操作,上传依赖、模型到nas的操作,创建nas目录的操作在哪里是吧?
统统在s.yaml
中:
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平台/工具进行结合。