はじめに
いつも心は虹色に! nikkieです。
2/16開催 (第96回)Python mini Hack-a-thon のイベントレポートをお送りします。
勉強会の概要
(第96回)Python mini Hack-a-thon - connpass
基本的に毎月開催です。スプリントのゆるい版みたいな感じで各自自分でやりたいことを持ってきて、勝手に開発を進めています。参加費は無料です。 初めての方も常連さんもぜひご参加ください。
冬山合宿ぶりのpyhack。
参加者数が定員に収まり、こぢんまりとした雰囲気の2月回でした。
(エンジニア界隈としてはデブサミ明け、かつ、裏番組ららこんだったようです)
取り組んだこと
- Amazon Machine Learning(以下、Amazon ML)でタイタニック号乗客の生死を予測するモデルを作り、APIにする
- 1で作ったAPIをFlaskのアプリから呼び出して使う(入力フォームと結果表示ページを用意)
- 2のFlaskアプリをAWS Lambdaにデプロイする
- 入力フォーム以外に顔写真のアップロードでも生死が予測できるように機能追加(Rekognitionで顔写真から年齢・性別推定)
これは来週のJAWS DAYS 2019の懇親会LTの仕込みです。
Amazon Machine Learningで機械学習始めませんか? | JAWS DAYS 2019
エンジニア界隈デファクトのAWSをどこかで触ってみたかったので、今回LT駆動開発をしています。
達成したこと
上記の1〜4は一通り達成しました。
今回のアプリは #大晦日ハッカソン の成果物をベースにしており、新規で開発する部分は少なかったためです。
(むしろ、LambdaからAmazon MLを呼び出すなど設定周りで苦心しました)
#大晦日ハッカソン
— nikkie (@ftnext) 2018年12月31日
sklearnで作ったタイタニックの生存予測モデルをFlaskでWebアプリにしてみた。
朝から取り組み、一旦ここでタイムアップ。なる早でBootstrap当てたい
なお、写真アップロードも実装した。(MSのComputerVisionAPIを利用して予測に必要な属性を取得し、予測実行) pic.twitter.com/IlB4ruzNq1
▼現状のデモアプリ(入力フォーム)
▼現状のデモアプリ(顔写真アップロードフォーム)
- Lambdaへのデプロイはzappaが便利
- 「AWS Lambda Flask」で検索するとzappaを使ったデプロイが上位を占める
- 例:Zappaを使ってFlask appをAWS Lambda と API Gatewayにデプロイしてみた | DevelopersIO
- 使ってみたところ、デプロイをラップしてくれて大変便利。ローカルで動作確認したら
zappa update dev
で即反映😆 - zappaが作ったLambda関数の実行ロールを編集する必要があった(Amazon MLやRekognitionへのアクセス権をつけないと、アクセスできないためにboto3(後述)の使用箇所でエラーが発生。ブラウザにはInternal Server Errorと表示される)
- AWSのAPI呼び出しにはboto3が便利
- AmazonMLで作ったエンドポイントをrequestsパッケージで叩こうとしたが、ドキュメント内に情報が見つからない
- requestsでやるのは大変そうと察した:完全なバージョン 4 署名プロセスの例 (Python) - アマゾン ウェブ サービス
- boto3を使う情報を見つけ、試してみる→叩けた!😀
- 参考箇所:MachineLearning — Boto 3 Docs 1.9.96 documentation
- boto3を使ったコードはslackclientを使ったコードと似る印象
- Lambdaの実行環境(Python3.6)にもboto3はインストール済みのよう
- boto3はRekognitionを叩くのにも使いました
- flaskでフォームからアップロードされたファイル
request.files
は保存せずにAPIに送れるrequest.files['inputのnameの値'].stream
:SpooledTemporaryFilerequest.files['inputのnameの値'].stream._file
:_io.BytesIOrequest.files['inputのnameの値'].stream._file.read()
:a bytes-like object
- 読みやすいコードにしたくてflake8を使ってみた(恥ずかしながら、これまで使ってこなかった)
- 指摘に沿って引数のインデントを揃えたらたしかに読みやすい
- VSCodeからの自動実行設定調べよう
return render_template( 'predict.html', prediction=PREDICTION[predict_index], input_data=input_data )
他の方の取り組みから
- shimakaze_softさん共有 ボトムアップドメイン駆動設計 │ nrslib (私の積読)
- kaizumakiさん 義理チョコ文化、やめませんか?Pythonでバレンタインに関するツイートを分析〜動機から技術スタック紹介編〜
- 義理チョコと本命チョコの間に何があるのか、私、気になります(そこには愛情があるのかword2vecで検証したい)
- どりらんさん PEP 582で仮想環境が不要になる? - Qiita
- takanoryさんのAPACトーク、組み立てが上手く、YouTubeで見るのが楽しみ(自分用積読メモ)
- 型付けにmypy 積読:mypyやっていくぞ - Qiita
- (懇親会より)PyConJP 2016はトークの裏でビギナーセッション(ハンズオン)があった👀 bottle.pyをつかったチャットアプリ作成チュートリアル
感想
LambdaでLT用のデモアプリを作るという目的は達成できたので大満足です。
CSS設定やアップロードされた画像の表示機能(成果発表でのフィードバック)など、時間が許す限り準備していきます。(まずはスライドを作ろう)
AWSのロールまわりは脳内が整理しきれていませんが、引き続き触って理解を進めていきます。(当日猛者に質問してもいいな)
成果発表やお昼・懇親会の場で興味深い話が聞け、最近アウトプットが多かった身としては、「まだまだこんなに知らないことがあるのか!」と燃料が再チャージされた感覚です。
参加者の皆さま、1日ありがとうございました & お疲れさまでした!