从 Flask docker 容器到 Tensorflow/Serving 容器的 HTTP POST 请求出错

问题描述 投票:0回答:1

我正在尝试在 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(': 无法建立新连接: [Errno 111] 连接被拒绝') )

虽然我在 docker-compose.yml 中设置了端口公开和链接,但为什么 POST 请求失败?

(ps - 我没有在 Flask 容器中安装完整的 Tensorflow,因为当我尝试时 Flask 容器被杀死,可能是由于内存超出。所以安装完整的 Tensorflow 不在我的选择范围内。)

我尝试将 request.post 中的 'mytf' 更改为 localhost, 127.0.0.1, 0.0.0.0, 容器 ID,但所有尝试都失败了。 HTTPConnectionPool 问题仍然存在。

docker http flask docker-compose tensorflow-serving
1个回答
0
投票

我自己找到了答案。

以前,包括“saved_model.pb”的文件位于“exportedmodel”文件夹中。

我在“exportedmodel”文件夹下创建了一个名为“0001”的文件夹,并将文件移动到“exportedmodel/0001”中。

(注:我没有更改docker-compose.yml的内容。)

令人惊讶的是,它有效!

(也许...因为HTTP POST请求的路径包含'v1'??)

我参考了 Aurélien Géron 撰写的《Hands-On Machine Learning》(第二版)第 19 章。

© www.soinside.com 2019 - 2024. All rights reserved.