搜尋此網誌

2026年8月25日 星期二

Ollama 本地 LLM 部屬

緣起:


    前陣子跟之前的同事聊天,聊著聊著,他讓我加入他的 google pro 家庭方案,那方案除了共享 5TB 的雲端空間外,還有 gmini pro ai 能用。我就想試試看,pro 的 ai 模型有沒有比較強,能不能讓它幫我寫勾羿的小說。

    我問它,有關遊戲“九日”裡的勾芒跟羿,你知道什麼嗎?


    你媽媽的,還是理解得很狗屁不通,這樣肯定是無法寫出符合九日背景的小說(後來發現,其實用 LLM Note),這時,我的腦子開始有了想在自己本地跑 LLM 的想法,我那時打的算盤是,在本地跑的話,能調整的東西比較多,我可以給它九日的參考資料,讓它了解世界觀之後再依此來創作,一定會比那些雲端 ai 模型在網路上亂查資料後再産的內容還要好。

    接下來的一兩天,我一直在研究 ollama 跟怎麼把設定的文本塞進 prompt 裡,雖然有成功跑起來,但後來發現,那個 context window 根本不夠啊 ~~ 光是不到 1/10 的世界觀文本就塞不進了,如果真的還是想跑的話,只能自己做 RAG,太麻煩了吧。

    後來轉頭一查,發現 claude project 的功能很符合自己的需求,唉呀,我應該一開始就先查看看有什麼現成的功具可以達成我需求的。不過這樣瞎折騰下來,有學到東西就是了。


前置準備:


    習慣性的先問一下 gpt 有關方案的可行性與可選擇的工具



    所以當前目標就是用 Ollama 跑 Qwen 的模型,看 14B 的模型跑起來速度如何,我看 ollama 有提供 docker image,所以我就用 docker 來跑了,比較省事。

    要先確認跑 ollama docker 所需的工具有沒有裝

nvidia-smi //確認 nvidia 驅動

nvcc --version //確認 cuda 有沒有裝(但gpt說 Ollama 本身帶有 NVIDIA GPU 支援,所以不裝好像也沒差(?,反正我系統上有就是了)

docker --version //確認 docker 有沒有裝

nvidia-ctk --version //確認 NVIDIA Container Toolkit 有沒有裝


Ollama Container:



    Ollama container 跑在我的桌電上,建個 llama-docker 資料夾,把東西都放裡頭


    然後使用 gpt 給我的 docker-compose 檔,用 sudo docker compose up 把它給跑起來

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    restart: unless-stopped

    ports:
      - "11434:11434"

    volumes:
      - ./models:/root/.ollama

    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

    進入 ollama container 

sudo docker exec -it ollama bash

    用 ollama pull 指令載模型

ollama pull llama3.1:8b

    然後用 ollama run 跑模型

ollama run llama3.1:8b

    跑起來後,就可以直接在命令列輸入,跟它互動


    也能用中文跟它交談


    可以用

watch -n 0.5 nvidia-smi

    來查看顯存的用量,確認 gpu 真的有在跑,而且跑那模型用了大概 5GB 的顯存


    有點好奇它的推理能力,所以去網路上找了一個國文題目給它解


    哇,他答對了,超酷的。我再接著去試試其它的模型,載了 qwen 來玩


    後來跟我同事聊天,跟他分享我在本機跑 LLM,還有載了 qwen



    等到模型載好後,我先給這模型來波壓力測試,在本機上可以用

ollama list

    來查看有哪些模型能使用


    我發現,那個 qwen 在跑的時候有 thinking 的過程,有趣


    不過那個 thinking 的過程會拖慢輸出的時間,如果想把 thinking 關掉的話可以在跑的時候加上 think=false 的參數

ollama run <模型名稱> --think=false

    確認 qwen 能跑後,開始上壓力測試




    啊哈哈哈,幹 XD,還會自我審查,快笑瘋。不能辱華的模型沒存在的必要,砍了!!!

