書店レビューのための感情分析サービス¶
書店オーナーとして、お客様が新しいネガティブなレビューコメントを送信するたびに、Slackチャンネルに即時通知を受け取ることを目指しています。Knative Functionを活用することで、レビューコメントを感情によって分類する単純な感情分析サービスを含むサーバーレス関数を設定できます。
どのようなKnative機能について学習しますか?¶
Knative Function を使用してサービスを簡単にデプロイし、Knative Servingによって管理させることで、サービスをゼロに自動スケーリングし、需要に合わせてスケールアップできるようになります。
最終成果物はどのようなものですか?¶
新しいレビューコメントをCloudEventとして受信し、入力テキストの感情分類をCloudEventとして返すPythonアプリケーションを含む、実行中のサーバーレスKnative Functionです。
関数の出力は、以下のもののみです。
-
肯定的
-
中立的
-
否定的
インストールの前提条件¶
前提条件1:Knative func CLIのインストール¶
Knative Functionを使用すると、func CLIを使用して、ステートレスでイベント駆動型の関数をKnative Servicesとして簡単に作成、ビルド、デプロイできます。
そのためには、func CLIをインストールする必要があります。公式ドキュメントに従ってfunc CLIをインストールできます。
検証
ターミナルで`func version`を実行してインストールを確認すると、インストールしたfunc CLIのバージョンが表示されます。
トラブルシューティング
`command not found`が表示された場合は、func CLIをPATHに追加する必要がある可能性があります。
実装¶
プロセスは簡単です。
-
`func create`コマンドを使用してコードテンプレートを生成することから始めます。
-
次に、このテンプレートに独自のコードを組み込みます。
-
最後に、`func deploy`を実行してアプリケーションをKubernetesクラスタにシームレスにデプロイします。
このワークフローにより、Knative Functionsエコシステム内での開発からデプロイへのスムーズな移行が保証されます。
ステップ1:Knative Functionテンプレートの作成¶
func CLIを使用して新しい関数を作成します。
func create -l <language> <function-name>
この場合、Python関数を作成しているので、コマンドは次のようになります。
func create -l python sentiment-analysis-app
このコマンドは、`sentiment-analysis-app`という名前の新しいディレクトリと、その中にいくつかのファイルを作成します。func CLIは、開始点となる基本的な関数テンプレートを生成します。
サポートされているすべての言語テンプレートはこちらにあります。
検証
ファイルツリーは次のようになります。
start/sentiment-analysis-app
├── func.yaml
├── .funcignore
├── .gitignore
├── requirements.txt
├── app.sh
├── test_func.py
├── README.md
├── Procfile
└── func.py
ステップ2:生成されたコードを感情分析ロジックに置き換える¶
`sentiment-analysis-app/func.py`は、関数のコードを含むファイルです。生成されたコードを感情分析ロジックに置き換えることができます。次のコードを起点として使用できます。
sentiment-analysis-app/func.py
from parliament import Context
from flask import Request, request, jsonify
import json
from textblob import TextBlob
from time import sleep
from cloudevents.http import CloudEvent, to_structured
# The function to convert the sentiment analysis result into a CloudEvent
def create_cloud_event(inputText, badWordResult, data):
attributes = {
"type": "moderated-comment",
"source": "sentiment-analysis",
"datacontenttype": "application/json",
"sentimentResult": data,
"badwordfilter": badWordResult,
}
# Put the sentiment analysis result into a dictionary
data = {
"reviewText": inputText,
"badWordResult": badWordResult,
"sentimentResult": data,
}
# Create a CloudEvent object
event = CloudEvent(attributes, data)
return event
def analyze_sentiment(text):
analysis = TextBlob(text["reviewText"])
sentiment = "neutral"
if analysis.sentiment.polarity > 0:
sentiment = "positive"
elif analysis.sentiment.polarity < 0:
sentiment = "negative"
badWordResult = ""
try:
badWordResult = text["badWordResult"]
except:
pass
# Convert the sentiment into a CloudEvent
sentiment = create_cloud_event(text["reviewText"], badWordResult, sentiment)
return sentiment
def main(context: Context):
"""
Function template
The context parameter contains the Flask request object and any
CloudEvent received with the request.
"""
print("Sentiment Analysis Received CloudEvent: ", context.cloud_event)
# Add your business logic here
return analyze_sentiment(context.cloud_event.data)
ステップ3:依存関係の設定¶
`sentiment-analysis-app/requirements.txt`ファイルには、関数の依存関係が含まれています。次の依存関係をファイルに追加します。
sentiment-analysis-app/requirements.txt
Flask==3.0.2
textblob==0.18.0.post0
parliament-functions==0.1.0
cloudevents==1.10.1
Knative Functionは、関数をビルドするときにここにリストされている依存関係を自動的にインストールします。
ステップ4:プリビルド環境の設定¶
`textblob`ライブラリを正しく使用するには、コーパスをダウンロードする必要があります。コーパスは、感情分析モデルのトレーニングに使用される大量のテキストデータのコレクションです。`setup.py`という新しいファイルを作成することでこれを行うことができます。Knative Functionは、依存関係がインストールされた後に`setup.py`ファイルが実行されるようにします。
書店用の`sentiment-analysis-app/setup.py`ファイルには、次のコードを含める必要があります。
sentiment-analysis-app/setup.py
from setuptools import setup, find_packages
from setuptools.command.install import install
import subprocess
class PostInstallCommand(install):
"""Post-installation for installation mode."""
def run(self):
# Call the superclass run method
install.run(self)
# Run the command to download the TextBlob corpora
subprocess.call(['python', '-m', 'textblob.download_corpora', 'lite'])
setup(
name="download_corpora",
version="1.0",
packages=find_packages(),
cmdclass={
'install': PostInstallCommand,
}
)
ステップ5:Knative Functionをローカルでビルドして実行する(オプション)¶
クリックして展開
Knative Functionには、pack buildとsource-to-image (s2i) buildの2つのビルド方法があります。
`setup.py`を実行する必要がある場合、現在サポートされているのはs2iビルドのみです。s2iでビルドする場合、`setup.py`ファイルは依存関係がインストールされた後に自動的に実行されます。
始める前に、コンテナレジストリにイメージをプッシュするようにコンテナレジストリを構成します。コンテナレジストリを構成するには、次のコマンドを使用できます。
export FUNC_REGISTRY=<your-container-registry>
この例では、-b=s2i
フラグと詳細出力を表示するための-v
フラグを追加して、s2iビルドを使用します。
func build -b=s2i -v
ビルドが完了すると、次の出力が表示されます。
🙌 Function built: <Your container registry username>/sentiment-analysis-app:latest
このコマンドは、関数をビルドし、イメージをコンテナレジストリにプッシュします。ビルドが完了したら、次のコマンドを使用して関数を実行できます。
トラブルシューティング
❗エラー:'/home/Kuack/Documents/knative/docs/code-samples'には初期化された関数を含んでいません。
解決策:正しいディレクトリにいるかどうかを確認してください。現在のディレクトリを確認するには、次のコマンドを使用できます。正しいディレクトリにいて、エラーがまだ発生する場合は、有効なKnative関数として扱われるためにcreated
フィールドと正しいタイムスタンプを含んでいる必要があるため、func.yaml
を確認してください。
func run -b=s2i -v
今後、func run
は自動的に関数をビルドするため、func build
の手順をスキップできます。
関数が正常に実行されている場合は、次の出力が表示されます。
❗function up-to-date. Force rebuild with --build
Running
on host port 8080
---> Running application from script (app.sh) ...
Knative関数は、CloudEventをシミュレートする簡単な方法を提供しています。次のコマンドを使用してCloudEventをシミュレートし、関数をテストできます。
func invoke -f=cloudevent --data='{"reviewText": "I love Knative so much"}' --content-type=application/json --type="new-review-comment" -v
ここで、-f
フラグはデータの種類(HTTP
またはcloudevent
)を示し、--data
フラグは入力テキストです。func invoke
の詳細については、こちらをご覧ください。
この場合、完全なCloudEventレスポンスを取得します。
Context Attributes,
specversion: 1.0
type: new-review-comment
source: book-review-broker
id: ebbcd761-3a78-4c44-92e3-de575d1f2d38
time: 2024-05-27T04:44:07.549303Z
datacontenttype: application/json
Extensions,
badwordfilter: good
Data,
{
"reviewText": "I love Knative so much",
"badWordResult": "",
"sentimentResult": "positive"
}
ステップ6:クラスタへの関数のデプロイ¶
注記
次のコマンドを実行する際は、/sentiment-analysis-app
を入力してください。
Knative Functionには、pack buildとsource-to-image (s2i) buildの2つのビルド方法があります。
現在、setup.py
を実行する必要がある場合、s2i
ビルドのみがサポートされています。s2iでビルドする場合、依存関係のインストール後にsetup.py
ファイルが自動的に実行されます。
コードを完成させたら、次のコマンドを使用して関数をクラスタにデプロイできます。
注記
-b=s2i
を使用して、関数のビルド方法を指定します。
func deploy -b=s2i -v
検証
デプロイが完了すると、次の出力が表示されます。
Function deployed in namespace "default" and exposed at URL:
http://sentiment-analysis-app.default.svc.cluster.local
ヒント
次のコマンドを実行して、Knative関数(Knativeサービス)のURLを確認できます。
kubectl get kservice
出力にURLが表示されます。
NAME URL LATESTCREATED LATESTREADY READY REASON
sentiment-analysis-app http://sentiment-analysis-app.default.svc.cluster.local sentiment-analysis-app-00001 sentiment-analysis-app-00001 True
Knative Serving:ゼロへのスケールダウン¶
次のコマンドを使用してクラスタ内のすべてのポッドをクエリすると、ポッドが実行されていることがわかります。
kubectl get pods
ここで、-A
はすべての名前空間内のすべてのポッドをクエリするフラグです。
そして、あなたのセンチメント分析アプリが実行されていることがわかります。
NAMESPACE NAME READY STATUS RESTARTS AGE
default sentiment-analysis-app-00002-deployment 2/2 Running 0 2m
しかし、しばらくの間関数にCloudEventを送信せずに、再度ポッドをクエリすると、あなたのセンチメント分析アプリが含まれているポッドが**消えて**いることがわかります!
これは、関数へのリクエストがない場合、Knative Servingのオートスケーラが**自動的にゼロにスケールダウン**するためです!詳しくはKnative Autoscalingをご覧ください。
検証¶
デプロイ後、func
CLIは関数にアクセスするためのURLを提供します。サンプルレビューコメントを使用してリクエストを送信することで、関数の動作を確認できます。
クラスタ上の関数にCloudEventを直接送信するには、Knative関数のコマンドfunc invoke
を使用します。
func invoke -f=cloudevent --data='{"reviewText":"I love Knative so much"}' -v
-f
フラグはデータの種類(HTTP
またはcloudevent
)を示します。--data
フラグは入力テキストです。-t
フラグはKnative関数のURIです。
検証
レスポンスが表示された場合は、関数が正常に実行されていることを意味します。
Context Attributes,
specversion: 1.0
type: moderated-comment
source: sentiment-analysis
id: 0c2d0659-a30e-4efd-bcce-803f15ff5cc5
time: 2024-06-11T15:12:43.795405Z
datacontenttype: application/json
Extensions,
badwordfilter:
sentimentresult: positive
Data,
{
"reviewText": "I love Knative so much",
"badWordResult": "",
"sentimentResult": "positive"
}
このチュートリアルでは、Knativeを使用してシンプルなセンチメント分析サービスのためのサーバーレス関数を作成する方法を学習しました。
次のステップ¶
次に、同じ手順に従って別のMLサービスをデプロイします。ぜひご自身で試してみてください!
ヒント
続行する前に、ルートディレクトリ/start
にcd
することを忘れないでください。
他のMLサービスを自分でデプロイすることに自信がある場合は、この簡略化されたガイドに従ってください。
問題が発生しても心配しないでください。詳細なチュートリアルを用意しています。