[NVIDIA NIM] usd codeをローカルのPythonから呼び出す

  • by

NVIDIA NIMとは、AIを使用した各種サービス(マイクロサービス)を提供するポータルです。

NVIDIA NIM for Developers
https://developer.nvidia.com/nim?sortBy=developer_learning_library%2Fsort%2Ffeatured_in.nim%3Adesc%2Ctitle%3Aasc

クラウド上で処理されるものなので、ローカル側はその機能を呼び出すだけです。
クラウドの先では高性能なGPUがたくさん処理をしてくれている、という認識でよいかと思います。
また、APIを使って自身のシステムに組み込むことも可能です(← これが一番メリットがあるかもしれない)。

「APIカタログ」で何が提供されているか確認できます。
APIの使い方もここで見ることが可能です。
https://build.nvidia.com/

例えば以下のようなサービスがあります。

それぞれブラウザからテキスト(プロンプト)を書いてブラウザ上で結果を得ることができます。
ブラウザ上の操作だけではつまらないので、今回は「nvidia/usdcode」を使ってローカルのPythonからUSDに関する質問の回答を得てみましょう。

NIMをAPIとして使うには ?

Web上でNIMを試す場合(ログインせずに試す)は特にアカウントは不要なようです。
APIとして使うには「API Key」を取得する必要があります。この手順について記載します。
まず先にNVIDIAアカウントでログインする必要があります。
以下の使用許諾を確認し、右上からアカウント登録を行います。

https://www.nvidia.com/en-us/about-nvidia/nv-accounts/

次にAPIカタログページを開きます。
https://build.nvidia.com/

このAPIカタログの右上からNVIDIAアカウントを使ってログインします。

個人アカウントの場合、1000クレジットまで使用できます。
仕事用のアカウントの場合は、4000クレジットまで使用できます。
「クレジット」は何かしらのAI処理を行うと消費されます。1つのAPIコールで1クレジット処理ではない点にご注意ください。

これはお試し版の制限になります。延長したい場合は「free NVIDIA AI Enterprise evaluation license」というのも用意されているようです。

