🎃

NVIDIA NIMを試してみる。

2024/10/18に公開

Jetson NanoがJetpack4で止まってしまったので、Jetson Orin Nanoを買って遊び始めたコネクトーム・デザインの伊藤です。
Jetson Orin Nanoについてはまたの機会に書こうと思いますが、今回はNVIDIAの新しいクラウドサービスの話です。

1. NVIDIA NIM とは。

https://www.nvidia.com/ja-jp/ai/

「生成AIを即座にデプロイする」と書かれています。
つまり今までNVIDIAのGPUは、ディープラーニングの分野では「学習が超絶速い」という文脈で言及されることが多かったのですが、このサービスは「推論実行環境」にフォーカスしています。

メニューにも「モデル」「統合」「どこでも実行可能」「今すぐ始める」と、簡単に選んで組み合わせて使えそうなワードが並んでいます。

「How to Deploy NVIDIA NIM in 5 Minutes」(5分でNIMを展開する方法を見る)という動画も用意されています。

2. 「生成AIを即座にデプロイする」をやってみる。

そんなにすぐ始められるのであれば、あれこれ読む前に手を動かしてみましょう。

・まずは一際目立つ、グリーンの「今すぐ試す」ボタンから、"Discover"ページに入ります。
https://build.nvidia.com/explore/discover
・最初に一番人気として表示された2つが、Llama3.1の70bと405bのモデルでした。(2024/10/18時点)

https://build.nvidia.com/nvidia/llama-3_1-nemotron-70b-instruct
https://build.nvidia.com/meta/llama-3_1-405b-instruct

・「llama-3.1-nemotron-70b-instruct」の詳細ページを開きます。
・これまた目立つ「Build with this NIM」をクリックしてみます。
・「無料のAPIクレジットがもらって始めてね」とアカウント登録画面が出てきます。会社のEmailと個人のEmailでもらえるクレジットの量やサポートなどに違いがあるようです。
・Email認証だけでスムーズに作れました。

・NIMの中に入れました。
・Step.1/2 「Generate your API Key」でAPIキーを作り、コピーして保存します。
・Step.2/2 「Make an API call」へ進みます。
・次の画面では、もうLLMが動いています(!)。

・パラメータ調整もGUIで可能。

・APIコールして使う場合のサンプルコードも表示されています。プロンプトを入力したりパラメータを変更すると、その値も反映されます。

至れり尽くせり……。

・「Type text here...」のボックスにテキストを打ち込むと会話できます。
・画面はすべて英語で記載されているので英語しか対応されていないかなと思いきや、日本語をそのまま入力したらちゃんと日本語で答えてくれます。

3. LLMを使ってみる。

・こんなプロンプトを入れてみました。

Pythonを使って、フィボナッチ数列を作成するプログラムを2つ書いてください。
一つ目は、初学者向けに可読性を重視したシンプルでわかりやすい実装にしてください。
二つ目は、熟練者向けに速度を最重視した実装にしてください。

・待ち時間なく、すぐに回答が表示されました。

・実際の回答は以下の通りでした。

初学者向け: 可読性を重視したシンプルな実装

def fibonacci_simple(n):
    """
    フィボナッチ数列の最初のn個の数字を返します。

    :param n: 数列の長さ
    :return: フィボナッチ数列のリスト
    """
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]

    fib_sequence = [0, 1]
    while len(fib_sequence) < n:
        # 次の数字は、最後の2つの数字の合計
        next_number = fib_sequence[-1] + fib_sequence[-2]
        fib_sequence.append(next_number)

    return fib_sequence

# 例: 最初の10個のフィボナッチ数
print(fibonacci_simple(10))
熟練者向け: 速度を最重視した実装 (メモ化を用いた再帰)

def fibonacci_fast(n, memo={}):
    """
    フィボナッチ数列のn番目の数字を返します。
    メモ化を用いた再帰により高速化されています。

    :param n: 数列のインデックス (0から始まる)
    :param memo: すでに計算された値のメモ (内部使用)
    :return: フィボナッチ数列のn番目の数字
    """
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    elif n not in memo:
        # 計算結果をメモ化
        memo[n] = fibonacci_fast(n-1, memo) + fibonacci_fast(n-2, memo)

    return memo[n]

def fibonacci_fast_sequence(n):
    """
    フィボナッチ数列の最初のn個の数字を返します。
    :param n: 数列の長さ
    :return: フィボナッチ数列のリスト
    """
    return [fibonacci_fast(i) for i in range(n)]

