我必须在AWS Sagemaker中部署自定义keras模型。我已经创建了一个笔记本实例,并且具有以下文件:
AmazonSagemaker-Codeset16
-ann
-nginx.conf
-predictor.py
-serve
-train.py
-wsgi.py
-Dockerfile
我现在打开AWS终端并构建docker映像并将该映像推送到ECR存储库中。然后,我打开一个新的jupyter python笔记本,并尝试拟合模型并进行部署。训练正确完成,但是在部署时出现以下错误:
“错误,承载端点sagemaker-example-2019-10-25-06-11-22-366:失败。>原因:生产变型AllTraffic的主容器未通过> ping健康检查。请检查CloudWatch日志以了解这个端点...“
查看日志时,发现以下内容:
2019/11/11 11:53:32 [crit] 19#19:* 3 connect()到Unix:/tmp/gunicorn.sock>失败(2:没有这样的文件或目录),但连接到上游客户端:> 10.32.0.4,服务器:,请求:“ GET / ping HTTP / 1.1”,上游:>“ http://unix:/tmp/gunicorn.sock:/ping”,主机:“ model.aws.local:8080”
和
追踪(最近通话):文件“ / usr / local / bin / serve”,第8行,在sys.exit(main())文件“ /usr/local/lib/python2.7/dist->packages/sagemaker_containers/cli/serve.py”,主行中的第19行server.start(env.ServingEnv()。framework_module)在开始的文件“ /usr/local/lib/python2.7/dist->packages/sagemaker_containers/_server.py”中,第107行module_app,init中的文件“ /usr/lib/python2.7/subprocess.py”,第711行errread,errwrite)_execute_child中的文件“ /usr/lib/python2.7/subprocess.py”,行1343提高child_exception
[我试图在本地计算机上将这些文件部署到AWS Sagemaker中的同一模型,并且该模型已成功部署,但是在AWS内部,我遇到了这个问题。
这是我的服务文件代码:
from __future__ import print_function
import multiprocessing
import os
import signal
import subprocess
import sys
cpu_count = multiprocessing.cpu_count()
model_server_timeout = os.environ.get('MODEL_SERVER_TIMEOUT', 60)
model_server_workers = int(os.environ.get('MODEL_SERVER_WORKERS', cpu_count))
def sigterm_handler(nginx_pid, gunicorn_pid):
try:
os.kill(nginx_pid, signal.SIGQUIT)
except OSError:
pass
try:
os.kill(gunicorn_pid, signal.SIGTERM)
except OSError:
pass
sys.exit(0)
def start_server():
print('Starting the inference server with {} workers.'.format(model_server_workers))
# link the log streams to stdout/err so they will be logged to the container logs
subprocess.check_call(['ln', '-sf', '/dev/stdout', '/var/log/nginx/access.log'])
subprocess.check_call(['ln', '-sf', '/dev/stderr', '/var/log/nginx/error.log'])
nginx = subprocess.Popen(['nginx', '-c', '/opt/ml/code/nginx.conf'])
gunicorn = subprocess.Popen(['gunicorn',
'--timeout', str(model_server_timeout),
'-b', 'unix:/tmp/gunicorn.sock',
'-w', str(model_server_workers),
'wsgi:app'])
signal.signal(signal.SIGTERM, lambda a, b: sigterm_handler(nginx.pid, gunicorn.pid))
# If either subprocess exits, so do we.
pids = set([nginx.pid, gunicorn.pid])
while True:
pid, _ = os.wait()
if pid in pids:
break
sigterm_handler(nginx.pid, gunicorn.pid)
print('Inference server exiting')
# The main routine just invokes the start function.
if __name__ == '__main__':
start_server()
我使用以下方法部署模型:
predictor = classifier.deploy(1,'ml.t2.medium',serializer = csv_serializer)] >>
请让我知道我在部署时所犯的错误。
我必须在AWS Sagemaker中部署自定义keras模型。我已经创建了一个笔记本实例,并且具有以下文件:AmazonSagemaker-Codeset16 -ann -nginx.conf -predictor.py ...
使用Sagemaker脚本模式比处理容器和nginx底层内容要简单得多,您考虑过吗?您只需要提供keras脚本: