iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
AI & Data

「30 天打造 Discord AI 助手:結合本地 LLM 與 IoT 的智慧生活」系列 第 4

Day 4:拉取並執行 Gemma 3 4B 模型 — 使用 Ollama 啟動推理任務

  • 分享至 

  • xImage
  •  

📌 背景

昨天我們安裝了 Ollama,並用內建的 llama2 測試了基本功能。

今天要挑戰的是 Google 開源的 Gemma 3 4B 模型

🔎 為什麼選 Gemma 3 4B?

Google 在 2024 年推出了 Gemma 系列,特色是:

  • 輕量化設計:4B 參數版本適合在單張顯卡上跑(8GB VRAM 起跳)。
  • 開源授權:允許研究與商業使用(比 Gemini 系列更開放)。
  • 優化推理效率:比同參數規模的 LLaMA 速度更快。
  • 專注文本生成:回答自然,語氣更貼近人類。

對於我們這個挑戰來說,Gemma 3 4B 是一個理想的「中型模型」,既能在本地運行,也能提供不錯的對話體驗。


🛠️ 安裝與執行

Step 1:拉取模型

Ollama 支援直接下載 Gemma 模型,只需要:

ollama pull gemma3:4b

這會自動從官方下載權重檔,可能需要幾分鐘(取決於網速,大約 2-3GB)。

👉 注意:如果 VRAM < 8GB,可能需要用 CPU 模式或量化版本,否則會出現記憶體不足錯誤。


Step 2:啟動模型

ollama run gemma3:4b

成功啟動後,會看到互動式介面:

>>> 你好!請介紹一下你自己。

Gemma 回答:

你好!我是由 Google 訓練的大型語言模型。

簡單來說,我是一個人工智能,可以:

*   **回答你的問題:** 只要你問我任何問題,我會盡我所能提供準確、有用的答案
。
*   **生成文本:** 我可以寫詩、程式碼、劇本、音樂作品、電子郵件、信件等等。

*   **翻譯語言:** 我可以將文本從一種語言翻譯成另一種語言。
*   **總結文本:** 我可以將長篇文本縮短成簡潔的摘要。
*   **進行創意創作:** 我可以和你一起發明故事、想法和解決方案。

**重要的是要記住,我仍然在不斷學習和發展。** 我的知識截至到 2023 年 12 月,
並且我的理解能力仍然有限。

**現在,你想用什麼樣的方式來了解我呢?** 你可以:

*   問我一個問題。
*   要求我寫一些東西。
*   跟我聊聊你感興趣的話題。

我很期待與你互動!

Step 3:進行測試

我們可以測試幾個不同的場景:

  1. 知識問答
>>> 請用繁體中文解釋gemma3:4b的架構

Gemma 回答(節錄):

好的,讓我來為你解釋 Gemma 3:4B 的架構。由於 Gemma 的資訊比較新穎,且 
Google 官方的詳細技術文件相對有限,以下是我根據現有資訊和推測所做的解釋:

**Gemma 3:4B 的架構總體來說,是一個基於 Transformer 的大型語言模型 (LLM)。
** 就像許多現代 LLM 一樣,它也是基於自注意力機制(Self-Attention)來理解和生
成文本。

**以下是更詳細的分解:**

1.  **Transformer 架構:** Gemma 3:4B 採用了標準的 Transformer 架構,主要包
含以下幾個關鍵組件:
    *   **Encoder (編碼器):**  處理輸入的文本,將其轉換成向量表示。雖然 
Gemma 的詳細 Encoder 結構未公開,但很可能也採用了多層 Transformer 堆疊。
    *   **Decoder (解碼器):**  根據 Encoder 的輸出,產生目標文本。同樣,也採
用多層堆疊的 Transformer 堆疊。
    *   **自注意力機制 (Self-Attention):**  這才是核心!它允許模型在生成每個
詞語時,考慮到輸入序列中其他所有詞語的關係,從而更好地理解上下文和語義。

2.  **4B 代表 40 億參數 (4 Billion Parameters):**  “3:4B” 的數字,指的是模型
所擁有的參數數量。 40 億參數表示模型擁有大量的可學習參數,能夠學習更複雜的模
式和關係。參數越多,模型通常在性能上會更好,但也需要更多的計算資源進行訓練和
推理。

3.  **訓練方法:** Gemma 的訓練方式也值得關注:
    *   **預訓練 (Pre-training):**  Gemma 首先在一個非常大的文本數據集上進行
預訓練,學習通用的語言知識和模式。
    *   **超視域微調 (SFT - Supervised Fine-Tuning):**  在預訓練後,模型會針
對特定任務(例如,回答問題、生成文本等)進行微調。

4.  **優化技術:**  Google 為了提高 Gemma 的效率,可能使用了各種優化技術,例
如:
    *   **量化 (Quantization):**  將模型參數的精度降低,從而降低模型的體積和
計算成本。
    *   **剪枝 (Pruning):**  移除模型中不重要的連接,從而減少模型的複雜度和
計算量。

**與其他模型相比:**

