找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1499

积分

0

好友

190

主题
发表于 3 天前 | 查看: 10| 回复: 0

Gemma 3 270M是Google推出的一款轻量级开放模型,虽然参数规模不大,但能力不俗。它延续了Gemini模型的技术精髓,并以一种更轻量、更易于定制的方式呈现。

你可以在不到一小时的时间内完成对其的微调,并将模型压缩至300MB以下,从而让它能够直接在浏览器中运行。

本文将演示如何使用Gemma模型创建一个自定义的表情符号翻译器——一个能够将文本转换为表情符号并在本地运行的小型模型。

图片

第一步:引导Gemma进行“Emoji思维”

Gemma是一个通用模型。如果你直接要求它将文本翻译成表情符号,它的回应通常会过于礼貌。

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

模型回应:
“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",  # 可选:使用自动类型以提升效率
    device_map="auto"    # 可选:如果可用,自动映射到GPU
)

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

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",
)

# 关键:适用于因果语言模型的正确数据整理器
data_collator = DataCollatorForLanguageModeling(
    tokenizer=tokenizer,
    mlm=False  # 因果语言模型,非掩码语言模型
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    tokenizer=tokenizer,
    data_collator=data_collator
)

trainer.train()

完成训练后,模型将学会只生成表情符号。

图片

第二步:压缩模型以适配Web环境

微调后的模型大小约为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,可以从一个小目标开始:选择一个简单任务,利用Hugging Face的Transformers库PyTorch微调Gemma模型,将其量化,然后部署到浏览器中直接运行。

因为AI的未来不仅仅是云端的大型模型,也包含那些存在于你设备本地、触手可及的小型智能。




上一篇:Vim高效编码核心快捷键速查:提升服务器运维与文本编辑效率
下一篇:基于eBPF构建Kubernetes网络异常检测系统实战指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 21:11 , Processed in 0.266288 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表