Gunicorn: рдбреЛрдХрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ Gunicorn + рдХреБрдкреНрдкреА + Tensorflow рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЕрдХреНрддреВре░ 2019  ┬╖  23рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: benoitc/gunicorn

рдирдорд╕реНрддреЗ

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ TensorFlow 2.0 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдлреНрд▓рд╛рд╕реНрдХ рдПрдкреАрдЖрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдкреАрдЖрдИ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде HTTP рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдлреНрд▓рд╛рд╕реНрдХ/рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Gunicorn рдХреЛ рдЪреБрдирд╛ред рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдХрд┐ Gunicorn рдХрдВрдЯреЗрдирд░ рдореЗрдВ рддрдм рддрдХ рд▓рдЯрдХрд╛ рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕реЗ Gunicorn рджреНрд╡рд╛рд░рд╛ рдорд╛рд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ред рд╕рд░реНрд╡рд░ рдХрднреА рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣реА Gunicorn рд╕реЗрдЯрдЕрдк рдореЗрд░реА рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдореЗрдВ рдбреЙрдХрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдбреЙрдХрд░ рд▓реЙрдЧ (рдпрд╣ рдмрд╕ рд╡рд╣реАрдВ рд▓рдЯрдХрддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рдмрд╛рдж рдЯрд╛рдЗрдордЖрдЙрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ)

[2019-10-03 18:03:05 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2019-10-03 18:03:05 +0000] [1] [INFO] Listening at: http://127.0.0.1:8000 (1)
[2019-10-03 18:03:05 +0000] [1] [INFO] Using worker: sync
[2019-10-03 18:03:05 +0000] [8] [INFO] Booting worker with pid: 8
2019-10-03 18:03:08.126584: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-10-03 18:03:08.130017: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3392000000 Hz
2019-10-03 18:03:08.130306: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55fbb23fb2d0 executing computations on platform Host. Devices:
2019-10-03 18:03:08.130365: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version

рдбреЙрдХрд░рдлрд╛рдЗрд▓:

FROM python

RUN pip install gunicorn

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD [ "gunicorn", "--chdir", "src", "api:app" ]

api.py:

from flask import Flask, request
import inference

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def predict():
    if request.method == 'GET':
        return 'POST a json payload of {"imageBase64": "base64base64base64"} to this address to predict.'
    try:
        result = inference.run(request.json['imageBase64'])
        return result
    except Exception as e:
        return {'error': str(e)}, 500

if __name__ == "__main__":
    app.run()
else:
    print('\n * Server ready!')

рдЕрдиреБрдорд╛рди.py

# Import packages
from __future__ import absolute_import, division, print_function, unicode_literals

import os
import tensorflow as tf
from tensorflow import keras
import PIL
import numpy as np
from io import BytesIO
import base64
import json

print("TensorFlow version is ", tf.__version__)

# Set variables
##########################################################################################
##########################################################################################

model_name = 'catsdogs'

base_dir = os.path.join(os.path.dirname(__file__), '..')
model_dir = os.path.join(base_dir, 'models')

##########################################################################################
##########################################################################################

# Load model
model = keras.models.load_model(os.path.join(model_dir, model_name + '.h5'))

# Load metadata
with open(os.path.join(model_dir, model_name + '_metadata.json')) as metadataFile:
    metadata = json.load(metadataFile)

# Split metadata
labels = metadata['training_labels']
image_size = metadata['image_size']

# Exported function for inference
def run(imgBase64):
    # Decode the base64 string
    image = PIL.Image.open(BytesIO(base64.b64decode(imgBase64)))

    # Pepare image
    image = image.resize((image_size, image_size), resample=PIL.Image.BILINEAR)
    image = image.convert("RGB")

    # Run prediction
    tensor = tf.cast(np.array(image), tf.float32) / 255.
    tensor = tf.expand_dims(tensor, 0, name=None)
    result = model.predict(tensor, steps=1)

    # Combine result with labels
    labeledResult = {}
    for i, label in enumerate(labels):
        labeledResult[label] = float(result[0][labels[label]])

    return labeledResult

рдореИрдВрдиреЗ рдЙрдореНрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдзрдиреНрдпрд╡рд╛рдж!

Feedback Requested FeaturWorker FeaturIPC PlatforDocker

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЙрдЧ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ tensorflow gevent рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдк gevent рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ gunicorn рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред . --workers рдФрд░ --threads рдЭрдВрдбреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд▓реЗрдХрд┐рди --worker-class=gevent рд╕реЗ --worker-class=gthread рдмрджрд▓рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред рдзрдиреНрдпрд╡рд╛рдж @javabrett

рд╕рднреА 23 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдбреЙрдХрд░ рд╕реЗрдЯрдЕрдк рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдЕрдзрд┐рдХрддрдо рдореЗрдореЛрд░реА рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ?

