🤞

Flaskで作った「なんちゃってAI Webアプリ」を改変させた話

2023/12/10に公開

備忘なのでいつも以上に支離滅裂です.アイコンとは裏腹に膨大な情報量をあなたの脳に流し込まないです.

この前作ったなんちゃってAI Webアプリをもうちょっとちゃんとしたものにしようと思い,四苦八苦した話です.
https://zenn.dev/toratti/articles/f075e85dd230f5
モデルをLSTMに変えた時系列予測アプリにしてます.

主にやったこと

・前回まではFlaskのアプリケーションサーバで機能させていたため,本格的っぽさを出すべくWSGIとnginxを使った
・ついでにDockerの実践を兼ねて,コンテナ2つで構成した

雑なイメージ

もっとちゃんと作る場合,nginxと複数のwsgiがつながり,nginxがリバースプロキシ的になると思われますし,大規模になればnginxも複数存在してその前にローバランサを設置するんじゃないのでしょうか…

今回やったことの流れ

  1. WSGIとFlaskのpythonファイルがあるコンテナをビルドして動作確認
  2. nginx側をビルドして動作確認
  3. docker composeで両方使った場合の動作確認

躓いた箇所とか,忘れそうな箇所

・ホストとコンテナのポートマッピング
Dockerの勉強材料のUdemyでも説明受けていたのに忘れてました.
docker runするときに -p 5000:5000と127.0.0.1のポートとコンテナのポートをマッピングさせる必要があります.
docker compose時はyamlファイル内に記載します.

・invalid request block size: 21573 (max 4096)...skip
1の動作確認時,ポートマッピング後にアクセスできなかった時のログです.
WSGIの設定ファイルにてbuffer-sizeを大きめに設定しましたら直りました.
また,WSGIとFlaskだけで動かしていたのでWSGIの設定ファイルでsocket=:5000ではなく,http=:5000にしました.nginxとwsgiの間は今回httpで通信しているので.
Djangoで同じような状況に陥った方の情報を参考にしております
https://cream-worker.blog.jp/archives/1078251491.html

・app.run(host="0.0.0.0")は辞めておく
前にFast APIをEC2インスタンスで実装したときは,この引数で機能させてました.一時的とはいえなかなか脆弱な実験をしてました.
今回はnginx側のipを指定してます.

・nginx.confの設定値
ネットに落ちてるテンプレートを引用しすぎて,一部よくわからない設定値があります.特にinclude系は中身を見ておらず.

ただ,
・学習中の時間にnginxとwsgi間のタイムアウトしてしまうのを阻止するためにproxy_read_timeoutを入れたこと
・ネットで見かけるflaskとnginxを使った設定値だと,uwsgi_passになっていて,見よう見まねでは動かず30分くらい時間を取られていたのですが,今回はhttpを使っているのでproxy_passでコンテナのIPとポートを指定する必要があったこと
を忘れないでおきたいです…

   location / {
        proxy_read_timeout 86400;
        include uwsgi_params;
        proxy_pass  http://xxx.xxx.xxx.xxx:5000;

    }

今後やりたいこととか

・学習待ち時間の改善
現状のWebアプリの仕様ではcsvで時系列データをアップロードさせ,確か100回学習させて予測値を返させているのですが,学習中のレスポンス待ちがタイムアウトの仕様に引っかかっていたり(上述の通り直したが),待っている間はクライアント側が暇になると思いました.
学習データを受け付けて,サーバ側でDBに保管,学習完了後にURLをメールで通知みたいな仕様が無難な気がしてきました.

・http通信の暗号化
本番だったら暗号化すると思われるので,試してみたいです.

・Dockerの軽量化
composeで時間がかかっておりました.特に自分のWindowsPCは5年前のモデルなので,M1 Macの方がスピーディーでした.
Dockerをもっと勉強して,軽量化させたいです.

・アプリ内(Pythonコード)
ちゃんと分岐させたり例外処理させていないので,そこ直したいです.特にcsvファイル受付後の処理周りガバガバです.
選択できるパラメータも少し増やしたいです.
学習回数とかはクライアント側が決めても良い気がします.
さすがに学習率,最適化手法なんかは中身興味ない人にとっては不要かな…と

まだまだ完ぺきではないがプロトタイプはこちら

実際にクラウド上とかで運用するとなるとファイル名競合が起きることに気づいたから,当分はローカルでコンテナで動かすしかないですね.
今はもうちょいモノとして完成するように試行錯誤中です.
https://github.com/ryusei-nyaan/LSTM_Flask

話は逸れるが

研究室の先輩(当時から10年以上前に卒業した先輩)の修論だったかな?
それをなんとなく思い出しました.
というのも,たしかフラクタルの研究をしていた気がして,解析手法をWindowsのデスクトップアプリとして実装していたような…
Unity触っていた自分よりもあの先輩の方がC#書けてましたね.当たり前ですけど.
あれをサービスとして公開してみたら面白いのではないかと思いつつ,実際に使ったわけでもなく,そのソフトが僕が研究室在籍時,そして現在どこにあるのか…
それはさておき,研究周りで触っていた解析をアプリケーションに落としてみるのも,アプリのアイディアを0から考えるより楽で,技術の勉強にもなるし,学生時代の研究の社会実装()みたいな感じで手触り感あって良いなと思いました.

GitHubで編集を提案

Discussion