рдирдорд╕реНрддреЗ
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ 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
рдореИрдВрдиреЗ рдЙрдореНрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдзрдиреНрдпрд╡рд╛рдж!
рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдбреЙрдХрд░ рд╕реЗрдЯрдЕрдк рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдЕрдзрд┐рдХрддрдо рдореЗрдореЛрд░реА рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ?
рд╡рд╣реА рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧрдирд┐рдХреЛрд░реНрди рдХреЛ рджреЛрд╖ рджреЗрдирд╛ рд╣реИред рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдмреИрд╢ рд╢реЗрд▓ рд╕реЗ 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
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рднрдВрдбрд╛рд░ рдХреЛ рдЦреЛрд▓ рджрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреЛрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
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 рдЬрд╝рд░реВрд░
docker build -t tlaanemaa/image-classifier .
_рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рдордп:_
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
рдирдорд╕реНрддреЗ! рдЧреАрд╡реЗрдВрдЯ рдХреЗ рдЕрдиреБрд░рдХреНрд╖рдХ рдФрд░ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреАрд╡реЗрдВрдЯ рдФрд░ рдЧрдирд┐рдХреЛрд░реНрди рдПрдХ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди рдпрд╛ рдЧреАрд╡реЗрдВрдЯ рдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЙрдЧ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
tensorflow
gevent
рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдкgevent
рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВgunicorn
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред .--workers
рдФрд░--threads
рдЭрдВрдбреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд▓реЗрдХрд┐рди--worker-class=gevent
рд╕реЗ--worker-class=gthread
рдмрджрд▓рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред рдзрдиреНрдпрд╡рд╛рдж @javabrett