L'autre jour, j'ai écrit un article j'ai créé une API qui renvoie la valeur prédite du modèle d'apprentissage automatique avec Docker, mais je peux obtenir la valeur prédite avec l'API. Maintenant que je veux faire une prédiction à partir d'une page Web, je l'ai construite avec Docker. L'image à construire cette fois est celle illustrée ci-dessous.
Je souhaite configurer trois conteneurs sur Docker, accéder à WordPress à partir d'un navigateur local et vérifier le résultat de la prédiction avec WordPress.
L'environnement à utiliser est le suivant.
$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
(réduction)
Server: Docker Engine - Community
Engine:
Version: 19.03.4
API version: 1.40 (minimum version 1.12)
(réduction)
Je pense qu'il y a plusieurs étapes, mais cette fois après la construction de WordPress, nous allons construire un conteneur pour la prédiction. Après avoir confirmé la connexion, nous créerons un article WordPress et vérifierons le fonctionnement.
Obtient l'image du conteneur utilisée pour prédire les modèles WordPress et d'apprentissage automatique. Reportez-vous à cet article [^ 1] et exécutez les trois commandes suivantes pour obtenir l'image.
$ docker pull mysql:5.7.25
$ docker pull wordpress:4.9.1
Vérifiez les images obtenues avec la commande `` images docker ''.
$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
Démarrez les conteneurs WordPress et MySQL.
Reportez-vous ici [^ 2] et construisez un réseau avec la commande docker network
avant de commencer.
$docker network create test-network
Confirmez que le réseau a été créé avec la commande suivante.
$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
Démarrez le conteneur sur le réseau créé.
$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
Pour WordPress, l'option -v '' monte un répertoire local nommé vol dans / mnt à l'intérieur du conteneur. En effet, le script php à utiliser ultérieurement pour la communication POST avec l'API de prédiction est créé localement et stocké dans le conteneur. Nous avons également défini l'option
-p '' pour définir le transfert de port pour transférer le port local 8080 au port 80 dans le conteneur.
Lorsque vous accédez à `` http: // localhost: 8080 '' avec votre navigateur local, l'écran des paramètres WordPress apparaîtra, alors définissez votre langue préférée.
Définissez le nom et le mot de passe de l'utilisateur administrateur. Vous devrez également entrer votre adresse e-mail, mais ce n'est pas grave si vous la saisissez correctement.
Cliquez sur le bouton "Installer WordPress" et un écran pour l'administrateur apparaîtra.
À ce stade, si vous accédez à nouveau à `` http: // localhost: 8080 / '' avec votre navigateur, une page élégante apparaîtra.
C'est la fin de la construction de WordPress. La partie qui atteint l'API de prédiction sera définie ultérieurement.
La construction est celle décrite dans J'ai créé une API qui renvoie la valeur prédite du modèle d'apprentissage automatique avec Docker, donc je l'omettrai, mais lors du démarrage du conteneur Assurez-vous de spécifier le réseau créé.
$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)
Vous avez maintenant configuré un serveur API pour la prédiction.
Assurez-vous que trois conteneurs Docker sont en cours d'exécution jusqu'à présent.
$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
Une fois à partir du conteneur WordPress, utilisez la commande curl pour vérifier la connexion avec le serveur d'API de prédiction. Entrez dans le conteneur WordPress avec la commande `` docker exec '' et envoyez les données de prédiction avec la commande 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}
La valeur prévue est 34,67 ..., donc la connexion semble être correcte.
Passons maintenant aux paramètres WordPress. Créez une nouvelle page fixe et remplissez le contenu suivant. De plus, les choix numériques pour chaque élément sont définis sur Texto.
<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="Exécutez php" /></form>
Maintenant, lorsque vous cliquez sur Publier, vous pourrez voir la page que vous avez créée.
Lorsque vous cliquez sur le bouton "Prédiction" sur la page créée, les données seront envoyées à l'API de prédiction et le résultat de la prédiction sera renvoyé et affiché sur la page. Créez un fichier php localement.
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>mise à jour:".date("Y/m/d H:i:s");
?>
Les données saisies sur la page Web sont stockées au format tableau, converties au format json, puis envoyées au serveur API de prédiction. J'essaye d'afficher la valeur prévue de la valeur de retour. Pour créer php, reportez-vous ici [^ 3]. Stockez le fichier créé localement dans le conteneur WordPress. Stockez php dans le répertoire vol.
$ls vol/ml-submit.php
vol/ml-submit.php
Puisque le répertoire vol est monté sur / mnt sur le conteneur, copiez le fichier dans le répertoire où php est stocké.
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
La construction est terminée jusqu'à présent.
Maintenant, saisissons la valeur appropriée sur la page créée par WordPress et appuyez sur le bouton "Prédire".
Lorsque vous appuyez sur le bouton "Prédire", la valeur prédite s'affiche. Yay.
Les valeurs prédites, etc. sont affichées sur une page vierge et cela semble mauvais, mais j'ai pu accéder à l'API de prédiction sur la page Web et l'afficher.
J'ai pu prédire le modèle d'apprentissage automatique sur une page Web créée à l'aide de WordPress sur Docker. Il y a encore des domaines dans lesquels je n'ai pas suffisamment étudié, et cela semble mauvais, mais c'est un sujet pour l'avenir. À l'avenir, j'aimerais l'exécuter sur un cloud tel qu'AWS.
Recommended Posts