AWSlambdaでkerasを動かす

AWSのlambdaはサーバレスアーキテクチャで非常に扱いがいいのですが、一つ難点があって、アップロードできるファイルサイズが限られていることです。
最大50MのZIPファイルまでなのですが、裏技を使って展開時に500M以上のファイルを使うことができます。

そのカラクリは、Lambdaの/tmp以下は500Mまで使うことができます。この領域に、Lambdaが起動するときにファイルをS3から読み込めば、非常に大きなライブラリが必要なプログラムも動かすことができます。
以下は、pythonにてkeras+tensorflow+opencvを動かすサンプルです。

ライブラリ準備

python3を使用します。
ライブラリは、あらかじめ、EC2でAmazonLinuxを使って作成しておきます。

requirements.txt

このlib以下にライブラリがインストールされます。

pycは削除しておきます。しなくてもいいですが。。。

これを全てLambdaの起動時に追加してもいいのですが、ロードが面倒になるので2つに分けます。

libを固めてS3にアップ

lambdaディレクトリ

lambda用のディレクトリに、先ほど分けたlib_otherのライブラリを入れておきます。
これ全部を入れてようやく50Mぐらいまでに収まります。

lambdaプログラム

lambdaのプログラムには少し工夫が必要です。
起動時に、S3から先ほどアップしたlib.zipをダウンロードし展開、ロードします。

lambda_functioy.py

こんな感じでコードを書きます。
Lambdaは一度起動すると、しばらくはインスタンスが残っているので、2回目以降に再度S3からダウンロードするのを防ぎます。

こんな感じで、500M以上のモジュールをつかったLambdaファンクションが作ることができます。

AmazonLinux(CentOS)にMPIを入れる

yumでインストール

パス追加

~/.bashrcに追加

python

ライブラリを追加

pyenv

.bashrcに追加 

python install

mpi4pyを導入

chainermn

lambdaのAPIにキーを付与する

AWSの仕様がすぐ変わるのでメモ。

こちらの記事を参考にAPIGatewayにAPIキーをつけようとしたのですが、2017.5.16現在、仕様が変わってしまっているようでそのままでは設定できませんでした。

記事の中頃「API Keyの追加」の部分ですが、API Stage AssociationはAPI Keyのページには存在しません。

以下の手順となります

  • 左メニューのUsagePlansというメニューをクリック
  • createでNameに何か適当な名前を入れる。
  • リクエスト数にリミットをつけないのならば、Enable throttlingとEnable Quotaはチェックを外す
  • Add API Stageでデプロイ済みのAPIとStageを選択しチェックマークをクリック。Nextをクリック
  • Add API Key to Usage Planをクリックし、作成済みのAPI Keyの名前を入力。チェックマークをクリックしDone

これでAPIキーが付加されます。

AWSのlambdaでJavaを使う

ちょっとハマったのでメモ。JavaはMavenでコンパイルします。

Test.java

pom.xml

コンパイル

Lambdaへアップロード

  • zipファイルをアップロード
  • Configulationを設定
  • RuntimeJava 8
    Handlercom.example.Test::handler

     これで動きます。テストの際に与えるパラメタの値が表示されます

UCD-DISKIO-MIB::diskIODevice = No more variables left in this MIB View (It is past the end of the MIB tree)エラー

Hinemos5.0でサーバ監視をしているのですが、EC2のAmazonLinuxで作成したサーバのリソース監視がデフォルトではうまくいかなかったのでメモ。

* Amazon Linux AMI release 2015.09

AmazonLinuxは作成すると自動で、SNMPが起動されています。そこに対してHinemosから監視をかけるわけですが、タイムアウトというエラーが出たりします。

まず確認用に監視サーバからコマンドを打ちます

こんな感じのエラー。
こちらに対処法が書いてありましたので実行してみます。

被監視サーバの設定を修正します

先のブログには再起動と書いていますがリスタートのみでOKです

