无法在 AWS Lambda 中加载 dlib

Unable to load dlib in AWS Lambda

我正在 AWS Lambda 中创建一个使用 DLIB 包的函数。我让它在本地运行良好,然后为了确保我正确编译二进制文件,我创建了一个基于 AMI information given by Amazon 的 EC2 实例,但我似乎无法正确打包我的依赖项。

这是我在尝试测试我的功能时从 AWS Lambda 收到的错误:

Unable to import module 'lambda_function': /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /var/task/site-packages/dlib.cpython-36m-x86_64-linux-gnu.so)

在我的包中(保存在 S3 中,因为它是 49mb),我有我的 lambda_function.py 文件,然后是两个子目录,名为 libssite-packagesLibs包含liblapack.solibquadmath.solibstdc++.so.6等文件

site-packages 目录包含我的 python 代码的所有依赖项 - CVNumpyDlib。几天来我一直在思考 table。对于我的生活,我无法弄清楚如何指示 lambda 使用我在 libs 目录中给出的 libstdc++.so.6

我认为我在 lambda_function.py

中正确链接了所有包
import sys
import os

# Import installed packages (in site-packages and lib)
CWD = os.path.dirname(os.path.realpath(__file__))

site_pkgs = os.path.join(CWD, "site-packages")
lib_pkgss = os.path.join(CWD, "libs")

sys.path.append(site_pkgs)
sys.path.append(lib_pkgss)

import json
import cv2
import numpy as np
import dlib
import boto3
...

知道我在这里遗漏了什么吗?

不要使用站点包文件夹。相反,将文件压缩到 site-packages 文件夹和完整的 lib 文件夹中,并将其上传到 AWS lambda(通过 S3 存储桶)。它应该工作。对我有用的文件夹结构是这样的。

├── dlib.cpython-36m-x86_64-linux-gnu.so
├── easy_install.py
├── lambda_function.py
├── lib
│   ├── libgfortran.so.3
│   ├── libopenblas.so.0
│   └── libquadmath.so.0          # only these three are needed.
├── pip
├── pip-10.0.1.dist-info
├── pkg_resources
├── setuptools
├── setuptools-39.0.1.dist-info
├── numpy
└── any other packages you might have(like scikit opencv etc)

压缩此文件夹,然后将其上传到 lambda。您不需要像使用 sys.path.append()os.path.join() 那样在代码中手动 link ,因此请删除这些行。 AWS lambda 将自动从 lib 文件夹加载共享库。