ollama rm qwen3:14b

    最後是聽我前同事的建議,選用了 gpt-oss:20b 的模型來使用,13 GB,那天在載的時候家裡還斷電個一兩次,操。話說,那個 gpt-oss 模型沒法用 --think=false 來把它關掉,最多用 --think=low 來讓它不要想那麼多。


Ollama 遠端連線:


    我上面的操作都是在我 N100 電腦上,用遠端桌面進我那台桌電,然後再開 terminal 進 container 裡下指令,實在是有些煩,而且這樣單純用 cli 的互動方式也無法讓模型紀錄上下文,所以再來要修正一下互動的方式。桌電跑 ollama container,我在 N100 上直接用 ollama cli 連到 container 裡的 server。

    先在我那台 N100 上裝 ollama

curl -fsSL https://ollama.com/install.sh | sh

    N100 上沒有要跑 ollama 服務,只是單純想用它的 cli,所以把服務給關了

sudo systemctl disable --now ollama.service

    Ollama 是用 OLLAMA_HOST 變數來指定 server 位置,所以

export OLLAMA_HOST=http://192.168.3.3:11434

    那台桌電在區網的 ip 是 192.168.3.3,ollama 的預設 port 是 11434。這設定在 terminal 重開後會失效,所以要寫進 .bashrc 裡

echo 'export OLLAMA_HOST=http://192.168.3.3:11434' >> ~/.bashrc
source ~/.bashrc

    把桌機的 ollama container 跑起來後,在我 N100 電腦上下 ollama list 指令測試,能正常顯示有什麼模型。


結合 Python 來紀錄聊天:


    我再來要弄個 python 程式,讓一開始跟模型聊天時能先載入自己設定的 prompt,也能紀錄對話的紀錄,請 gpt 幫我快速生成一個 python 程式來使用 XD

import requests

MODEL = "gpt-oss:20b"
OLLAMA_URL = "http://192.168.3.3:11434/api/chat"
STORY_FILE = "story.md"

# 讀取小說
with open(STORY_FILE, "r", encoding="utf-8") as f:
    story = f.read()

# 對話歷史
messages = [
    {
        "role": "system",
        "content": """幫我記住以下設定"""
    },
    {
        "role": "user",
        "content": f"""
--- 設定開始 ---
{story}
--- 設定結束 ---
"""
    }
]

print("開始對話,輸入 /quit 離開。")

while True:
    try:
        user_input = input("\n你:")

        if user_input == "/quit":
            break

        if not user_input.strip():
            continue

        messages.append({
            "role": "user",
            "content": user_input
        })

        response = requests.post(
            OLLAMA_URL,
            json={
                "model": MODEL,
                "messages": messages,
                "stream": False,
                "think": "low"
            }
        )

        response.raise_for_status()

        data = response.json()
        answer = data["message"]["content"]

        print(f"\nAI:{answer}")
        
        messages.append({
            "role": "assistant",
            "content": answer
        })
    except KeyboardInterrupt:
        print("\n離開。")
        break

    except Exception as e:
        print(f"\n錯誤:{e}")

    然後這是 md 檔的內容

我是一個 26 歳的人,之前有做過網頁工程師,家裡有養小狗。

    透過 python 程式跟模型聊天


    啊哈,它有成功記住了,但我最後就只做到這,因為當我開始把遊戲設定加到 md 檔後,我發現我才加不到 1/20 的設定,它 context window 就爆了,它會無法回應,就算把 context window 調高,讓它能跑,它也會開始胡言亂語,解決方案就是做 RAG,對話時不把文本全載入,只載入關聯性最高的幾個敘述,但真要做的話感覺要花不少時間,所以最後才會放棄,轉去 AI 服務的平台,它們的模型跟搜尋機制肯定是比我自己在我的桌電上跑還要強。

    最後補充個,可以用

ollama ps

    來查看目前在執行的模型


    如果想讓它停止的話可以用

ollama stop <模型名稱>

    來停止。

沒有留言:

張貼留言