[PYTHON] (Hinweis) Hinweise zum Erstellen einer TensorFlow + Flask + Nginx-Umgebung mit Docker Compose

Einführung

Für mein Memorandum: Schweiß: Dies ist ein Memo beim Erstellen einer Umgebung aus TensorFlow + Flask + Nginx mit Docker Compose. Nur Hinweise zu Apps, die TensorFlow verwenden Ich habe gemacht, aber ich habe beschlossen, es auszuschneiden und zu organisieren. .. .. Nach dem Ausführen dieses Verfahrens sollte die Web-API mit TensorFlow funktionieren: Schweiß: Bitte beachten Sie, dass dies ein Artikel ist, den ich für mich selbst erstellt habe. Daher ist es möglicherweise schwer zu verstehen, Informationen und Technologie sind möglicherweise veraltet: bow_tone1:

Referenzmaterial

Ich habe es als Referenz beim Erstellen dieses Artikels verwendet: bow_tone1:

Umgebung * Ich denke, es wird funktionieren, auch wenn es nicht die folgende Version ist, aber bitte beachten Sie, dass es alt ist: no_good_tone2: </ sup>

Ubuntu-Version

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Docker-Version

$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b7f0
 Built:             Wed Mar 11 01:25:46 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b7f0
  Built:            Wed Mar 11 01:24:19 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

Docker-Version verfassen

$ docker-compose version
docker-compose version 1.25.5, build unknown
docker-py version: 4.2.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.1c  28 May 2019

* Aus irgendeinem Grund Build unbekannt. Ich gab auf, weil es einige Zeit zu dauern schien: schluchzen: </ sup>

Verzeichnisaufbau

Ich mache es richtig $ \ tiny {* Starr es nicht an} $: no_good_tone1: Es gibt viele Mülldateien, aber sie befinden sich auf Github. Quelle

Verzeichnisaufbau


dk_tensor_fw
├── app_tensor
│   ├── Dockerfile
│   ├── exeWhatMusic.py
│   ├── inputFile
│   │   └── ans_studyInput_fork.txt
│   ├── mkdbAndStudy.py
│   ├── requirements.txt
│   ├── studyModel
│   │   ├── genre-model.hdf5
│   │   ├── genre-tdidf.dic
│   │   ├── genre.pickle
│   ├── tfidfWithIni.py
│   └── webQueApiRunServer.py
├── docker-compose.yml
├── web_nginx
    ├── Dockerfile
    └── nginx.conf

Dateien, die zum Erstellen einer lokalen Umgebung mit Docker-Compose erforderlich sind

docker-compose.yml


version: '3'
services:
###########App Server Einstellungen###########
  app_tensor:
    container_name: app_tensor
    #Richtlinie zum Neustart des Dienstes
    restart: always
    #Verzeichnis mit der zu erstellenden Docker-Datei
    build: ./app_tensor
    volumes:
      #Verzeichnis zum Mounten
      - ./app_tensor:/dk_tensor_fw/app_tensor
    ports:
      #Host-seitiger Port: Container-seitiger Port
      - 7010:7010
    networks:
      - nginx_network
###########App Server Einstellungen###########

###########Webserver-Einstellungen###########
  web-nginx:
    container_name: web-nginx
    build: ./web_nginx
    volumes:
      #Verzeichnis zum Mounten
      - ./web_nginx:/dk_tensor_fw/web_nginx
    ports:
      #Portweiterleitung vom Host-PC 7020 zum Container 7020
      - 7020:7020
    depends_on:
      #Geben Sie die Abhängigkeit an. Netz-App vor dem Start des Servers-Startet den Server
      - app_tensor
    networks:
      - nginx_network
###########Webserver-Einstellungen###########
networks:
  nginx_network:
    driver: bridge

(Referenz) So überprüfen Sie freie Ports


#Überprüfen Sie die freien Ports (frei, wenn nichts angezeigt wird)
netstat -an | grep 7010

Dockerfile ← Ap Server Seite(Gunicorn)


FROM ubuntu:18.04

WORKDIR /dk_tensor_fw/app_tensor
COPY requirements.txt /dk_tensor_fw/app_tensor

RUN apt-get -y update \
    && apt-get -y upgrade \
    && apt-get install -y --no-install-recommends locales curl python3-distutils vim ca-certificates \
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python3 get-pip.py \
    && pip install -U pip \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && pip install -r requirements.txt --no-cache-dir

ENV LANG en_US.utf8

CMD ["gunicorn", "webQueApiRunServer:app", "-b", "0.0.0.0:7010"]

requirements.txt


Flask==1.1.0
gunicorn==19.9.0
Keras>=2.2.5
numpy==1.16.4
pandas==0.24.2
pillow>=6.2.0
python-dateutil==2.8.0
pytz==2019.1
PyYAML==5.1.1
requests==2.22.0
scikit-learn==0.21.2
sklearn==0.0
matplotlib==3.1.1
tensorboard>=1.14.0
tensorflow>=1.14.0
mecab-python3==0.996.2

