LLM | Gemma的初体验

一起来体验一下吧~

技术报告书:jgoogle/gemma-7b-it · Hugging Facegemma-report.pdf (storage.googleapis.com)

代码1  :google-deepmind/gemma: Open weights LLM from Google DeepMind. (github.com)

代码2 :https://github.com/google/gemma_pytorch

代码3 :

技术报告书:jgoogle/gemma-7b-it · Hugging Face

1.论文详解

谷歌介绍的Gemma的主要特点如下。

  • 新车型将提供两种变体:Gemma 2B 和 Gemma 7B。这两种类型分别带有预训练和指令调整的变体。
  • 新的负责任的生成式 AI 工具包提供指导和基本工具,帮助您使用 Gemma 构建更安全的 AI 应用程序。
  • Native Keras 3.0 在 JAX、PyTorch 和 TensorFlow 等领先框架中提供了用于监督微调 (SFT) 的工具链。
  • 它配备了即用型 Colab 和 Kaggle 笔记本电脑,以及 Hugging FaceMaxText 和 NVIDIA NeMo 等通用工具,使 Gemma 易于用户使用。
  • 预先训练和指令调整的 Gemma 模型可在笔记本电脑、工作计算机甚至 Google Cloud 上使用,并且使用 Vertex AI 和 Google Kubernetes Engine (GKE) 轻松安装。
  • Gemma 针对各种 AI 硬件平台进行了优化,确保了行业领先的性能,包括 NVIDIA GPU 和 Google Cloud TPU。
  • 条款和条件允许负责任的商业用途和分发给各种规模的企业。

Gemma 是由 Google 推出的一系列轻量级、先进的开源模型,基于 Google Gemini 模型的研究和技术而构建。它们是一系列text generation,decoder-only的大型语言模型,对英文的支持较好,具有模型权重开源、并提供预训练版本(base模型)和指令微调版本(chat模型)。

本次 Gemma 开源提供了四个大型语言模型,提供了 2B 和 7B 两种参数规模的版本,每种都包含了预训练版本(base模型)和指令微调版本(chat模型)。

官方除了提供 pytorch 版本之外,也提供了GGUF版本,可在各类消费级硬件上运行,无需数据量化处理,并拥有高达 8K tokens 的处理能力,Gemma 7B模型的预训练数据高达6万亿Token,也证明了通过大量的高质量数据训练,可以大力出奇迹,小模型也可以持续提升取得好的效果。


1.1.模型构造

采用transformer的解码器

下图是针对不同任务/数据集的结果对比,取得了一个很好的结果。

微调

  • 使用 QLoRA 对 UltraChat 数据集执行监督微调 (SFT) 的脚本
  • 在 TPU 设备上使用 FSDP 执行 SFT 的脚本
  • 可以在免费套餐 Google Colab 实例上运行的笔记本,用于对英语报价数据集执行 SFT

2.实战 

对于 Gemma 型号的 7B 指令版本。还可以选择 2B 基本模型7B 基本模型和 2B 指导模型的模型卡。

2.0环境设置

pip install -U transformers
pip install packaging
pip install accelerate
pip install -U scikit-learn scipy matplotlib

更多请参考A1 

git clone https://huggingface.co/google/gemma-7b-it/ 
cd gemma-7b-it

 

2.1.在CPU上运行,这里省略

from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("google/gemma-7b-it")
model = AutoModelForCausalLM.from_pretrained("google/gemma-7b-it")

input_text = "Write me a poem about Machine Learning."
input_ids = tokenizer(input_text, return_tensors="pt")

outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))

2.2.在单个/多个 GPU 上运行模型

本文RAM24G,2张TITAN卡

# pip install accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("google/gemma-7b-it")
model = AutoModelForCausalLM.from_pretrained("google/gemma-7b-it", device_map="auto")

input_text = "Write me a poem about Machine Learning."
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")

outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))

运行后

