2017年10月18日水曜日

【Microsoft Azure, DeepLearning】Gluon API を Azure Cloud Shell で使う

10/12に、AWSとマイクロソフトが深層学習ライブラリ「Gluon」を発表しました。
http://www.businesswire.com/news/home/20171012005742/en/AWS-Microsoft-Announce-Gluon-Making-Deep-Learning

Gluon API は、githubでプロジェクトが公開されています。
https://github.com/gluon-api/gluon-api

今のところApache MXNetをサポートしていますが、近いうちに Microsoft Cognitive Toolkit もサポート予定です。

Pythonが動作すれば動かせそうなので、ここはひとつ、Azure Cloud Shell で動かしてみましょう。(UbuntuだからもちろんVMでもオンプレでも同様に使えます)

まず、AzureポータルでCloudShellを起動します。
右上の「>_」をクリックすると、ページの下にターミナルが立ち上がります。



次に、pip3でMXNetと関連するパッケージを導入します。
なお、アクセス権の問題で「--user」をつけてコマンドを実行してください。

$ pip3 install mxnet --user

インストールが終わったら、手書き文字認識のデモを動かしてみます。
githubのチュートリアルは Jupyter Notebook用のファイルなので、以下のページのPythonコードをコピペしてCloudShellにコードを置きます。
以下のように実行すると、学習データをダウンロードして実行します。(実行結果のスコアは環境によって異なります)

$ python3 sample.py
Downloading /home/takeshi/.mxnet/datasets/train-images-idx3-ubyte.gz from http://data.mxnet.io/data/mnist/train-images-idx3-ubyte.gz...
Downloading /home/takeshi/.mxnet/datasets/train-labels-idx1-ubyte.gz from http://data.mxnet.io/data/mnist/train-labels-idx1-ubyte.gz...
Downloading /home/takeshi/.mxnet/datasets/t10k-images-idx3-ubyte.gz from http://data.mxnet.io/data/mnist/t10k-images-idx3-ubyte.gz...
Downloading /home/takeshi/.mxnet/datasets/t10k-labels-idx1-ubyte.gz from http://data.mxnet.io/data/mnist/t10k-labels-idx1-ubyte.gz...
Epoch 0. Current Loss: 0.13201400637626648.
Epoch 1. Current Loss: 0.14284838736057281.
Epoch 2. Current Loss: 0.015998387709259987.
Epoch 3. Current Loss: 0.1412399709224701.
Epoch 4. Current Loss: 0.01220973301678896.
Epoch 5. Current Loss: 0.020301349461078644.
Epoch 6. Current Loss: 0.008270819671452045.
Epoch 7. Current Loss: 0.001500518061220646.
Epoch 8. Current Loss: 0.0009114982676692307.
Epoch 9. Current Loss: 0.006475736387073994.

ちょっとしたことがCloudShellで出来ちゃいました。

2017年8月18日金曜日

【Microsoft Azure】空耳で気になる曲を Azure Media Analytics で解析してみよう(Python3編)

Azure Media Analytics は、メディアサービスが提供する分析機能です。
https://docs.microsoft.com/ja-jp/azure/media-services/media-services-analytics-overview

さんざんいろんな人が試してるとは思いますが、もちろんWindowsは使わない方向で考えて、Pythonで以下のライブラリを使ってみました。

amspy
https://github.com/msleal/amspy

試したところ、Python3で動作し、REST API をラップしているようです。

では、まずはUbuntuへの導入方法を。

最初にライブラリを導入するための、Python3用setuptoolsとpipをaptでインストールします。

$ sudo apt install python3-pip python3-setuptools

次に、pipを最新版にして、ストレージに接続するための Azure SDK for Python をインストールします。

$ sudo pip3 install —upgrade pip
$ sudo pip3 install azure

githubより、amspyをクローンしてインストールします。

$ git clone https://github.com/msleal/amspy.git
$ cd amspy
$ sudo python3 setup.py install

次は、exampleを使って、Indexer v2 を使って解析する準備をします。
ポータルよりメディアサービスのアカウントキーとストレージのアカウントキーよりアクセス情報を確認して設定ファイルに保存します。

