Try   HackMD

#概要
本資料はJSCプロジェクトでの機械学習システム導入手順書です。
主な導入内容は、スプリーム独自の機械学習アプリケーション ”barn-owl”のインストールおよび設定です。
barn-owlは、各種機械学習アルゴリズムのモデルを作成したり、作成したモデルを利用してスコアリングすることができるwebアプリケーションです。Webアプリケーションのため、Apachのインストール・設定、ネットワーク設定が必要となります。

#前提
JSCプロジェクトでの機械学習サーバー(MLサーバー)はEC2上にAimstarおよび保守端末から接続できる環境になっています。
保守端末とMLサーバー間はssh、httpの通信が可能。
AismtarとMLサーバー間はhttpの通信が可能。
AismtarとMLサーバー間でファイル連携をする場合は、S3を介する想定。

OSはUbuntu 20.04を想定しています。CentOSを使用する際には、機械学習サーバー構築手順書_JSC案件_20190328_kawa_ykoba修正を参照して下さい。

(参)ローカル環境でAmazonLinux2を検証したい場合には、VirtualBoxなどのツールを用いて、
   仮想環境上にAmazonLinux2を構築することも可能です。

- 参考URL:「Amazon Linuxのローカル環境を作成する」 https://qiita.com/horikeso/items/cc3d628069421e11d7ab
 - 関連ファイル:\ss7\share\Aimstar\10_Aimstar導入顧客\2018_ジュピターショップチャンネル\60_導入\AWS社内開発環境\分析サーバー構築\Amazon Linux 2 ローカル仮想環境構築
 
JSC案件ではGPUを使用しないため、CUDAおよびCUDNNのインストールは行いません。
GPUが利用できない環境であってもbarn-owl自体は問題なく動作させることができます。
また、本番環境ではApacheの利用を推奨しますが、開発環境では、後述するDjangoの簡易サーバーを使用することもできます。

以下の手順はgithubのREADME.mdを書き直したものです。

#導入手順概要

  1. 初期設定・ツールインストール
  2. barn-owlのソースコードの配置
  3. pythonの実行環境作成
  4. Apacheのインストールと関連する設定
  5. ssh関連の設定
  6. barn-owlの初期設定
  7. barn-owlの起動

以下の作業は、barn-owlを起動後、ブラウザ上で設定します。

  1. barn-owl起動後の設定
  2. 外部アプリケーションの登録(barn-owl,Aimstar)

以降個々の手順について説明します。

#導入手順詳細

1. 初期設定・ツールインストール

1.1. セキュリティの設定

Amazon EC2ではセキュリティグループの設定によって
事前にAWSコンソール画面にログインし、起動するサーバーのポートを開放しておいてください。
デフォルトではHTTPS:8001番。(※設定によりHTTPで起動することも可能です。)
(上記より、firewalldの設定によるポート開放は不要)

1.2. 各種ツールインストール

まず、前提となる各種ツールをダウンロードします。

apt-get install build-essentials'
#yum -y install sqlite-devel openssl-devel httpd-devel #Ubuntuのため略(pyenvに必要っぽい)

2. barn-owlのソースコードの配置

git clone  -b develop http://192.168.0.63/barn-owl/barn-owl.git

開発環境を作成する場合は、SUP社内gitlab(192.168.0.63/barn-owl/barn-owl)の"develop"リポジトリからgit cloneでソースコードを取得し、User直下に配置してください。(配置場所は都合の良い場所でよい。)
もし、権限がない場合は管理者に問い合わせてください。

本番環境に配置する場合は、社内で取得したソースコードを用いて、User直下に配置してください。(配置場所は都合の良い場所でよい。)
今回は下記ファイルを解凍・利用してください。
"\ss7\share\Aimstar\10_Aimstar導入顧客\2018_ジュピターショップチャンネル\60_導入\AWS社内開発環境\分析サーバー構築\barn-owl.zip"

3. Anaconda環境構築

3.1. Anacondaのインストール

barn-owlはpython3.Xで動作します。
以下、Amazon Linux2でのインストール方法を記載します。

