🤗

GradioをDockerで動かす

2023/11/20に公開

はじめに

Gradio っていう機械学習モデルとかをインタラクティブなアプリにするためのフレームワークを触り中です。ブラックボックスの塊みたいなフレームワークで、機械学習の成果をいい感じに共有するのに良さそうです。

https://www.gradio.app/

適当なところでデプロイしてみたくて、Docker で動かしてみたところ、少しつまずきました。今回、ChatGPT にも手伝ってもらって解決したので、そのプロセスも含めて共有です。

Hello, World!

https://www.gradio.app/guides/quickstart
Getting Started にしたがって、試してみました。

これを入れて

pip install gradio

このファイルを作って

main.py
import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

if __name__ == "__main__":
    demo.launch(show_api=False)

実行。

gradio main.py

こっちでも動く。

python main.py

ただ、最初、Python 3.12 で動かしてたら、No module named 'distutils'って怒られて動かなかった。調べるとどうもこれはpip installしたらいいって感じではなさそう。

以下のサイトを見ると、3.11 までになってそうだったので、3.11 でやることにした。
https://pypi.org/project/gradio/

Docker 環境 (動かない)

動いたので、Docker でやってみることにした。
ここらをみながら設定。

https://blog.ovhcloud.com/deploy-a-custom-docker-image-for-data-science-project-gradio-sketch-recognition-app-part-1/
https://qiita.com/hideki/items/61e25b07901f1cdec679
https://www.inoue-kobo.com/aws/gradio-on-apprunner/
https://modelz.ai/blog/gradio-docker

Dockerfile はこんな感じ。

FROM python:3.11

WORKDIR /workspace
ADD requirements.txt main.py /workspace/
RUN pip install --no-cache-dir --upgrade -r /workspace/requirements.txt

CMD ["python", "/workspace/main.py"]

docker composeはこんな感じ。

docker-compose.yml
version: "3.0"

services:
  gradio:
    container_name: "gradio"
    build: .
    ports:
      - 7860:7860

こんな感じで、pip installするものを固めておく。

pip freeze > requirements.txt

これで実行しても、なぜかブラウザからアクセスできず・・・。

docker compose up

ちなみに、docker compose 使わないときはこんな感じ。

docker build -t optimisuke/hello-gradio:latest .
docker run -p 7860:7860 optimisuke/hello-gradio

コンテナの中に入ったらちゃんと動いてる。ポートも間違えてなさそう。わからん・・・。

ChatGPT に聞いてみる

聞いてみたら、ここらを言われた。確かに、と思って確認。

  • ポートフォワーディングの確認
  • コンテナ内のサーバーの設定
  • ファイアウォールの設定
  • ネットワーク設定の確認
  • コンテナのログ確認
  • IP アドレスとポートの確認

また、サーバーの設定として、こんなことも言われた。怪しい。

  • 外部からの接続を許可するには、サーバーを 0.0.0.0 でリッスンさせる必要があります。

調べてみると、ますます怪しい。
https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46

Docker 環境 (動く)

ということで、launch()server_name0.0.0.0にしてみた。
docker image を build しなおして使ってみたら無事動いた!
ChatGPT サマサマ。めでたしめでたし。

main.py
import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

if __name__ == "__main__":
    demo.launch(show_api=False, server_name="0.0.0.0")

おわりに

Docker あるあるな雰囲気のところでつまづいて解決して、コンテナのネットワークのこと、よく分かってなかったけど、また少し賢くなりました。サンクス ChatGPT。

GitHubで編集を提案

Discussion