概要
完全にやっちまった
実装終わって図作って社内wikiに投稿した瞬間に気付いた
それ、SageMakerでできるよ!
ってね
やりたいこと
でももったいないのでメモ
- 学習済みのモデルがある
- そのモデルに入力(今回は画像)をかければ出力(今回はJSON)を得られるプログラム(この図のRecognitionTool)がある
- プログラムの実行にはPython3やChainerの環境が必要なので一個一個インストールするのは面倒くさい
- Docker(Docker Compose)で環境構築して、
docker-compose run
に入力を与えて出力を得られないか - 出来た。ので、入力いろいろ変えて出力し放題やったー
- でも実行にマシンパワー食うので専用のマシンをクラウドに置きたい
- AWSに作るか
構成
EC2
- 普通にAmazonLinuxAmiを起動
-
docker
docker-compose
をインストール -
nginx
php
もインストール(この辺はなんでもいい)-
nginx
はuser: ec2-user
、group: ec2-user
に設定する - あるいは
nginx
ユーザーがdockerを実行できるようにしてもいいかも
-
-
git
もインストールしてツールをcloneする
Docker
- ツールのリポジトリに
Dockerfile
とdocker-compose.yml
がある -
docker-compose build
する
Dockerfile
### chainer/chainer:latest-python3
### see https://hub.docker.com/r/chainer/chainer/builds/bm89qhzebyhkcrsc2ia4egg/
###
FROM chainer/chainer:latest-python3
###
### Application Setting
###
RUN pip3 install --upgrade pip
RUN pip3 install opencv-python
RUN pip3 install pillow
ARG APP_HOME
WORKDIR $APP_HOME
docker-compose.yml
version: '2.1'
services:
tool:
build:
context: .
dockerfile: Dockerfile
args:
- APP_HOME=${PWD}
command: python run.py
volumes:
- .:${PWD}
RecognitionTool
- 入力と出力のパス、その他オプションを指定して実行できる
run.sh
がある - コンテナの中のdemo用ファイルを使うとこんな感じで実行可能
$ docker-compose run --service-ports tool sh run.sh -i demo/input.png -o demo/output.json
PHP
rg.php(雑に抜粋)
<?php
//作業フォルダ(/tmp/RGT***/)
$temp_dir = tempDir('RGT');
//アップロードファイル
move_uploaded_file($_FILES['inputfile']['tmp_name'], "$temp_dir/input" );
//実行
{
putenv("PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin");
chdir("/path/to/recognitiontool/");
$cmd = "/usr/local/bin/docker-compose run --service-ports -v ${temp_dir}:${temp_dir} tool sh run.sh -i ${temp_dir}/input -o ${temp_dir}/output";
exec($cmd, $output);
}
//JSON返却
{
header('Content-Type: application/json');
header('Content-Length: ' . filesize("${temp_dir}/output"));
echo file_get_contents("${temp_dir}/output");
}
ポイント
- Nginxを通して実行すると
PATH
がないと怒られるのでec2-userのPATHをputenv
してみたら動いた(要調査) - PATHを追加したのに
docker-compose
がないと怒られたのでwhich
して探したフルパスで指定したら動いた(要調査)
テスト
実行
$ curl URL/rg.php -F inputfile=@demo/input.png > demo/output.json
まとめ
実装を始める前にいろいろ振り返ってよく考える