組み込みAI セルフサービス型デジタル共創体験(DSCE)とは
組み込みAI セルフサービス型デジタル共創体験に記載しておりますが、現在STT(speech-to-text)、TTS(test-to-speech)、NLU(natural-language-understanding)等のAIがサーバーに接続しなくても組み込んで利用することが可能となりました。
その情報がこちらのサイト、DSCE(Digital Self-Serve Co-Create Experience;"組み込みAI セルフサービス型デジタル共創体験"?)にて紹介されております。
今回はそのDSCEの中から、「Watson NLP Hands-On Lab」 を実施してみます。
ただし、NLPはNLUと違いSaaS版のAIエンジンに接続します。
※個人的な利用は無償ですが、商用利用は有償となります。
今回 「Watson NLP Hands-On Lab: Deploy Model」で感情分析をやってみた。
今回の「Watson NLP Hands-On Lab: Deploy Model」はOpenShift上に Watson NLP を構築するものです。前半に学習済モデルでの感情分析を行い、後半でカスタムモデルでの感情分析を行ないます。
1.前提
- IBM Entitled Registry にアクセスしてするための entitlement key を container soft libraryから入手していること
- IBM Technology Zone (TechZone)にアクセスできること
- このリンク先にあるTechZoneで環境を予約すること : https://techzone.ibm.com/collection/watson-nlp-library-hands-on-lab/journey-deploy-model:
上のURLにアクセスすると下の左のサイトにアクセスできます。そこで、「Environment: Deploy Model」枠下にある「Reserve」をクリックし、開く画面(下の右)で「Reserve now」「Schedule for later」どちらかを選択。
* 上記のTechZoneで環境を予約したする時には以下のように記入すること
* Purpose: Practice/Self-Education
* Purpose description: Hands-on lab
* Preferred geography: AMERICAS - us-south region - any datacenter
2. deploy a pretrained nlp model
2.1. メールからtechzoneにアクセスする
予約するをするとまずプロビジョニング開始を📢メールが飛んできます。数分後に準備完了との連絡が届きます。そのメール内に「Project URL」というリンクがあります。こちらに OpenShift Web Console の URL が連携してされていますのでこれにアクセスします。
* この環境は3日間有効です。3日経過すると自動的に削除されます。
2.2. Open a Terminal in the Image-Builder Pod
下の図参照
①左上に「Administrator」が選択されていることを確認
②ワークロード - Pod を選択
③可動しているPodが表示されますのでリンクをクリック (OpenShiftのビルド構成を使用してコンテナイメージを作成するための機能を持つ基礎的なPodです。)
④展開される画面の上、右にある"ターミナル"をクリック
2.3: Log in to OpenShift from the Terminal
① 画面右上にある「IAM#<ログインユーザ名>」をクリック。
② 「ログインコマンドのコピー」→「Display Token」→「Log in with this token」をコピー
③ 前のステップ(2.2)にて開いたターミナルに貼り付け&実行
oc login --token=xxxx --server=xxxx
④ 後続のステップにて有効な環境変数を設定
export REGISTRY=$(oc registry info)
export PROJECT=$(oc config view --minify -o 'jsonpath={..namespace}')
2.3' @ローカルホスト
① ご自身のローカル環境でターミナルを開く
② ターミナルにログインコマンドを貼り付け&実行
③ @ローカルホスト ターミナルで後続のステップにて有効な環境変数を設定
2.4. Add Your Entitlement Key @ OpenShift Terminal
① 次のURLにアクセス https://myibm.ibm.com/products-services/containerlibrary
② ライセンスキーをコピー
③ 環境変数として設定
export IBM_ENTITLEMENT_KEY=xxx
④ IBM Entitled Container Registry にアクセスし、Watson NLP イメージを取得するため、プロジェクトに"watson-nlp"という名のシークレットを作成
oc create secret docker-registry watson-nlp --docker-server=cp.icr.io/cp --docker-username=cp --docker-password=$IBM_ENTITLEMENT_KEY
oc patch serviceaccount default -p '{"imagePullSecrets": [{"name": "watson-nlp"}]}'
2.4' @ローカルホスト
① ライセンスキーを環境変数として設定
② IBM Entitled Container Registry にアクセスし、Watson NLP イメージを取得するため、プロジェクトに"watson-nlp"という名のシークレットを作成
2.5. Create the Watson NLP Service @ OpenShift Terminal
2.2.④で開いたOpenShift上のターミナルで以下を実行
cd /workshop
wget https://raw.githubusercontent.com/ibm-build-lab/Watson-NLP/workshop/MLOps/Init-Container/deployment/deployment.yaml
oc apply -f deployment.yaml
2.5' @ローカルホスト
デプロイメントYamlを入手して、デプロイメント作成
2.6. 確認 @ OpenShift Terminal
サービス確認
oc get svc
デプロイメント確認
oc get deployment
ポッド確認
oc get pods
2.6' @ローカルホスト
2.7. Test the Pretrained Model @ OpenShift Terminal
「procrasting is fun until im an hour away from the time its due and i still havent finished so i have a panic attack」という文章を使って、事前学習モデルのNLPを実行
curl -X POST "http://watson-nlp-runtime-service:8080/v1/watson.runtime.nlp.v1/NlpService/EmotionPredict" -H "accept: application/json" -H "grpc-metadata-mm-model-id: emotion_aggregated-workflow_lang_en_stock" -H "content-type: application/json" -d "{ \"rawDocument\": { \"text\": \"procrasting is fun until im an hour away from the time its due and i still havent finished so i have a panic attack\" }}" | jq
2.7' @ローカルホスト
ローカルホストで実施する場合、OpenShiftのサービスがまだ外部に公開されていないので、以下のコマンドを使ってサービスを外に公開
oc port-forward svc/watson-nlp-runtime-service 8080:8080
上記コマンドにより、Openshiftのサービスがローカルホストにポートフォワードされるので、事前学習モデルのNLPを実行する際にはホスト名を「watson-nlp-runtime-service」から「localhost」に変更
Deploy a Custom Model
ここから Watson model builder tool を使ってコンテナイメージにカスタムモデルを入れていきます。ここではIBM内部で使われているものと同じツールを使います。カスタムイメージを作って、OpenShift内部のコンテナレジストリに登録していきます。
簡便のため、ここではWatson Studio で作成したNLPカスタムモデルを用いてプロビジョニングされたPodを使います。モデル名は「model_tfidf_emo_classification」です。
※ここから後、/workshop/models ディレクトリをGithubから得ることができなかったので、ローカルホストでの実行は確認できておりません。
2.8 Install the model packager tool @ OpenShift Terminal
まずWatson NLP model packager toolをインストールします。このツールはPythonで作成されており、1つ以上のモデルをパッケージングします。
pip3 install watson-embed-model-packager
2.9 Build the Model Container Image
パッケージングツールをインストールするため以下のコマンドを実行します。
cd
python3 -m watson_embed_model_packager setup \
--library-version watson_nlp:3.6.0 \
--local-model-dir /workshop/models \
--output-csv model-manifest.csv
次で、ビルド。
python3 -m watson_embed_model_packager build --config model-manifest.csv
イメージ確認
docker images
2.10 Push Model Image to Container Registry
できたモデルイメージをOpenShift の内部レジストリに登録していきます。
echo $(oc whoami -t) | docker login $REGISTRY -u $(oc whoami) --password-stdin --tls-verify=false
cd /workshop
for m in $(ls models)
do
docker tag watson-nlp_${m}:latest ${REGISTRY}/${PROJECT}/watson-nlp_${m}:latest
docker push ${REGISTRY}/${PROJECT}/watson-nlp_${m}:latest --tls-verify=false
done
確認
oc get is
2.11 Update Kubernetes Manifest
初めに作成された Kubernetes Deployment を次のコマンドで更新します。
echo "spec:
template:
spec:
initContainers:
- name: complaint-topic-model-discover
image: image-registry.openshift-image-registry.svc:5000/$PROJECT/watson-nlp_model_tfidf_emo_classification
volumeMounts:
- name: model-directory
mountPath: \"/app/models\"
env:
- name: ACCEPT_LICENSE
value: 'true'
resources:
requests:
memory: \"100Mi\"
cpu: \"100m\"
limits:
memory: \"200Mi\"
cpu: \"200m\"" > /tmp/patchFile.yaml
oc patch deployment watson-nlp-runtime --patch-file /tmp/patchFile.yaml
上記コマンドで、事前学習モデルとカスタムモデルのPodが起き変わりました。
確認します。
2.12 Test the Custom Model
ここでもやはり「procrasting is fun until im an hour away from the time its due and i still havent finished so i have a panic attack」という文章を使って、カスタムモデルのNLPを実行
curl -X POST "http://watson-nlp-runtime-service:8080/v1/watson.runtime.nlp.v1/NlpService/ClassificationPredict" -H "accept: application/json" -H "grpc-metadata-mm-model-id: model_tfidf_emo_classification" -H "content-type: application/json" -d "{ \"rawDocument\": { \"text\": \"procrasting is fun until im an hour away from the time its due and i still havent finished so i have a panic attack\" }}" | jq
結果
事前学習モデルの結果とカスタムモデルの結果を見比べると各感情の確率が違いますね。
最後
Swagger GUI を使って Watson NLP API を見てみます。
2.7’ @ローカルホストの所でも記載したのですが、OpenShiftのサービスを外部に公開するため、以下のコマンドを使います。
oc port-forward svc/watson-nlp-runtime-service 8080:8080
その後、ローカルホストのブラウザを使って以下のURLにアクセス
http://localhost:8080/swagger/