NKP の Kubernetes クラスタに、Nutanix Enterprise AI(NAI)2.6 を展開してみます。今回は、NAI の動作確認として、モデルのインポートとエンドポイントの作成を実施してみます。なお、今回は簡易的に動作確認するため、Hugging Face Hub からトークンなしでダウンロードできるモデルを利用します。
なお、NAI のライセンス キーを追加していない場合、一定時間が経過すると、ライセンス不足によりエンドポイント起動ができなくなります。そのため動作確認は、NAI インストール直後に実施するか、NAI のライセンス キーを登録してからあらためて実施することになります。
前回はこちら。
今回の内容です。
1. Emmbeding モデルによる推論サービスの作成
まずは、動作確認もかねて、Emmbeding モデルの推論サービスを作成してみます。
ここでは、Hugging Face Hub からトークンなしでダウンロードできる「granite-embedding-107m-multilingual」モデルを利用します。このモデルによる推論サービス エンドポイントは、CPU のみでも動作します。
1-1. モデルのインポート
NAI UI で、「モデル」を開き、「Hugging Face モデル ハブからインポートする」をクリックします。

モデル名で検索、もしくは「>」ボタンをクリックしてページを進めて、下記のモデルを選択して「インポート」をクリックします。
ちなみに、これはテキスト生成ではなく、テキストをベクトル化(Embedding)するモデルです。

モデル インスタンスの名前を入力して、「インポート」をクリックします。これは、インポートしたモデルを NAI で管理するための名前です。
- モデル インスタンス名:granite-embed

モデルのダウンロード・インポートが完了すると、ステータスが「準備完了」になります。まだ NAI でモデルへのアクセスを許可していないため、モデル インスタンス名のとなりに「!」マークが表示されています。

1-2. モデルのアクセス許可
「モデル」画面で「モデル アクセス制御」タブを開き、「Hugging Face モデル ハブ」の行にある「許可リストを変更」をクリックします。

「granite」などの文字列で検索し、さきほどインポートしたモデルのチェック ボックスを ON にして「保存」をクリックします。

これで、Hugging Face モデル ハブのモデルが、1件のみアクセス許可されました。

「リスト」タブに戻ると、モデル インスタンス名のとなりにあった「!」マークが消えています。

1-3. エンドポイントの作成
この環境では、まだ Kubernetes クラスタに GPU ノードを追加していません。そして今回のモデルは GPU を必須としていないので、CPU のみを利用した推論サービス エンドポイントとして起動します。
「モデル」画面の「リスト」タブで、インポートしたモデルを選択して、「アクション」→「エンドポイントの作成」をクリックします。

エンドポイントを起動するためのパラメータを入力します。
- エンドポイント名:granite-embed-ep
- モデル機能:Embedding
- モデル インスタンス名:granite-embed
- アクセラレーション タイプ:CPU
そして、「新規 API キーを作成」をクリックします。

キーの名前を入力して、「作成」をクリックします。
- キーの名前:demo-kay-01

API キーが作成されるので、「キーをコピー」ボタンなどを利用して、テキスト ファイルなどに保存しておきます。そして、「閉じる」ボタンをクリックして画面を閉じます。
この画面を閉じると API キーを再確認できないので、キーを紛失した場合は、新規のキーを作成することになります。

作成した API キーを選択し、「次へ」をクリックします。
- API キー:demo-kay-01

推論エンジンなどのパラメータを指定して、「次へ」をクリックします。
- 推論エンジン:vLLM
- インスタンス数:1
- vCPUs:8
- メモリー:10
なお、ここで指定されている vCPU と メモリーの値は、デフォルト値であり、最小値です。推論サービスを提供する Pod を起動するには、Kubernetes の Worker ノードに、このリソースの空きが必要です。

パラメータを確認して、「作成」をクリックすると、推論サービスの Pod が起動されます。

起動が完了すると、下記のように、「推論」→「ローカル エンドポイント」画面で、エンドポイントのステータスが「アクティブ」になります。

NAI のエンドポイントは、Kubernetes 側では KServe の InferenceService(isvc)リソースとして起動されます。そして、admin ユーザーによって作成されたエンドポイントは、nai-admin Namespace で起動されます。
gowatana@nkp-work-02:~$ kubectl get inferenceservices.serving.kserve.io -n nai-admin NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE granite-embed-ep http://granite-embed-ep-nai-admin.example.com True 2m32s
Pod も起動できています。
gowatana@nkp-work-02:~$ kubectl get pods -n nai-admin NAME READY STATUS RESTARTS AGE granite-embed-ep-predictor-57668dfcbb-t2dmw 1/1 Running 0 2m40s
1-4. エンドポイントのテスト
作成したエンドポイントの名前をクリックします。