In Analogie zur folgenden Python-Quelle unter Verwendung eines maschinell erlernten Modells, Der Hauptteil der Web-API, der die Json-Antwort zurückgibt. Aktuelles Analogiemodul (exeWhatMusic) Liest von außen: heat_smile:

webQueApiRunServer.py


import flask
import os
import exeWhatMusic

#Port-Nummer
TM_PORT_NO = 7010

# initialize our Flask application and pre-trained model
app = flask.Flask(__name__)
app.config['JSON_AS_ASCII'] = False  # <--Vermeiden Sie verstümmelte japanische Schriftzeichen

@app.route('/recommend/api/what-music/<how_music>', methods=['GET'])
def get_recom_music(how_music):
    recoMusicInfos = getRecoMusicMoji(how_music)
    return flask.jsonify({'recoMusicInfos': recoMusicInfos})

#Gibt den empfohlenen Songnamen zurück
def getRecoMusicMoji(how_music):

    recMusicName, predict_val = exeWhatMusic.check_genre(how_music)

    #JSON-Erstellung
    recoMusicInfoJson = [
        {
            'id':1,
            'recoMusicMoji':recMusicName,
            'predict_val':predict_val,
            'how_music':how_music
        }
    ]
    return recoMusicInfoJson

if __name__ == "__main__":
    print(" * Flask starting server...")
    app.run(threaded=False, host="0.0.0.0", port=int(os.environ.get("PORT", TM_PORT_NO)))

Dockerfile ← Webserverseite(Nginx)


FROM nginx:latest

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

nginx.conf


    upstream app_tensor_config {
        #Wenn Sie den Dienstnamen des Containers angeben, wird der Name aufgelöst
        server app_tensor:7010;
    }

    server {
        listen 7020;
        root /dk_tensor_fw/app_tensor/;
        server_name localhost;

        location / {
            try_files $uri @flask;
        }

        location @flask {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_redirect off;

            proxy_pass http://app_tensor_config;
        }

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        #Statische Dateianforderungen werden statisch weitergeleitet. ← Es ist nicht erforderlich, da es nicht verwendet wird.
        location /static/ {
            alias /dk_tensor_fw/app_tensor/satic/;
        }
    }

Bestätigung der abgeschlossenen Umgebung

Beginnen Sie mit Build & Hintergrund

$ docker-compose up -d --build

Docker-Compose Bildinformationen anzeigen

$ docker-compose images
Container          Repository           Tag       Image Id       Size  
-----------------------------------------------------------------------
app_tensor   dk_tensor_fw_app_tensor   latest   3b916ea797e0   2.104 GB
web-nginx    dk_tensor_fw_web-nginx    latest   175c2596bb8b   126.8 MB

Ist es schlecht gemacht? Es scheint, dass die Kapazität ziemlich groß ist: Schweiß: </ sup>

Liste der Container

$ docker-compose ps
   Name                 Command               State               Ports             
------------------------------------------------------------------------------------
app_tensor   gunicorn webQueApiRunServe ...   Up      0.0.0.0:7010->7010/tcp        
web-nginx    nginx -g daemon off;             Up      0.0.0.0:7020->7020/tcp, 80/tcp

Verbindung zum Container herstellen (Ap-Serverseite)

$ docker-compose exec app_tensor /bin/bash
root@ba0ce565430c:/dk_tensor_fw/app_tensor#

Ich habe es in einen Container auf der Ap-Serverseite gelegt. .. ..

Überprüfen Sie den Inhalt, um festzustellen, ob TensorFlow oder Keras enthalten sind

Ich habe einige weggelassen, weil die Anzeige des Ausgabeergebnisses lang ist: Schweiß: </ sup>

root@ba0ce565430c:/dk_tensor_fw/app_tensor# pip3 list
Package                Version
---------------------- -----------
absl-py                0.9.0
Flask                  1.1.0
gunicorn               19.9.0
Keras                  2.3.1
Keras-Applications     1.0.8
Keras-Preprocessing    1.1.2
matplotlib             3.1.1
mecab-python3          0.996.2
numpy                  1.16.4
pandas                 0.24.2
Pillow                 7.1.2
pip                    20.1
python-dateutil        2.8.0
pytz                   2019.1
PyYAML                 5.1.1
requests               2.22.0
requests-oauthlib      1.3.0
rsa                    4.0
scikit-learn           0.21.2
six                    1.14.0
sklearn                0.0
tensorboard            2.2.1
tensorboard-plugin-wit 1.6.0.post3
tensorflow             2.2.0
tensorflow-estimator   2.2.0
(Kürzung)

Es scheint, dass TensorFlow, Keras usw. alle enthalten sind. .. ..

Stellen Sie eine Verbindung zum Container auf der Webserverseite her

$ docker-compose exec web-nginx /bin/bash
root@d6971e4dc05c:/# 

Ich habe es auch in den Container auf der Webserverseite gestellt.

Überprüfen Sie vorerst, ob der Webserver (Nginx) ausgeführt wird.

root@d6971e4dc05c:/# /etc/init.d/nginx status
[ ok ] nginx is running.

