3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

久しぶりの投稿です。最近のAI関連の進化が早すぎて、情報を追うだけでも一苦労です。
さて、以前からAIエージェントによる自動コーディングをやってみたいと考えていました。ようやく構想が少し形になってきたので、記事にしてみることにしました。

いざ自分の環境でAIエージェントを動かそうとすると、APIの課金が気になります。かといって、ローカルでコーディングができるLLM(大規模言語モデル)を動かせるほどのVRAMを積んだGPUも手元にありません。
手詰まりに感じていたのですが、オンラインで無料のGPU環境を活用して自分用のAPIサーバーを作る方法に辿り着いたので、備忘録として手順を残します。

本記事では、Kaggleの無料GPU(16GB VRAM × 2枚)を利用して自分専用のLLM APIサーバーを構築し、ngrok経由で自PCから利用する方法 を説明します。

構成

  1. Kaggle(クラウド): 実行環境。無料でもT4 GPUが1週間で30時間まで利用可能です。ここでLLMを稼働させます。
  2. ngrok(トンネル): API公開サービス。Kaggle上で動くローカルサーバーのポート(11434)を、インターネット越しにアクセスできるようにトンネリングします。
  3. Ollama(オラマ): ローカル環境でLLMを簡単にダウンロード・実行できるプラットフォーム。今回はKaggleのGPU環境にインストールし、コーディング用APIサーバーとして機能させます。
  4. クライアント(自PCなど): ngrokが発行したURLをエンドポイントとして設定し、手元のPCからAPI経由でLLMを利用します。

手順1. ngrokのAuthtokenを取得

Kaggleのローカル環境を外部公開するために、ngrokのアカウントを作成します。

  1. ngrokの公式サイトにアクセスし、無料アカウントを作成してログインします。
  2. ダッシュボード左側のメニューから Authtoken > Add Authtoken からトークンを追加します。
    スクリーンショット_20260416_232126.png
  3. 追加したトークンのトークン文字列をコピーしておきます。

手順2. Kaggleでの事前準備

Kaggle Notebook(ブラウザ上でPythonコードなどを実行できる環境)を作成し、環境を整えます。

  1. Kaggleの公式サイトにアクセスし、無料アカウントを作成してログインします。

  2. Kaggleで新しいNotebookを作成します。

  3. トークンの保存: 画面上部の Add-ons -> Secrets を開き、LabelNGROK_AUTHTOKENValue に先ほどコピーしたトークンを入力して保存します。
    image.png

  4. GPUの有効化: 画面右側の設定パネル(Notebook options)を開き、「Accelerator」を「GPU T4 x2」に変更します。
    (※GPUを利用するには、Kaggleアカウントに携帯電話番号を登録してSMS認証(Verification)を完了させておく必要があります)
    image.png

  5. インターネット接続: 同じ設定パネル内の「Internet」が「On」になっていることを確認します。
    image.png

手順3. Kaggle上でAPIサーバーを構築・公開する

KaggleのNotebookには「セル」と呼ばれるコードの入力・実行ブロックがあります。以下のコードを別々のセルに貼り付け、上から順に実行(再生ボタンをクリック)するだけで、APIサーバーが立ち上がります。

セル1:OS依存ツールのインストールとGPU確認

KaggleはLinuxベースのPython実行環境です。先頭に ! をつけることでOSコマンドを実行できます。

Python
# 依存ツールとハードウェア認識ツールのインストール
!apt-get update && apt-get install -y zstd pciutils
# GPUの状態確認
!nvidia-smi

実行後、T4 GPUが2枚認識されている表が出力されれば成功です。

セル2:Ollamaのインストールと外部公開設定

Ollamaはデフォルトでローカルホスト(Kaggle内部)以外からの接続を拒否するため、環境変数でCORSポリシーを緩和し、ngrokからのアクセスを許可します。

Python
import os
import subprocess
import time

# 1. Ollamaのインストール
!curl -fsSL https://ollama.com/install.sh | sh