рд╡рд╣реА рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧрдирд┐рдХреЛрд░реНрди рдХреЛ рджреЛрд╖ рджреЗрдирд╛ рд╣реИред рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдмреИрд╢ рд╢реЗрд▓ рд╕реЗ python3 api.py рдЪрд▓рд╛рддреЗ рд╕рдордп рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

@tlaanemaa рдХреНрдпрд╛ рдЖрдк рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ @mackdelany рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ?

рдЕрд░реЗред рдЗрд╕ рддрд░рд╣ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдореЗрд░рд╛ рд╕реЗрдЯрдЕрдк рдбреЙрдХрд░ рдХреА рд░реИрдо рдХреЛ рдереЛрдбрд╝рд╛ рд╕реАрдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣реА рдмрд╛рдд рддрдм рднреА рд╣реБрдИ рдЬрдм рдореИрдВрдиреЗ рд╕реАрдорд╛ рд╣рдЯрд╛ рджреАред

рдореИрдВ рдЧрдирд┐рдХреЛрд░реНрди рдФрд░ рдЖрд░ рдИрдкреЛрд░реНрдЯ рдХреЗ рдмрд┐рдирд╛ рдПрдкреАрдЖрдИ рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж!

@tlaanemaa рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЦрдмрд░?

@benoitc рд╣реЗрдпрд╛
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рдЕрдиреНрдп рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЖрдЬ рдЗрд╕реЗ рдкреЛрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЖрдкрд╕реЗ рд╡рд╛рдкрд╕ рдорд┐рд▓реВрдВрдЧрд╛

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рдмрд┐рдирд╛ рдРрдк рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред
рдореЗрд░реЗ рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХрд╛ рд╕реАрдПрдордбреА рдмрд┐рдЯ рдиреАрдЪреЗ рд╣реИ

рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

CMD [ "python", "src/api.py" ]

рд▓реЙрдЧ:

2019-12-02 11:40:45.649503: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-12-02 11:40:45.653496: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2208000000 Hz
2019-12-02 11:40:45.653999: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55f969cf6a40 executing computations on platform Host. Devices:
2019-12-02 11:40:45.654045: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version
TensorFlow version is  2.0.0
 * Serving Flask app "api" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛:

CMD [ "gunicorn", "--chdir", "src", "api:app" ]

рд▓реЙрдЧ:

[2019-12-02 11:39:22 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2019-12-02 11:39:22 +0000] [1] [INFO] Listening at: http://127.0.0.1:8000 (1)
[2019-12-02 11:39:22 +0000] [1] [INFO] Using worker: sync
[2019-12-02 11:39:22 +0000] [9] [INFO] Booting worker with pid: 9
2019-12-02 11:39:24.041188: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-12-02 11:39:24.046495: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2208000000 Hz
2019-12-02 11:39:24.047129: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x5623e18b5200 executing computations on platform Host. Devices:
2019-12-02 11:39:24.047183: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рднрдВрдбрд╛рд░ рдХреЛ рдЦреЛрд▓ рджрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреЛрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

https://gitlab.com/tlaanemaa/image-classifier

Listening at: http://127.0.0.1:8000 (1)

рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЧрдирд┐рдХреЛрд░реНрди рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЛ рд╕реБрди рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрд╛рд╣рд░ рд╕реЗ рдирд╣реАрдВ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдРрдк рд╡рд╣реА рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рд╡рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрдирд┐рдХреЛрд░реНрди рд╕рдВрд╕реНрдХрд░рдг рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛрдб рдореЗрдВ рд▓реЙрдЧ рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рдордиреЗ рд╣реЛрддреА рд╣реИред рдЬрдм рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рдмрд┐рдирд╛ рджреМрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдлреНрд▓рд╛рд╕реНрдХ, рдлрд┐рд░ рдпрд╣ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИред
TensorFlow version is 2.0.0

рдбреАрдмрдЧ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ?

@tlaanemaa рдЖрдкрдХрд╛ рдбреЙрдХрд░ @CaselIT рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ

рдХреНрдпрд╛ рдЖрдк Gunicorn рдХреЛ arg -b 0.0.0.0:8000 рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд▓реЙрдЧ рд╕реЗ, рдХрд┐ рд╕рд░реНрд╡рд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрднреА рднреА рд▓реЙрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╣рд┐рдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдЖрдпрд╛рдд рдХреЗ рдмрд╛рдж рдЖрддреЗ рд╣реИрдВ

рдлрд┐рд░ рднреА рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ

CMD [ "gunicorn", "-b", "0.0.0.0:8000", "--chdir", "src", "api:app" ]

_рд▓реЙрдЧ_

usage: gunicorn [OPTIONS] [APP_MODULE]
gunicorn: error: unrecognized arguments: -d

рдЕрдЧрд░ рдЖрдк рдЦреБрдж рдХреЛ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреЙрдордЯреЗрдирд░ рдЗрдореЗрдЬ рд░рдЬрд┐рд╕реНрдЯреНрд░реА .gitlab.com/tlaanemaa/image-classifier рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