再度、監視サーバからコマンドを打ちます

無事コマンドが通りました。
しばらくするとエラーになっていたHinemosの監視項目にも値が入るようになります

ElasticSearchでClusterBlockException[blocked by: [FORBIDDEN/8/index write (api)]エラーの対応

ElasticSearchをAWSで運用しているとたまにエラーが出ます。

このメッセージが出る場合の対処方法ですが、こちらの記事にある通りにディスクフルの場合には容量アップで対応できるみたいですが、そうでない場合もあります。

http://qiita.com/dorachan1029/items/f3b47f4d9859450d9b90

その場合には再度テーブルを作成しなおすとなおったりします。こんな感じで。

http://qiita.com/shouta-dev/items/c2d2eb6cf61bb1fa8e1b

自分の場合には、データを毎日入れ替えていたのですが、全入れ替えするとその間検索ができなくなってしまうので、要、不要を判断し、1レコードづつ入れ替えていたのが悪かったのかもしれません。半年ほど運用していたらこのエラーになりました。

EC2インスタンスでTensorflow

GoogleのTensorflow、GPUマシンでないとなかなか性能がでないので

EC2で作成してみます。

TensorflowはCUDA3.5以降対応だとかで、AWSのEC2インスタンスで使用可能なg2.2xlargeではCUDA3.0。ということでそのままでは使えないそうです

というわけで、いろいろ調べたところ、偉い方々が手順を示してくれています。

https://www.tecnos-dsm.co.jp/archives/info/technical_info_04

2016/3/17現在、これらの手順ですとTensorflowをコンパイルする際にエラーになります

これの回避策がこちらに

http://stackoverflow.com/questions/34941620/unable-to-build-tensorflow-from-source-with-bazel-22nd-january-2016

単純な話でbazelのバージョンのせいだとか。

bazelをコンパイルしなおします

その後、Tensorflowのコンパイル

うまくいきました

EMRのSparkでWordCount

BODY:

EMRではSparkでファイルを開く際には*が使えるみたいだ 

こんな感じのBOWを数えるスクリプトを作成

s3にはgzで固められたファイルがたくさんある場合には

このような指定で起動すると全ファイルを解凍しながら計算し、outputへ結果を保存します

EMRでSparkSQLサンプル

SparkからHiveが使いづらいというか使えない?のでSparkSQLを使ってみました。

そこそこ試行錯誤する必要があったのでメモです。

データファイル

のフォーマットのファイルを用意しておきます。こんな感じ。

これをS3へアップしておきます

build.sbt

こんな感じで記述します。build assemblyでエラーが出るのでこんな記述にしています。

ちなみにproject/assembly.sbtはこれ

SqlSample.scala

http://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-15-to-16

この辺りを参考に

build

これで作成したJarを同じくS3へアップします

EMR

今までと同様にEMRを作成し、AddStepでSparkApplicationを追加します。Jarは先ほどアップしたものを指定します

Spark-submit options

Arguments

ここには出力ファイルが入ります

じっこすればOutputにMapで表現されたデータが保存されます

EMRでSparkサンプル

emr-4.2.0をベースにAdvancedOptionでSpark1.5.2を追加しクラスターを作成しておきます

今回はPiをモンテカルロシミュレーションで計算するSpark付属のサンプルプログラムをちょっと改造して使用します

build.sbt

build.sbtはこんな感じ

SparkPi

SparkConfを作成する際のここがポイントです

ビルド

Jarファイルが作成されたらS3にアップしておきます

EMRでの実行

AWSコンソールからEMRで作成したクラスターを選択し、AddStepで先ほどアップしたJarファイルを指定し追加します

step typeにはSpark applicationを選択、

Spark-submit optionsに

Argumentsに出力を保存するS3のロケーションを入れておきます。すでにフォルダがあるとエラーになるので注意

実行後、出力先にファイルが作成されます