# 2. サーバー起動設定
OLLAMA_PATH = "/usr/local/bin/ollama"
custom_env = os.environ.copy()
custom_env["OLLAMA_HOST"] = "[::]:11434"  # 外部アクセスを許可
custom_env["OLLAMA_ORIGINS"] = "*"        # CORSポリシーの緩和
custom_env["OLLAMA_KEEP_ALIVE"] = "-1"    # モデルをメモリに常駐させる

# バックグラウンドでOllamaサーバーを起動
with open("ollama.log", "w") as log_file:
    # 既存プロセスを掃除
    subprocess.run(["pkill", "-9", "ollama"], check=False)
    # 外部アクセスを許可した状態で起動
    subprocess.Popen([OLLAMA_PATH, "serve"], env=custom_env, stdout=log_file, stderr=log_file)

print("Waiting for Ollama server to start...")
time.sleep(12)

# 起動確認
!/usr/local/bin/ollama --version

セル3:モデルのダウンロードとngrokでの公開

LLMモデルをプルし、Basic認証をかけてngrokで公開します。
※モデルはお好みで。gemma4:26b は、おすすめです。

Python
# モデルのダウンロード
!/usr/local/bin/ollama pull gemma4:26b

!pip install -q pyngrok
from pyngrok import ngrok
from kaggle_secrets import UserSecretsClient

user_secrets = UserSecretsClient()
NGROK_TOKEN = user_secrets.get_secret("NGROK_AUTHTOKEN")

# セキュリティのためのBasic認証設定(必ず任意のものに変更してください)
BASIC_AUTH_USER = "your_username"
BASIC_AUTH_PASS = "your_password"

ngrok.set_auth_token(NGROK_TOKEN)

try:
    # 既存のトンネルがあれば切断
    tunnels = ngrok.get_tunnels()
    for t in tunnels:
        ngrok.disconnect(t.public_url)

    # 11434ポートをBasic認証付きで公開
    public_url = ngrok.connect(11434, auth=f"{BASIC_AUTH_USER}:{BASIC_AUTH_PASS}")
    
    print("=== API Server Information ===")
    print(f"Public URL: {public_url}")
    print(f"Auth: {BASIC_AUTH_USER} / {BASIC_AUTH_PASS}")
    print(f"Test Cmd: curl -u {BASIC_AUTH_USER}:{BASIC_AUTH_PASS} -H 'ngrok-skip-browser-warning: 1' {public_url}/api/tags")
    print("==============================")
except Exception as e:
    print(f"ngrok Error: {e}")

出力された Public URL: のURL(例: https://xxxx-xx-xx-xx.ngrok-free.app)をメモしておきます。

手順4. 自PCからインターネット越しにAPIを利用する

サーバーが立ち上がったら、ローカルのターミナルやプログラムから呼び出してみます。

curlを使ったテスト実行
ターミナルから以下のコマンドを実行します。(URL、ユーザー名、パスワードはご自身のものに置き換えてください)

Bash
curl -X POST https://<取得したngrokのURL>/api/generate \
     -u "your_username:your_password" \
     -H "Content-Type: application/json" \
     -d '{
           "model": "gemma4:26b",
           "prompt": "Reactでボタンコンポーネントを書いて",
           "stream": false
         }'

※初回のアクセスは、モデルがVRAMにロードするために応答が返ってくるまで数分かかります。

⚠運用上の注意点(セッション切れ)

Kaggle Notebookは、ブラウザでの操作がない状態(アイドル状態)が約40分続くとインスタンスが停止してしまいます。セッションが切れてしまった場合は、1つめのセルから順番に動かしてください。

APIサーバーとして長時間稼働させたい場合は、Kaggleの画面右上にある「Save Version」から「Save & Run All(バックグラウンド実行)」を選択することで、最大12時間連続稼働させることができるようですが、うまく継続させるためには何かコツが必要そうです。まずはインタラクティブモード(ブラウザを開きっぱなし)での検証をおすすめします。

おわりに

Kaggleとngrokで、実質無料でそこそこ実用的(個人の趣味レベルです(汗))なAIバックエンドを構築できました。
次はこのAPI環境を利用して、ほったらかしでコーディングとテストをするような、自動開発を試す予定です。形になってきたら、また記事にしようと思います。下記は作成中のスクショの一部です。

3
4
1

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
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?