Hugging Face SpacesでModuleNotFoundErrorが出る時の対処法

Python
元教師
元教師

こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!

今回の記事では、Hugging Face Spacesでアプリを動かしたいときに、なぜかModuleNotFoundErrorが出てしまう場合の対処法を紹介いたします!

分かってしまえば解決は非常に簡単なので、解決法を噛み砕いてご説明いたします!

時間がない人のための3行要約
  • NotFoundModuleErrorの原因はHugging Face Spaces上の実行環境に必要なモジュールが存在しないから
  • 解決方法としてはapp.pyと同じ階層にrequirements.txtを用意し、requirements.txtの中にapp.pyで使用するライブラリ名を書き連ねていくだけ
  • Hugging Face Spacesの実行環境構築時にrequirements.txtに記載してあるライブラリを自動でインストールしてくれる

エラーの内容

私が直面したシチュエーションは以下の通りです。

  • Hugging Face Spacesで新しいSpaceを作成し、手順に従ってgitの構築を行う
  • Spaceにアップロードするプログラムapp.pyを作成し、gitを使ってpushする
  • ModuleNotFoundエラー発生!

エラーの内容を読み解いてみると、「fastaiモジュールが見つからないよ」と言われていることが分かります。

「ローカル環境のときには問題なかったのになんでだろう。。。」と疑問に駆られました。

ちなみに、私がこのときにpushしたプログラムはPractical Deep Learning for CodersのLesson2で学んでいた「犬か猫か識別プログラム」です。

# AUTOGENERATED! DO NOT EDIT! File to edit: app.ipynb.

# %% auto 0
__all__ = ['learn', 'categories', 'examples', 'intf', 'is_cat', 'classify_image']

# %% app.ipynb 1
import gradio as gr
from fastai.vision.all import * 

def is_cat(x): return x[0].isupper()

# %% app.ipynb 3
learn = load_learner('model.pkl')

# %% app.ipynb 5
categories = ('Dog', 'Cat')

def classify_image(img):
    pred, idx, probs = learn.predict(img)
    return dict(zip(categories, map(float, probs)))

# %% app.ipynb 7
examples = ['dog.jpg', 'cat.jpg', 'dunno.jpg']

intf = gr.Interface(fn = classify_image, inputs = 'image', outputs = 'label', examples= examples)
intf.launch(inline=False)

ModuleNotFoundErrorの解決方法

解決方法としては、app.pyと同じ階層のディレクトリにrequirements.txtを配置し、その中に必要なライブラリ名をつらつらと記載すればOKです。

例えば、以下のrequirements.txtファイルでは、app.pyで使用しているライブラリのfastaiとgradioを記載しています。

※厳密に言えば、Hugging Face SpacesのSpace作成時、実行環境に「Gradio」を指定しているので、gradioライブラリのインストールは必要ありません。

fastai
gradio

app.pyと同じ階層の上記を記載したrequirements.txtがある状態でgit pushをすれば、ModuleNotFoundErrorは解消されます。

ModuleNotFoundErrorの原因は?

ModuleNotFoundErrorの原因は何だったのでしょうか。

原因は非常に単純で、Hugging Face上の実行環境に必要なライブラリ(Module)がなかったことです。

それでは、なぜrequirements.txtに必要なライブラリを記載することによって、ModuleNotFoundErrorが解消したのでしょうか。

それは、Hugging Face Spaceは実行環境を構築(Build)するときに、requirements.txtに記載されているライブラリをインストールする仕様になっているからです。

実際に環境構築時のログを見てみると、以下の部分でrequirements.txtに記載されているライブラリをインストールしていることが分かります。

--> RUN --mount=target=requirements.txt,source=requirements.txt 	pip install --no-cache-dir -r requirements.txt
CACHED

まとめ

今回の記事では、Hugging Face SpacesでNotFoundModuleErrorが発生する場合の対処方法について解説をいたしました!

Hugging Face Spacesはデータサイエンティストが自身の作成したモデルをポートフォリオ的に披露する場所としては、軽量・無料と魅力が非常に大きいので、ぜひ皆さんも使いこなしてみてください!

コメント

タイトルとURLをコピーしました