ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">Google的新型Gemma模型是第一批采用与Gemini模型使用相同技术构建的开放式LLMs。它们仅提供两种尺寸,2B和7B。此外,还提供了用于聊天应用程序的基础版本和指令调优版本。这些模型已经得到了许多深度学习框架的支持,并且足够小,可以在消费者硬件上使用。 ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">在本文中,我们将了解Gemma模型的主要特点。我们会发现,其中一些特点并非一般标准模型所具有的,而Google似乎从Llama 2和Mistral 7B中吸取了很多有用的经验,提出了一个出色的7B模型。在本文的第二部分,我们将了解如何使用Gemma模型:与QLoRA进行微调、推断和量化。ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;margin-top: calc(2.33333em);margin-bottom: calc(1.16667em);clear: left;color: rgb(25, 27, 31);letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">Gemma 7B其实是8.5BingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">关于Gemma 的实现细节可以查看下面的文档:ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">Gemma: Open Models Based on Gemini Research and Technology(https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf)ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">Gemma技术报告中的表2非常引人注目:ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);"> ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">在这个表格中,Google展示了每个模型的参数数量,区分了嵌入参数和非嵌入参数。对于7B模型,非嵌入参数有7.751B。即使不计算嵌入参数,我们也更接近于8B而不是7B。如果考虑到总参数数量,Gemma 7B有8.54B参数ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);"> 所以Gemma更接近于9B模型而不是7B模型。将Gemma发布为“7B”LLM是误导性的,但似乎这是一个新趋势,因为LLM制造商希望将他们自己的LLM与先前发布的7B模型进行比较。ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;font-size: medium;letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(255, 255, 255);">
为了比较,以下是其他流行的“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倍。这可能有两个原因:
Llama 2的训练损失在训练3T token后仍然显着下降。 由于词汇表非常大,模型需要进行更长时间的训练,以学习词汇表中所有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:
pipinstallvllm 这是一个简单的离线推断示例,可以有效地利用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的最新版本: pipinstall--upgradetransformersaccelerate 然后,按以下步骤加载和运行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库: pipinstall--upgradetransformersbitsandbytesaccelerate 量化脚本: 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进行量化的版本应该很快就会推出。
|