もうダチョウ倶楽部の「ムッシュムラムラ、ストッピング!」というネタ状態。Open WebUIとOllamaが連携できました!だけでは済まない問題。
Tailscale を使い、どこからでもアクセスできる “メイン LLM アプライアンス” として、EVO-X2 (Ubuntu)上に Ollama 環境を構築することにした。(その先には大学へ納品するLLMサーバの構築があってそのリハーサルも兼ねていた。。。)
最初は実に順調だった。普通にチャットをするだけなら速い。軽い。静か。しかもローカル完結。正直、「これはもう完成では?」と思ったくらいだった。ところが、Open WebUI と組み合わせて、本格的に Agent、Web Search、Vision、Task Model、Function Calling といった “ちゃんとした統合運用” を始めた瞬間、空気が変わった。Chat 用、Agent 用、Vision 用、Task 用と、用途別にモデルを切り替えながら使おうとすると、最初のモデルは元気に動くのに、2つ目へ切り替えた途端、Open WebUI が静かに固まる。
エラーは出ない。
クラッシュもしない。
ただひたすら、
と表示されたまま帰ってこない。脳内でダチョウ倶楽部の「ストッピング!」がリピートし出したw
最初は Open WebUI を疑った。次に Ollama を疑った。Qwen3.5 を疑った。GPU メモリ不足も疑った。ROCm も疑った。Docker も疑った。果ては自分まで疑い始めた。しかし調べていくと、実際には Open WebUI も Ollama も “壊れていた” わけではなかった。なんというか、「誰も踏み入れたことがない世界」に、うっかり足を踏み入れてしまったような感覚だった。
当初は、
-
Open WebUI 側の Agent 設定
-
Ollama の runner 管理
-
Native Function Calling
-
Reasoning 制御
-
think パラメータ
などを疑っていたが、実際には Open WebUI も Ollama も本質的な原因ではなかった。原因は、古い Ollama バージョンと、Qwen 系モデルの reasoning 出力特性、さらに Ollama の runner 再利用挙動が複合的に重なったことだった。
特に大きかったのが、Ollama の runner 再利用だった。
当初は、
qwen3.5:9b-chat-32k
qwen3.5:9b-agent-32k
qwen3.5:9b-code-32k
qwen3.5:9b-summarize-32k
のように、用途別に細かくモデルを分ければ、内部的にも完全に別プロセスとして扱われると考えていた。
しかし実際には、Ollama は、
-
同じベースモデル
-
同じ quantization
-
同じ context
-
近い runtime parameter
の場合、内部 runner を再利用する。
つまり、モデル名が違っていても、
qwen3.5:9b-main-32k
qwen3.5:9b-agent-32k
は、内部的には同じ runner が使われる場合がある。
そのため、
-
Chat 用設定
-
Agent 用設定
-
Reasoning 制御
-
think 設定
が、期待通りに完全分離されないケースが発生した。
実際に、
では、Agent を呼び出したつもりでも、別名モデルではなく既存 runner が継続利用されている挙動が確認できた。
さらに、Qwen 系モデルは reasoning token を大量生成しやすく、古い Ollama バージョンでは think 制御も不完全だったため、
状態が長時間残るように見えていた。
結果として、
「用途別モデルを Ollama 側で大量に増やす」のではなく、
という構成に整理し直した。
つまり今回の検証で分かったのは、“Open WebUI も Ollama も悪くなかった”ということだった。悪かったのは、「LLM はモデルを増やせば増やすほど賢く整理されるはずだ」という、人類側の浅い思慮の期待だったのかもしれない。
そしてたぶん、この “Stopping…” 問題、世界中で静かに発生している。みんな黙って再起動しているだけで。これがブラウザ上のチャットだから笑い話で済むが、もし宇宙船の搭載 AI だったら、かなり笑えない。
「船長、推進制御 AI が応答しません」 「どうした?」 「Stopping… のまま帰ってきません」
閑話休題
以下、Stopping問題を解決するための手順書。Dockerで動くOllamaコンテナ(コンテナ名 ollama)で記載してある。
1. 目的
EVO-X2上で、OllamaをOpen WebUI向けLLMバックエンドとして利用する。
設計方針は以下。
Ollama側:
ベースが異なる最小限の実行モデルだけ作成する
Open WebUI側:
Chat / Agent / Task / Vision / Heavy用途をUI設定で使い分ける
Ollama側では、用途別に細かく chat / agent / code / strict / summarize を大量作成しない。
2. EVO-X2 推奨 compose.yml (ImageとEnvironment部分のみ)
environment: のみ抜粋。
services:
ollama:
image: ollama/ollama:rocm
environment:
– OLLAMA_HOST=0.0.0.0:11434
# GPU visibility
– HIP_VISIBLE_DEVICES=0
# ROCm / EVO-X2 stability first
– OLLAMA_FLASH_ATTENTION=0
# Context and scheduling
– OLLAMA_CONTEXT_LENGTH=32768
– OLLAMA_NUM_PARALLEL=1
– OLLAMA_MAX_LOADED_MODELS=3
– OLLAMA_MAX_QUEUE=64
– OLLAMA_KEEP_ALIVE=30m
# Debug only when troubleshooting
# – OLLAMA_DEBUG=1
補足
MAX_LOADED_MODELS=3 の想定常駐は以下。
汎用モデル: qwen3.5:9b-main-32k
VLモデル: qwen2.5vl:7b-main-32k
タスクモデル:gemma3:4b-task-8k
gpt-oss:20b-main-32k は必要時ロード。 GPT-OSS 20Bまで同時常駐させる前提ではない。
EVO-X2 (ROCm / Radeon 8060S) では、Flash Attention有効時に不安定化や推論失敗が起きる場合があるため、まずは無効化推奨。
将来のROCm/Ollama更新で改善する可能性あり。
3. 作成するOllamaモデル
|
用途
|
作成モデル名
|
ベース
|
|
Main
|
qwen3.5:9b-main-32k
|
qwen3.5:9b
|
|
Task
|
gemma3:4b-task-8k
|
gemma3:4b
|
|
Vision/OCR
|
qwen2.5vl:7b-main-32k
|
qwen2.5vl:7b
|
|
Heavy
|
gpt-oss:20b-main-32k
|
gpt-oss:20b
|
4. モデル作成スクリプト(ここが重要1)
全モデル共通の基本方針。
predictを入れた。これを入れないと「世界の果てまで行ったきり」になって返ってこないケースがある。
Reply in the same language as the user’s input.
If the language is unclear, reply in Japanese.
Do not expose chain-of-thought or internal reasoning.
日本語で書くと、意味は以下。
入力された言語で返答する。
言語が不明な場合は日本語で返答する。
内部推論やchain-of-thoughtは出さない。
cat <<‘SCRIPT’ > rebuild-openwebui-ollama-models.sh
#!/usr/bin/env bash
CONTAINER_NAME=”ollama”
OLLAMA_BIN=”docker exec ${CONTAINER_NAME} ollama”
# Rebuild minimal Ollama models for Open WebUI on EVO-X2.
# Comments are written in English intentionally.
# This script assumes the Ollama container already exists and is running.
BASE_MODELS=(
“qwen3.5:9b”
“gemma3:4b”
“qwen2.5vl:7b”
“gpt-oss:20b”
)
CUSTOM_MODELS=(
“qwen3.5:9b-main-32k”
“qwen3.5:9b-agent-32k”
“gemma3:4b-task-8k”
“qwen2.5vl:7b-main-32k”
“gpt-oss:20b-main-32k”
)
OLD_CUSTOM_MODELS=(
“qwen3.5:0.8b-task-8k”
)
create_model() {
local base_model=”$1″
local custom_model=”$2″
local ctx=”$3″
local predict=”$4″
local temperature=”$5″
local top_p=”$6″
local repeat_penalty=”$7″
local system_msg=”$8″
local safe_name
safe_name=”$(echo “${custom_model}” | tr ‘:/’ ‘-‘)”
local container_modelfile=”/tmp/Modelfile.${safe_name}”
echo “=================================================================”
echo “Creating model: ${custom_model}”
echo “Base model : ${base_model}”
echo “Context : ${ctx}”
echo “Predict : ${predict}”
echo “=================================================================”
docker exec -i “${CONTAINER_NAME}” sh -c “cat > ‘${container_modelfile}'” <<EOF
FROM ${base_model}
PARAMETER num_ctx ${ctx}
PARAMETER num_predict ${predict}
PARAMETER temperature ${temperature}
PARAMETER top_p ${top_p}
PARAMETER repeat_penalty ${repeat_penalty}
PARAMETER repeat_last_n -1
SYSTEM “””${system_msg}”””
EOF
docker exec “${CONTAINER_NAME}” ollama create “${custom_model}” -f “${container_modelfile}”
docker exec “${CONTAINER_NAME}” rm -f “${container_modelfile}”
echo
}
echo “=================================================================”
echo “Pulling base models”
echo “=================================================================”
for model in “${BASE_MODELS[@]}”; do
echo “Pulling: ${model}”
${OLLAMA_BIN} pull “${model}”
echo
done
echo “=================================================================”
echo “Removing existing custom models”
echo “=================================================================”
for model in “${CUSTOM_MODELS[@]}” “${OLD_CUSTOM_MODELS[@]}”; do
if ${OLLAMA_BIN} list | awk ‘{print $1}’ | grep -qx “${model}”; then
echo “Removing: ${model}”
${OLLAMA_BIN} rm “${model}”
fi
done
echo “=================================================================”
echo “Creating custom models”
echo “=================================================================”
create_model \
“qwen3.5:9b” \
“qwen3.5:9b-main-32k” \
32768 \
2048 \
0.6 \
0.9 \
1.1 \
“Reply in the same language as the user’s input. If the language is unclear, reply in Japanese. Answer directly, accurately, and concisely. Do not expose chain-of-thought or internal reasoning. For technical answers, prefer structured explanations and practical steps.”
create_model \
“qwen3.5:9b” \
“qwen3.5:9b-agent-32k” \
32768 \
2048 \
0.3 \
0.9 \
1.1 \
“Reply in the same language as the user’s input. If the language is unclear, reply in Japanese. You are an agent-oriented assistant for tool use, troubleshooting, system administration, coding assistance, and multi-step tasks. Prefer concise execution, practical steps, and clear summaries. Do not expose chain-of-thought or internal reasoning.”
create_model \
“gemma3:4b” \
“gemma3:4b-task-8k” \
8192 \
256 \
0.1 \
0.8 \
1.1 \
“Reply in the same language as the user’s input. If the language is unclear, reply in Japanese. You are a lightweight task model for title generation, tagging, routing, simple classification, short summarization, search query generation, and extraction. Respond with only the requested output. Do not add explanations unless explicitly requested. Be concise and deterministic.”
create_model \
“qwen2.5vl:7b” \
“qwen2.5vl:7b-main-32k” \
32768 \
2048 \
0.2 \
0.9 \
1.1 \
“Reply in the same language as the user’s input. If the language is unclear, reply in Japanese. You are a vision-language assistant for image analysis, screenshots, diagrams, OCR, and document images. Clearly separate visible facts from inference. Do not infer unreadable text. Do not expose chain-of-thought or internal reasoning.”
create_model \
“gpt-oss:20b” \
“gpt-oss:20b-main-32k” \
32768 \
2048 \
0.3 \
0.9 \
1.1 \
“Reply in the same language as the user’s input. If the language is unclear, reply in Japanese. You are a high-capability assistant for complex reasoning, troubleshooting, coding, architecture review, and difficult technical tasks. Provide clear conclusions, structured rationale, and practical next steps. Do not expose chain-of-thought or internal reasoning.”
echo
echo “=================================================================”
echo “Installed custom models”
echo “=================================================================”
${OLLAMA_BIN} list | grep -E ‘qwen3.5:9b-main-32k|qwen3.5:9b-agent-32k|gemma3:4b-task-8k|qwen2.5vl:7b-main-32k|gpt-oss:20b-main-32k’
echo
echo “=================================================================”
echo “Done”
echo “=================================================================”
SCRIPT
chmod +x rebuild-openwebui-ollama-models.sh
./rebuild-openwebui-ollama-models.sh
5. 確認コマンド
docker exec ollama ollama list
NAME ID SIZE MODIFIED
gemma3:4b-task-8k fe48c463cd75 3.3 GB 10 seconds ago
gpt-oss:20b-main-32k d3630fb496e8 13 GB 10 seconds ago
qwen3.5:9b-agent-32k 54bee28632f7 6.6 GB 10 seconds ago
qwen3.5:9b-main-32k 7b623980abf9 6.6 GB 10 seconds ago
qwen2.5vl:7b-main-32k 88312ba76252 6.0 GB 10 seconds ago
gpt-oss:20b 17052f91a42e 13 GB 10 seconds ago
qwen2.5vl:7b 5ced39dfa4ba 6.0 GB 11 seconds ago
gemma3:4b a2af6cc3eb7f 3.3 GB 12 seconds ago
qwen3.5:9b 6488c96fa5fa 6.6 GB 13 seconds ago
docker exec ollama ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
Mainモデル確認。
docker exec ollama ollama run qwen3.5:9b-main-32k “こんにちは。1行で返答してください。”
docker exec ollama ollama ps
⠋ Thinking… Process:
1.Analyze the Request:
<省略>
7.Final Output Generation: こんにちは。承知いたしました。 …done thinking.
こんにちは。承知いたしました。
NAME ID SIZE PROCESSOR CONTEXT UNTIL qwen3.5:9b-main-32k 7b623980abf9 16 GB 100% GPU 32768 29 minutes from now
Taskモデル確認。
docker exec ollama ollama run gemma3:4b-task-8k “次のタイトルを短くしてください: UbuntuでDockerを使う方法”
docker exec ollama ollama ps
UbuntuでDockerを使う方法
NAME ID SIZE PROCESSOR CONTEXT UNTIL
gemma3:4b-task-8k fe48c463cd75 5.5 GB 100% GPU 8192 29 minutes from now
qwen3.5:9b-main-32k 7b623980abf9 16 GB 100% GPU 32768 29 minutes from now
Visionモデル確認。
docker exec ollama ollama show qwen2.5vl:7b-main-32k
Model architecture qwen25vl parameters 8.3B context length 128000 embedding length 3584 quantization Q4_K_M
Capabilities completion vision
Parameters temperature 0.2 top_p 0.9 num_ctx 32768 repeat_last_n -1 repeat_penalty 1.1
System Reply in the same language as the user’s input. If the language is unclear, reply in Japanese. You are a vision-language assistant for image analysis, screenshots, diagrams, OCR, and document images. Clearly separate visible facts from inference. Do not infer unreadable text. Do not expose chain-of-thought or internal reasoning.
License Apache License Version 2.0, January 2004 …
Heavyモデル確認。
docker exec ollama ollama run gpt-oss:20b-main-32k “Dockerと仮想マシンの違いを簡潔に説明してください。”
docker exec ollama ollama ps
Thinking… User asks: “Dockerと仮想マシンの違いを簡潔に説明してください。” They want a concise explanation in Japanese. Provide concise explanation. …done thinking.
Docker(コンテナ)
<省略>
NAME ID SIZE PROCESSOR CONTEXT UNTIL
gpt-oss:20b-main-32k d3630fb496e8 21 GB 100% GPU 32768 29 minutes from now
gemma3:4b-task-8k fe48c463cd75 5.5 GB 100% GPU 8192 29 minutes from now
qwen3.5:9b-main-32k 7b623980abf9 16 GB 100% GPU 32768 29 minutes from now
6. Open WebUI モデル設定方針
Open WebUIでは、Function Callingはモデル単位またはチャット単位で Default / Native を設定できる。Nativeはモデル自身のtool callを使う方式で、AgentやWeb Search用途ではNativeが推奨。
Reasoning/Thinking関連は、Advanced ParamsでReasoning Tagsや think (Ollama) を設定できる。
7. モデル設定
Advanced Prams(ここが重要2)
以下以外はDefault。
|
Ollamaモデル
|
Open WebUI用途
|
Stream Chat Response
|
Function Calling
|
Reasoning Tags
|
think (Ollama)
|
num_ctx (Ollama)
|
|
gemma3:4b-task-8k
|
Task / Title / Tag / Routing
|
Off推奨
|
Default
|
Disabled推奨
|
Off
|
8192
|
|
qwen3.5:9b-main-32k
|
通常Chat / Coding / Summarize
|
On
|
Default
|
Disabled推奨
|
Offを試す。効かなければDefault
|
32768
|
|
qwen3.5:9b-agent-32k
|
Agent用チャット
|
On
|
Native
|
Disabled推奨
|
Offを試す。Agent品質が落ちるならDefault
|
32768
|
|
gpt-oss:20b-main-32k
|
Heavy / Deep / 難しめのAgent
|
On
|
Native推奨
|
Disabled推奨
|
Offを試す。品質が落ちるならDefault
|
32768
|
|
qwen2.5vl:7b-main-32k
|
Vision / OCR
|
On
|
Default
|
Disabled推奨
|
Off
|
32768
|
補足
Reasoning Tagsは、Open WebUI上で余計なreasoning表示を抑えるため、think (Ollama) は空欄にすると Default に戻るため、無効化したい場合は明示的に Off を選ぶ。 ただし、Qwen系ではモデル内部のreasoning文字列が残る可能性がある。
Capabilities
gemma3:4b-task-8k
全部オフ
qwen3.5:9b-main-32k
Web Search: ON
File Upload: ON
File Context: ON
Citations: ON
それ以外OFF寄り
qwen3.5:9b-agent-32k
gpt-oss:20b-main-32k
全部オン
qwen2.5vl:7b-main-32k
|
Capability
|
推奨
|
|
Vision
|
ON
|
|
File Upload
|
ON
|
|
File Context
|
ON
|
|
Web Search
|
ONでもOK
|
|
Image Generation
|
OFF推奨
|
|
Code Interpreter
|
OFF推奨
|
|
Terminal
|
OFF推奨
|
Open WebUIのSystem Promptは空欄推奨
SYSTEM promptはOllama Modelfile側で管理する。Open WebUI側のSystem Prompt欄は、通常は空欄推奨。
両方にSYSTEMを書くと、指示競合やreasoning抑制失敗が起きる場合がある。
8. Open WebUI 全体設定
|
設定
|
推奨
|
|
Default Model
|
qwen3.5:9b-main-32k
|
|
Task Model
|
gemma3:4b-task-8k
|
|
Title Generation Model
|
選べるなら gemma3:4b-task-8k
|
|
Fallback Model
|
まず無効
|
|
Web Search / Tools
|
Agent用途のみON
|
|
Agent用途
|
qwen3.5:9b-main-32k または gpt-oss:20b-main-32k + Native
|
9. 運用上の注意
Ollama側で用途別モデルを増やしすぎない
以下のような構成は避ける。
qwen3.5:9b-chat-32k
qwen3.5:9b-agent-32k
qwen3.5:9b-code-32k
qwen3.5:9b-strict-32k
qwen3.5:9b-summarize-32k
qwen3.5:9b-main-32k と qwen3.5:9b-agent-32k は、Open WebUI側で用途を分離しやすくするために作成している。ただし、Ollama内部では同一runnerとして再利用される場合がある。
そのため、これは「完全分離モデル」ではなく、Open WebUI側の用途分離用エイリアスとして扱う。
ベースが違うものだけ分ける
qwen3.5:9b
gemma3:4b
qwen2.5vl:7b
gpt-oss:20b
のように、ベースが違うものだけOllama側で分ける。
GPT-OSS 20Bは常用しない
gpt-oss:20b-main-32k は必要時だけ使う。 通常は以下2つを常駐させる。
qwen3.5:9b-main-32k
qwen3.5:0.8b-task-8k
Vision利用時だけ以下が追加される。
10. 推奨確認順序
docker exec ollama ollama ps
通常チャット実行。
docker exec ollama ollama run qwen3.5:9b-main-32k “こんにちは”
Task確認。
docker exec ollama ollama run gemma3:4b-task-8k “次の文を10文字以内のタイトルにしてください: DockerでOpen WebUIを構築する”
Open WebUIから通常チャットを実行。
docker exec ollama ollama ps
期待。
qwen3.5:9b-main-32k
gemma3:4b-task-8k
Vision利用後。
が追加、または古いモデルと入れ替わる。
11. 最終構成イメージ
Ollama
├─ qwen3.5:9b-main-32k 通常Chat
├─ qwen3.5:9b-agent-32k Agent / Coding / Summarize
├─ gemma3:4b-task-8k. Title / Tag / Routing / Short task
├─ qwen2.5vl:7b-main-32k Vision / OCR
└─ gpt-oss:20b-main-32k Heavy reasoning / complex troubleshooting
Open WebUI
├─ 通常Chat: qwen3.5:9b-main-32k / Default
├─ Agent: qwen3.5:9b-main-32k or gpt-oss:20b-main-32k / Native
├─ Task: gemma3:4b-task-8k
└─ Vision: qwen2.5vl:7b-main-32k
結果
ブログを書きながら直しているのだが、ようやく、Qwen 3.5でも入力して、サクッと返信がもらえる。また複数からOllamaに接続しても問題ない。ふーっ、ようやく大学に持っていける。
正直言って、今までは「とりあえず動いた」「一応できた」というレベルで終わっていて、本当の意味では使い込んでいなかったのだと思う。
しかし、大学で学生に使わせるとなると話は別だ。
実際には、
– 複数人が同時に使う
– モデルを切り替える
– Agent を使う
– Vision を使う
– Web Search を使う
といった、“本当に運用される環境” を想定しなければならない。
そこで実際に使い込んでみた結果、今回の「Stopping…問題」にぶち当たった。
まあ、何となく気がついてはいた。
同じモデルだけをずっと使っている限り、たぶん一生気がつかなかった問題だったと思う。
やはり、AI 環境も「子作り」だけでは駄目で、「子育て」までしないと、本当の問題は見えてこないらしい。
多分だが、追加で必要なコンポーネントの展開、LLMのモデルの選択、設定をある程度しておかないと、企業内に設置しても面白半分で最初は使ってくれるが、すぐに動かないことが露見して、Chat GPTやCopilotへ戻られてしまうのだろうな。それに企業で使うにしたら、EVO-X2やGDX Spark、Pro6000ですら今やリソースが足りないかもしれない。これらのマシンだと、企業レベルなんて捌けなくて、少人数のチームレベルがやっと。もし大人数で使うなら、OpenAI APIに課金して使うしかないが、それだとローカルLLMを建てる意味がない。素直にChat GPTに月額3000円のほうがずっとまし。