AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Google的新型Gemma模型是第一批采用与Gemini模型使用相同技术构建的开放式LLMs
发布日期:2024-06-07 07:41:18 浏览次数: 1669


Google的新型Gemma模型是第一批采用与Gemini模型使用相同技术构建的开放式LLMs。它们仅提供两种尺寸,2B和7B。此外,还提供了用于聊天应用程序的基础版本和指令调优版本。这些模型已经得到了许多深度学习框架的支持,并且足够小,可以在消费者硬件上使用。

在本文中,我们将了解Gemma模型的主要特点。我们会发现,其中一些特点并非一般标准模型所具有的,而Google似乎从Llama 2和Mistral 7B中吸取了很多有用的经验,提出了一个出色的7B模型。在本文的第二部分,我们将了解如何使用Gemma模型:与QLoRA进行微调、推断和量化。

Gemma 7B其实是8.5B

关于Gemma 的实现细节可以查看下面的文档:

Gemma: Open Models Based on Gemini Research and Technologyhttps://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf

Gemma技术报告中的表2非常引人注目:


在这个表格中,Google展示了每个模型的参数数量,区分了嵌入参数和非嵌入参数。对于7B模型,非嵌入参数有7.751B。即使不计算嵌入参数,我们也更接近于8B而不是7B。如果考虑到总参数数量,Gemma 7B有8.54B参数


所以Gemma更接近于9B模型而不是7B模型。将Gemma发布为“7B”LLM是误导性的,但似乎这是一个新趋势,因为LLM制造商希望将他们自己的LLM与先前发布的7B模型进行比较。


为了比较,以下是其他流行的“7B”模型的总参数数量:

  • Llama 2 7B:6.74B

  • Mistral 7B:7.24B

  • Qwen-1.5 7B:7.72B

  • Gemma 7B:8.54B

Gemma 7B显然不是与Llama 2和Mistral同一类别的模型。Gemma 7B比Llama 2 7B多了1.8B的参数。
在这份报告中,Google还在表1中给出了关于模型架构的一些细节:


这些模型可以处理长达8k个token的上下文。为了有效扩展,它们使用了多查询注意力和RoPE嵌入。Gemma已经与FlashAttention-2兼容。

这个架构非常标准,除了词汇表之外。它的词汇表非常庞大。在最近的已发布的生成式LLM中,Gemma拥有最大的词汇表,达到了256k个条目。这比Llama 2的词汇表大8倍,比Qwen-1.5的词汇表大1.7倍,而Qwen-1.5的词汇表已经被认为非常大了。

较大的词汇量通常意味着该模型经过了多语言训练。然而,谷歌写道,这些模型主要是针对英语任务进行训练的。与Gemini不同,这些模型不是多模态的,也没有针对多语言任务进行最优性能的训练。

不过,很多人认为谷歌使用多种语言的数据对模型进行了训练,正如模型的词汇表所显示的那样。对其进行多语言任务的微调应该会产生良好的性能。


Gemma的训练数据


Gemma 2B和7B分别训练了2万亿和6万亿个token。这意味着Gemma 7B的训练token比Llama 2多了3倍。这可能有两个原因:

  1. Llama 2的训练损失在训练3T token后仍然显着下降。

  2. 由于词汇表非常大,模型需要进行更长时间的训练,以学习词汇表中所有token的更好嵌入。

Gemma的指令调优版本


对于模型的指令调优版本,他们在一个由人类和合成数据组成的指导数据集上应用了监督微调,随后进行了来自人类反馈的强化学习(RLHF)。

这是提示格式:

谷歌对Gemma进行了评估,并将结果与Llama 2(在论文中拼写为LLaMA-2)和Mistral 7B进行了比较。

Gemma 7B在大多数任务中获得了比其他模型更好的分数。尽管如此,在评估这些基准得分时,始终要持谨慎态度。我们没有任何关于这些评估分数的计算细节。

在您的计算机上运行Gemma 2B和7B


Gemma模型已经得到了Hugging Face Transformers和vLLM的支持。您将需要一台至少具有18 GB GPU内存的GPU。


使用vLLM


安装vLLM:

pip install vllm

这是一个简单的离线推断示例,可以有效地利用GPU内存:

 import time
from vllm import LLM, SamplingParams
prompts = [
"The best recipe for pasta is"
]
sampling_params = SamplingParams(temperature=0.7, top_p=0.8, top_k=20, max_tokens=150)
loading_start = time.time()
llm = LLM(model="google/gemma-7b")
print("--- Loading time: %s seconds ---" % (time.time() - loading_start))
generation_time = time.time()
outputs = llm.generate(prompts, sampling_params)
print("--- Generation time: %s seconds ---" % (time.time() - generation_time))
for output in outputs:
generated_text = output.outputs[0].text
print(generated_text)
print('------')


使用Transformers 库

确保您正在运行Transformers的最新版本:

pip install --upgrade transformers accelerate


然后,按以下步骤加载和运行Gemma 7B:

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
set_seed(1234) # For reproducibility
prompt = "The best recipe for pasta is"
checkpoint = "google/gemma-7b"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, torch_dtype=torch.float16, device_map="cuda")
inputs = tokenizer(prompt, return_tensors="pt").to('cuda')
outputs = model.generate(**inputs, do_sample=True, max_new_tokens=150)
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(result)


Gemma 7B的量化


量化更具挑战性。当前用于GPTQ和AWQ量化的两个最常用的库AutoGPTQ和AutoAWQ不支持Gemma。尽管如此,我相信它们以后会支持Gemma。
我只能使用bitsandbytes NF4对Gemma 7B进行量化。注意:也可以使用llama.cpp在GGUF格式中进行块状量化。谷歌在与原始版本相同的存储库中正式发布了Gemma的GGUF版本。
一旦使用bitsandbytes进行量化,您仍然需要7.1GB的GPU内存来运行Gemma 7B。

安装相应的python库:

pip install --upgrade transformers bitsandbytes accelerate

量化脚本:

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed, BitsAndBytesConfig

set_seed(1234) # For reproducibility
prompt = "The best recipe for pasta is"
checkpoint = "google/gemma-7b"
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,
)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, quantization_config=bnb_config, device_map="cuda")
inputs = tokenizer(prompt, return_tensors="pt").to('cuda')
outputs = model.generate(**inputs, do_sample=True, max_new_tokens=150)
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(result)


使用QLoRA对Gemma 7B进行微调


由于bitsandbytes量化已经得到支持,我们可以使用QLoRA对Gemma 7B进行微调。同时,也可以在消费者硬件上,通过使用微小的训练批大小和较短的max_seq_length,对Gemma 7B进行LoRA微调(即不进行量化)。
以下是我用来测试QLoRA对Gemma 7B进行微调的代码:

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"
#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")
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=4,
per_device_eval_batch_size=4,
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()

完成300个eopch需要不到1小时(训练批量大小为4)。


结论

Gemma 7B看起来是Mistral 7B的一个旗鼓相当的竞争对手,但我们不要忘记它也多了10亿个参数。我们不知道Gemma 2B的用例是什么,因为它在性能上被其他类似大小的模型超越了。Gemma模型已经得到许多框架的良好支持。一旦量化,您可以使用具有8 GB GPU的Gemma 7B。

支持GPTQ和AWQ进行量化的版本应该很快就会推出。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询