NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

NAI 2.4 の推論エンドポイントを利用するデモ アプリを作成してみる。

Nutanix Enterprise AI(NAI)2.4 で作成した推論エンドポイントを利用する、デモ アプリを作成してみます。

下記のセッションで例示したデモ アプリの修正版です。

1. 接続情報とサンプル リクエストの確認

デモ アプリを作成する準備として、NAI UI で推論エンドポイントの接続情報を確認して、サンプル クエリで動作確認しておきます。

1-1. エンドポイント接続情報の確認

NAI で、下記のようにテキスト生成モデルの推論エンドポイントを作成してあります。

 

エンドポイントの画面を開いて、下記を確認しておきます。

 

1-2. エンドポイント接続情報の確認

推論エンドポイントのページで、「サンプル リクエストを見る」をクリックします。

 

サンプル リクエストとして、curl のコマンド ラインが表示されます。

 

1-3. サンプル リクエストの実行

ためしに、サンプル リクエストの curl コマンドを実行してみます。

まず、環境変数「API_KEY」に、API キーを格納しておきます。

$ API_KEY=d8cb366b-d68d-4f9e-8a65-7075e137977e

 

そして、Linux マシンでサンプル リクエストを実行します。もとのサンプル リクエストから、10行目のみ変更(プロンプトを日本語に)してあります。

gist.github.com

 

実行すると、下記のようにテキスト生成の結果が1行で表示されます。そこで、見やすくするために Linux マシンに追加インストールした jq コマンドを利用します。

 

jq コマンドで整形して実行すると、下記のように出力されます。jq コマンドは、コマンド ラインの末尾にパイプで追記しています。

ちなみに、「jq -r .」の部分を「jq -r .choices[0].message.content」に置き換えると、生成されたテキストのみを取得できます。(15行目)

gist.github.com

 

2. デモ アプリ(Python スクリプト)の作成

今回は、Python でデモ アプリを作成してみます。NAI のサンプル リクエストをできるだけそのまま流用するため、あえて OpenAI のモジュール(openai)ではなく requests を利用します。そして、チャット UI には Gradio を利用しています。

2-1. Python venv の作成

作業用マシンには、Python 3.11 がインストールされています。

$ python3 -V
Python 3.11.13

OS のシステム Python とは別環境に Gradio モジュールをインストールするため、venv を作成します。

$ python3 -m venv gradio

作成した venv に切り替えます。これから作成する Python スクリプトを実行する場合は、事前にこの venv に切り替える必要があります。

$ source ./gradio/bin/activate
(gradio) $

 

2-2. Gradio のインストール

pip で、Gradio と、推論エンドポイントの API コールに必要な requests モジュールをインストールします。

(gradio) $ pip install gradio requests

 

2-3. Python スクリプトの作成(nai_demo.py)

AI チャットのデモ アプリを、Gradio と requests を利用した Python スクリプトとして作成します。

  • L1-L2:Gradio と requests のモジュールをインポートします。
  • L6-L8:OS の環境変数を読み込みます。
  • L15-L31:サンプル リクエストを参考に、API リクエストのヘッダーとデータを指定しています。
    • 推論エンドポイントのパラメータは環境変数に置き換え
    • Python の記法に従って、「"stream": false」→「"stream": False」

gist.github.com

 

2-4. デモ アプリの実行

作成した Python スクリプトを実行します。

まず、環境変数を設定しておきます。

$ export NAI_ENDPOINT_NAME="gemma-ep-01"
$ export NAI_ENDPOINT_URL="https://10.1.7.122/api/v1/chat/completions"
$ export NAI_API_KEY="d8cb366b-d68d-4f9e-8a65-7075e137977e"

 

スクリプトを実行します。node.js がインストールされていない警告メッセージについては、今回は無視します。