$ cd amspy/example
$ vi config.json

設定ファイルの中身はこのように設定します。
{
   "accountName": "メディアサービスのアカウント名",
   "accountKey": "メディアサービスの主キー",
   "sto_accountName": "ストレージ アカウント名",
   "sto_accountKey": "ストレージのキー",
   "logName": "log/indexer.txt",
   "logLevel": "DEBUG",
   "purgeLog": "Yes"
}

Indexer v2 のサンプルを設定します。

$ cd analytics/indexer_v2
$ vi indexerv2.json

今回は空耳なので、設定ファイルのLanguageを日本語(jaJP)にします。

{
  "version":"1.0",
  "Features":
    [
       {
       "Options": {
            "Formats":["WebVtt","ttml"],
            "Language":"jaJP",
            "Type":"RecoOptions"
       },
       "Type":"SpReco"
    }]
}

なお、空耳ということで今回は独断と偏見で Prince の Batdance にしました。
https://youtu.be/0wbtLYPTCug

さて、農協牛乳はどうなるのでしょうか?(再生時間で5:14のあたり)
本当はボーカルトラックだけ抜き出してやりたいところですが、大変なのでそのまま楽曲を解析します。

ファイルを置いて、プログラムを多少変更します。

$ mv /home/xxx/Batdance.mp3 .
$ vi indexer_v2.py

プログラムは、76行目を読み込むファイル名、ファイルの相対パスに変更します。

VIDEO_NAME = "Batdance.mp3"
VIDEO_PATH = "./Batdance.mp3"

また、最終行に以下の2行を追加すると、メディアサービスで使ったストレージを自動的に削除するのでお財布に優しいです。

response = amspy.delete_media_asset(access_token, asset_id)
response = amspy.delete_media_asset(access_token, output_asset_id)

では実行します。結果は、同じディレクトリのoutput以下に保存されます。

$ python3 indexer_v2.py
$ cat output/Batdance_aud_SpReco.vtt

中身をみてみましょう。

WEBVTT

00:00:03.200 --> 00:00:05.070
王への愛*にいる

00:00:06.150 --> 00:00:12.010
アプリ

00:00:47.350 --> 00:00:49.510
H 島

00:00:50.330 --> 00:00:53.360
H

00:01:05.540 --> 00:01:09.900
Pro キッズ店

00:01:24.720 --> 00:01:27.480
V

00:01:32.670 --> 00:01:35.350
アプリ

00:01:38.810 --> 00:01:40.070
V

00:02:42.860 --> 00:02:44.280
アピタ

00:02:45.800 --> 00:02:51.990
V

00:02:52.540 --> 00:02:54.520
V

00:03:04.500 --> 00:03:05.250
そうね

00:03:06.740 --> 00:03:10.640
ハイト保証ですからねやってるからな

00:03:11.400 --> 00:03:21.570
Z

00:03:27.170 --> 00:03:30.280
このパスタ

00:03:31.150 --> 00:03:43.680
プレステ零

00:03:46.660 --> 00:03:49.000
V

00:03:50.010 --> 00:03:51.450
果実は行くってなんです

00:03:53.010 --> 00:03:57.610
Pro

00:04:21.250 --> 00:04:26.050
ステージ v だよね

00:04:27.090 --> 00:04:29.480
V

00:04:30.610 --> 00:04:32.380
ええ

00:04:42.630 --> 00:04:45.360
で

00:04:53.890 --> 00:04:54.910
見つめるます

00:05:03.130 --> 00:05:04.170
V

00:05:06.740 --> 00:05:08.130
作品

00:05:53.780 --> 00:05:57.410
V

00:06:06.770 --> 00:06:08.020
V

00:06:09.110 --> 00:06:13.890
プラチナメンバー

農協牛乳はありませんでしたが、さらに謎な言葉が並んでいます...




(2017.08.19追記)
ついでに手元にあったコンテスト用のGetWildのボーカルトラックを解析してみたら、こんなことになってました。

00:00:00.090 --> 00:00:06.530
あぁスパルタは大変大きいり続けんだ
上がらんくらい army 発信いる犬系るんだ

