ハグフェイスのDockerスペースで機械学習アプリを簡単に構築

Hugging Face Hub は、コラボレーティブなオープンソース機械学習 (ML) を可能にするプラットフォームです。 ハブは、ユーザーが機械学習を使用してテクノロジを探索、実験、共同作業、構築できる中心的な場所として機能します。 ハブでは、140,000 を超えるモデル、50,000 の ML アプリ (Spaces と呼ばれる)、コミュニティによって共有されている 20,000 のデータセットを見つけることができます。

Spaces を使用すると、ML を利用したアプリケーションやデモを数分で簡単に作成してデプロイできます。 最近、Hugging Face チームは Docker Spaces のサポートを追加し、ユーザーが Dockerfile を作成するだけで任意のカスタム アプリを作成できるようにしました。

Spaces のもう 1 つの優れた点は、アプリを実行すると、世界中の誰とでも簡単に共有できることです。 🌍

このガイドでは、Docker Space の作成、構成、およびコードのデプロイの基本について説明します。 入力テキストを指定してテキストを生成できる google/flan-t5-small モデルのデモに使用される、テキスト生成用の基本的な FastAPI アプリを構築する方法を示します。 このようなモデルは、あらゆる種類のアプリでテキスト補完を強化するために使用されます。 (アプリの完成版はハ グフェイスで確認できます。

バナーハグフェイスドッカー

前提 条件

この記事で紹介する手順を実行するには、Hugging Face Hubにサインインする必要があります—まだアカウントをお持ちでない場合は無料で サインアップ できます。

新しいドッカースペース🐳を作成する

開始するには、図 1 に示すように 新しいスペースを作成します

右上に「新しいスペースを作成」ボタンを示す、顔のスペースを抱きしめるスクリーンショット。
図1: 新しいスペースを作成します。

次に、プロジェクトに適した名前を選択し、ライセンスを選択して、ソフトウェア開発キット (SDK) として Docker を使用できます (図 2 参照)。 

Spaces には、Argilla や Livebook などのビルド済みの Docker テンプレートが用意されており、オープンソースツールを使用して ML プロジェクトをすばやく開始できます。 「空白」オプションを選択した場合は、Dockerfileを手動で作成することを意味します。 しかし、心配しないでください。後でコピーして貼り付けるための Dockerfile を提供します。 😅

名前、ライセンスを追加し、SDK を選択できるスペース インターフェイスのスクリーンショット。
図2: 新しいスペースの詳細を追加します。

フォームへの入力を完了して[スペースの作成]ボタンをクリックすると、 スペース アカウントに新しいリポジトリが作成されます。 このリポジトリは、作成した新しいスペースに関連付けられます。

手記: Hugging Face Hub 🤗 を初めて使用する場合は、「リポジトリ の使用を開始する 」で、ハブ上のリポジトリに関する優れた入門書を確認してください。

アプリの作成

さて、空のスペースリポジトリができたので、コードを書く時が来ました。 😎

サンプル アプリは、次の 3 つのファイルで構成されます。

  • requirements.txt — Python プロジェクトまたはアプリケーションの依存関係を一覧表示します。
  • app.py — FastAPI アプリを記述する Python スクリプト
  • Dockerfile — 環境をセットアップし、インストールします。 requirements.txtその後、起動します app.py

先に進むには、 Webインターフェイスを介して以下に示す各ファイルを作成します。 これを行うには、スペースの[ ファイルとバージョン ]タブに移動し、[ ファイルの追加 ]→ [新しいファイルの作成 ]を選択します(図3)。 必要に応じて、Git を利用することもできます。

[ファイルの追加]ドロップダウンメニューの下にある[新しいファイルの作成]の選択を示すスクリーンショット。
図3: 新しいファイルの作成。

ここで行ったように、各ファイルに正確に名前を付けてください。 次に、ここから各ファイルの内容をコピーして、エディターの対応するファイルに貼り付けます。 必要なファイルをすべて作成して入力したら、[ 新しいファイルをメインにコミット] ボタンをクリックして、新しいファイルをリポジトリにコミットします。

Python の依存関係を一覧表示する 

プロジェクトが正しく機能するために必要なすべてのPythonパッケージとその特定のバージョンを一覧表示します。 通常、ファイルの内容にはパッケージの名前とバージョン番号が含まれており、正確なバージョン番号、バージョン範囲、互換性のあるバージョンなど、 requirements.txt さまざまな形式で指定できます。 このファイルには、API sentencepieceの , , および、テキスト生成モデルの , , requests torch および transformersuvicornが一覧表示 FastAPI されます。

fastapi==0.74.*
requests==2.27.*
uvicorn[standard]==0.17.*
sentencepiece==0.1.*
torch==1.11.*
transformers==4.*

FastAPI ウェブアプリケーションの定義

次のコードは、トランスフォーマー ライブラリを使用してユーザー入力に基づいてテキストを生成する FastAPI Web アプリケーションを定義します。 アプリ自体は、単純な単一エンドポイント API です。 エンドポイントは /generate テキストを受け取り、トランスフォーマー パイプライン を使用して完了を生成し、それを応答として返します。

人々に何かを見てもらうために、FastAPIの インタラクティブなSwaggerドキュメントを デフォルトの /docs エンドポイントからアプリのルートに再ルーティングします。 これにより、誰かがスペースにアクセスしたときに、コードを書かなくてもスペースで遊ぶことができます。

from fastapi import FastAPI
from transformers import pipeline

# Create a new FastAPI app instance
app = FastAPI()

# Initialize the text generation pipeline
# This function will be able to generate text
# given an input.
pipe = pipeline("text2text-generation", 
model="google/flan-t5-small")

# Define a function to handle the GET request at `/generate`
# The generate() function is defined as a FastAPI route that takes a 
# string parameter called text. The function generates text based on the # input using the pipeline() object, and returns a JSON response 
# containing the generated text under the key "output"
@app.get("/generate")
def generate(text: str):
    """
    Using the text2text-generation pipeline from `transformers`, generate text
    from the given input text. The model used is `google/flan-t5-small`, which
    can be found [here](<https://huggingface.co/google/flan-t5-small>).
    """
    # Use the pipeline to generate text from the given input text
    output = pipe(text)
    
    # Return the generated text in a JSON response
    return {"output": output[0]["generated_text"]}

ドッカーファイルの書き込み

このセクションでは、Python 3.9 環境をセットアップし、 にリストされているパッケージ requirements.txtをインストールする Dockerfile を記述します。 ポート7860でFastAPIアプリを起動します。

このプロセスを段階的に見ていきましょう。

FROM python:3.9

前の行は、公式の Python 3.9 Docker イメージをコンテナーの基本イメージとして使用することを指定しています。 このイメージは Docker Hub によって提供され、Python 3.9 を実行するために必要なすべてのファイルが含まれています。

WORKDIR /code

この行は、コンテナ内の作業ディレクトリを /codeに設定します。 これは、後でアプリケーション コードと依存関係をコピーする場所です。

COPY ./requirements.txt /code/requirements.txt

前の行は、 requirements.txt ファイルをローカルディレクトリからコンテナ内のディレクトリにコピーします /code 。 このファイルには、アプリケーションが依存する Python パッケージが一覧表示されます

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

この行は、 にリストされている requirements.txt パッケージをインストールするために使用します pip。フラグは pip にキャッシュされたパッケージを使用しないように指示し、フラグは新しいバージョンが利用可能な場合は既にインストールされているパッケージをアップグレードするように指示 pip し、 --upgrade フラグは --no-cache-dir -r 使用する要件ファイルを指定します。

RUN useradd -m -u 1000 user
USER user
ENV HOME=/home/user \\
	PATH=/home/user/.local/bin:$PATH

これらの行は、 user ユーザ ID が 1000 の新しい名前付きユーザを作成し、そのユーザに切り替えてから、ホームディレクトリ /home/userを に設定します。 このコマンドは ENVHOME 環境変数と環境変数 PATH を設定します。 PATH を含むように .local/bin 変更されます ディレクトリに置き、pip によってインストールされたバイナリをコマンド ラインで使用できるようにします。 ユーザー権限の詳細については、ドキュメントを参照してください

WORKDIR $HOME/app

この行は、コンテナ $HOME/app内の作業ディレクトリを に設定します /home/user/app

COPY --chown=user . $HOME/app

前の行では、ローカル ディレクトリの内容をコンテナー内のディレクトリ /home/user/app にコピーし、ファイルの所有者を前に作成したユーザーに設定します。

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]

