博客 / 詳情

返回

1小時微調 Gemma 3 270M 端側模型與部署全流程

Gemma 3 270M是 Google 推出的一款雖小但能力驚人的開放模型。它屬於 Gemma 家族,本質上是將 Gemini 模型中使用的相同技術帶入了輕量級、可定製的形式中。

你可以在 不到一小時內完成微調,並將其大小壓縮到 300MB 以下,讓他直接在你的瀏覽器中運行。

在這篇文章中,我將展示我是如何使用 Gemma 創建我自己的 emoji 翻譯器的——這是一個將文本轉換為表情符號並在本地運行的小型模型。

第一步:教 Gemma “用 Emoji 思考”

Gemma 是一個通才。如果你讓它把文本翻譯成表情符號,它會表現得有點太客氣了。

Prompt:

“Translate this text into emojis: what a fun party”

Model:

“Sure! Here is your emoji: 🥳🎉🎈”

這不完全是我想要的目標。對於我的應用我想要 只有表情符號——不要單詞,不要“Sure!”,只要有趣的東西。

所以我們可以對他進行微調

構建一個微型數據集

從一個簡單的 JSON 文件開始——輸入文本,輸出表情符號。

 [  
   { "input": "what a fun party", "output": "🥳🎉🎈" },  
   { "input": "good morning sunshine", "output": "☀️🌻😊" },  
   { "input": "so tired today", "output": "😴💤" }  
 ]

在 Colab 中微調

以前微調需要 A100 GPU 和時間,現在不需要了。使用 QLoRA(僅更新少量參數)在 Google Colab 的 免費 T4 GPU 上就可以微調。

 from transformers import (  
    AutoModelForCausalLM,   
    AutoTokenizer,   
    Trainer,   
    TrainingArguments,   
    DataCollatorForLanguageModeling  
)  
from peft import LoraConfig, get_peft_model  
from datasets import load_dataset  

model_name = "google/gemma-3-270m"  
tokenizer = AutoTokenizer.from_pretrained(model_name)  

# 關鍵:為 Gemma 設置 pad_token  
if tokenizer.pad_token is None:  
    tokenizer.pad_token = tokenizer.eos_token  

model = AutoModelForCausalLM.from_pretrained(  
    model_name,   
    torch_dtype="auto",  # 可選:使用 auto dtype 以提高效率  
    device_map="auto"    # 可選:如果可用,自動映射到 GPU  
)  

dataset = load_dataset("json", data_files="emoji_dataset.json")  

# 可選:如果序列很長,進行預分詞和截斷(Trainer 可以處理原始文本,但這樣更明確)  
# def tokenize_function(examples):  
#     return tokenizer(examples["text"], truncation=True, max_length=512)  
# dataset = dataset.map(tokenize_function, batched=True, remove_columns=dataset["train"].column_names)  

lora_config = LoraConfig(  
    r=8,   
    lora_alpha=32,   
    target_modules=[  
        "q_proj", "k_proj", "v_proj", "o_proj",  # Attention 層  
        "gate_proj", "up_proj", "down_proj"     # MLP 層  
    ],   
    lora_dropout=0.05,  
    task_type="CAUSAL_LM"  # 為了清晰起見顯式指定  
)  
model = get_peft_model(model, lora_config)  

training_args = TrainingArguments(  
    output_dir="./gemma-emoji",  
    num_train_epochs=3,  
    per_device_train_batch_size=4,  
    save_steps=100,  
    logging_steps=10,      # 可選:更頻繁地記錄日誌  
    evaluation_strategy="no",  # 如果你有 eval_dataset,請在此添加  
    # group_by_length=True,  # 可選:將相似長度分組以提高效率  
    # max_steps=-1,          # 可選:運行完整的 epoch  
)  

# 關鍵:適用於 CLM 的正確整理器 (collator)  
data_collator = DataCollatorForLanguageModeling(  
    tokenizer=tokenizer,   
    mlm=False  # 因果語言模型 (Causal LM),非掩碼  
)  

trainer = Trainer(  
    model=model,   
    args=training_args,   
    train_dataset=dataset["train"],  
    tokenizer=tokenizer,       # 如果未預分詞,則啓用自動分詞  
    data_collator=data_collator  
)  
 trainer.train()

就是這樣,訓練後模型可以只生成表情符號。

第二步:讓它足夠小以適應 Web

微調後s模型仍然約有 1GB,按 LLM 標準來看很小但對於瀏覽器來説還是很大。

為了在本地運行它,我使用 LiteRT 將其量化為 4-bit(如果你更喜歡 Transformers.js,也可以選擇 ONNX)。

這個較小的版本非常適合 MediaPipe 或 Transformers.js,兩者都利用 WebGPU 來訪問你的設備硬件。所以是它實際上是在你的瀏覽器中運行的。

第三步:在瀏覽器中運行模型

有趣的部分來了——沒有服務器,沒有 API,無需等待。

使用 MediaPipe 的 GenAI Tasks 直接在瀏覽器中加載並運行模型。

 const genai = await FilesetResolver.forGenAiTasks(  
  'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm'  
);  

const llmInference = await LlmInference.createFromOptions(genai, {  
  baseOptions: { modelAssetPath: 'path/to/yourmodel.task' }  
});  
const prompt = "Translate this text to emoji: what a fun party!";  
const response = await llmInference.generateResponse(prompt);  
 console.log(response); 

一旦緩存,它完全離線運行。零延遲。完全隱私。甚至在飛行模式下也能工作。

更小的模型意味着加載更快的應用和更好的最終用户體驗。

總結

這個項目從開始到結束花了我不到一個小時,測試時它甚至使用我最喜歡的表情符號。如果你一直想嘗試本地 AI從小處着手,選擇一個簡單的任務,微調 Gemma將其量化,然後讓它直接在你的瀏覽器中運行。

因為 AI 的未來不僅僅是雲端的大型模型——還有那些存在於你口袋裏的小型模型。

https://avoid.overfit.cn/post/8e8e6d615ea1480385c1e56d39952dd1

Civil Learning

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.