(gradio) $ python3 nai-demo.py
which: no node in (/home/gowatana/.local/bin:/home/gowatana/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
* Running on local URL:  http://0.0.0.0:5000

To create a public link, set `share=True` in `launch()`.

 

これで、AI チャットのデモ アプリが起動されます。Web ブラウザから作業マシンの 5000 番ポートにアクセスすると、下記のようなページが表示されるはずです。なお、別のマシンからアクセスする場合には、Python スクリプトを実行したホストのファイアウォールで TCP 5000 番ポートを開放しておく必要があります。

 

3. デモ アプリのコンテナ化

Docker がインストールされている Linux マシンで、コンテナ イメージを作成します。

3-0. Docker のインストール

作業用の Linux マシンに、Docker Engine と CLI をインストールします。今回は Ubuntu 24.04 を使用しているので、apt でインストールします。

$ sudo apt update -y
$ sudo apt install docker.io -y

 

Dcoker のサービスが起動されたことを確認しておきます。

$ systemctl is-active docker
active
$ systemctl is-enabled docker
enabled

 

作業ユーザー(例では gowatana)を、docker グループに追加しておきます。そしてグループ追加後には、再ログインしておきます。

$ sudo usermod -aG docker gowatana

 

3-1. コンテナ イメージの作成

今回インストールされた Gradio と requests のバージョンを記載した、requirements.txt を作成します。

gist.github.com

 

Dockerfile を作成します。

gist.github.com

 

nai-demo.py、requirements.txt、Dockerfile が保存されているディレクトリで、docker build を実行します。

$ docker build -t /nai-demo-chat:v0.0.1 .

 

コンテナ イメージが作成されました。

$ docker images nai-demo-chat
REPOSITORY               TAG         IMAGE ID      CREATED             SIZE
localhost/nai-demo-chat  v0.0.1      49edc11209fe  About a minute ago  635 MB

 

3-2. コンテナの起動

環境変数を指定して、コンテナを起動します。下記のように docker run コマンドを実行して、Web ブラウザからコンテナ ホストの 5000 番ポートにアクセスすると AI チャットのデモ アプリが表示されるはずです。

コンテナを停止するには、Ctrl + C キーを押します。

docker run \
-e NAI_ENDPOINT_NAME="gemma-ep-01" \
-e NAI_ENDPOINT_URL="https://10.1.7.122/api/v1/chat/completions" \
-e NAI_API_KEY="d8cb366b-d68d-4f9e-8a65-7075e137977e" \
-p 5000:5000 \
nai-demo-chat:v0.0.1

 

あるいは、下記のように環境変数を別のファイルに記載しておきます。

env_config.txt

NAI_ENDPOINT_NAME=gemma-ep-01
NAI_ENDPOINT_URL=https://10.1.7.122/api/v1/chat/completions

 

env_key.txt

NAI_API_KEY=d8cb366b-d68d-4f9e-8a65-7075e137977e

 

そして、下記のように --env-file でファイルを指定してコンテナを起動します。

docker run \
--env-file env_config.txt \
--env-file env_key.txt \
-p 5000:5000 \
nai-demo-chat:v0.0.1

 

さらに、コンテナをバックグラウンドで起動し、停止時に削除するには下記のようにオプションを追記します。

docker run -d --rm \
--env-file env_config.txt \
--env-file env_key.txt \
-p 5000:5000 \
nai-demo-chat:v0.0.1

 

3-3. コンテナ イメージの Push

コンテナ イメージを、コンテナ レジストリ(今回は Github Container Registry の ghcr.io)で公開します。

まず、ghcr.io にログインしておきます。

$ docker login ghcr.io

 

コンテナ イメージに、ghcr.io リポジトリのアドレスを含むタグを付与します。「ghcr.io/gowatana」は、私のアカウントのリポジトリです。

$ docker tag nai-demo-chat:v0.1.1 ghcr.io/gowatana/nai-demo-chat:v0.0.1

 

イメージを Push します。

$ docker push ghcr.io/gowatana/nai-demo-chat:v0.0.1

 

レジストリのコンテナをダウンロードして起動する場合は、docker run でも下記のように「ghcr.io」アドレスの指定されたイメージ名を指定します。すでにローカルにこのイメージが存在する場合はそれが利用され、存在しない場合はレジストリからダウンロードされます。

docker run -d --rm \
--env-file env_config.txt \
--env-file env_key.txt \
-p 5000:5000 \
ghcr.io/gowatana/nai-demo-chat:v0.0.1

 

これで、レジストリに「nai-demo-chat」イメージが Push されました。Github Container Registry では、下記のように GitHub サイトの「Packages」タブで確認できます。なお、このイメージはデフォルトではアクセス範囲が「Private」になっており、自身の GitHub ユーザーのみで利用できます。(つまりGitHub の認証が必要です)

 

おまけ:Git Hub Container Registry でのコンテナ イメージ公開

GitHub に Push されたコンテナ イメージを認証なしで公開するには、Visibility を「Public」に設定します。今回のデモ アプリは機密情報をもたないので、Public に設定してみます。

コンテナ イメージのページにある、「Package settings」を開きます。

 

画面下方にある、「Change visibility」をクリックします。

 

「Public」を選択し、リポジトリの名前(今回は nai-demo-chat)を入力して、「I understand the consequences, change package visibility」をクリックします。

 

これで、コンテナ イメージの Visibility が「Public」になり、GitHub の認証なしで Pull できるようになりました。

 

つづく。

 

©2025 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。