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