Raspberry Pi × IBM Code Engine × LLM
実験:Raspberry Piで得たセンサー値をCode Engine経由でLLM整形する(ラズパイ部分は未実装です)
概要
Raspberry Piで取得したセンサー値(温度・湿度など)をIBM Code EngineのWeb APIに送信し、クラウド側でLLMを使って自然文コメントを生成し、戻すといった実験をしてみます。
今回のテストにおける価値と目的
1. エッジ×クラウドAIの実験的統合
IBM Code Engineはクラウド上でスケーラブルにコードを動かせる「サーバーレス実行環境」で、Raspberry Piは手元でセンサー制御や軽量推論を行える「エッジコンピューティング環境」です。
両者の組み合わせで、ローカルでデータの観測・収集を行い、クラウド側で解析・生成というAIワークロード全体を、小規模ながら再現できます。
つまり、「Raspberry Piがリアル世界の入口、Code EngineがAI解析の頭脳」という役割分担を体験できます。
2. クラウドリソースを“必要な時だけ”使う構成
Code Engineはトラフィックに応じて自動スケールしますので、無負荷時には課金されません。
これによって、Raspberry Piなどの常時稼働デバイスが低消費電力+低コストでAI活用できる仕組みを作れます。
「使うときだけクラウドが立ち上がる」構成は、IoT時代に極めて効率的かと思います。
3. LLMを“クラウド推論API”として抽象化
Raspberr Pi側ではLLMを直接実行せず、Code Engine上でAPI化されたLLMを呼び出します。
これにより、
- デバイスを選ばない(Raspberry PiでもESP32でも同じAPIを叩ける)
- 複数のLLM(watsonx.ai、Ollama、OpenAIなど)を統一的に扱える
といった利点が得られます。
「どのLLMを使うかをクラウド側で抽象化」する設計は、将来的なサービス展開にもつながります。
4. RAGやEdge AIの前段としての価値
この構成は、RAG(Retrieval Augmented Generation)やローカルLLM拡張の前段階実験としても有用です。
Raspberry Pi側で軽量モデル(例:gemma3:270M
)を常駐させ、
クラウド側(Code Engine)で重いモデル(例:granite4:small-hgraniteの32b
や watsonx API)を呼び出すハイブリッド構成を試す基盤になります。
これにより、「どの処理をローカルに」「どこからクラウドにオフロードするか」の分離実験も可能です。
5. 可観測性・スケーラビリティの学習題材
Code Engineにはログ、イベント、メトリクス可視化が備わっており、
Rasoberry Piからのアクセス数や応答レイテンシ、LLM推論コストなどを簡単にトレースできます。
これにより、サーバーレスAI APIのスケーリングの動きを確認しながら学ぶことができます。
6. この実験から学べる技術要素まとめ
分野 | 学べる内容 |
---|---|
IoT通信 | Raspberry Pi→クラウドHTTP送信、センサー値JSON化 |
コンテナ/DevOps | Webサーバー(Flask)アプリのDocker化とデプロイ |
クラウドネイティブ | Code Engineの自動スケーリング、環境変数管理 |
LLM API利用 | OpenAI/watsonx/Ollama互換API構造の理解 |
システム設計 | エッジ+クラウド連携のアーキテクチャ思考 |
7. 構成概要
[Raspberry Pi]
↓ POST(JSON)
[IBM Code Engine Flask API]
↓ (内部で LLM 推論)
[Response: 自然言語コメント]
8. 前提条件
項目 | 内容 |
---|---|
Raspberry Pi 4B / 5 | Raspberry Pi OS Bookworm (4 GB 以上) |
Python | 3.9 以上(requests , psutil 導入済み) |
IBM Cloud アカウント | 無料枠で可 |
LLM API | watsonx.ai または Ollama クラウド互換 API |
Docker Hub アカウント | Code Engine デプロイに使用 |
9. 作業ステップ
これ以降のステップは、MacとRasoberry Piで行います。Windowsの方は、適宜置き換えをお願いいたします。
ステップ 1:Code Engine プロジェクト作成
- IBM Cloudのアカウントを持っていない人は、アカウントの作成から。
- IBM Cloud Code Engine コンソール にログイン。
-
「Create project」 → プロジェクト名例
pi-llm-demo
。 - 「CLI にコピー」で表示されるAPIキー情報を控える。
ステップ 2:Flask API アプリを作成(Mac)
Flask APIアプリを作成して、Code EngineへDeployしていきます。
Step 2-1. Docker Desktop のインストールと起動(Macの場合)
-
ダウンロード
• Docker Desktop for Macの公式サイトからインストーラ(.dmg)をダウンロード。 -
インストール
• .dmg を開いて「Docker.app」を Applications フォルダにドラッグ。
• 起動時に管理者権限を求められた場合は承認。 -
起動確認
• メニューバー右上にDockerアイコン が表示されていれば起動中。
• ターミナルで以下を実行:
docker --version
下記のような表示が出ればOK
Docker version 28.4.0, build d8eb465
ステップ 2-2:開発フォルダの作成
mkdir ~/pi_llm_api && cd ~/pi_llm_api
ステップ 2-3:Flask API アプリを作成(ローカル)
app.py
from flask import Flask, request, Response
import os
import requests
import json
app = Flask(__name__)
# --- 安全な環境変数の取得 ---
LLM_API_URL = os.getenv("LLM_API_URL", "https://api.openai.com/v1/chat/completions")
LLM_API_KEY = os.getenv("LLM_API_KEY", "")
@app.route("/")
def index():
return "Pi LLM API is running"
@app.route("/analyze", methods=["POST"])
def analyze():
data = request.get_json(force=True)
temp = data.get("temperature", "不明")
humidity = data.get("humidity", "不明")
prompt = f"現在の室温は {temp}℃、湿度は {humidity}% です。これに対してアドバイスを一文で日本語で述べてください。"
try:
payload = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7
}
headers = {"Authorization": f"Bearer {LLM_API_KEY}"}
res = requests.post(LLM_API_URL, json=payload, headers=headers, timeout=20)
res.raise_for_status()
comment = res.json()["choices"][0]["message"]["content"]
# --- Unicodeエスケープを抑止して日本語のまま返す ---
response_json = json.dumps({"comment": comment}, ensure_ascii=False)
return Response(response_json, content_type="application/json; charset=utf-8")
except Exception as e:
error_json = json.dumps({"error": str(e)}, ensure_ascii=False)
return Response(error_json, content_type="application/json; charset=utf-8", status=500)
# --- Code Engine対応: 0.0.0.0:8080で待機 ---
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
ステップ 2-4:Dockerfile 作成
FROM python:3.10-slim
WORKDIR /app
COPY app.py .
RUN pip install --no-cache-dir flask requests
# --- Code Engineがリッスンポートを検出するために必要 ---
EXPOSE 8080
CMD ["python", "app.py"]
ステップ 2-5:ローカル動作確認
docker build -t pi-llm-api .
docker run -p 8080:8080 pi-llm-api
ブラウザで
http://localhost:8080
→ “Pi LLM API is running” が表示されればOK。
ステップ 5:Docker Hub へ push(Mac上で)
下記に出てくる your_dockerhub_id は、あなたのDocker Hubアカウント名(ユーザーID) のことを指します。
docker login
docker tag pi-llm-api your_dockerhub_id/pi-llm-api
docker push your_dockerhub_id/pi-llm-api
そして、Docker Hub のWeb画面で pi-llm-api が表示されていればOKです。
https://hub.docker.com/r/your_dockerhub_id/pi-llm-api
ステップ 6:IBM Cloud CLI の導入と設定
- CLIインストール(Mac上)
brew install --cask ibm-cloud-cli
ibmcloud plugin install code-engine
インストール確認
ibmcloud --version
出力例
ibmcloud 2.37.1 (8cc6b022b-2025-09-26T18:37:10+00:00)
Copyright IBM Corp. 2014, 2025
2.ログイン
ibmcloud login --sso
ブラウザでIBM Cloudにサインインし、認証コードを入力してログインします。
ステップ 7:Code Engine プロジェクト作成とアプリデプロイ
① リソースの確認
ibmcloud target
出力例
API エンドポイント: https://cloud.ibm.com
Region: jp-tok
ユーザー: XXXXX@XXXXXXXX.co.jp
アカウント: TxxxxxMxxxxCo., Ltd. (b25e814bxxxxxc63b4bxxxxx583xxxxa) <-> 200000n
リソース・グループ: リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
リソースグループターゲットが、ターゲットになっていないメッセージが出た場合は、Defaultをターゲットとして指定しておきます。
ibmcloud target -g Default
② Code Engineプロジェクト作成
ibmcloud ce project create --name pi-llm-demo
ibmcloud ce project select --name pi-llm-demo
③ Docker イメージのビルド & Push(Mac → x86_64)とアプリデプロイ
Apple Silicon Mac は arm64 なので、Code Engine (x86_64) 向けに明示ビルドします。
# Buildx を有効化(初回のみ)
docker buildx create --use
# x86_64 向けにビルド&即 Push
docker buildx build --platform linux/amd64 -t techmind428/pi-llm-api . --push
ibmcloud ce application create \
--name pi-llm-api \
--image docker.io/your_dockerhub_id/pi-llm-api \
--port 8080 \
--env LLM_API_URL=https://api.openai.com/v1/chat/completions \
--env LLM_API_KEY=sk-xxxxx
今回の例では、OpenAIのapiを使う想定となっています。your_dockerhub_idや、API_KEYには各自の値を入れてください。
APIキーは環境変数で渡すだけで、GUIにもマスクされ、セキュアに保持されます。
watsonx.aiやOllama APIでも同様に設定可能です。
④ 起動確認
ibmcloud ce application get --name pi-llm-api
Status: Ready が表示され、URL項目でURLが発行されます。
例:
https://pi-llm-api.21d0xjzxxxxx.jp-tok.codeengine.appdomain.cloud/
そのURLをブラウザーで開くと
Pi LLM API is running
が表示されます。
ステップ 8:API 動作確認(Mac上)
curl -X POST -H "Content-Type: application/json" \
-d '{"temperature":25.3,"humidity":60.2}' \
https://pi-llm-api.21d0xjzxxxxx.jp-tok.codeengine.appdomain.cloud/analyze
出力例
{"comment": "室内を快適に保つためには、エアコンや扇風機を上手に活用してください。"}
Code Engine の「Logs」タブでもアクセス履歴を確認可能。
ステップ9:app.pyを修正した場合
下記の手順で、アプリケーションの修正を反映させることができます。
# 新バージョンをビルド&Push
docker buildx build --platform linux/amd64 -t your_dockerhub_id/pi-llm-api . --push
# Code Engine 上でローリングアップデート
ibmcloud ce application update \
--name pi-llm-api \
--image docker.io/your_dockerhub_id/pi-llm-api
✅ 最後に
この手順で以下が体験できるようになりました。
- Code Engine アプリデプロイ
- Pi → クラウド通信 + LLM 応答パイプライン
- ログ/スケール監視
→ Raspberry Pi + クラウド LLM の最小実験環境が完成しました
Raspberry Piから直接Code Engine上のアプリを呼び出すサンプルは提供できませんでしたが、ステップ8を参考にして実装をお願いいたします。
機会がありましたら、追加でその部分を書いて行きます。