はじめに
この度、大学の研究室に共用計算機としてMac Studioが導入されたということで、これを使って研究室メンバーがAPIを叩いてLLMを利用できるようにしていきたいと思います。
利用するツール
- Mac Studio (2025, M3Ultra, 512GB Unified Memory)
- remoteSSH
- Ollama
- LiteLLM
システム構造
今回の目的は、OpenAIのAPI互換のPythonコードでもってMac Studio上のローカルモデルを呼び出し、推論ができるようにすることです。
<個人PC> --> <LiteLLM> --> <Ollamaサーバー>
remoteSSH
私の研究室では共用の計算資源へアクセスする方法としてremoteSSHが採用されています。今回もその慣例に倣い、ローカルネットワーク下であるなしかかわらず、VSCodeから安全にアクセスできるようにしました。
Ollama
オープンソースモデルをローカル環境で動かすツールは数多く存在しますが、中でも今回は個人PCからCLIで動かすということで、調べた中で最も使いやすいと感じたOllamaを利用します。
※今回は以下のサイトを参照しました。
LiteLLM
今回Ollamaの前にプロキシサーバーを立てるのに利用したのが、LiteLLMです。
導入の主たる目的は、既定のモデル以外を大量にロードすることによるリソースの圧迫を避けることです。LiteLLMの設定の中で指定したモデル以外のリクエストを拒否することにより、それを実現しています。
また、同じPythonコードでClosedモデルにAPI経由でアクセスするのに便利という嬉しい副作用もあります。
実装手順
Ollama
- Ollamaのインストール
- 利用するモデルのロード
OllamaではOllama側が公式で提供しているモデルの他に、Hugging Face上で公開されているモデルを利用することもできます。
後者の場合は.gguf形式で公開されているものを選ぶか、自分で.gguf形式に変換するかが必要となります。
# Ollamaの公式ライブラリからロードする場合はそのまま指定(コロン以降でモデルサイズ指定)
ollama pull gemma3:4b
# 公式ライブラリにない.gguf形式モデルをロードする場合 (hf.co以下はモデルに準ずる)
ollama pull hf.co/unsloth/granite-4.0-micro-GGUF
- Ollamaサーバー用のscreenセッションに入る
APIサーバー化するので管理者アカウントでログインしていないときに動かないということでは問題があります。
そこで今回はscreenセッションを利用して、そのアカウントにログインしていなくともOllamaが動き続けるようにしていきたいと思います。
screen -S ollama_server
- screenセッション内でサーバーを起動
作成したscreenセッションの中でOllamaを起動します。
ollama serve
# Ctrl + A -> Dでデタッチしてscreenセッションから抜けられる
コマンドを実行すると処理待ちになり動かなくなるが正常
| コマンド | 内容 |
|---|---|
| ollama serve | Ollamaを起動 |
| ollama create <モデル名> -f Modelfile | Modelfileからモデルを作成 |
| ollama show <モデル名> | モデル情報を見る |
| ollama run <モデル名> | モデルを実行 |
| ollama stop <モデル名> | モデルを停止 |
| ollama pull <モデル名> | モデルを取得 |
| ollama push <モデル名> | モデル一覧にモデルを登録 |
| ollama list | ロード済みモデル一覧 |
| ollama ps | 動作中モデル一覧 |
| ollama cp <モデル名> <新しいモデル名> | モデルのコピー |
| ollama rm <モデル名> | モデルの削除 |
LiteLLM
- LiteLLMのインストール
pip install "litellm[proxy]"
- プロキシ設定ファイルを作成
nano litellm_config.yaml
model_list:
# メンバーに利用を許可するモデルをここに列挙します
- model_name: gemma3-4b # メンバーがコードで指定する名前
litellm_params:
model: ollama/gemma3:4b # Ollamaでの実際のモデル名
api_base: <http://localhost:11434>
- model_name: qwen3-4b
litellm_params:
model: ollama/qwen3:4b
api_base: <http://localhost:11434>
- model_name: openai/* # openaiの全モデルを許可
litellm_params:
今回は例として、"Gemma3 4B", "Qwen3 4B", "OpenAIのAPIアクセスモデル"を設定します。
※modelで指定する名前は以下を参照
Closedモデルのサポートのために、ワイルドカード設定を利用していますが、動作確認できていないためうまく動くかは不明です
https://docs.litellm.ai/docs/proxy/model_access
- LiteLLM用のscreenセッションの中でLiteLLMプロキシを起動
# screenセッションを起動
screen -S litellm_proxy
# screenの中でプロキシを起動
litellm --config litellm_config.yaml
# screenからデタッチ (Ctrl + A -> D)
model情報を記述したconfigファイルを編集するたびにこの操作をやり直す必要があります
実行例
研究室の中のネットワーク内で実行するか否かで実行の仕方が異なります。
ネットワーク内ならば個人PCから直接LiteLLMを指定するだけで良いですが、外ならばremoteSSHでMac Studioかその他の研究室内のサーバーに繋ぐ必要があります。
from openai import OpenAI
client = OpenAI(
base_url = "http://<MacStudioのIPアドレス>:4000" # MacStudio上のLiteLLMを指定
api_key = "litellm" # これはダミーコード(API利用ならAPIキー指定)
)
response = client.chat.completions.create(
model = "gemma3-4b", # "設定済みモデル"に記載のカッコ内の設定名をそのまま転記
messages = [
{"role": "user", "content": "こんにちは!"}
],
temperature = 0.7,
)
print(response.choices[0].message.content)
感想
Macとはいえサーバーの設定というなかなかない機会をいただき良い経験になりました。
一方でネットワークに関する知識がまったくないことにも気づけたため、これを機にまとまった時間をとって勉強しなければと思いました。