我正在尝试在 AWS EC2 上使用 docker compose 部署我的微型项目。主要容器镜像有Nginx、Flask、MySQL、Tensorflow/Serving。
我已成功在 Flask 容器和 MySQL 容器中的数据库之间建立连接,用于将选择查询发送到数据库并将正确的结果接收回 Flask,
但是我无法在 Flask 和 Tensorflow/Serving 之间建立连接,无法将输入作为 HTTP POST 请求发送到已保存的 Keras 模型(包括 .pb 文件的文件夹),并将预测接收回 Flask。
这是 docker-compose.yml
version: "3"
services:
nginxproxy:
depends_on:
- nginx
- db
image: nginx:alpine
container_name: proxyserver
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./certbot-etc:/etc/letsencrypt
- ./myweb:/usr/share/nginx/html
nginx:
image: nginx:latest
container_name: mywebserver
restart: always
volumes:
- ./myweb:/usr/share/nginx/html
flask:
build: ./flask_docker
restart: always
container_name: myflask
command: gunicorn -w 1 -b 0.0.0.0:80 wsgi:server
links:
- tf
tf:
image: tensorflow/serving
restart: always
container_name: mytf
volumes:
- ./exportedmodel:/models/test_model
environment:
- MODEL_NAME=test_model
expose:
- "8501"
db:
image: mysql:5.7
container_name: mysqldb
volumes:
- mydb:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpw
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: pw
volumes:
mydb:
对于Flask和MySQL中的DB的连接,Flask中的下面的python代码运行良好。我的选择查询得到了正确的结果。
db = pymysql.connect(
host='mysqldb', # container name
port=3306,
user='root',
passwd='rootpw',
db='mydatabase',
charset='utf8')
cursor = db.cursor()
但是,对于Flask和Tensorflow/Serving之间的连接,Flask中的以下代码显示错误。
data = json.dumps({"signature_name": "serving_default", "instances": [input_id]}) # [input_id] is the input for the DL model
headers = {"content-type": "application/json"}
json_response = requests.post('http://mytf:8501/v1/models/test_model:predict', data=data, headers=headers) # /models/test_model includes .pb file, the Keras model
result = json_response.json()
错误信息是:
HTTPConnectionPool(host='mytf', port=8501): 超过最大重试次数,url: /v1/models/test_model:predict (由 NewConnectionError('
虽然我在 docker-compose.yml 中设置了端口公开和链接,但为什么 POST 请求失败?
(ps - 我没有在 Flask 容器中安装完整的 Tensorflow,因为当我尝试时 Flask 容器被杀死,可能是由于内存超出。所以安装完整的 Tensorflow 不在我的选择范围内。)
我尝试将 request.post 中的 'mytf' 更改为 localhost, 127.0.0.1, 0.0.0.0, 容器 ID,但所有尝试都失败了。 HTTPConnectionPool 问题仍然存在。
我自己找到了答案。
以前,包括“saved_model.pb”的文件位于“exportedmodel”文件夹中。
我在“exportedmodel”文件夹下创建了一个名为“0001”的文件夹,并将文件移动到“exportedmodel/0001”中。
(注:我没有更改docker-compose.yml的内容。)
令人惊讶的是,它有效!
(也许...因为HTTP POST请求的路径包含'v1'??)
我参考了 Aurélien Géron 撰写的《Hands-On Machine Learning》(第二版)第 19 章。