この行は、コンテナーの起動時に実行するコマンドを指定します。 ポート7860を使用して uvicorn FastAPIアプリを起動し、リッスンします。 このフラグは --host 、アプリが使用可能なすべてのネットワーク インターフェイスでリッスンする必要があることを指定し、app:app 引数は、コード内の app モジュールでアプリ オブジェクトを検索するように指示 uvicorn します。

完全な Dockerfile を次に示します。

# Use the official Python 3.9 image
FROM python:3.9

# Set the working directory to /code
WORKDIR /code

# Copy the current directory contents into the container at /code
COPY ./requirements.txt /code/requirements.txt

# Install requirements.txt 
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# Set up a new user named "user" with user ID 1000
RUN useradd -m -u 1000 user
# Switch to the "user" user
USER user
# Set home to the user's home directory
ENV HOME=/home/user \\
	PATH=/home/user/.local/bin:$PATH

# Set the working directory to the user's home directory
WORKDIR $HOME/app

# Copy the current directory contents into the container at $HOME/app setting the owner to the user
COPY --chown=user . $HOME/app

# Start the FastAPI app on port 7860, the default port expected by Spaces
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]

このファイルをコミットすると、スペースが [ビルド] に切り替わり、コンテナーのビルド ログがポップアップ表示され、その状態を監視できます。 👀

ファイルを再確認したい場合は、 アプリSpaceですべてのファイルを見つけることができます。

手記: FastAPIでDockerを使用するためのより基本的な紹介については、FastAPIドキュメントの公式 ガイド を参照してください。

アプリ🚀の使用

すべてがうまくいけば、構築が完了するとスペースが [実行中 ]に切り替わり、FastAPIによって生成されたSwaggerドキュメントが[ アプリ ]タブに表示されます。 これらのドキュメントは対話型であるため、エンドポイントの詳細 /generate を展開して [試してみる] をクリックすると、エンドポイントを試すことができます。 (図4)。

fastapiのスクリーンショットは「試してみてください! 右側の「」オプション。
図4: アプリを試しています。

結論

この記事では、Docker Space の作成、google/flan-t5-small モデルを使用するテキスト生成用の基本的な FastAPI アプリの構築と構成の基本について説明しました。 このガイドを出発点として使用して、機械学習の力を活用するより複雑でエキサイティングなアプリケーションを構築できます。

Docker テンプレートの詳細とキュレーションされた例の確認に関心がある場合は、 Docker の例に関するページをご覧ください。 そこには、独自のプロジェクトの出発点として使用するさまざまなテンプレートと、Dockerテンプレートを最大限に活用するためのヒントとコツがあります。 ハッピーコーディング!

フィードバック

0 「ハグフェイスのDockerスペースで機械学習アプリを簡単に構築する」に関する考え