Amazon Linuxのyumにあるpythonを確認し、インストールします。
以下のurlより適切なanacondのバージョンを選択後、

https://www.anaconda.com/products/individual#linux
適切なバージョンのanacondaをインストール

wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
bash Anaconda3-2020.02-Linux-x86_64.sh

ちゃんと構築できているか確認

conda -V

3.2. anacondaライブラリのインストール

pythonが利用できるようになったら、barn-owlのソースコードのトップディレクトリ(README.mdと同じディレクトリ)に仮想環境を作成しましょう。(具体的な方法は後述)

cd ~/barn-owl/
# 仮想環境の作成
conda env create -f barn-owl_env.yaml

# 次のコマンドで仮想環境をアクティベートする
conda activate barn-owl_env

※依存関係があるパッケージに変更があった場合には

conda env export > barn-owl_env.yaml

でyamlファイルを更新すること。

4. Apacheのインストールと関連する設定

参考: https://qiita.com/itisyuu/items/dafa535adc8197208af1

apache2をインストールする

sudo apt-get -y install apache2 apache2-dev
#systemctl start apache2

mod_wsgiのインストール
(mod-wsgiとは、PythonのプログラムをApache HTTP Serverで動作させるためのモジュール)
(mod_wsgiはpythonのライブラリにある)

pip install mod_wsgi
sudo mod_wsgi-express install-module

で現れてた文字列をコピーし
(自分の場合は、'/usr/lib/apache2/modules/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so')

vi /etc/apache2/apache2.conf 

の末尾に書き込む。

#apacheとDjangoを結びつける

vi /etc/apache2/sites-available/django.conf

でconfファイルを作成し

<VirtualHost *:80>
  WSGIDaemonProcess proj1 python-home=/home/yuyonod/anaconda3/bin/python
  WSGIScriptAlias/ /home/yuyonod/work/barn-owl/test/test_project/test_project/wsgi.py
  <Directory /home/yuyonod/work/barn-owl/test/test_project/test_project>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>
</VirtualHost>

のような内容を書き込みます。各自環境に合わせてください。

以下をbarn-owl.confに記載


LoadModule wsgi_module   modules/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so
WSGIScriptAlias / /home/ec2-user/barn-owl/Django/ML/wsgi.py
WSGIPythonHome /home/ec2-user/barn-owl/.env
WSGIPythonPath /home/ec2-user/barn-owl/Django/

<Location / >
  Require all granted
</Location>

<Directory /home/ec2-user/barn-owl/Django/ML>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

##起動確認

$sudo a2dissite 000-default
$sudo a2ensite django
$systemctl restart apache2

で設定ファイルを読みこみapacheを起動させる。

※以下のエラーが出る場合
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.
要解決法

ここまで編集(20200628)

5. ssh関連の設定

鍵がなければ、作成しましょう。

ssh-keygen -t rsa

鍵を作成したら、クライアント側(Aimstarサーバー)に登録してください

ssh-copy-id {username}@{ip-address}

次に、秘密鍵、公開鍵、サーバ証明書を作成・登録します。

openssl genrsa > barn-owl.key
openssl req -new -key barn-owl.key > barn-owl.csr
openssl x509 -req -signkey barn-owl.key < barn-owl.csr > barn-owl.crt

mkdir /etc/httpd/conf/ssl/
mkdir /etc/httpd/conf/ssl/
mv barn-owl.key /etc/httpd/conf/ssl/
mv barn-owl.crt /etc/httpd/conf/ssl/

6. barn-owlの初期設定

barn-owlの初期設定のうち以下のものはCLIで実行します。

・マイグレーション
・スーパーユーザーの作成

まず、上述の仮想環境をアクティベートして、Djangoディレクトリに移動し、以下のコマンドを実行してください。

python manage.py makemigrations regression
python manage.py makemigrations classification
python manage.py makemigrations clustering
python manage.py makemigrations recommendation
python manage.py makemigrations datafile_manager
python manage.py migrate

次にスーパーユーザーを作成します。

python manage.py createsuperuser