默认 max_length` =20

可能会出现如下情况,

修改输出outputs = model.generate(**input_ids,max_length=64)就好啦~

2.3.模型微调

本文使用代码数据集MBPP进行微调

import torch
from datasets import load_dataset
from peft import LoraConfig, PeftModel, prepare_model_for_kbit_training
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    AutoTokenizer,
    TrainingArguments,
)
from trl import SFTTrainer

model_name = "google/gemma-7b-it"
#Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name, add_eos_token=True, use_fast=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.pad_token_id =  tokenizer.eos_token_id
tokenizer.padding_side = 'left'

#ds = load_dataset("timdettmers/openassistant-guanaco")
ds = load_dataset("mbpp") 
#ds = load_dataset("Muennighoff/mbpp")  # 974 rows test only
compute_dtype = getattr(torch, "float16")
bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_compute_dtype=compute_dtype,
        bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
        model_name, quantization_config=bnb_config, device_map={"": 0}
)
model = prepare_model_for_kbit_training(model)
#Configure the pad token in the model
model.config.pad_token_id = tokenizer.pad_token_id
model.config.use_cache = False # Gradient checkpointing is used by default but not compatible with caching
peft_config = LoraConfig(
        lora_alpha=16,
        lora_dropout=0.05,
        r=16,
        bias="none",
        task_type="CAUSAL_LM",
        target_modules= ['k_proj', 'q_proj', 'v_proj', 'o_proj', "gate_proj", "down_proj", "up_proj"]
)
training_arguments = TrainingArguments(
        output_dir="./results_qlora",
        evaluation_strategy="steps",
        do_eval=True,
        optim="paged_adamw_8bit",
        per_device_train_batch_size=2,
        per_device_eval_batch_size=2,
        log_level="debug",
        save_steps=50,
        logging_steps=50,
        learning_rate=2e-5,
        eval_steps=50,
        max_steps=300,
        warmup_steps=30,
        lr_scheduler_type="linear",
)
trainer = SFTTrainer(
        model=model,
        train_dataset=ds['train'],
        eval_dataset=ds['test'],
        peft_config=peft_config,
        dataset_text_field="text",
        max_seq_length=512,
        tokenizer=tokenizer,
        args=training_arguments,
)
trainer.train()

仅仅测试训练,所以设置4 个,但是训练相对来说蛮快的,4个epoch30分钟左右。

 

过程中遇到的问题及解决【PS】

【PS1】 Traceback (most recent call last):
  File "/root/anaconda3/envs/sam/lib/python3.8/site-packages/huggingface_hub/utils/_errors.py", line 304, in hf_raise_for_status
    response.raise_for_status()
  File "/root/anaconda3/envs/sam/lib/python3.8/site-packages/requests/models.py", line 1021, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://huggingface.co/google/gemma-7b-it/resolve/main/config.json

from huggingface_hub import login
login()

在自己的huggingface账号上创建一个token

点击自己账号->Access Tokens->New token -> 输入名称->选择可写入->Generate a token 

生成token后,复制到服务器里~

登录

【PS2】ImportError: cannot import name 'ClusterInfo' from 'triton._C.libtriton.triton' (unknown location)

 尝试

# 怀疑是triton版本问题

pip install -U --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/Triton-Nightly/pypi/simple/ triton-nightly

#或者
pip install Triton==2.1.0

#之前的版本是2.0.0

输入
python -m bitsandbytes

 

 然后就可以啦~

扩展

A1

accelerate==0.27.2
bitsandbytes==0.42.0
huggingface-hub==0.21.3
peft==0.9.0

 

### Llama3 和 Gemma2 的特性、性能及应用场景比较 #### 特性 (Features) Llama3 是 Meta 开发的一系列开源大语言模型中的最新版本之一,其主要特点在于支持多模态输入以及更高的上下文长度处理能力[^1]。相比之下,Gemma2 则是由 MoonShot 推出的一款闭源大型语言模型,专注于对话理解和生成质量优化。 - **多模态支持**: Llama3 提供了更强的图像和文本联合理解功能,而 Gemma2 主要集中在纯文本交互上。 - **参数规模**: 虽然具体数值未公开披露,但从先前版本推测,两者可能处于相似量级但各有侧重领域内的调优策略不同。 #### 性能 (Performance) 在实际测试中发现: - 对于复杂逻辑推理任务如数学计算或者编程代码撰写方面,基于前代产品表现来看,Llama 系列通常展现出较强优势因为它们接受过广泛技术文档训练从而具备良好编码能力和科学知识基础; - 另一方面,在涉及自然流畅的人际交流场景下比如客服聊天机器人应用场合里,则可能是经过专门微调后的Gemmas系列产品会更胜一筹由于它更加注重用户体验友好性和情感共鸣建立过程。 #### 应用场景 (Use Cases) 鉴于上述区别可以得出结论如下: - 如果目标项目需要利用到视觉数据配合文字分析解释等功能模块构建解决方案的话那么选择Meta家出品LLaMA家族成员将是明智之举因为它能够很好地融合不同类型的信息资源来解决问题并提供全面见解; - 当仅仅关注高质量书面表达或者是创建虚拟助手用于日常沟通联系目的之时考虑采用由Moonshot打造而成GEMMAs品牌也许更为合适因其擅长营造亲切互动氛围使得机器回复听起来更像是真人所说话语一般温暖贴心. ```python # 示例代码展示如何加载预训练模型(假设存在官方API) from transformers import pipeline nlp_llama = pipeline('text-generation', model='meta-llm/Llama3') nlp_gemma = pipeline('conversational', model='moonshot/Gemma2') result_llama = nlp_llama("Explain quantum mechanics simply.") result_gemma = nlp_gemma([{"speaker":"USER","text":"Tell me about your day?"},{"speaker":"BOT"}]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天|여름이다

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值