@tlaanemaa рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП Dockerfile , рдЗрдореЗрдЬ рдмрд┐рд▓реНрдб рдХрдорд╛рдВрдб рдФрд░ рдХрдВрдЯреЗрдирд░ рд░рди рдХрдорд╛рдВрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@javabrett рдЬрд╝рд░реВрд░

  • рдбреЙрдХрд░рдлрд╛рдЗрд▓: https://gitlab.com/tlaanemaa/image-classifier/blob/master/Dockerfile
  • рдмрд┐рд▓реНрдб рдХрдорд╛рдВрдб: docker build -t tlaanemaa/image-classifier .
  • рдХрдВрдЯреЗрдирд░ рдкреЛрд░реНрдЯреЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд╣рд╛рдВ рдХреБрдЫ рднреА рдкрд╛рдЧрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдорд╛рдирдХ рд╕рд╛рдорд╛рди, рдкреЛрд░реНрдЯ 8000 рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

_рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рдордп:_

FROM python:3.7

RUN pip install gunicorn

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD [ "gunicorn", "-b", "0.0.0.0:8000", "--chdir", "src", "api:app" ]

рдбреЙрдХрдЯрд░ рдХрд╛ рдкреВрд░рд╛ рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЛ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рд╡рд╣ рдЕрдВрдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдЬрдм рддрдХ рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдбрд┐рдмрдЧ рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯреЗрдирд░ рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдХ 2.1.0.5 рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдбреЗрд╕реНрдХрдЯреЙрдк:

docker build -t tlaanemaa/image-classifier .
docker run -it --rm -p 8000:8000 tlaanemaa/image-classifier

POST рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдкреВрд░реНрдг рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЪрд▓рд╛рдПрдВ рдФрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред

рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдпрд╣ -b рдзреНрд╡рдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛?

рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдЕрдм рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ POST рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рд╡реЗ рддреЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИред рдЬреАрдИрдЯреА рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдпреЗ рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдкреЛрд╕реНрдЯ рдмрд╣реБрдд рдзреАрдореА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рдЙрд╕ POST рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рддреЛ POST рдлрд┐рд░ рд╕реЗ рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ GET рдзреАрдореЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдПрдХ рдЙрдкрд╡рд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ :D

рдпреЗ рд▓реЙрдЧ рд╣реИрдВ рдЬрдм GET рддреЗрдЬ рд╣реИ рдФрд░ POST рдзреАрдорд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ:

[2020-01-10 09:34:46 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:72)
[2020-01-10 09:34:46 +0000] [72] [INFO] Worker exiting (pid: 72)
[2020-01-10 09:34:47 +0000] [131] [INFO] Booting worker with pid: 131
TensorFlow version is  2.0.0
2020-01-10 09:34:48.946351: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-01-10 09:34:48.951124: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2208000000 Hz
2020-01-10 09:34:48.951612: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x56481dbabd80 executing computations on platform Host. Devices:
2020-01-10 09:34:48.951665: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version

 * Server ready!

рд╕рд╛рде рд╣реА, рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ * Server ready! рд▓реЙрдЧ рдбреЙрдХрд░ рд▓реЙрдЧ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рднреНрд░рд╛рдордХ рднреА рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ

рдЖрдкрдХреЗ рдбреЙрдХрд░ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡рд░ рд╕рд┐рдВрдЧрд▓/рд╕рд┐рдВрдХ рдереНрд░реЗрдбреЗрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╡реНрдпрд╕реНрдд/рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦ рд░рд╣реЗ рд╣реЛрдВред --workers=2 --threads=4 --worker-class=gthread рдЬреИрд╕реЗ рдХреБрдЫ рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдзрдиреНрдпрд╡рд╛рдж @javabrett
рдЗрд╕рдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛!

рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЙрдЧ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ tensorflow gevent рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдк gevent рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ gunicorn рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред . --workers рдФрд░ --threads рдЭрдВрдбреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд▓реЗрдХрд┐рди --worker-class=gevent рд╕реЗ --worker-class=gthread рдмрджрд▓рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред рдзрдиреНрдпрд╡рд╛рдж @javabrett

рдирдорд╕реНрддреЗ! рдЧреАрд╡реЗрдВрдЯ рдХреЗ рдЕрдиреБрд░рдХреНрд╖рдХ рдФрд░ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреАрд╡реЗрдВрдЯ рдФрд░ рдЧрдирд┐рдХреЛрд░реНрди рдПрдХ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди рдпрд╛ рдЧреАрд╡реЗрдВрдЯ рдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

bywangxp picture bywangxp  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

agilezebra picture agilezebra  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Bogdanp picture Bogdanp  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mw44118 picture mw44118  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mrwillis picture mrwillis  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