LoginSignup
14
9

More than 5 years have passed since last update.

それ、SageMakerで出来るよ!っていう構成をわざわざEC2で自作してしまったのでメモ

Posted at

RGT (2).png

概要

完全にやっちまった

実装終わって図作って社内wikiに投稿した瞬間に気付いた

それ、SageMakerでできるよ!

ってね

やりたいこと

でももったいないのでメモ

  • 学習済みのモデルがある
  • そのモデルに入力(今回は画像)をかければ出力(今回はJSON)を得られるプログラム(この図のRecognitionTool)がある
  • プログラムの実行にはPython3やChainerの環境が必要なので一個一個インストールするのは面倒くさい
  • Docker(Docker Compose)で環境構築して、 docker-compose run に入力を与えて出力を得られないか
  • 出来た。ので、入力いろいろ変えて出力し放題やったー
  • でも実行にマシンパワー食うので専用のマシンをクラウドに置きたい
  • AWSに作るか

構成

EC2

  • 普通にAmazonLinuxAmiを起動
  • docker docker-composeをインストール
  • nginx phpもインストール(この辺はなんでもいい)
    • nginxuser: ec2-usergroup: ec2-userに設定する
    • あるいは nginxユーザーがdockerを実行できるようにしてもいいかも
  • gitもインストールしてツールをcloneする

Docker

  • ツールのリポジトリにDockerfiledocker-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

まとめ

実装を始める前にいろいろ振り返ってよく考える

資料

14
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9