エンドポイントの動作確認をするため、「テスト」をクリックします。

テスト用のリクエストを選択して、「テスト」をクリックします。

画面の右側に、リクエストの文字列が、推論サービスによってベクトル化されたものが表示されます。
これで、エンドポイントが動作していることが確認できたので、「完了」をクリックして画面を閉じます。

このエンドポイントを利用するサンプル リクエストを入手するため、「エンドポイント アクセス」ボタンをクリックします。

curl によるサンプル リクエストが表示されます。

表示されたスクリプトは下記です。
エンドポイントの起動・テストが完了したら、アプリケーション担当には、エンドポイントの URL、API キー、そしてサンプル スクリプトを提供することになるはずです。
1-5. エンドポイントのハイバネート
エンドポイントを一時的に停止して、CPU / メモリ / GPU リソースを開放したい場合は、エンドポイントを削除せずに一時的に停止(ハイバネート)できます。
ここでは、ほかのモデルのエンドポイントを起動するために、granite-embed-ep エンドポイントをハイバネートしてみます。
「推論」→「ローカル エンドポイント」を開き、停止するエンドポイント(granite-embed-ep)を選択して、「アクション」→「ハイバネート」をクリックします。

確認のため、「hibernate」と入力して、「ハイバネート」をクリックします。

これで、エンドポイントがハイバネートされて、ステータスが「休止状態」になりました。

2. Reranker モデルによる推論サービスの作成
ここまでと同様の手順で、Reranker モデルのエンドポイントも作成してみます。 これは、RAG システムで検索結果の並べ替え(Reranking)を行うことで、LLM に渡す情報の精度向上させるために用いられます。
2-1. モデルのインポート
Hugging Face の Reranker モデルは、NAI v2.6 には ms-marco-MiniLM-L6-v2 のみが登録されています。このモデルも、Hugging Face Token 登録なしでダウンロードできます。
「モデル」→「リスト」タブを開き、「モデルをインポートする」→「Hugging Face モデル ハブから」をクリックします。

「機能でフィルタリング」→「Reranker」を選択して、「フィルターを適用」をクリックします。

モデルを選択して、「インポート」をクリックします。

モデル インスタンス名を入力して、「インポート」をクリックします。
- モデル インスタンス名:minilm-rerank

モデルのダウンロード・インポートが完了すると、ステータスが「準備完了」になります。

2-2. モデルのアクセス許可
「モデル」→「モデル アクセス制御」タブを開き、「Hugging Face モデル ハブ」の行にある「許可リストを変更」をクリックします。

「機能でフィルタリング」→「Reranker」を選択して、「フィルターを適用」をクリックします。

モデルを選択して、「保存」をクリックします。このとき、すでに選択されていたモデルのチェックボックスを OFF にしないように注意してください。
- モデル:minilm-rerank

「Hugging Face モデル ハブ」の許可されたモデルが、2件(2 / 43)になったことを確認します。

2-3. エンドポイントの作成
「モデル」画面の「リスト」タブで、インポートしたモデルを選択して、「アクション」→「エンドポイントの作成」をクリックします。
- モデル インスタンス名:minilm-rerank

エンドポイントの基本パラメータを入力て「次へ」をクリックします。このモデルも、CPU で利用可能です。
- エンドポイント名:minilm-rerank-ep
- モデル機能:Reranker
- モデル インスタンス名:minilm-rerank
- アクセラレーション タイプ:CPU
- API キー:demo-key-01

推論エンジンなどのパラメータは、デフォルトのまま「次へ」をクリックします。
- 推論エンジン:vLLM
- インスタンス数:1
- vCPUs:8
- メモリー:10

確認画面で「作成」をクリックすると、推論サービスの Pod が起動されます。

しばらく待つと、作成したエンドポイントが「アクティブ」になります。Worker ノードのリソースに空きがないと Pod が起動できないので、利用していないエンドポイントは「ハイバネート」などで停止しておきます。

2-4. エンドポイントのテスト
エンドポイントの動作確認を実施します。アクティブになったエンドポイントの名前をクリックします。
- エンドポイント名:minilm-rerank-ep

エンドポイントの「概要」タブが表示されるので、「テスト」をクリックします。

リクエストと、並べ替え対象のテキストが3件用意されているので(内容は固定)、「テスト」をクリックします。

3件のテキストの(Reranking(並べ替え)が実施されれました。「完了」をクリックしてテスト画面を閉じます。

「エンドポイント アクセス」をクリックすると、このエンドポイントを利用するサンプル リクエストが入手できます。

下記のように、curl のサンプル リクエストが表示されます。

表示されたスクリプトは下記です。
つづく。
