Neulich habe ich einen Artikel geschrieben Ich habe eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells mit Docker zurückgibt, aber ich kann den vorhergesagten Wert mit der API erhalten. Jetzt, da ich eine Vorhersage von einer Webseite machen möchte, habe ich sie mit Docker erstellt. Das Bild, das dieses Mal erstellt werden soll, ist in der folgenden Abbildung dargestellt.
Ich möchte drei Container in Docker einrichten, über einen lokalen Browser auf WordPress zugreifen und das Vorhersageergebnis mit WordPress überprüfen.
Die zu verwendende Umgebung ist wie folgt.
$sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G9016
$docker version
Client: Docker Engine - Community
Version: 19.03.4
API version: 1.40
(Kürzung)
Server: Docker Engine - Community
Engine:
Version: 19.03.4
API version: 1.40 (minimum version 1.12)
(Kürzung)
Ich denke, es gibt verschiedene Schritte, aber dieses Mal, nachdem wir WordPress erstellt haben, werden wir einen Container für die Vorhersage erstellen. Nach Bestätigung der Verbindung erstellen wir einen WordPress-Artikel und überprüfen den Vorgang.
Ruft das Container-Image ab, das zur Vorhersage von WordPress- und maschinellen Lernmodellen verwendet wird. Lesen Sie diesen Artikel [^ 1] und führen Sie die folgenden drei Befehle aus, um das Bild zu erhalten.
$ docker pull mysql:5.7.25
$ docker pull wordpress:4.9.1
Überprüfen Sie die mit dem Befehl docker images
erhaltenen Bilder.
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.25 98455b9624a9 7 months ago 372MB
wordpress 4.9.1 28084cde273b 22 months ago 408MB
Starten Sie die WordPress- und MySQL-Container.
Lesen Sie hier [^ 2] und bauen Sie vor dem Start ein Netzwerk mit dem Befehl docker network
auf.
$docker network create test-network
Bestätigen Sie, dass das Netzwerk mit dem folgenden Befehl erstellt wurde.
$docker network ls
NETWORK ID NAME DRIVER SCOPE
edbb6037a089 bridge bridge local
5f7c06763a14 host host local
1b7e419414a4 none null local
687f0232408b test-network bridge local
Starten Sie den Container im erstellten Netzwerk.
$docker run --name mysql --network test-network -e MYSQL_ROOT_PASSWORD=test-pw -d mysql:5.7.25
$docker run --name wordpress --network test-network -e WORDPRESS_DB_PASSWORD=test-pw -v $(pwd)/vol:/mnt -p 8080:80 -d wordpress:4.9.1
Für WordPress stellt die Option -v
ein lokales Verzeichnis mit dem Namen vol in / mnt im Container bereit. Dies liegt daran, dass das PHP-Skript, das später für die POST-Kommunikation mit der Vorhersage-API verwendet werden soll, lokal erstellt und im Container gespeichert wird.
Ich habe auch die Option -p
festgelegt, um den Port vorwärts zu setzen, um den lokalen Port 8080 an den Port 80 im Container weiterzuleiten.
Wenn Sie mit Ihrem lokalen Browser auf http: // localhost: 8080
zugreifen, wird der WordPress-Einstellungsbildschirm angezeigt. Legen Sie daher Ihre bevorzugte Sprache fest.
Legen Sie den Namen und das Kennwort des Administratorbenutzers fest. Sie müssen auch Ihre E-Mail-Adresse eingeben, aber es ist in Ordnung, wenn Sie sie entsprechend eingeben.
Klicken Sie auf die Schaltfläche "WordPress installieren" und ein Bildschirm für den Administrator wird angezeigt.
Wenn Sie zu diesem Zeitpunkt erneut mit Ihrem Browser auf http: // localhost: 8080 /
zugreifen, wird eine elegante Seite angezeigt.
Dies ist das Ende der WordPress-Konstruktion. Der Teil, der auf die Vorhersage-API trifft, wird später festgelegt.
Die Konstruktion ist wie in Ich habe eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells mit Docker zurückgibt beschrieben, daher werde ich sie weglassen, aber beim Starten des Containers Stellen Sie sicher, dass Sie das erstellte Netzwerk angeben.
$docker run -it --name test-api --network test-network --rm -p 5000:5000 -v $(pwd)/vol:/home myflask/mlapi:1.0 /bin/bash
root@b9e8ac7cdb71:/# cd home/
root@b9e8ac7cdb71:/home# python3 api.py
Server is running ...
* 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://0.0.0.0:5000/ (Press CTRL+C to quit)
Sie haben jetzt einen API-Server für die Vorhersage eingerichtet.
Stellen Sie sicher, dass bisher drei Docker-Container ausgeführt werden.
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9e8ac7cdb71 myflask/mlapi:1.0 "/bin/bash" 8 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp test-api
c6b2f713a6a5 wordpress:4.9.1 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:8080->80/tcp wordpress
290950f0f643 mysql:5.7.25 "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 3306/tcp, 33060/tcp mysql
Verwenden Sie im WordPress-Container den Befehl curl, um die Verbindung mit dem Vorhersage-API-Server zu überprüfen.
Geben Sie den WordPress-Container mit dem Befehl docker exec
ein und senden Sie die Vorhersagedaten mit dem Befehl curl.
$docker exec -i -t c6b2f713a6a5 /bin/bash
root@c6b2f713a6a5:/var/www/html# curl http://test-api:5000/predict -X POST -H 'Content-Type:application/json' -d '{"feature":{"season":[1], "year":[0], "month":[1], "hour":[0], "holiday":[0], "weekday":[6], "workingday":[0], "weather":[1], "temp":[0.24], "feelslike":[0.3], "humidity":[0.8], "windspeed":[0.0]}}'
{"Content-Type":"application/json","prediction":[34.67747315059312],"success":true}
Der vorhergesagte Wert ist 34,67 ..., daher scheint die Verbindung in Ordnung zu sein.
Fahren wir nun mit den WordPress-Einstellungen fort. Erstellen Sie eine neue feste Seite und füllen Sie den folgenden Inhalt aus. Außerdem sind die numerischen Auswahlmöglichkeiten für jedes Element auf Texto eingestellt.
<form action="/ml-submit.php" method="post">
season: <select name="season">
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
</select>
year: <select name="year">
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
</select>
month: <select name="month">
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
</select>
hour: <select name="hour">
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
</select>
holiday: <select name="holiday">
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
</select>
weekday: <select name="weekday">
<option value=0>0</option>
<option value=1>1</option>
</select>
workingday: <select name="workingday">
<option value=0>0</option>
<option value=1>1</option>
</select>
weather: <select name="weather">
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
</select>
temp(0-1): <input type="text" name="temp">
feelslike(0-1): <input type="text" name="feelslike">
humidity(0-1): <input type="text" name="humidity">
windspeed(0-1): <input type="text" name="windspeed">
<input class="submit" type="submit" value="Führen Sie php aus" /></form>
Wenn Sie nun auf Veröffentlichen klicken, wird die von Ihnen erstellte Seite angezeigt.
Wenn Sie auf der erstellten Seite auf die Schaltfläche "Vorhersage" klicken, werden die Daten an die Vorhersage-API gesendet und das Vorhersageergebnis wird zurückgegeben und auf der Seite angezeigt. Erstellen Sie lokal eine PHP-Datei.
ml-submit.php
<?php
$data = array(
'feature'=> array(
'season'=> array((int)$_POST['season']),
'year' => array((int)$_POST['year']),
'month' => array((int)$_POST['month']),
'hour' => array((int)$_POST['hour']),
'holiday' => array((int)$_POST['holiday']),
'weekday' => array((int)$_POST['weekday']),
'workingday' => array((int)$_POST['workingday']),
'weather' => array((int)$_POST['weather']),
'temp' => array((float)$_POST['temp']),
'feelslike' => array((float)$_POST['feelslike']),
'humidity' => array((float)$_POST['humidity']),
'windspeed' => array((float)$_POST['windspeed'])
)
);
$data_json = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://test-api:5000/predict');
curl_setopt($ch, CURLOPT_PORT, 5000);
$result=curl_exec($ch);
$res_json = json_decode($result , true );
echo 'PREDICTION:'.$res_json['prediction'][0];
curl_close($ch);
echo "<br>aktualisieren:".date("Y/m/d H:i:s");
?>
Die auf der Webseite eingegebenen Daten werden im Array-Format gespeichert, in das JSON-Format konvertiert und dann an den Vorhersage-API-Server gesendet. Ich versuche, den vorhergesagten Wert des Rückgabewerts anzuzeigen. Informationen zum Erstellen von PHP finden Sie hier [^ 3]. Speichern Sie die lokal erstellte Datei im WordPress-Container. Speichern Sie PHP im vol-Verzeichnis.
$ls vol/ml-submit.php
vol/ml-submit.php
Da das vol-Verzeichnis auf / mnt im Container bereitgestellt ist, kopieren Sie die Datei in das Verzeichnis, in dem PHP gespeichert ist.
root@c6b2f713a6a5:/var/www/html# cp /mnt/ml-submit.php .
root@c6b2f713a6a5:/var/www/html# ls
index.php readme.html wp-blog-header.php wp-config.php wp-includes wp-login.php wp-signup.php
license.txt wp-activate.php wp-comments-post.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
ml-submit.php wp-admin wp-config-sample.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php
Der Bau ist bis zu diesem Punkt abgeschlossen.
Geben Sie nun den entsprechenden Wert auf der von WordPress erstellten Seite ein und klicken Sie auf die Schaltfläche "Vorhersagen".
Wenn Sie auf die Schaltfläche "Vorhersagen" klicken, wird der vorhergesagte Wert angezeigt. Yay.
Vorausgesagte Werte usw. werden auf einer leeren Seite angezeigt und es sieht schlecht aus, aber ich konnte sie anzeigen, indem ich auf die Vorhersage-API auf der Webseite geklickt habe.
Ich konnte das Modell des maschinellen Lernens auf einer Webseite vorhersagen, die mit WordPress on Docker erstellt wurde. Es gibt noch einige Bereiche, in denen ich nicht genug studiert habe, und es sieht schlecht aus, aber dies ist ein Thema für die Zukunft. In Zukunft möchte ich es in einer Cloud wie AWS ausführen.
Recommended Posts