Background
因为某些需要,需要在阿里云函数计算(Function Compute)平台部署PaddleOCR。
OverView
阿里云函数计算平台,是事件驱动的全托管计算服务,优点就是无需管理基础设置,只需要编写并上传代码或者镜像,即可完成部署。不负任何责任的推测,底层八成就是docker或者containerd,从上传docker镜像和文档中的描述可以看出来。
CPU 版本部署
其实对于paddleocr来说,CPU版本的部署,主要问题出现在依赖的安装上。
使用pip处理依赖
我们可以直接创建一个Web函数(python 3.10),然后使用WebIDE打开,并在WebIDE的终端中使用pip命令进行一些依赖的安装。
首先我们可以尝试安装一些简单的库,比如requests,然后尝试在WebIDE中进行debug。此时,我们可以看到WebIDE左侧的文件管理中看到已经安装上的依赖,点击部署后,类似git commit 的操作,将代码上传到函数计算平台(包括安装好的依赖)。
这一步可以说是顺风顺水,WebIDE的体验十分舒畅,可以说真的和vscode的体验差不多就是vscode嘛。
接下来我们开始干活,安装paddlepaddle和paddleocr,并且开始编写我们的业务代码。
当完成依赖安装,同时写完业务之后,点击部署代码后,部署的速度不仅超级慢,WebIDE下面还会多出一堆python依赖,最后当网页提示部署完成,运行时会报错,提示缺少依赖(git commit不完了呀)。
而当你十分不解/不小心刷新了网页,WebIDE还会贴心地提示你IDE代码包加载失败。
至此使用pip处理paddlepaddle的依赖可以说是完全失败。
接下来,我们尝试使用FC平台定义的自定义层来解决这个问题。
使用并构建自定义层
点击红框,就可以给当前函数添加自定义层。
其实这个自定义层和docker的layer是大差不差的概念,在FC平台创建自定义层,可以认为是某种程度上可视化模板化地编写Dockerfile中的某一层,添加自定义层就是将这个layer挂载到函数上。常威你还说不会武功
构建完之后直接添加为自定义层就可以正常使用了。
GPU 版本部署
GPU实例的部署就要折磨人一些了。
选择地区
目前(2024-10-29)阿里云函数计算GPU实例只在几个地区可用。
笔者选择的是在华东1(杭州)的区域。
GPU显卡型号的选择
在笔者多次的尝试下,发现只有Tesla显卡的资源比较富足,不会出现资源耗尽/资源不足的情况。Ada和Ampere显卡的资源比较少,在使用时会出现资源不足的情况。
底层镜像的选择
像文章开头说的一样,只要是能在NVIDIA Container Runtime中运行的镜像都可以。但是出于镜像大小的问题(主要是push到阿里云ACR镜像仓库的时候,30G镜像顶不住),我们可以直接使用阿里云提供的基础镜像。在本次部署中我们使用的是registry.cn-hangzhou.aliyuncs.com/serverless_devs/paddlepaddle:22.12-py3
的镜像,这个镜像已经内置了paddlepaddle。
理论上我们只需要安装paddleocr即可,但是实际上可能会出现以下几种问题:
碰到以上情况,请调整paddlepaddle-gpu的版本,升级之后即可解决(可能是paddleocr兼容性的问题,要相信云服务器的CPU真的有avx指令集)。