00:00:07.360 --> 00:00:13.680
シンプルな種類に意味じゃなきゃ野生でも明日に怯えて言ってあげよう

00:00:14.780 --> 00:00:26.440
撃ち合点はまあペンはサーバーありサイン誰からのために行きらんだえるなら一
アーチは今まあちょいはサーバーある人に何も

00:00:27.360 --> 00:00:30.360
時間は食うわない

00:00:32.940 --> 00:00:59.270
ジャムはじゃあきっと売り電話解けない愛の parser ウォーターにて客はじゃあ
買うのマーチで優しいスターに甘えていたクーガーないがてっちゃんせんがけんいだけが
守られるものがどこかにあんうるさてっちゃんせんが一人でも傷ついた

00:00:59.310 --> 00:01:02.020
あ有名を取り戻すやを




2017年5月13日土曜日

【Microsoft Azure】PHP向けDocumentDBライブラリのCosmosDB対応できてます

Build2017でDocumentDBの後継であるAzure Cosmos DBが発表されました。
https://azure.microsoft.com/en-us/blog/azure-cosmos-db-microsofts-globally-distributed-multi-model-database-service/

Azure Cosmos DB の公開に合わせて、開発しているPHP向けDocumentDBライブラリも更新しました。

Cosomos DB を作成する際に、APIの選択を"SQL(DocumentDB)"にしてもらえば今まで通り使えます。





2017年4月23日日曜日

【Microsoft Azure】みんな大好きマストドンを Web App On Linux で簡単に動かそう(完結編)

Web App On Linux は、簡単に言えば単体のDockerコンテナを動かすサービスです。
最初からNode.jsとかPHPのイメージが提供されているので、Windowsベースの Web App と同じように、かつApacheをWebサーバーとして使えるのがメリットです。

今回マストドンを単体のdockerコンテナで動かすわけですが、大変な苦労をして作成したdockerコンテナイメージを Docker Hub で公開します。
https://hub.docker.com/r/cocteau666/mastodon/

苦労した点を列挙するとこんな感じです。

1.複数のサーバーをひとつのコンテナに立てる
本来なら1コンテナ1プロセスの思想で、必要ならオーケストレーションツールで複数のコンテナを使うのが正しいのですが、限られた環境なのであえてオールインワンにしてみました。
この問題を解決するためには、supervisordを使いました。

2.ホスト名を設定する
コンテナをrunしたらほぼ問題なく動くようになったのですが、Web App にデプロイ後にどうやってホスト名を追加するのが良いのか、いろいろ検討しました。
結局、ポータルのアプリケーション設定の中のアプリ設定(いわゆる環境変数)に、Railsで使う環境変数を上書きする形で設定するように落ち着きました。
手順は後ほど説明します。

それでは、このイメージを使って、Azureで簡単にマストドンを運用する手順を説明します。

Azure使ってない人はまず使えるようにしてくださいw
https://azure.microsoft.com/ja-jp/offers/ms-azr-0044p/

ポータルにログインしたら、「Web + モバイル」→「Web App On Linux」を選びます。



アプリ名(今回はmastodon0)を入力し、サブスクリプションを選択(デフォルトでも問題ないはず)、リソースグループを新規作成または既存のグループを選択(今回はdocker2というグループを新規作成)します。
App Service のプラン/場所は、プランは今のところ「B1 Basic」が5700円/月で一番安いです。場所はプレビューなので、West Europe、Southeast Asia、West USの3つから選びます。ご自身に近いところでどうぞ。
コンテナの構成は、イメージのソースは「Docker Hub」、リポジトリ アクセスは「パブリック」、イメージとオプションのタグは「cocteau666/mastodon:latest」をそれぞれ入力します。
ここまで入力したら左下の「作成」を押します。

出来上がったら、アプリの管理ポータルで環境変数を設定します。
左の一覧から「アプリケーション設定」を選び、真ん中あたりのアプリ設定に追加します。
キーが「LOCAL_DOMAIN」、値が今回のアプリのFQDN(mastodon0.azurewebsites.net)を入力して上の保存を押します。