*   Gemma 的重點在於,它是一個相對較小的模型,但仍然具有很高的性能。 相比之
下,像是 GPT-3/4 等大型模型則參數數量更大,但也需要更多的計算資源。
*   Gemma 的設計目標是提供一個易於使用、可獲得的語言模型,並方便在各種設備上
運行。

**重要提示:**

*   由於 Google 官方釋出的 Gemma 的技術細節不多,因此上述解釋可能存在一些不
確定性。

**總結:** Gemma 3:4B 是一個基於 Transformer 的語言模型,擁有 40 億參數,並
採用了預訓練和微調等技術。 它的目標是提供一個高性能、易於使用的模型。

希望這個解釋對你有幫助! 如果你還有其他問題,請隨時提出。

  1. 程式碼生成
>>> 請用 Python 寫一個 python多執行序的code

Gemma 輸出:


```python
import threading
import time

# 要執行的一個函數,可以被多個執行緒共享
def worker(thread_id):
  """
  模擬一個耗時的操作,並打印執行緒 ID。
  """
  print(f"執行緒 {thread_id}: 開始執行...")
  time.sleep(2)  # 模擬耗時操作
  print(f"執行緒 {thread_id}: 執行完成!")

# 主函數
if __name__ == "__main__":
  threads = []
  for i in range(5):  # 创建5个线程
    thread = threading.Thread(target=worker, args=(i,)) # 创建线程并启动
    threads.append(thread)
    thread.start()

  # 等待所有线程完成
  for thread in threads:
    thread.join()

  print("所有线程已完成")

程式碼解釋:

  1. import threading: 導入 threading 模組,它提供了多執行緒的功能。

  2. import time: 導入time模組,用於模擬執行時間。

  3. worker(thread_id): 這是我們每個執行緒要執行的函數。

    • thread_id: 參數,用于区分不同的线程,便于调试和跟踪。
    • time.sleep(2): 模擬一个 2 秒的延时操作。
    • print(...): 打印消息,指示线程正在执行。
  4. if __name__ == "__main__":: 這個區塊只在程式作為主程式運行時才會
    執行。

  5. threads = []: 創建一個空列表 threads,用於保存所有創建的執行緒
    對象。

  6. for i in range(5):: 循環五次,創建五個執行緒。

  7. thread = threading.Thread(target=worker, args=(i,)): 創建一個
    threading.Thread 對象。

    • target=worker: 指定了這個執行緒要執行的函數是 worker
    • args=(i,): 将 i 作为 worker 函数的参数传递给该线程。 注意
      (i,) 是创建一个元组,即使只有一个元素。
  8. threads.append(thread): 將創建的執行緒添加到 threads 列表中。

  9. thread.start(): 開始執行該執行緒。 這會將執行緒的控制權轉移給該
    執行緒,該執行緒就可以開始執行其 worker 函数。

  10. for thread in threads: thread.join(): 循环遍历线程列表,并使用
    thread.join() 阻塞主线程,直到所有子线程执行完毕。 join() 方法会等待线程
    完成其任务后再继续执行。

如何运行:

  1. 将代码保存为 .py 文件 (例如 multithreading_example.py)。
  2. 在命令行中运行该文件:python multithreading_example.py

运行结果 (可能会略有不同,因为线程执行是并发的):

執行緒 0: 開始執行...
執行緒 1: 開始執行...
執行緒 2: 開始執行...
執行緒 3: 開始執行...
執行緒 4: 開始執行...
執行緒 1: 執行完成!
執行緒 3: 執行完成!
執行緒 0: 執行完成!
執行緒 2: 執行完成!
執行緒 4: 執行完成!
所有线程已完成

关键点:

  • 并发 (Concurrency): 多线程允许程序同时执行多个任务,这可以提高程序
    的效率,尤其是在需要处理大量数据或进行 I/O 操作时。
  • 并行 (Parallelism): 当你有多个 CPU 核心时,多线程可以实现真正的并行
    执行。
  • 线程安全 (Thread Safety): 在多线程编程中,需要特别注意线程安全问题
    ,例如线程竞争、数据一致性等。

这个例子展示了如何在 Python 中使用多线程的基本概念。 了解线程安全问题是多线
程编程的关键。


---

### Step 4:效能觀察

用 `nvidia-smi` 檢查:

```bash
nvidia-smi -l
  • Gemma 3 4B 在 8GB VRAM GPU 上運行大約佔用 3GB 左右。
  • 推理速度:一秒約 20 tokens(取決於顯卡)。
  • CPU 模式也能運行,但速度會慢許多(可能 < 1 token/s)。

✅ 成果展示

今天我們完成了:

  1. 成功拉取 Gemma 3 4B 模型
  2. 在本地運行並進行文字生成、程式碼生成、創作測試
  3. 觀察效能表現,確認在單卡 6GB GPU 上能順暢運行

這代表我們現在已經能 真正跑一個小型 LLM,而且完全不依賴雲端!


上一篇
Day 3:Ollama 介紹 — 本地 LLM Server 架構解析與安裝實作
下一篇
Day 5:內建模型大比拼:llama3、Gemma 3 4B 效果比較
系列文
「30 天打造 Discord AI 助手:結合本地 LLM 與 IoT 的智慧生活」5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言