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

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

まとめ

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

資料


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。