ユーザー名、パスワード、メールアドレスの入力を求められます。このうち、ユーザー名とパスワードはのちの手順で使用するので、控えておいてください。
メールアドレスを利用する機能は今のところ実装していないので、空欄にして構いません。
([例] username:aimstar, password:supreme)

7. barn-owlの起動

以上の設定が終了したら、barn-owlを起動可能となります。
barn-owlはscriptsフォルダ内のserver-startup.sh というシェルスクリプトを使用して起動します。

barn-owl/scripts 内のserver.conf.sampleを参考に、server.confを作成してください。
少なくともipアドレスは書き換える必要があります。

cp server.conf.sample server.conf

server.confを書き換えたら、server-startup.shを実行してください。
ただし、server-startup.shとserver.confは改行コードがCR+LFになっている場合はエラーになるので、LFに変換して実行してください。

./server-startup.sh
# もしくは
nohup ./server-startup.sh

https://{id-address}:{port}/api-auth/login にアクセスできることを確認し、
先ほど作成したスーパーユーザーアカウントでログインしてください。

なお、nohupモードで起動した際に、停止したい場合にはプロセスIDを特定してkillする必要があります。

# PIDを確認
ps -ef
kill [PID]

nohupモードで起動した際の起動結果は、scripts/nohup.outに出力されています。
また、正常起動しなかった場合は、エラーログがDjango/logディレクトリあるのでそちらを参照してください。

8. barn-owl起動後の設定

barn-owl起動後、ブラウザ上で「グループ」「ユーザー」を設定(作成)します。
「グループ」「ユーザー」作成後、外部から接続するためのclient_idとclient_secretが発行可能となります。

8.1. グループの作成

  1. groupをクリックする
  2. add group をクリックする
  3. 適当な名前を入力する
  4. 以下のpermissionを追加する(フィルタで検索し、該当したものをすべて追加する)
  • classification
  • regression
  • clustering
  • recommendation
  • datafile_manager
  1. save する

8.2. ユーザーの作成

  1. users をクリックする
  2. add user をクリックする
  3. usernameとpasswordを入力する。このusernameとpasswordはAimstarのconfに記述するほか、接続する際に必要となる情報なので控えておくこと。
  4. スーパーユーザー作成時と同様にメールアドレスを入力する欄がありますが、気にしなくて良いです

9. アプリケーションの登録

認証に必要な情報は「アプリケーション」という単位で発行しています。ここでの「アプリケーション」とは、barn-owl に対して、リクエストを投げる外部のソフトウェアのことであり、今回はAimstarが該当します。そのほかにも、開発者がデバッグ用にリクエストを投げる場合もアプリケーションの登録が必要です。

アプリケーションの登録をするために、前の手順で作成したユーザーでログインする必要があります。次のurlにアクセスしてください(もし、まだスーパーユーザーとしてログインしたままであれば、いったんログアウトしてください。)

https://{ip-address}:{port}/api-auth/login/

ログインしたら、click here をクリックし、以下の情報を入力します。

項目 内容
Name アプリケーション名。AimstarV75
Client id 接続用id。書き換えないこと
Client secret 同上
Redirect urls 空欄でよい
Client type Confidentialを選択する
Authorization grant type Resorce owner password-basedを選択する

入力したらsave をクリックしてください。Client id とClient secret が接続するために必要な情報です。これらは控えておいてください。

AimstarからAPIを利用する場合であっても、そのほかの方法でAPIを利用する場合であっても必要な情報は以下の4つです。

  • ユーザー名
  • パスワード
  • Client id
  • Client secret

Aimstarであれば、これらをaimstar+local.confに記述する必要があります。

machine_learning.server.url=https://{ip-address}:{port}/v2/
machine_learning.server.basic.username={username}
machine_learning.server.basic.password={password}
# アクセストークンを取得するためのAPI
oauth2.0.machine_learning.url=https://{ip-address}:{port}/oauth2/token/
oauth2.0.machine_learning.userid={client_id}
oauth2.0.machine_learning.secret={client_secret}

#DatasetFile
dataset_file.host_ip_address={ip-address}
dataset_file.file.protocol=scp
dataset_file.user.name={username}