Text to Image Slack Bot
DALL·E 2やImagenなどのText to Image のモデルが楽しそう。商用可のモデルも増えて来ていることだし、Slackでボットにメッセージ送ると、画像を返してくれるbotを作ると社内でも盛り上がるし、Text to Imageの知見が貯まりそうだよね。ってことで調べてみる。
リサーチ
有名所
いづれもWaiting List載せてるけど、まだ入れてない…。
Pre-Trained で 商用可能なモデルたち
最近は商用化なライセンス且つ、Pre-trainedなモデルを公開してくれているところもあるのでここらへんを試せるようにするのが本命。
- Hugging Face 上で試せるモデルがある
- Replicate 上で試せるモデルがある
商用可能だけど、モデル非公開
Slack Botを作る戦略メモ
Google Cloud Run上でDockerで動かす
Hugging Faceにモデルを公開してAPIを使う
Hugging FaceのAPI仕様
Replicateというのもあるっぽい
AWS LambdaでSlack Botを作る的なチュートリアル
DeployとかはGitHub Actionsで自動化したい。
PythonでインストールしたパッケージごとAWSに上げるチュートリアル
GitHub Action経由でLambdaにdeployできるのあるから今後のために試してみよう!て思ったら設定がめんどいぞ。
name: Deploy to Lambda
on:
push:
branches:
- main
workflow_dispatch:
jobs:
deploy_zip:
name: Deploy to Lambda
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Setup lambda_package.zip
run: bash make_package.sh
- name: default deploy
uses: appleboy/lambda-action@master
with:
aws_region: ${{ secrets.AWS_REGION }}
aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
function_name: ml_playground
description: Slack Bots that runs ML tasks via Hugging Face API
zip_file: lambda_package.zip
memory_size: 256
timeout: 900
handler: lambda_function.lambda_handler
runtime: python3.9
publish: false
environment: HUGGINGFACE_API_TOKEN=${{ secrets.HUGGINGFACE_API_TOKEN }}
最終的にこんな感じの設定になったが、連続で実行するとこんな感じの警告がでるので、デバッグ時には自分でzipをアップロードするほうが良いかもしれない。
ResourceConflictException: The operation cannot be performed at this time. An update is in progress for resource
なんかDescriptionに"aws:states:opt-out"入れると直るという、大変苦々しい感じのワークアラウンドを使うとエラーが消えたかも。
んーだめだ。このエラーは消えないな。失敗したり成功したり
ここを参考にslackボットの設定をしている。
どうやらボットは↓このイベントを返さねばならないらしい。
作業再開。
Slack Chatに画像付きでメッセージを返す方法。
お、うごいた!
が、なるほど、作ったSlack Botを他のワークスペースで使えるようにするにはoauthが必要なのね…。めんどいぞこりゃ。
とりあえず非公開で、2つのワークスペースでしか使わない予定なので。
それぞれのslack workspaceでボットを立てて、AWS Lambdaも2個立てちゃう方が簡単な気がする。
Slack BotからLambdaに何度も同じリクエスト飛んでくるのどうすればいいの…?AWS Lambdaだとステート持てないから、同じIDが来たら弾くみたいなことはできない。
あーSlack APIは 3秒以内に返さないとリトライするって仕様なのか。となると、そもそもAWS Lambdaでできないかな
これを参考にしながら非同期の実行を設定したけど、うまく行ってないな。わからぬ。
3秒以内に返さないとリトライされるって仕様は、
正しくは、Lambdaをイベント駆動にする方法を使いたかった…が、うまく動かない…。
ので強制的にタイムアウトさせるっていう糞仕様で対応した。なんとかしたい。
複数のモデルを試したかったので、Slackコマンドでモデルを試せるようにした。
ソースコードはこれ。自動Lambda deployのGitHub Actionsの成功率は2割くらい。awsコマンドをActionsで叩くほうが良いのかも。
あー寝不足だったのでちゃんと文章を読んでなかったけど。
ヘッダーにX-Slack-Retry-Num
入るらしいので弾けるな。
レスポンスにこれを入れることで、200レスポンスじゃくてもリトライを止めれるらしい。
X-Slack-No-Retry: 1
実際動作初めたので、一旦クローズ。いろんなモデルを試してます。