0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jetson / 産業用PCとAWS IoT Greengrassを連携させたエッジ推論基盤の実装レシピ

0
Posted at

Jetson / 産業用PCとAWS IoT Greengrassを連携させたエッジ推論基盤の実装レシピ

Feature(208).png

はじめに

こんにちは、NKKTech Global 技術チームです。

エッジAIプロジェクトがPoC(概念実証)から本番量産フェーズに進む際、必ずぶつかるのが以下の課題です。

  • 「現場のJetsonに新しいAIモデル(重みファイル)をどうやって安全にOTA(Over-The-Air)配信するか?」
  • 「コンテナ内部からJetsonのGPUアクセラレータ(TensorRT / CUDA)を正しく叩かせるにはどう設定すべきか?」
  • 「工場の回線が切れた際、エッジ単独で自律稼働させながら、復旧時に推論結果をどうクラウドへ同期するか?」

これを解決する標準基盤が AWS IoT Greengrass v2 です。Greengrassを活用することで、AWSマネジメントコンソールやCI/CDから、世界中のエッジデバイスへDockerコンテナやモデル重みを一括展開・監視できるようになります。

本記事では、Jetsonの初期プロビジョニングから、GPUパススルー対応のDockerコンテナ作成、Greengrass v2コンポーネントレシピの書き方までを網羅した実装レシピを公開します。


1. システム全体アーキテクチャ

クラウド側で管理されたモデル重みとコンテナイメージが、AWS IoT Greengrassを通じて現場のJetsonへ自動配信されるパイプラインです。


2. エッジ端末(Jetson)の事前準備

Jetson上でDockerコンテナからGPUを認識させ、Greengrassを稼働させるためのOS層の設定です。

① NVIDIA Container Toolkitの確認

JetPack 5.x / 6.x では標準で組み込まれていますが、Dockerのデフォルトランタイムが nvidia になっているか確認します。

# /etc/docker/daemon.json の設定確認
cat <<EOF | sudo tee /etc/docker/daemon.json
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
EOF

sudo systemctl restart docker

② Greengrass Core v2 の自動プロビジョニング

AWS CLIからクレデンシャルを取得し、端末を「モノ(Thing)」として登録します。

# Javaランタイム(Greengrass必須要件)のインストール
sudo apt-get update && sudo apt-get install -y openjdk-11-jdk

# Greengrassインストーラの取得とセットアップ
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip
unzip greengrass-nucleus-latest.zip -d GreengrassInstaller

sudo -E java -Droot="/greengrass/v2" -Dlog.level=INFO \
  -jar ./GreengrassInstaller/lib/Greengrass.jar \
  --aws-region ap-northeast-1 \
  --thing-name Factory-Line1-JetsonOrin \
  --thing-group-name Factory-Inference-Group \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --setup-system-service true

3. 推論コンテナの設計とDockerfile

エッジ端末側で重いビルドを走らせないため、ベースイメージには公式のJetson向けコンテナを採用します。

# Dockerfile
FROM nvcr.io/nvidia/l4t-tensorrt:r8.5.2.2-devel

WORKDIR /app

# 依存ライブラリのインストール
RUN apt-get update && apt-get install -y --no-install-recommends \
    python3-pip \
    libglib2.0-0 \
    libgl1-mesa-glx \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt

# Greengrass IPC通信用SDK
RUN pip3 install --no-cache-dir awsiotsdk

COPY src/ /app/src/

ENTRYPOINT ["python3", "/app/src/main.py"]

4. Greengrass v2 コンポーネントレシピ (recipe.yaml)

ここが最も重要な部分です。モデル重み(S3)とコンテナ(ECR)を分離定義し、**「モデルだけ更新したい場合はコンテナの再pullを不要にする」**設計にします。

---
RecipeFormatVersion: '2020-05-31'
ComponentName: com.nkktech.visual.inspection
ComponentVersion: '1.0.0'
ComponentDescription: 'Jetson TensorRT Visual Inspection with GPU'
ComponentPublisher: 'NKKTech Global'

ComponentConfiguration:
  DefaultConfiguration:
    camera_rtsp_url: "rtsp://192.168.1.100:554/live"
    confidence_threshold: 0.75
    accessControl:
      aws.greengrass.ipc.mqttproxy:
        com.nkktech.visual.inspection:mqttproxy:1:
          policyDescription: 'AWS IoT CoreへのMQTT送信を許可'
          operations:
            - 'aws.greengrass#PublishToIoTCore'
          resources:
            - 'factory/line1/inspection/alerts'

