python-3.x - AWS Lambda Docker 容器问题(权限被拒绝)
问题描述
我正在使用执行机器学习模型的 AWS Lambda 部署 Docker 容器。但是,每当我尝试加载保存的检查点时,在尝试读取本地文件系统或根据我存储模型的位置找不到目录时都会收到权限被拒绝消息...?
这是相关的 Dockerfile:
FROM public.ecr.aws/lambda/python:3.8
# copy requirements.txt file to the container
COPY requirements.txt ./
# upgrade pip and install the python requirements from requirements.txt
RUN python3.8 -m pip install \
--upgrade pip
RUN python3.8 -m pip install \
-r requirements.txt
# Copy function code
COPY app.py ./
# Install the runtime interface client
RUN python3.8 -m pip install \
awslambdaric
# clean up image for small container
RUN find . -type d -name "tests" -exec rm -rf {} +
RUN find . -type d -name "__pycache__" -exec rm -rf {} +
RUN find . -type d -name "include" -exec rm -rf {} +
RUN rm -rf ./{caffe2,wheel,wheel-*,pkg_resources,boto*,aws*,pip,pip-*,pipenv,setuptools}
RUN rm -rf ./{*.egg-info,*.dist-info}
RUN find . -name \*.pyc -delete
RUN find . -type d -name "test" -exec rm -rf {} +
RUN ls -R -al
# update linux libraries
RUN yum update -y
# install python3 and unzip
RUN yum install -y python3 unzip
# pull model files
RUN mkdir ./model
RUN curl https://somewhere.com/model.zip -o ./model/model.zip
RUN unzip ./model/model.zip -d ./model
RUN chmod 644 ./model
RUN chmod -R 644 ./model/*
RUN rm ./model/model.zip
WORKDIR ./
ENTRYPOINT [ "python3", "-m", "awslambdaric" ]
CMD [ "app.lambda_handler" ]
和 app.py:
from __future__ import print_function
import json, time
import urllib.request
from jose import jwk, jwt
from jose.utils import base64url_decode
from sentence_transformers import SentenceTransformer, util
model = ModelFunction('/model')
def lambda_handler(event, context):
body = json.loads(event['body'])
token = body['jwttoken']
utterance = body['utterance']
comparestring = body['comparestring']
# generate embeddings for each phrase
embeddings1 = model.encode(utterance, convert_to_tensor=True)
embeddings2 = model.encode(comparestring, convert_to_tensor=True)
# compute score
score = util.embeddings(embeddings1, embeddings2)
# output score
print("Score:")
print(score.item())
return {
"statusCode": 200,
"score": json.dums(score.item())
}
# the following is useful to make this script executable in both
# AWS Lambda and any other local environments
if __name__ == '__main__':
event = {
'token': '',
'email': 'somewhere@somewhere.com'}
lambda_handler(event, None)
一些相关的错误消息:
[ERROR] PermissionError: [Errno 13] Permission denied: './model/modules.json'
Traceback (most recent call last):
File "/var/lang/lib/python3.8/imp.py", line 234, in load_module
return load_source(name, filename, file)
File "/var/lang/lib/python3.8/imp.py", line 171, in load_source
module = _load(spec)
File "<frozen importlib._bootstrap>", line 702, in _load
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 848, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/var/task/app.py", line 8, in <module>
model = model('./model')
File "/var/lang/lib/python3.8/site-packages/model/model.py", line 115, in __init__
with open(os.path.join(model_path, 'modules.json')) as fIn:
和
[ERROR] FileNotFoundError: [Errno 2] No such file or directory: '/home/sbx_user1051/.cache/model'
Traceback (most recent call last):
File "/var/lang/lib/python3.8/imp.py", line 234, in load_module
return load_source(name, filename, file)
File "/var/lang/lib/python3.8/imp.py", line 171, in load_source
module = _load(spec)
File "<frozen importlib._bootstrap>", line 702, in _load
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 848, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/var/task/app.py", line 8, in <module>
model = model('/model')
File "/var/lang/lib/python3.8/site-packages/model/model.py", line 101, in __init__
shutil.rmtree(model_path)
File "/var/lang/lib/python3.8/shutil.py", line 709, in rmtree
onerror(os.lstat, path, sys.exc_info())
File "/var/lang/lib/python3.8/shutil.py", line 707, in rmtree
orig_st = os.lstat(path)
有任何想法吗?我想我没有将模型检查点存储在正确的目录中?由于 NDA 等原因,上述日志已被删除。
解决方案
尝试运行:
chmod 644 $(find . -type f)
chmod 755 $(find . -type d)
在您尝试部署的文件上。
正如AWS Docs所说,如果文件未设置为可由任何用户执行,则可能存在权限问题。
推荐阅读
- android - 我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?
- neural-network - Unet 预测灰度图像(灰块)
- ajax - Laravel ajax 表单调用 jQuery 函数
- c++ - std::promise 的存储
:“通信对象” - c - 在 C 中使用指针连接字符串
- python-3.x - 使用更改的十六进制向 .jsf 页面发送 POST 请求
- php - php的远程文件下载脚本不能在服务器上运行,但可以在我的xampp上运行
- amp-html - Trigger YouTube video by button click - AMP
- python - 比较系列中的索引值
- python - 什么是 print(f"...")