GradioをDockerで動かす
はじめに
Gradio っていう機械学習モデルとかをインタラクティブなアプリにするためのフレームワークを触り中です。ブラックボックスの塊みたいなフレームワークで、機械学習の成果をいい感じに共有するのに良さそうです。
適当なところでデプロイしてみたくて、Docker で動かしてみたところ、少しつまずきました。今回、ChatGPT にも手伝ってもらって解決したので、そのプロセスも含めて共有です。
Hello, World!
Getting Started にしたがって、試してみました。
これを入れて
pip install gradio
このファイルを作って
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 でやることにした。
Docker 環境 (動かない)
動いたので、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
はこんな感じ。
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 でリッスンさせる必要があります。
調べてみると、ますます怪しい。
Docker 環境 (動く)
ということで、launch()
のserver_name
を0.0.0.0
にしてみた。
docker image を build しなおして使ってみたら無事動いた!
ChatGPT サマサマ。めでたしめでたし。
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。
Discussion