Tensorflow Serving 容器进入事件循环后 Heroku Dyno 崩溃

Heroku Dyno Crash after Tensorflow Serving container enters the Event Loop

我正在尝试使用 Docker、Tensorflow Serving 和 Heroku 部署我的 Tensorflow 模型。一切顺利,但是当 TF 服务容器结束初始化时(当它输出 "Entering the event loop" 时),Heroku Web Dyno 突然崩溃。然后它重新启动并再次尝试,但是当它再次到达事件循环时,它崩溃了。第三次,Heroku 再也没有启动测功机。

首先,我只是部署镜像,没有问题:

C:\Users\whitm\Desktop\CodeProjects\deep-deblurring-serving>heroku container:release web
Releasing images web to deep-deblurring-serving... done

C:\Users\whitm\Desktop\CodeProjects\deep-deblurring-serving>heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): /usr/bin/tf_serving_entrypoint.sh (1)
web.1: starting 2020/04/10 15:36:38 -0400 (~ 6s ago)

初始化一分钟后,(当 tf 服务到达事件循环时)dyno 崩溃:

2020-04-10T19:36:53.234387+00:00 app[web.1]: [evhttp_server.cc : 238] NET_LOG: Entering the event loop ...
2020-04-10T19:36:53.234389+00:00 app[web.1]: 2020-04-10 19:36:53.234341: I tensorflow_serving/model_servers/server.cc:378] Exporting HTTP/REST API at:localhost:8501 ..
.
2020-04-10T19:37:46.597354+00:00 heroku[web.1]: State changed from starting to crashed
2020-04-10T19:37:46.602976+00:00 heroku[web.1]: State changed from crashed to starting

然后由Heroku自动重启。

C:\Users\whitm\Desktop\CodeProjects\deep-deblurring-serving>heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): /usr/bin/tf_serving_entrypoint.sh (1)
web.1: restarting 2020/04/10 15:37:46 -0400 (~ 45s ago)

循环进行三次,最后一次,Heroku停止重启dyno:

C:\Users\whitm\Desktop\CodeProjects\deep-deblurring-serving>heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): /usr/bin/tf_serving_entrypoint.sh (1)
web.1: crashed 2020/04/10 15:38:53 -0400 (~ 3m ago)

这不是容器的问题,它在本地运行得很好,它到达事件循环并开始侦听传入的请求。我可以毫无问题地提出要求。所以问题出在Heroku上,但我不知道是怎么回事。我觉得这与 Heroku 将容器解释为无响应应用程序有关吗?我不知道。最糟糕的情况是,如果 dyno 不处于 "running" 状态,我无法通过 SSH 进入容器,这个状态永远不会达到,因为它在初始化期间崩溃了。

还有最后一件事,容器在本地使用 448MB RAM,而 Heroku free Dynos 有 500MB,我认为它因内存而崩溃,但同样,我无法进入检查发生了什么.

我可以做什么,在哪里可以看到?

提前致谢!

PD:我尝试了 运行 一个更轻的模型,它在本地使用 20MB 的 RAM,但是在 Heroku 上结果是一样的,Dyno 崩溃了。

我解决了问题。这是由容器端口不匹配引起的。基本上,Tensorflow Serving 试图为其余 API 使用默认的 8501 端口,但实际上,Heroku 分配了一个不同的端口来公开容器。解决方案是告诉 tensorFlow 模型服务器并更新 /usr/bin/tf_serving_entrypoint.sh 文件,以使用 Heroku 分配的端口。

这是新的 Dockerfile:

FROM tensorflow/serving
LABEL maintainer="Whitman Bohorquez" description="Build tf serving based image. This repo must be used as build context"
COPY / /
RUN apt-get update && apt-get install -y git && git reset --hard
ENV MODEL_NAME=deblurrer MODEL_BASE_PATH=/models

RUN echo '#!/bin/bash \n\n\
tensorflow_model_server \
--rest_api_port=$PORT \
--model_name=${MODEL_NAME} \
--model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \
"$@"' > /usr/bin/tf_serving_entrypoint.sh \
&& chmod +x /usr/bin/tf_serving_entrypoint.sh

# CMD is required to run on Heroku
CMD ["/usr/bin/tf_serving_entrypoint.sh"]