Manifests:
  - Platform:
      os: linux
      architecture: aarch64 # Jetson (ARM64)
    Artifacts:
      - URI: "s3://nkktech-models-ap-northeast-1/models/defect_yolov8n_fp16.engine"
        Unarchive: NONE
        Permission:
          Read: OWNER
    Lifecycle:
      Install: |
        # ECRへのログイン認証
        aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
        docker pull 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/jetson-inspection:v1.0
      Run: |
        # GPUパススルーとGreengrass IPCソケットのマウント
        docker run --rm \
          --name visual-inspector \
          --runtime=nvidia \
          --network=host \
          -v {artifacts:path}/defect_yolov8n_fp16.engine:/models/model.engine \
          -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \
          -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT=$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \
          -e SVCUID=$SVCUID \
          -e CAMERA_URL="{configuration:/camera_rtsp_url}" \
          -e THRESHOLD="{configuration:/confidence_threshold}" \
          123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/jetson-inspection:v1.0
      Shutdown: |
        docker stop visual-inspector || true

5. 推論結果をAWS IoT Coreへ送るPython実装(IPC通信)

コンテナ内部から、Greengrass IPC(プロセス間通信)を経由してAWS IoT CoreへアラートをMQTT送信します。インターネット接続用クレデンシャルをコンテナ内に置く必要がありません。

import os
import json
import time
import awsiot.greengrasscoreipc
from awsiot.greengrasscoreipc.model import (
    PublishToIoTCoreRequest,
    QOS
)

TOPIC = "factory/line1/inspection/alerts"

def send_alert_to_cloud(ipc_client, defect_type, score):
    payload = {
        "device_id": os.environ.get("AWS_IOT_THING_NAME", "jetson-01"),
        "timestamp": int(time.time()),
        "defect_type": defect_type,
        "confidence_score": round(score, 3),
        "action": "LINE_STOP_SIGNAL_EMITTED"
    }

    request = PublishToIoTCoreRequest()
    request.topic_name = TOPIC
    request.payload = json.dumps(payload).encode('utf-8')
    request.qos = QOS.AT_LEAST_ONCE

    operation = ipc_client.new_publish_to_iot_core()
    operation.activate(request)
    future = operation.get_response()
    future.result(timeout=5.0)
    print(f">> [IPC MQTT SUCCESS] Sent alert: {payload}")

def main():
    # Greengrass IPCクライアントの接続確立
    ipc_client = awsiot.greengrasscoreipc.connect()
    print("Connected to Greengrass Core IPC.")

    # (※カメラ映像取得とTensorRT推論ループ)
    while True:
        # 異常検知シミュレーション
        time.sleep(10)
        send_alert_to_cloud(ipc_client, defect_type="SCRATCH_DETECTED", score=0.88)

if __name__ == "__main__":
    main()

6. 工場実運用でのトラブル防止ノウハウ(EdgeOps)

  1. OOM(Out of Memory)キラーの回避:
    JetsonはメインメモリとVRAM(GPUメモリ)が統合されたUnified Memoryアーキテクチャです。メモリが枯渇するとOS全体がクラッシュするため、Docker起動時に必ず --memory=6g --memory-swap=6g などの上限を課し、nvpmodel -m 0(最大パフォーマンスモード)とZRAMスワップの調整を行います。
  2. 帯域削減(画像はアップロードしない):
    正常品の動画を常時クラウドに送ると工場の通信帯域を圧迫します。**「推論はエッジで完結」「クラウドにはメタデータ(JSON)のみ送信」「NG判定時のみ前後のキャプチャ画像をS3へ非同期アップロード」**する構成を徹底します。
  3. カナリアデプロイメント:
    100台のエッジに一斉適用するのではなく、AWS IoT Greengrassの「Thing Group」機能を用いて、まず「Line1-Test-Group(1台)」にモデルを適用し、誤検知率をモニタリングした後に全社展開します。

まとめ:エッジAIの真の価値は「運用の自動化」にある

どれほど精度の高い画像認識モデルを作っても、現場の端末へ安全に配信・ロールバックできるインフラがなければ、製造現場での実用化は不可能です。

  • AWS IoT Greengrass v2 により、現場に行かずにクラウドからエッジを一元管理。
  • NVIDIA Container Toolkit + TensorRT により、コンテナ仮想化とミリ秒推論を両立。
  • IPCプロキシ経由のMQTT通信 により、証明書管理の安全性を極限まで向上。

NKKTech Globalでは、産業用PC・Jetsonの選定から、エッジ向けモデル軽量化(TensorRT INT8量子化)、GreengrassによるMLOps/EdgeOps基盤の設計・運用までをグローバル体制で支援しています。


お問い合わせ先

エッジAIシステムの現場導入、AWS IoT Greengrass環境の設計・構築、Jetson向け画像認識モデルの最適化に関するご相談は、下記よりお気軽にお問い合わせください。

著者:NKKTech Global 技術チーム
私たちは、組み込みエッジ技術とクラウドエンジニアリングを融合させ、世界のスマートファクトリー化を強力に牽引します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?