# 例: 最初の10個のフィボナッチ数
print(fibonacci_fast_sequence(10))
解説
初学者向け実装:

fibonacci_simple 関数は、フィボナッチ数列の最初の n 個の数字を生成します。
ループを使用してシーケンスを構築するため、理解と実装が簡単です。
ただし、大きな n の場合、計算効率は良くありません。
熟練者向け実装:

fibonacci_fast 関数は、メモ化を用いた再帰により、フィボナッチ数列の n 番目の数字を高速に計算します。
fibonacci_fast_sequence 関数は、fibonacci_fast を使用して最初の n 個の数字を生成します。
メモ化により、同じインデックスの値を複数回計算するのを避け、大幅に高速化されます。
再帰の使用により、コードは複雑になります。ただし、計算効率は大幅に改善されます。

・リクエストを正しく理解した興味深い回答が返ってきました。

4. ここからがNVIDIA NIMの本領発揮。

「即座にデプロイする」の謳い文句通り、70bのモデルが動きました。
となるとやはり隣にある、405bのモデルも試してみたくなります。

パラメータ数 4,050億。推論実行に必要なGPUメモリサイズは、FP16精度で810GBだそうです。NVIDIA DGX H100が一台しか買えない人は、FP8で我慢しましょう。(笑)
Llama 3.1 の新機能と使い方

・では最初の画面に戻って、405bを選択してみます。
・もう動いてます……。

・では先ほどと同じプロンプトを入れてみます。こちらも待ち時間ゼロで回答が出ました。

初学者向けの実装

def fibonacci(n):
    fib_sequence = [0, 1]
    while len(fib_sequence) < n:
        fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])
    return fib_sequence

n = 10  # 生成するフィボナッチ数列の長さ
print(fibonacci(n))

この実装は、フィボナッチ数列をリストに追加していくシンプルな方法です。初学者にもわかりやすい構造になっています。

熟練者向けの実装

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

n = 10  # 生成するフィボナッチ数列の長さ
print(list(fibonacci(n)))

この実装は、ジェネレータを使用してフィボナッチ数列を生成します。ジェネレータは、必要な値をその都度生成するため、メモリ効率が高く、速度も速くなります。熟練者向けの実装として、より効率的で高速な方法を提供します。

こちらは若干あっさり目の回答が返ってきた印象。
内容的にはよく似ていますが、表現が異なっているようです。
このように同じプロンプトを、いくつかのモデルに入れてみてどれが自分の期待する回答に近いか、すぐに試せるわけです。VLAMサイズの物理的な制約もなく、インストールや設定もせずに。

5. フロントエンドを自分で作って組み込みたい。

サンプルコードを使えば、このまま自分のサービスに組み込めるかも簡単に試せます。

Pythonコードの出力例を転載。

from openai import OpenAI

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

completion = client.chat.completions.create(
  model="meta/llama-3.1-405b-instruct",
  messages=[{"role":"user","content":"今夜はどんな星が見られるでしょうか"}],
  temperature=0.2,
  top_p=0.7,
  max_tokens=1024,
  stream=True
)

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

これを自分のPCにpyファイルとして保存しAPIキーを設定して、プロンプトを引数で受け取れるように少し改造すれば、webページへの組み込みも簡単にできそう。

6. モデルをちょっと試してみたいときには最適なのでは。

自分が想定する具体的な質問に対して、各モデルがどのような回答を返してくるのか、実際に試してみたいことは多々あると思います。
じっくり調べてみる前にも、フィット感を軽く確認できるのは嬉しい。

また、数クリックするだけで最新のLLMが動いて自由に試せるというのもとても楽しい。
環境構築の手間やマシンスペックが足りずに途中で挫ける心配もありません。
新しいモデルもかなり早いタイミングで追加されてくるようです。

当然、言語モデルだけでなく画像生成やマルチモーダルに対応したモデルも並んでいるので、気になったものはどんどん実際に動かして触ってみましょう。聞くだけと触って動かしてみるのとでは大違いですし。

余談

NIM = NVIDIA Inference Microservices の略なのですが、
通常、"NVIDIA NIM" と表記されています。NVIDIAがダブってますね🤭
(NVIDIAの方にもちらっと聞いてみたら、「私も気になってます😂」とのことでした。)

CODブログ

Discussion