先日、「Watsonx.AI の LLM をチューニングする」というブログを公開しました。IBM Cloud から提供されている IBM の生成 AI である WatsonX.AI の標準 LLM を、独自に与えるテキストデータによってチューニングを施した新しい LLM を作る、という内容を、その実行例を交えて紹介したものでした。
紹介した方法で作られた新しい LLM を REST API で使う方法についても紹介ページに含まれているのですが、API プログラミングが求められるとなると、まだ少しハードル高いですよね。となると、チューニング済み LLM は WatsonX.AI のプロンプトラボという機能/UIを使って使うことになる・・・ というのではあまりにも寂しいです。
そんなわけで、本日のブログエントリでは「チューニング済み WatsonX.AI LLM を Node-RED で使う」手順を紹介します。Node-RED はフローエディタを使った、いわゆるノーコード/ローコード開発ツールの代表的な1つです。この Node-RED であればプログラミングにあまり自信がない人でもデータの流れを理解していれば WatsonX.AI プログラミングができるようになる、かも、という狙いです。
【Node-RED の用意】
まず何はともあれ Node-RED 環境が必要です。既に Node-RED を使える環境がある場合はその環境を使ってください。環境がない場合はなんらかの方法で Node-RED 環境を用意する必要があります。
比較的一般的な方法は「手元のローカル PC に Node-RED をインストール」する方法です。Windows, Mac, ラズベリーパイなどに対応していて、管理者権限があればインストールすることができます:
https://nodered.jp/docs/getting-started/local
または「IBM Cloud の Code Engine を使ってインストールする」方法もあります。こちらはリソースの使い方によっては有料となってしまいますが、比較的安価にコンテナアプリケーションを実行することができる環境です。この環境で DockerHub 内の nodered/node-red を動かす、という方法です。
Code Engine を使う場合はアプリケーションの登録時に以下の設定をしてください。まず Code の種類は "Use an existing container image" を選択し、イメージ名は "nodered/node-red" と入力します:
下にスクロールします。次にこの1アプリに使うリソース量を指定します。まず CPU とストレージは最小のものでいいと思います(多いほど値段が上がります)。注意が必要なのはその下の Autoscalling 設定です。この Max 値は 1 固定でいいのですが、問題は Min 値です。ここを 1 にするとアプリケーションは(最小インスタンス数=1、最大インスタンス数=1になるので)1つ起動しっぱなしになります。常に稼働しているため料金はそれなりにかかりますが、常に使える状態で待機していることになります。 一方、ここを 0 にすると(最小インスタンス数=0、最大インスタンス数=1になるので)アクセスがない時は消え、アクセスがあるとその場で1つ動き出します。アクセスのない時間帯の料金は(0インスタンスなので)かかりませんが、アクセスから実際にアプリケーションが動き出すまでのタイムラグがあり、また一度保存した状態があっても、アクセスがなく 0 インスタンスになってしまうと、次にアクセスした時には保存状態が残りません。いつでも使える状態がいいか、アクセスしない時間のコストをセーブするのがいいか、優先順位に合わせて選んでいただきたいのですが、以下の機能を試す間だけでも 1 に設定してインスタンスが落ちないようにしておくのがいいと思いました:
そしてドメインマッピングの設定は "Public" を選択し、最後に "Create" ボタンで作成します:
1~2分でアプリケーション(=Node-RED)が起動します。ステータスが "Ready" になったら "Test application" から "Application URL" を選択すると実際のアプリケーション(=Node-RED)にアクセスできます:
アクセスに成功するとこんな感じの画面になり、ここから Node-RED が使えます:
ここでは2つの方法を紹介しましたが、これ以外の方法(普通にパブリッククラウドにデプロイするとか・・)でももちろん構いません。何らかの方法で Node-RED が使えるようになっているという前提で以下の説明を続けます。
【watsonx.ai ノードのインストール】
Node-RED から Watsonx.AI を使えるようにするため、用意した Node-RED に拙作の watsonx.ai ノードを追加します:
追加手順は以下です。まず Node-RED の右上のメニューから "Manage Pallete(パレットの管理)" を選択します:
パレットの管理画面が表示されます。ここで "Install" タブに切り替え、検索ボックスに "watsonx" と入力します。すると(2024-09-28 時点では他の候補は見つからないのですが) "node-red-contrib-dotnsf-watsonx" という名前の公開ノードが見つかるはずです(2024-09-30 時点では最新バージョン 0.2.3 を公開しています)。この "Install" ボタンをクリックします:
「インストールしていいか?という確認画面が表示されたら "Install" を押してください:
インストールに成功すると、このような画面が表示されます:
ダイアログをクローズして元の画面に戻ると、ノード一覧の function カテゴリ内に "watsonx.ai" と書かれたノードが追加されているはずです。これで Node-RED から比較的簡単な方法で watsonx.ai の生成 AI が使えるようになりました:
【watsonx.ai 側のパラメータを確認】
準備の最後に、この後実際に Node-RED から Watsonx.AI を使う際にあたふたしないよう、watsonx.ai ノードに指定する各種パラメータの値をあらかじめまとめて調べておくことにします。
まず watsonx.ai ノードを左のパレット一覧から右のフロー部分にドラッグ&ドロップし、その後ダブルクリックしてください:
すると以下のようなダイアログが表示されます。これが watsonx.ai ノードに指定するパラメータです:
これらに指定するパラメータを確認しましょう。まずは watsonx.ai のプロンプトラボ画面を表示し、そこで指定するモデルをチューニングで作成したもの(下図では "kkimura-foreign-exchange-llm-v1")に設定します:
まず画面右の "View Code" というボタンをクリックすると、このプロンプトで実行する問い合わせを Curl で実行する時の指定内容が表示されます。この中に Location と Deployment ID の情報が含まれています:
例えば curl で指定する URL が以下のような値の場合、、
青字の ".ml.cloud.ibm.com" の前にある文字列 "jp-tok" が Location の値です。また "deployments/" と "/text" の間にある赤字の部分にある文字列が Deployment ID です。
なお API Key は IBM Cloud ダッシュボードで作る API Key の値です。またチューニング LLM を使う場合、Project ID と Model ID はともに指定不要です(指定されたままでも構いませんが、Deployment ID が指定されている場合は無視されます)。
これらの値を先ほどのダイアログ内に指定し、最後に "Done" ボタンをクリックします:
これでパラメータの準備も完了しました。
【Node-RED から watsonx.ai のチューニング済み LLM にアクセスする】
Node-RED のフローを完成させましょう。watsonx.ai ノードの左側に inject ノードを、右側に debug ノードを配置し、これらを繋げます:
inject ノードをダブルクリックしてダイアログを開き、"msg.payload" の種類を文字列に(図で az と書かれている指定)、文字列の内容を "与えられた質問に対する答を計算して簡潔に答えてください。\\\\n\\\\n1 ドルは 144.3 円です。 10 ドルは何円ですか?" と入力して、Done をクリックします(msg.topic は使いません。×をクリックして削除しても構いません):
ここまで準備できたら、Node-RED 画面右上の "Deploy" ボタンをクリックして、このフローをデプロイします:
そして inject ノード左のボタンをクリックすると指定した文字列が watsonx.ai ノードに渡され、Deployment ID で指定されたチューニング済み LLM で処理され、その結果が debug ノードに渡されます。debug ノードに渡った結果は画面右の debug ペイン(虫のマーク)で確認することができます:
まだチューニングが充分ではないので、期待していたような出力結果ではありませんが、Watsonx.AI のチューニング済み LLM を Node-RED からも使うことができる、ということが確認できました。
というわけで改めて、WatsonX.AI 用 Node-RED カスタムノードがチューニング済み LLM にも対応できましたので、よかったら使ってください:
紹介した方法で作られた新しい LLM を REST API で使う方法についても紹介ページに含まれているのですが、API プログラミングが求められるとなると、まだ少しハードル高いですよね。となると、チューニング済み LLM は WatsonX.AI のプロンプトラボという機能/UIを使って使うことになる・・・ というのではあまりにも寂しいです。
そんなわけで、本日のブログエントリでは「チューニング済み WatsonX.AI LLM を Node-RED で使う」手順を紹介します。Node-RED はフローエディタを使った、いわゆるノーコード/ローコード開発ツールの代表的な1つです。この Node-RED であればプログラミングにあまり自信がない人でもデータの流れを理解していれば WatsonX.AI プログラミングができるようになる、かも、という狙いです。
【Node-RED の用意】
まず何はともあれ Node-RED 環境が必要です。既に Node-RED を使える環境がある場合はその環境を使ってください。環境がない場合はなんらかの方法で Node-RED 環境を用意する必要があります。
比較的一般的な方法は「手元のローカル PC に Node-RED をインストール」する方法です。Windows, Mac, ラズベリーパイなどに対応していて、管理者権限があればインストールすることができます:
https://nodered.jp/docs/getting-started/local
または「IBM Cloud の Code Engine を使ってインストールする」方法もあります。こちらはリソースの使い方によっては有料となってしまいますが、比較的安価にコンテナアプリケーションを実行することができる環境です。この環境で DockerHub 内の nodered/node-red を動かす、という方法です。
Code Engine を使う場合はアプリケーションの登録時に以下の設定をしてください。まず Code の種類は "Use an existing container image" を選択し、イメージ名は "nodered/node-red" と入力します:
下にスクロールします。次にこの1アプリに使うリソース量を指定します。まず CPU とストレージは最小のものでいいと思います(多いほど値段が上がります)。注意が必要なのはその下の Autoscalling 設定です。この Max 値は 1 固定でいいのですが、問題は Min 値です。ここを 1 にするとアプリケーションは(最小インスタンス数=1、最大インスタンス数=1になるので)1つ起動しっぱなしになります。常に稼働しているため料金はそれなりにかかりますが、常に使える状態で待機していることになります。 一方、ここを 0 にすると(最小インスタンス数=0、最大インスタンス数=1になるので)アクセスがない時は消え、アクセスがあるとその場で1つ動き出します。アクセスのない時間帯の料金は(0インスタンスなので)かかりませんが、アクセスから実際にアプリケーションが動き出すまでのタイムラグがあり、また一度保存した状態があっても、アクセスがなく 0 インスタンスになってしまうと、次にアクセスした時には保存状態が残りません。いつでも使える状態がいいか、アクセスしない時間のコストをセーブするのがいいか、優先順位に合わせて選んでいただきたいのですが、以下の機能を試す間だけでも 1 に設定してインスタンスが落ちないようにしておくのがいいと思いました:
そしてドメインマッピングの設定は "Public" を選択し、最後に "Create" ボタンで作成します:
1~2分でアプリケーション(=Node-RED)が起動します。ステータスが "Ready" になったら "Test application" から "Application URL" を選択すると実際のアプリケーション(=Node-RED)にアクセスできます:
アクセスに成功するとこんな感じの画面になり、ここから Node-RED が使えます:
ここでは2つの方法を紹介しましたが、これ以外の方法(普通にパブリッククラウドにデプロイするとか・・)でももちろん構いません。何らかの方法で Node-RED が使えるようになっているという前提で以下の説明を続けます。
【watsonx.ai ノードのインストール】
Node-RED から Watsonx.AI を使えるようにするため、用意した Node-RED に拙作の watsonx.ai ノードを追加します:
追加手順は以下です。まず Node-RED の右上のメニューから "Manage Pallete(パレットの管理)" を選択します:
パレットの管理画面が表示されます。ここで "Install" タブに切り替え、検索ボックスに "watsonx" と入力します。すると(2024-09-28 時点では他の候補は見つからないのですが) "node-red-contrib-dotnsf-watsonx" という名前の公開ノードが見つかるはずです(2024-09-30 時点では最新バージョン 0.2.3 を公開しています)。この "Install" ボタンをクリックします:
「インストールしていいか?という確認画面が表示されたら "Install" を押してください:
インストールに成功すると、このような画面が表示されます:
ダイアログをクローズして元の画面に戻ると、ノード一覧の function カテゴリ内に "watsonx.ai" と書かれたノードが追加されているはずです。これで Node-RED から比較的簡単な方法で watsonx.ai の生成 AI が使えるようになりました:
【watsonx.ai 側のパラメータを確認】
準備の最後に、この後実際に Node-RED から Watsonx.AI を使う際にあたふたしないよう、watsonx.ai ノードに指定する各種パラメータの値をあらかじめまとめて調べておくことにします。
まず watsonx.ai ノードを左のパレット一覧から右のフロー部分にドラッグ&ドロップし、その後ダブルクリックしてください:
すると以下のようなダイアログが表示されます。これが watsonx.ai ノードに指定するパラメータです:
これらに指定するパラメータを確認しましょう。まずは watsonx.ai のプロンプトラボ画面を表示し、そこで指定するモデルをチューニングで作成したもの(下図では "kkimura-foreign-exchange-llm-v1")に設定します:
まず画面右の "View Code" というボタンをクリックすると、このプロンプトで実行する問い合わせを Curl で実行する時の指定内容が表示されます。この中に Location と Deployment ID の情報が含まれています:
例えば curl で指定する URL が以下のような値の場合、、
curl "https://jp-tok.ml.cloud.ibm.com/ml/v1/deployments/(deployment_id)/text/generation?version=2023-05-29"
青字の ".ml.cloud.ibm.com" の前にある文字列 "jp-tok" が Location の値です。また "deployments/" と "/text" の間にある赤字の部分にある文字列が Deployment ID です。
なお API Key は IBM Cloud ダッシュボードで作る API Key の値です。またチューニング LLM を使う場合、Project ID と Model ID はともに指定不要です(指定されたままでも構いませんが、Deployment ID が指定されている場合は無視されます)。
これらの値を先ほどのダイアログ内に指定し、最後に "Done" ボタンをクリックします:
これでパラメータの準備も完了しました。
【Node-RED から watsonx.ai のチューニング済み LLM にアクセスする】
Node-RED のフローを完成させましょう。watsonx.ai ノードの左側に inject ノードを、右側に debug ノードを配置し、これらを繋げます:
inject ノードをダブルクリックしてダイアログを開き、"msg.payload" の種類を文字列に(図で az と書かれている指定)、文字列の内容を "与えられた質問に対する答を計算して簡潔に答えてください。\\\\n\\\\n1 ドルは 144.3 円です。 10 ドルは何円ですか?" と入力して、Done をクリックします(msg.topic は使いません。×をクリックして削除しても構いません):
ここまで準備できたら、Node-RED 画面右上の "Deploy" ボタンをクリックして、このフローをデプロイします:
そして inject ノード左のボタンをクリックすると指定した文字列が watsonx.ai ノードに渡され、Deployment ID で指定されたチューニング済み LLM で処理され、その結果が debug ノードに渡されます。debug ノードに渡った結果は画面右の debug ペイン(虫のマーク)で確認することができます:
まだチューニングが充分ではないので、期待していたような出力結果ではありませんが、Watsonx.AI のチューニング済み LLM を Node-RED からも使うことができる、ということが確認できました。
というわけで改めて、WatsonX.AI 用 Node-RED カスタムノードがチューニング済み LLM にも対応できましたので、よかったら使ってください: