所要時間: 約60分 | 難易度: ★★★★☆

この記事で作るもの

Jetson Orin NXという省電力なエッジデバイス上で、外部APIを一切使わずに自律的に思考・実行する「Hermes Agent」を構築します。この記事の手順を完了すると、デバイス内で完結したプライベートなAIアシスタントがコマンドラインから利用可能になります。

  • 前提知識: 基本的なLinuxコマンド操作、Pythonの基礎知識
  • 必要なもの: Jetson Orin NX 開発者キット(または互換ボード)、NVMe SSD(128GB以上推奨)、インターネット環境

先に確認するスペック・料金

Jetson Orin NXは、エッジAI用としては最高峰の性能を持ちますが、PC用のGPUとは特性が異なります。まず、メモリ(VRAM)がメインメモリと共有の「ユニファイドメモリ」である点に注目してください。

16GBモデルを強く推奨します。8GBモデルでも動作しますが、OSとシステムが使う分を引くとLLMが使える領域が5GB程度になり、4ビット量子化した7B(70億パラメータ)モデルを動かすのが限界です。16GBモデルなら、8B〜13Bクラスのモデルを余裕を持って動かせます。

ストレージは必ずNVMe SSDを用意してください。microSDカードでの運用は、LLMの巨大なモデルファイルを読み込む際にボトルネックとなり、起動に数分かかるストレスに耐えられません。

予算目安は、本体・ケース・電源・SSD込みで約10万〜12万円。電気代はフル稼働でも月数百円程度(25W以下)なので、RTX 4090を積んだPCを24時間回すより圧倒的に経済的です。

なぜこの方法を選ぶのか

クラウド(OpenAIやAnthropic)を使えば一瞬でエージェントは作れます。しかし、工場の現場や自宅のホームオートメーションなど「データを外に出したくない」「オフラインでも動かしたい」というニーズには、Jetsonによるローカル完結型がベストです。

特に「Hermes(Nous Hermes)」というモデルは、MetaのLlama 3をベースに推論能力を強化したモデルで、関数呼び出し(Tool Use)の精度が非常に高いのが特徴です。これをJetsonのGPUコア(CUDA)に最適化されたllama.cppで動かすことで、MacやPCに頼らない「AIの自律駆動」が可能になります。

Step 1: 環境を整える

まずはJetsonの性能をフルに引き出すためのOS設定と、推論エンジンであるllama.cppのインストールを行います。

# 最大パフォーマンスモードに変更
sudo nvpmodel -m 0
sudo jetson_clocks

# 依存ライブラリのインストール
sudo apt-get update
sudo apt-get install -y build-essential cmake git python3-pip libcurl4-openssl-dev

Jetsonはデフォルトで電力を抑える設定になっています。nvpmodel -m 0は「全コア解放」を意味し、これを行わないと推論速度が半分以下に落ちます。

次に、llama.cppをCUDA(JetsonのGPU)有効状態でビルドします。

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build
cd build
cmake .. -DGGML_CUDA=ON
make -j$(nproc)

⚠️ 落とし穴: JetPackのバージョンによってCUDAのパスが通っていないことがあります。nvcc --versionでエラーが出る場合は、~/.bashrcexport PATH=/usr/local/cuda/bin:$PATHを追記してリロードしてください。これを見逃すと、GPUではなくCPUで推論が始まり、レスポンスが10秒に1文字という絶望的な速度になります。

Step 2: 基本の設定

エージェントとして使うモデル「Hermes 3 - Llama 3.1 8B」をダウンロードします。今回はメモリ効率と精度のバランスが良い「Q4_K_M(4ビット量子化)」を選択します。

# モデル用のディレクトリ作成
mkdir -p ~/models
cd ~/models

# Hugging Faceからモデルをダウンロード(huggingface-cliを使うと便利です)
pip3 install huggingface_hub
huggingface-cli download NousResearch/Hermes-3-Llama-3.1-8B-GGUF --local-dir . --include "*Q4_K_M.gguf*"

次に、エージェントを制御するPythonスクリプトの準備です。APIキーの代わりに、ローカルで立ち上げるサーバーのURLを指定します。

# config.py
import os

# ローカルサーバーの設定
MODEL_PATH = os.path.expanduser("~/models/Hermes-3-Llama-3.1-8B.Q4_K_M.gguf")
API_BASE = "http://localhost:8080/v1"

# エージェントの性格(System Prompt)
SYSTEM_PROMPT = """
あなたはJetson Orin NX上で動作する自律型エージェントです。
ユーザーの指示に対して、簡潔かつ正確に回答してください。
必要に応じて、提供されたツールを使用してください。
"""

ここでQ4_K_Mという量子化形式を選ぶ理由は、メモリ使用量を約5GBに抑えつつ、モデルの知能劣化を最小限にできるからです。16GBモデルのJetsonなら、残りのメモリをRAG(知識検索)や他のプロセスに回せます。

Step 3: 動かしてみる

まず、バックグラウンドでllama.cppのサーバーを起動します。

cd ~/llama.cpp/build/bin
./llama-server -m ~/models/Hermes-3-Llama-3.1-8B.Q4_K_M.gguf --n-gpu-layers 33 -c 4096 --host 0.0.0.0 --port 8080

--n-gpu-layers 33は、Llama 3 8Bの全レイヤーをGPUに載せる設定です。これにより、推論の全プロセスがCUDAコアで高速化されます。

次に、最小限のエージェントを実行するスクリプトを書きます。

import requests
import json

def chat_with_hermes(prompt):
    url = "http://localhost:8080/v1/chat/completions"
    headers = {"Content-Type": "application/json"}
    data = {
        "messages": [
            {"role": "system", "content": "あなたは優秀なアシスタントです。"},
            {"role": "user", "content": prompt}
        ],
        "temperature": 0.7
    }

    response = requests.post(url, headers=headers, data=json.dumps(data))
    return response.json()['choices'][0]['message']['content']

print(chat_with_hermes("Jetson Orin NXのスペックを教えて"))

期待される出力

Jetson Orin NXは、最大100 TOPSのAI性能を持つエッジコンピューティングデバイスです。
NVIDIA AmpereアーキテクチャのGPU、1024個のCUDAコア、32個のTensorコアを搭載しており...

私の環境では、プロンプト入力から最初の文字が出るまで(Time To First Token)は約0.5秒、出力速度は毎秒約20トークンでした。これは人間が文章を読む速度より速く、実用レベルです。

Step 4: 実用レベルにする

エージェントを「ただのチャット」から「実行可能なエージェント」へ進化させます。Hermesの強みであるTool Useを利用し、Jetsonのシステム情報を取得するエージェントを作成します。

import subprocess

def get_system_stats():
    """Jetsonの現在の負荷状況を取得するツール"""
    # jetson-stats(jtop)の情報を簡易的に取得
    try:
        # 実際にはjtopのAPIを使うのがベストですが、ここではデモ用にuptimeを使用
        res = subprocess.check_output(["uptime"]).decode("utf-8")
        return f"現在のシステム負荷: {res}"
    except:
        return "システム情報の取得に失敗しました。"

# エージェントが「システム負荷を教えて」と言われた時に
# この関数を呼び出すようにプロンプトで指示します。

実務で使う場合、最も重要なのは「エラーハンドリング」です。ローカルLLMは時々、存在しない関数を呼び出そうとしたり、JSON形式を崩したりします。

私は、エージェントの出力を必ずtry-exceptで囲み、パースに失敗した場合は「出力形式が正しくありません。JSON形式で再出力してください」という指示を自動で投げ返すループを入れています。これにより、自律稼働時のクラッシュを大幅に減らせます。

よくあるトラブルと解決法

エラー内容原因解決策
out of memoryメモリ不足--n-gpu-layersを減らすか、より小さい量子化モデル(Q3_K_Sなど)を使う。
推論が極端に遅いGPUが使われていないllama-server起動時に「BLAS = 1」と表示されているか確認。0ならビルド失敗。
デバイスが急に落ちる電力不足付属のACアダプタを使用し、USB給電を避ける。または電源モードを15Wに制限する。

次のステップ

ここまでの手順で、Jetson内で完結するAIエージェントの基盤ができました。次に挑戦すべきは、このエージェントに「目」を与えることです。

Jetsonはカメラ接続が容易なため、Llava-v1.6のようなマルチモーダルモデルを同じllama.cppで動かすことができます。「カメラに映ったものが何かを判断し、それに基づいてエージェントが行動する」という仕組みは、今のコードを少し拡張するだけで実現可能です。

また、Dockerコンテナ化してデプロイできるようにしておくと、将来的に複数台のJetsonを管理する際に楽になります。NVIDIAが提供しているjetson-containersリポジトリをチェックしてみてください。

よくある質問

Q1: Jetson Orin Nanoでも動きますか?

動きますが、NanoはOrin NXに比べて性能が1/2〜1/4程度です。特にメモリが8GBしかないため、モデルをかなり削る(Q2やQ3量子化)必要があり、エージェントとしての知能(推論精度)が著しく落ちる点に注意してください。

Q2: 冷却ファンは必須ですか?

はい、必須です。LLMの推論はGPUに高い負荷をかけ続けるため、ヒートシンクだけでは数分で100度近くに達し、サーマルスロットリングで速度が激減します。純正または互換品のファンを必ず装着してください。

Q3: Python 3.12を使いたいのですが。

JetPack 6.0以上であればUbuntu 22.04ベースなので標準で3.10が、それ以降は3.12も導入可能です。ただし、Jetson専用のライブラリ(PyTorchのJetson版など)は特定のPythonバージョンに依存することが多いため、まずは標準の3.10で環境構築することをお勧めします。

📦 この記事に関連する商品(楽天メインで価格確認)

Jetson Orin NX 16GB 開発者キット

メモリ16GBはLLM運用の最低ライン。8GB版より圧倒的に快適です。

楽天で価格を見る Amazonでも確認

※アフィリエイトリンクを含みます


あわせて読みたい