本格的に使用する場合は「NVIDIA AI Enterprise」(https://www.nvidia.com/en-us/data-center/activate-license/) を登録してサブスクリプションで使用するようです。

APIカタログに戻ります。
ログインしたときにクレジットはアカウントの下に表示されています。

API Keyを取得する

https://build.nvidia.com/nvidia/usdcode

ここのusd codeでみてみましょう。
NVIDIAアカウントであらかじめログインしておいてください。

このページの右のPythonコードの箇所に「Get API Key」というテキストが見えます。
これをクリックします。

ポップされたウィンドウ上で「Generate Key」を選択します。

この先でAPI Keyが表示されますので、コピーして保存しておきます。

以降はWebからの使用でもこのAPI Keyが使用されます。その場合はクレジットが消費されることになります。

右のPythonのコードがずばりのAPIの書き方になります。

from openai import OpenAI

client = OpenAI(
  base_url = "https://integrate.api.nvidia.com/v1",
  api_key = "xxxxx"
)

completion = client.chat.completions.create(
  model="nvidia/usdcode-llama-3.1-70b-instruct",
  messages=[{"role":"user","content":""}],
  temperature=0.1,
  top_p=1,
  max_tokens=1024,
  extra_body={"expert_type":"auto"},
  stream=True
)

for chunk in completion:
  if chunk.choices[0].delta.content is not None:
    print(chunk.choices[0].delta.content, end="")

api_keyは隠していますが、これは先ほど取得したAPI Keyを入れることになります。
Web上ではそのAPI Keyが見えているはずです。

この機能はOpenAIのAPIの互換で動きます。
これによると、MetaのLlama 3.1-70bを使用しているようですね。

USD Codeのリファレンス

APIカタログの各ページからリファレンスページに移行することができます。

https://docs.api.nvidia.com/nim/reference/nvidia-usdcode

ここでは各パラメータの意味などがリストされています。

ローカルのPythonでusd codeからの回答を得る

下準備

まず、Pythonをインストールしておいてください。

https://www.python.org/downloads/

環境変数のPATHにこのPythonの実行ファイルを検索できるようにするのを忘れずに行ってください。
以下の2つを検索パスに追加する必要があります(Python 3.13の場合)。

  • [Install Path]\Python\Python313\Scripts
  • [Install Path]\Python\Python313

ここではWindows11環境のコマンドプロンプトを使用します。

python --version

でPythonのバージョンを表示します。「Python 3.13.2」と表示されました。
次にPythonパッケージをインストールする際に必要なpipのバージョンを確認します。

pip --version

「pip 24.3.1」と表示されました。

次にOpenAIのAPIをpipを使ってインストールします。

pip install openai

以下を実行してOpenAIのバージョンを確認します。

openai --version

「openai 1.63.2」と表示されました。

Pythonコードを書く

APIカタログに表示されたPythonコードを参考に質問を作成します。
少しOpenAIのAPIの作法に従って改造しました。
OpenAIクラスのapi_keyには先ほど取得したAPI Keyを入れるようにしてください。

ファイル名を「hello_usdcode.py」としました。

from openai import OpenAI

client = OpenAI(
    base_url = "https://integrate.api.nvidia.com/v1",
    api_key = "xxxxx"
)

completion = client.chat.completions.create(
    model="nvidia/usdcode-llama-3.1-70b-instruct",

    messages = [
        {"role": "system", "content": "日本語で答えてください。"},
        {"role": "user", "content": "OpenUSDについて説明してください。"}
    ],

    temperature=0.1,
    top_p=1,
    max_tokens=1024,
    extra_body={"expert_type":"auto"},
    stream=True
)

for chunk in completion:
  if chunk.choices[0].delta.content is not None:
    print(chunk.choices[0].delta.content, end="")

これはLLM(AIにテキストで質問をしてその回答を返す)と同様に「プロンプト」の質問テキストを与えて、その結果を得ます。

以下を変更しました。

    messages = [
        {"role": "system", "content": "日本語で答えてください。"},
        {"role": "user", "content": "OpenUSDについて説明してください。"}
    ],

messagesで配列で質問内容を書きます。
このときに"role"を"system"として、"content"に条件を与えるようにしました。
ここでは日本語で答えてもらうための指示を入れました(自然言語で指示するだけです!)。

次に"role"を"user"として、"content"に質問内容を入れます。

"client.chat.completions.create"で質問を作成して投げてます。
結果は以下で出力しています。

for chunk in completion:
  if chunk.choices[0].delta.content is not None:
    print(chunk.choices[0].delta.content, end="")

実行

これをコマンドプロンプトで以下のように実行しました。

python hello_usdcode.py

しばらく待つと(はじめの一回は少し待ちます)、以下のように出力されました。

OpenUSDは、Pixar Animation Studiosが開発したオープンソースの3Dシーン記述言語です。OpenUSDは、3Dグラフィックス、映画、ゲ ーム、建築、製品デザインなどの分野で使用されています。OpenUSDは、シーンの構成、モデル、テクスチャ、ライト、カメラ、レン ダリング設定など、3Dシーンのすべての要素を記述するために使用されます。

OpenUSDの主な特徴は、シーンを構成する要素を階層的に管理することができることです。OpenUSDでは、シーンは階層的な構造で管理され、各要素は親子関係で結び付けられます。この階層的な構造により、シーンの管理と編集が容易になります。

OpenUSDは、さまざまなファイル形式をサポートしています。主なファイル形式は、USD(Universal Scene Description)形式です。USD形式は、シーンの構成、モデル、テクスチャ、ライト、カメラ、レンダリング設定など、3Dシーンのすべての要素を記述するために使用されます。

OpenUSDは、さまざまなツールやアプリケーションと連携することができます。OpenUSDは、Maya、3ds Max、Blenderなどの3Dモデリングツール、RenderMan、V-Rayなどのレンダリングエンジン、USDViewなどのビューアツールなどと連携することができます。

OpenUSDは、オープンソースのプロジェクトとして開発されており、コミュニティによるサポートと開発が行われています。OpenUSDは、GitHubなどのオープンソースプラットフォームで公開されており、誰でも開発に参加することができます。

詳しく教えてくれましたね。

では、質問を「USDのPrimでDisplayNameを指定するサンプルコードを教えてください。」としましょうか。
Pythonコードの"role": "user"の内容をこの質問に置き換えて保存し、再度実行します。

結果は以下のように出力されました。

 ```python
 from pxr import Usd, UsdGeom

 # Create an in-memory stage
 stage = Usd.Stage.CreateInMemory()

 # Define a new Sphere primitive
 sphere = UsdGeom.Sphere.Define(stage, '/mySphere')

 # Set the display name for the Sphere prim
 sphere.GetPrim().SetDisplayName('My Beautiful Sphere')

 # Retrieve the display name using GetDisplayName
 display_name = sphere.GetPrim().GetDisplayName()

 # Print the display name
 print(f"Display Name: {display_name}")

 # Print the stage to STDOUT
 print(stage.GetRootLayer().ExportToString())
 ```

markdown形式でコードを出力してくれました。
これはusd codeでないと作成できない詳細な内容になっています。

いくつか質問を繰り返すと、APIカタログページの右上のユーザアカウントのところのクレジットが減ってるのを確認できるかと思います。

今回は1回質問して1クレジット消費しました。

これをプログラムに組み込めば、独自のツールにUSDのためのアシスタント機能を容易に実装できそうですね。
このようなAIを使ったマイクロサービスはNVIDIA NIMにたくさんあります。
これを利用するとAI対応のちょっとした拡張は案外難しくないな(実際はクラウドで途方もなく難しいことをしている)、というのが見えてきそうです。