1
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?

IBM CloudのCode EngineとRaspberry Piの組み合わせで、環境を構築してみた。

Last updated at Posted at 2025-10-11

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 プロジェクト作成

  1. IBM Cloudのアカウントを持っていない人は、アカウントの作成から。
  2. IBM Cloud Code Engine コンソール にログイン。
  3. 「Create project」 → プロジェクト名例 pi-llm-demo
  4. 「CLI にコピー」で表示されるAPIキー情報を控える。

ステップ 2:Flask API アプリを作成(Mac)

Flask APIアプリを作成して、Code EngineへDeployしていきます。

Step 2-1. Docker Desktop のインストールと起動(Macの場合)

  1. ダウンロード
    Docker Desktop for Macの公式サイトからインストーラ(.dmg)をダウンロード。

  2. インストール
    • .dmg を開いて「Docker.app」を Applications フォルダにドラッグ。
    • 起動時に管理者権限を求められた場合は承認。

  3. 起動確認
    • メニューバー右上に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 の導入と設定

  1. 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を参考にして実装をお願いいたします。
機会がありましたら、追加でその部分を書いて行きます。


1
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
1
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?