ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

雑ログ lambda layersで遊ぶ

lambda layersを触る.

qiita.com

ここを参考にした。

ディレクトリ構成

- lambda
    - lambda_layers
        - python
            - cw_logging.py
    - lambda_test
        - lambda_function.py

lambda layersの作成

$ pwd
~/lambda/

$ cd lambda_layers/
$ zip -r python.zip python/

用意したzipファイルはqiitaの記事のようにアップロードする.

呼び出し元(lambda関数)

from cw_logging import logging


def lambda_handler(event, context):
    logging('INFO', 'LambdaLayerTest', 'This is test.')
    # ...

これでできた。

ここまで来るのに5回ミスったけど、その都度上げ直すのめんどくさい。

次は、lambda layers側で、外部ライブラリが必要になるケースでやる。

import datetime
import boto3


S3 = boto3.resource('s3')


def logging(error_lv, lambda_name, error_msg):
    """Lambdaログ出力(CloudWatch Logs)関数."""
    logging_date_str =(datetime.datetime.now()).strftime('%Y/%m/%d %H:%M:%S')
    log_str = '{} [{}] {} {}'.format(logging_date_str, error_lv, lambda_name, error_msg)

    # CloudWatch Logsに出力
    print(log_str)

    # ログ文字列を返却
    return log_str


def save_s3(bucket_name, html, file_name):
    obj = S3.Object(bucket_name, file_name)
    obj.put(Body=html)

これにした.

呼び出し元(lambda関数)

from cw_logging import logging, save_s3


def lambda_handler(event, context):
    logging('INFO', 'LambdaLayerTest', 'This is test.')
    save_s3('aipa.test.log', 'text', 'test.txt')
    # ...

保存できた(°ω°)

あれー? 昨日はできなかったような...?

boto3は実はインストール済みかもしれない。

beautifulsoupとかに変更してみる。

lambda layers側のimport文を修正する。

from bs4 import BeautifulSoup
import urllib3
from urllib3.exceptions import RequestError, InsecureRequestWarning

# ...

Unable to import module 'lambda_function': No module named 'bs4'

ふむ。予想通り。

ディレクトリ構成をちょっと修正する.

$ mkdir -p lib/python3.6/site-packages/
- lambda
    - lambda_layers
        - python
            - cw_logging.py
            - lib/python3.6/site-packages/
    - lambda_test
        - lambda_function.py

こうする。

ほんで、~/lambda/lambda_layers/requirements.txtを用意する。

中身はこうした。

requests
future
boto3
beautifulsoup4==4.6.0

落とす

$ pip install -r requirements.txt --target python/lib/python3.6/site-packages/

圧縮して再アップ.

$ zip -r python.zip python/

こうするとうまくいきました。やったね!!!

雑ログ lambdaで遊ぶ

lambda楽しい〜とつぶやいた3時間後、無事死亡

一気にやろうとして死んだ。

ハマったこと

  • lambda-uploderでアップした関数のruntimeがpython2.7
  • 謎のエラー invalid syntax (__init__.py, line 53)
  • 動かないlambda layer

runtimeの件は、lambda-uploderのREADME.mdみたら解決した。

github.com

最初、awsの公式の仕様と勘違いして、awsのドキュメントをあさっていたんだけど見つからなくてシクシクしていたら、よくよく考えてみたら、こいつだったことを思い出した。

謎のエラーは、bs4がC言語で動かいているからバージョン指定しないと動かないっぽい。

qiita.com

requirements.txtに追記した.

beautifulsoup4==4.6.0

lambda layerは、ブログ記事通りに試さず、自分のやりたい通りに書いたら動かなかったので、次は下記ブログを一度試して動いたことを確認してから進む。

blog.serverworks.co.jp

そういえば、lambda layerで利用するモジュールはどうやってinstallされるんだろ?

雑ログ

決定木で、テストデータがどの葉に分類されるかを自動でやりたいとき、なんかないかなーと探してたら公式ドキュメントにあった。

scikit-learn.org

# decision_pathで全体の結果が返ってくる?
node_indicator = estimator.decision_path(X_test)


# テストデータの行番号
sample_id = 0

# 0行目のデータを決定木に入力したときに、通る順番のノード番号が入っている.
node_index = node_indicator.indices[node_indicator.indptr[sample_id]:node_indicator.indptr[sample_id + 1]]

# ということは、このリストの最後に入っているノード番号が、葉のノードを示していることになる.
last_idx = node_index[-1]

# ノード番号をkeyに、そこに到達する行番号を保持するようにする
last_node_d = {}
last_node_d[last_idx] = []
last_node_d[last_idx].append(sample_id)

last_node_d = {}
for sample_id in range(X_test.shape[0]):
    node_index = node_indicator.indices[node_indicator.indptr[sample_id]:node_indicator.indptr[sample_id + 1]]
    last_idx = node_index[-1]
    if not last_idx in last_node_d.keys():
        last_node_d[last_idx] = []

    last_node_d[last_idx].append(sample_id)

これで、あるノード番号に含まれるテストデータを抽出することができる.

2019年1月3週目の振り返り

体調管理

  • ダメだねー

技術

数学

  • 特にしていない

個人開発

  • 決定木で遊んだ

  • 読んでいない

趣味

映画

ゲーム

  • やっておらん

仕事

  • うーむ。まだまだまだまだだなーという気持ち
  • 不安な業務に対し、相談も動きも遅いので早めに作業を終わらせたいのだが、なかなかうまくいかない
    • 多分、分析する必要があるのでちっと日毎に振り返りをやりたい

家庭

  • 子供の100日記念を取る場所を探し中
  • 結婚式の予算だったり、ドレスとかだったり確認しに

雑感

  • もちっと、資料を作る力と引き続き数学を勉強していきたい
  • アルゴリズムの実装を確認するのは結構勉強になったので引き続き進める
  • 体調管理どうすべ

雑ログ

YOLOを引き続き勉強中である。

github.com

↑のような説明記事をみてもわからないことが多い

  • darknet53で画像から特徴をとっているらしいが、それが後半の検出にどう使用されているのか
  • クラスの出力が、softmaxじゃなくてロジスティック回帰
  • バウンディングボックス検出の詳細ロジック
  • アンカー定義の謎 -> これはわかった

とりあえず、せっかく勉強したので、Tensorflow勉強しながらこれも進める。