Es scheint, dass Nginx auch läuft. Ich habe die Ausführungsumgebung bisher bestätigt. Wenn Sie die WEB-API wie unten gezeigt aufrufen, sollte auf der WEB-API-Seite eine Ausführungsumgebung vorhanden sein. .. ..

Web_API-Ausführungsbeispiel


http://localhost:7020/recommend/api/what-music/Ein Lied, das traurig ist und sich jemandes Glück wünscht

Beispiel für die Ausführung einer Web-API

Peek 2020-05-16 14-30.gif Es gibt verschiedene Tools, daher denke ich, dass alles in Ordnung ist, aber wie GIF Es wird in JSON zurückgegeben.

Andere Befehle (Hinweis)

* Referenzmaterial ist wie es ist. Weitere Informationen finden Sie in den Referenzmaterialien: bow_tone1: </ sup>

Dienstausfall
$ docker-compose stop      
Start des Dienstes
$ docker-compose start
Wenn Sie die Umwelt reinigen möchten
#Stoppen und löschen
#Containernetzwerk
docker-compose down

Container-Netzwerk-Image
docker-compose down --rmi all

#Containernetzwerkvolumen
docker-compose down -v

Recommended Posts

(Hinweis) Hinweise zum Erstellen einer TensorFlow + Flask + Nginx-Umgebung mit Docker Compose
(Hinweis) Hinweise zum Erstellen einer Tensor Flow-Umgebung mit Docker Compose (nur ein Container)
Ausgabeprotokoll an die Konsole mit Flask + Nginx auf Docker
Hinweis zum Erstellen einer eigenen Miniconda-Umgebung
Erstellen Sie mit Docker eine Python + uWSGI + Nginx-Umgebung
Starten Sie die Flask-Anwendung mit Docker auf Heroku
Erstellen Sie mit Docker eine Umgebung aus NGINX + NGINX Unit + MySQL
Hinweise zur Flasche
Hinweis: Bereiten Sie die Umgebung von CmdStanPy mit Docker vor
Erstellen Sie mit Docker eine Umgebung aus Nginx + uWSGI + Python (Django)
Führen Sie Flask unter CentOS mit Python3.4, Gunicorn + Nginx aus.
Verwenden der Flasche mit Nginx + Gunicorn-Konfiguration [Lokale Umgebung]
Aufbau einer virtuellen Umgebung mit Docker + Flask (Python) + Jupyter-Notebook
Erstellen einer TensorFlow-Umgebung, die GPUs unter Windows 10 verwendet
Hinweise zum Erstellen einer virtuellen Umgebung mit Anaconda Navigator
[Mit Bilddiagramm] Nginx + Gunicorn + Flask konvertiert zu Docker [Teil 2]
Erstellen Sie mit Docker eine Django-Entwicklungsumgebung! (Docker-compose / Django / postgreSQL / nginx)
Vom Umgebungsaufbau bis zum Einsatz für Kolben + Heroku mit Docker
[Mit Bilddiagramm] Nginx + Gunicorn + Flask konvertiert zu Docker [Teil 1]
Bereiten Sie die Python3-Umgebung mit Docker vor
[Tensorflow] Aufbau der Tensorflow-Umgebung unter Windows 10
Versuchen Sie, Jupyter Hub mit Docker zu erstellen
Erstellen Sie eine Rails-Anwendung mit Docker
Erstellen Sie mit pyenv unter Ubuntu 12.04 schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Erstellen einer HPC-Lernumgebung mit Docker Compose (C, Python, Fortran)
Postgres-Umgebungskonstruktion mit Docker Ich hatte ein wenig Probleme, also beachten Sie
Erstellen einer Entwicklungsumgebung mit Maven in Google App Engine [Java]
Erstellen einer Kubernetes-Umgebung mit ansible 2
Erstellen einer Python-Umgebung auf einem Mac
Versuchen Sie, Tensorflow auf Docker + Anaconda auszuführen
Hinweise zur Paketverwaltung mit conda
Erstellen einer Python-Umgebung unter Ubuntu
Erstellen eines Flask-Servers mit Docker
Erstellen Sie eine MySQL + Python-Umgebung mit Docker
Führen Sie das Docker-Image von TensorFlow unter Python3 aus
Erstellen einer virtuellen Umgebung mit Python 3
Verwenden Sie Tensorflow 2.1.0 mit Anaconda unter Windows 10!
[Linux] Aufbau einer Docker-Umgebung auf Redhat
Code-Server-Online-Umgebung (5) Starten Sie den Code-Server auf Docker
Hinweise zur Verwendung von rstrip mit Python.
Erstellen einer Kubernetes-Umgebung mit ansible 1
Erstellen Sie die Entwicklungsumgebung von Django mit Docker neu! !! !! !!
Anwendungsentwicklung mit Docker + Python + Flask
Vorgehensweise zum Erstellen einer Kube-Umgebung unter Amazon Linux2 (aws) ~ (mit Bonus)
Erstellen Sie mit Docker auf RaspberryPi3 eine Python + Flasche + MySQL-Umgebung! [Einfache Konstruktion]
Erstellen Sie mit venv unter Ubuntu 14.04 LTS schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen