reComputer RK3576 モジュール開発キットのアプリケーション

最終更新:

アプリケーション

RK1820 を使用したローカル LLM および VLM の実行

RK1820 はモデル性能テストだけでなく、rkllm3-server を介して reComputer RK3576 上でローカル LLM(大規模言語モデル)や VLM(視覚言語モデル)をデプロイし、OpenAI 互換 API を通じてローカル AI アプリケーションを構築するためにも使用できます。

本例では以下を行います:

  • Qwen3.5-0.8B を使用してローカル LLM チャットサービスを構築する

  • Qwen2.5-VL-3B_prune を使用してローカル画像理解サービスを構築する

rkllm3-server は RKNPU3 に基づいており、OpenAI 互換の Chat API を通じて LLM 推論を提供します。Python アプリケーション、Web UI、その他の AI エージェントフレームワークに統合可能です。

前提条件

このチュートリアルを開始する前に、RK1820 のインストールと RKNN3 Runtime の設定を完了し、以下を確認してください:

Plain
rknn-smi info -l

RK1820 が正常に認識されていること。


ローカル LLM の実行

本例では Qwen3.5-0.8B を使用します。

モデルディレクトリには以下のファイルが含まれています:

Plain
Qwen2.5-VL-3B_prune/
├── Qwen2.5-VL-3B_prune.embed.bin
├── Qwen2.5-VL-3B_prune.tokenizer.gguf
├── llm_Qwen2.5-VL-3B_prune.rknn
├── llm_Qwen2.5-VL-3B_prune.weight
├── vision_Qwen2.5-VL-3B_prune.rknn
└── vision_Qwen2.5-VL-3B_prune.weight

モデルディレクトリに移動します:

Plain
cd ~/Downloads/Qwen3.5-0.8B

ローカル LLM サーバーの起動

以下を実行します:

Plain
rkllm3-server \
-m Qwen3.5-0.8B.rknn \
--weight Qwen3.5-0.8B.weight \
--vocab Qwen3.5-0.8B.tokenizer.gguf \
--embed Qwen3.5-0.8B.embed.bin \
--host 0.0.0.0 \
--port 8080 \
-c 1024 \
--n_predict 256 \
--core-mask 0xff \
--repeat-penalty 1.1 \
--presence-penalty 1.0 \
--frequency-penalty 1.0 \
--top-k 1 \
--top-p 0.8 \
--temp 0.8

サーバーは以下をサポートしています:

Rockchip 公式の rkllm3-server は、model、weight、vocab、embed ファイルからローカル LLM を読み込みます。また、コンテキスト長、最大出力トークン数、NPU コアマスクの設定も可能です。

モデルの読み込みが成功すると、以下のような出力が表示されます:

Plain
rknn3_model_init success!
main: model loaded
server is listening on http://0.0.0.0:8080

これでローカル LLM API が起動しました。

ローカル LLM とチャットする

別のターミナルを開きます。

Python OpenAI SDK をインストールします:

Plain
pip3 install openai

テストプログラムを作成します:

Plain
nano llm_chat.py

書き込み:

Plain
from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8080/v1",
    api_key="sk-no-key-required"
)

response = client.chat.completions.create(
    model="",
    messages=[
        {
            "role": "user",
            "content": "Explain edge AI in three sentences."
        }
    ],
    stream=True,
    extra_body={
        "n_keep": 0,
        "cache_prompt": False,
        "id_slot": 0,
        "n_predict": 256
    }
)

for chunk in response:
    content = chunk.choices[0].delta.content

    if content:
        print(content, end="", flush=True)

print()

実行:

Plain
python3 llm_chat.py

モデルは RK1820 を介してローカルで応答を生成します。

Rockchip 公式のサンプルでも client.chat.completions.create() を使用してローカルの RKLLM3 サーバーにアクセスしており、ストリーミング、KV キャッシュ、最大出力トークン数などのパラメータに対応しています。


Qwen3.5-0.8B のパフォーマンス

RK1820 AI アクセラレータを搭載した reComputer RK3576 Dev Kit で測定:

テスト結果によると、Qwen3.5-0.8B は約以下の性能を達成できます:

生成速度:約 92.89 tokens/s

ローカルチャットアシスタント、テキスト生成、指示理解など、リアルタイム対話型アプリケーションの要件を満たすことができます。

ローカル VLM の実行

テキスト専用 LLM に加え、RK1820 では VLM(Vision-Language Models)も実行可能です。

この例では以下を使用します:

Qwen2.5-VL-3B_prune

このモデルは以下を処理できます:

Plain
Image + Prompt
      ↓
Vision Encoder
      ↓
Multimodal LLM
      ↓
Text Response

つまり、画像キャプション生成、シーン理解、視覚質問応答などのアプリケーションを実装できます。

Qwen2.5-VL-3B_prune の準備

モデルディレクトリには以下が含まれます:

Plain
Qwen2.5-VL-3B_prune/
├── Qwen2.5-VL-3B_prune.embed.bin
├── Qwen2.5-VL-3B_prune.tokenizer.gguf
├── llm_Qwen2.5-VL-3B_prune.rknn
├── llm_Qwen2.5-VL-3B_prune.weight
├── vision_Qwen2.5-VL-3B_prune.rknn
└── vision_Qwen2.5-VL-3B_prune.weight

Qwen2.5-VL のランタイムは、独立した Vision Model と LLM Model で構成されています。

VLM サーバーの起動

LLM Server が現在実行中の場合は、まず以下を使用して:

Plain
Ctrl+C

以前の実行中サービスを停止してください。

モデルディレクトリへ移動します:

Plain
cd ~/Downloads/Qwen2.5-VL-3B_prune

実行:

Plain
rkllm3-server \
-m llm_Qwen2.5-VL-3B_prune.rknn \
--weight llm_Qwen2.5-VL-3B_prune.weight \
--model2 vision_Qwen2.5-VL-3B_prune.rknn \
--weight2 vision_Qwen2.5-VL-3B_prune.weight \
--vocab Qwen2.5-VL-3B_prune.tokenizer.gguf \
--embed Qwen2.5-VL-3B_prune.embed.bin \
--host 0.0.0.0 \
--port 8080 \
-c 768 \
--n_predict 256 \
--core-mask 0xff \
--core-mask2 0xff \
--repeat-penalty 1.1 \
--presence-penalty 1.0 \
--frequency-penalty 1.0 \
--top-k 1 \
--top-p 0.8 \
--temp 0.8 \
--img-start "<|vision_start|>" \
--img-end "<|vision_end|>" \
--img-content "<|image_pad|>" \
--img-width 392 \
--img-height 392

主なパラメータは以下の通りです:

Plain
-m         → LLM Model
--model2   → Vision Model
--core-mask  → NPU Core used by LLM
--core-mask2 → NPU Core used by Vision

Rockchip 公式の Qwen2.5-VL サーバー例でも、LLM とビジョンモデルを分離して使用し、視覚言語モデルの入力画像サイズとして 392 脳 392 を採用しています。

画像理解テスト

この例では、次の画像を使用します:

Plain
/home/seeed/Downloads/people.png

作成:

Plain
nano vlm_test.py

書き込み:

Plain
import base64
from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8080/v1",
    api_key="sk-no-key-required"
)

image_path = "/home/seeed/Downloads/people.png"

with open(image_path, "rb") as image_file:
    base64_image = base64.b64encode(
        image_file.read()
    ).decode("utf-8")

response = client.chat.completions.create(
    model="Qwen2.5-VL",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url":
                        f"data:image/png;base64,{base64_image}"
                    }
                },
                {
                    "type": "text",
                    "text":
                    "Describe this image in detail."
                }
            ]
        }
    ],
    stream=True,
    extra_body={
        "n_keep": 0,
        "cache_prompt": False,
        "id_slot": 0,
        "n_predict": 256
    }
)

for chunk in response:
    content = chunk.choices[0].delta.content

    if content:
        print(content, end="", flush=True)

print()

実行:

Plain
python3 vlm_test.py

RKLLM3 の公式マルチモーダル例でも、ローカル画像を Base64 に変換し、OpenAI 互換の image_url フォーマットでローカルモデルに送信しています。

VLM 出力例

入力:

Plain
Describe this image in detail.

Qwen2.5-VL-3B_prune は、画像内の人物、位置関係、街並み環境、建物、木々、照明などを認識できます。

例えば:

Plain
The image depicts a group of people walking down
an urban street on what appears to be a sunny day...

Qwen2.5-VL-3B_prune の性能

本テストにおけるエンドツーエンドの VLM 結果を以下にまとめます。

TTFT(Time To First Token)

Plain
1.42 s

これは、画像とプロンプトを送信してから、モデルが最初のトークンの生成を開始するまでの時間です。

VLM の場合、この時間には画像処理、Vision Encoder、Multimodal Prefill、およびテキスト生成開始に必要な時間が含まれるため、純粋な LLM 単体のテストよりも実際のアプリケーション体験に近い値となります。

このテストでは n_predict=256 を設定しているため、モデル出力は 256 Streaming Chunks に達した時点で切り捨てられます。実際のアプリケーションでは、Context Length や要件に応じて最大出力 Token 数を調整してください。

ローカル AI アプリケーションの構築

rkllm3-server を使用することで、RK1820 のモデル機能を標準的な HTTP API 経由で上位レイヤーのアプリケーションに提供できます。

これにより、以下のような構成が可能になります:

Plain
Local Chat Assistant

Image Understanding

Visual Question Answering

Document / Image Analysis

Private Edge AI Assistant

典型的なアプリケーションアーキテクチャは以下の通りです:

Plain
Web UI / Python / Application
              │
              │ OpenAI-compatible API
              ▼
        rkllm3-server
              │
              ▼
          RKNN3 Runtime
              │
         PCIe Gen2 x1
              │
              ▼
            RK1820
        ┌─────┴─────┐
        │           │
       LLM         VLM

この方法により、上位レイヤーのアプリケーションは RKNN3 Runtime を直接操作することなく、API 経由で RK1820 上で動作するローカル AI モデルを呼び出せます。

RK1820 の監視

LLM または VLM アプリケーションの実行中は、以下を使用します:

Plain
sudo rknn-smi info -w

リアルタイムで以下を確認できます:

Plain
NPU Utilization
Memory Usage
Temperature
Health Status

モデル実行中の RK1820 の状態を観察するためです。

まとめ

RK1820 を活用することで、reComputer RK3576 はローカルで LLM および VLM を実行でき、rkllm3-server を通じてそのモデル機能をローカル API として上位レイヤーのアプリケーションに提供できます。

今回の検証結果は以下の通りです:

アプリケーションモデル結果
ローカル LLMQwen3.5-0.8B✅ 92.89 tokens/s
ローカル VLMQwen2.5-VL-3B_prune✅ 1.42 s TTFT