保存したら左の一覧の「概要」を選び、上の「再起動」をクリックします。


10分程度たってから、アプリにアクセスします。(今回は https://mastodon0.azurewebsites.net/)
見えましたか?




























ここでアカウントを登録すると確認メールが来て、アカウントを有効化できると思います。

なお、簡単にできますが、多少注意点があります。

・データベースもオールインワンなので、再起動するとすべてのデータがなくなります...
・App Serviceのプランに応じてサーバーのディスクサイズが決まりますが、B1だと10GBであまり余裕がないかと。大きくしても50GBなので、ごく小規模での運用に限られるかと思います。

公開しているイメージを自分でカスタムして使うのもアリなので、データベースを外部に立てたり(PostgreSQLです)、Redisキャッシュサービス使ってみたり、いろいろできると思いますので、挑戦してみてください。


2017年4月14日金曜日

【Microsoft Azure】みんな大好きMastodonをAzureで動かそう #1

最近にわかに話題に上がってるMastodonは、アメリカのヘヴィメタルバンドではなく、Twitterに似たWebサービスです。
https://github.com/tootsuite/mastodon

サーバーがそれぞれ分散しているのが特徴で、私を含む大人たちはもしかしたらNiftyServeみたいなのを思い出すかもしれません。
もちろんオープンソースですので、Azureで動かしちゃいます。

今回の構築に必要なものは、こちら。

・Azure Container Service(以下ACS)
docker-composeコマンドでさくっとMastodonサーバーを構築するのにちょうどいいです。

・PostgreSQLとRedisを動かす仮想マシン
今後DBを分散するために、dockerコンテナの外に構築します。
Ubuntuでやってみましょう。

・SMTPサーバー
登録時のメールアドレス確認のためのメールサーバーです。
なんでもいいんですけど。

では、さっそくやってみましょう。

まずは最初に仮想マシンを作成します。
こちらを参考にして、ログインするところまで頑張ります。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/quick-create-portal

ログイン後、以下のようにPostgreSQLとRedisを設定していきます。
まずは管理者になってパッチを当てます。
# apt update
# apt -y upgrade

次はaptコマンドでPostgreSQLとRedisをインストールします。
# aot -y install redis-server redis-tools postgresql postgresql-contrib

ACSからRedisに繋がるように設定します。
# vi /etc/redis/redis.conf
redis.confの中の「bind 127.0.0.1」を「bind 0.0.0.0」に書き換えます。
なお、この状態だとすべてのサーバーからの接続を許可するので、そのまま放置するのはよろしくないです。

PostgreSQLへ、Mastodonで使用するデータベース(mastodon)とユーザー(mastsan)を追加します。この作業はpostgresユーザーで行います。
# su - postgres
$ createdb mastodon
$ psql
> create role mastsan login createdb password 'ログインパスワード文字列';
> \q
$ exit

ACSからPostgreSQLへのパスワードログインを許可します。
# vi /etc/postgresql/9.5/main/postgresql.conf
まずは、postgresql.confに「listen_addresses = '*'」を追加します。
これで他のサーバーからのログインができるようになります。

# vi /etc/postgresql/9.5/main/pg_hba.conf
pg_hba.confの最後に以下の行を追加します。
「host   all  mastosan  0.0.0.0/0   md5」
mastosanユーザーはパスワードでログイン可能です。

最後に、サービスを再起動して反映します。
# /etc/init.d/redis-server restart
# /etc/init.d/postgresql restart


次はACSの設定ですが、今回は構築してSSHトンネリングで起動を確認するまでをやってみます。

まず、AzureポータルからACSを作成します。
左の「+」から、「Containers」を選び、「Azure Container Service」をクリックします。


そのまま下の「OK」をクリックします。


Orchestratorは「Swarm」を選んで、リソースグループやロケーションを決めたら、「OK」をクリックします。



DNSのプレフィックスに今回「mastodon」を設定しました。
コンテナへのユーザーネームと、ログインに必要な公開鍵を貼り付けます。



今回コンテナを3つ動作させるので、Agent count は「3」にします。
Agent virtual machine size はヘタレなので「Standard A0」(ACSでは最小)を選択します。


登録内容を確認して「OK」をクリック。


デプロイが終わるのを待ちます...。


デプロイが終わったら、リソースグループの一覧から今回作成したもの(acstest)を探して表示します。
左のメニューに「Deployments」があるので、選んで表示された一番上(最新)のデプロイ内容を表示します。


そこにdockerホストへのアクセス情報が書かれています。
SSHMASTER0というキーに表示されている値をコピーして、sshでdockerホストへアクセスします。
今回は「ssh ユーザー名@プレフィックス+mgmt.リージョン.cloudapp.azure.com -A -p 2200」となります。


さて、ここからはdockerホストでの作業です。

ログインしてまずはgithubからMastodonをクローンします。
$ ssh ユーザー名@プレフィックmgmt.リージョン.cloudapp.azure.com -A -p 2200
$ git clone https://github.com/tootsuite/mastodon.git
$ cd mastodon

環境に合わせて、「.env.production」ファイルを編集します。
$ cp .env.production.sample .env.production
$ vi .env.production

今回使うRedis、PostgreSQL、SMTPの設定をします。以下の値を環境に合わせて設定しましょう。

--------------------------------------------------------------------------------------------
REDIS_HOST=Redisが動作しているホスト名
REDIS_PORT=6379
DB_HOST=PostgreSQLが動作しているホスト名
DB_USER=ユーザー名(今回はmastsan)
DB_NAME=データベース名(今回はmastodon)
DB_PASS=PostgreSQLにログインするパスワード
DB_PORT=5432

# Federation
LOCAL_DOMAIN=example.com
LOCAL_HTTPS=false

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=長い文字列
SECRET_KEY_BASE=長い文字列
OTP_SECRET=長い文字列

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=SMTPサーバー
SMTP_PORT=587
SMTP_LOGIN=ログイン名
SMTP_PASSWORD=パスワード
SMTP_FROM_ADDRESS=メールに設定するFromアドレス
--------------------------------------------------------------------------------------------

保存したら、docker-compse.ymlを変更して、RedisとPostgreSQLのコンテナを作成しないよう以下のように変更します。

$ vi docker-compose.yml
--------------------------------------------------------------------------------------------
version: '2'
services:

#  db:
#    restart: always
#    image: postgres:alpine
### Uncomment to enable DB persistance
#    volumes:
#      - ./postgres:/var/lib/postgresql/data

#  redis:
#    restart: always
#    image: redis:alpine
### Uncomment to enable REDIS persistance
#    volumes:
#      - ./redis:/data

  web:
    restart: always
    build: .
    env_file: .env.production
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
#    depends_on:
#      - db
#      - redis
    volumes:
      - ./public/assets:/mastodon/public/assets
      - ./public/system:/mastodon/public/system

  streaming:
    restart: always
    build: .
    env_file: .env.production
    command: npm run start
    ports:
      - "4000:4000"
#    depends_on:
#      - db
#      - redis

  sidekiq:
    restart: always
    build: .
    env_file: .env.production
    command: bundle exec sidekiq -q default -q mailers -q pull -q push
#    depends_on:
#      - db
#      - redis
    volumes:
      - ./public/system:/mastodon/public/system
--------------------------------------------------------------------------------------------


あとはビルドしてコマンドから起動します。
途中で失敗する場合は、仮想マシンのRedisやPostgreSQLが起動していなかったりアクセスができない状態ではないか確認してみます。
$ docker-compose build
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rails db:migrate
$ docker-compose run --rm web rails assets:precompile
$ docker-compose up -d


ひとまず確認のため、ローカルホスト(私の場合はMacOS)からSSLトンネリングしてMastodonに接続できるか確認します。ローカルホストのポート30000/TCPに繋ぐとMastodonに接続するようにします。
$ ssh -fNL 30000:localhost:3000 ユーザー名@プレフィックス+mgmt.リージョン.cloudapp.azure.com -A -p 2200

ブラウザで「http://localhost:30000」へアクセスしてみましょう。
きっと見えてるはずw