从GPT到Mistral-7B:AI对话中的令人兴奋的跨越

AI技术之跨界对话:从GPT到Mistral-7B的令人兴奋突破

介绍

人工智能领域近年来取得了remarkable的进展,特别是在大规模语言模型领域。大规模语言模型可以生成类似人类的文本,摘要文档,编写软件代码。Mistral-7B是最近支持英语文本和代码生成能力的大型语言模型之一,它可以用于各种任务,如文本摘要,分类,文本补全和代码补全。

Mistral-7B-Instruct的特色在于其能够在参数较少的情况下提供出色的性能,使其成为一个高性能和具有成本效益的解决方案。在最近的基准测试结果中,该模型不仅在MT-Bench上表现优于所有7B模型,还与13B chat模型竞争激烈。在本博客中,我们将探讨Mistral 7B的特点和能力,包括其用例,性能以及模型微调的实际指南。

学习目标

  • 了解大规模语言模型和Mistral 7B的工作原理
  • Mistral 7B的架构和基准测试
  • Mistral 7B的用例和性能
  • 深入研究推理和模型微调的代码

本文章作为数据科学博客马拉松的一部分发布。

什么是大规模语言模型?

大规模语言模型的架构是由transformer组成的,它使用注意力机制来捕捉数据中的长距离依赖性,多个transformer块层包含多头自注意力和前向神经网络。这些模型是在文本数据上进行预训练的,学习预测序列中的下一个单词,从而捕捉语言的模式。预训练权重可以在特定任务上进行微调。我们将特别研究Mistral 7B LLM的架构和其突出之处。

Mistral 7B架构

Mistral 7B模型的transformer架构通过注意力机制和缓存策略,高效平衡了性能和内存使用,以速度和质量超越更大的模型。它使用4096窗口滑动窗口注意力(SWA),通过允许每个标记依赖于一部分前导标记,优化了对较长序列的注意力,从而最大化了对较长序列的注意力。

给定的隐藏层可以访问窗口大小和层深度确定的输入层中的标记。该模型集成了对Flash Attention和xFormers的修改,使得速度比传统的注意力机制提高了一倍。此外,滚动缓冲区缓存机制可以维持固定大小的缓存以实现高效的内存使用。

在Google Colab中使用Mistral 7B

让我们深入代码并了解在Google Colab中使用Mistral 7B模型进行推理的方法。我们将使用带有单个T4 GPU的免费版本,并从Hugging Face加载模型。

1. 在Colab中安装和导入ctransformers库。

#在Colab中安装ctransformerspip install ctransformers[cuda]#导入from ctransformers import AutoModelForCausalLM

2. 从Hugging Face初始化模型对象并设置必要的参数。我们将使用一个不同版本的模型,因为Mistral AI的原始模型在Google Colab中将整个模型加载到内存中可能会有问题。

#从huggingface加载模型,具有50个gpu层llm = AutoModelForCausalLM.from_pretrained("TheBloke/Mistral-7B-Instruct-v0.1-GGUF", model_file="mistral-7b-instruct-v0.1.Q4_K_M.gguf", model_type = "mistral", gpu_layers = 50)

3. 定义一个函数,以垂直方式在Google Colab中打印结果。如果在其他环境中运行,则可以跳过或修改此步骤。

#在Colab中以易读的方式打印模型输出的函数def colab_print(text, max_width = 120):  words = text.split()  line = ""  for word in words:    if len(line) + len(word) + 1 > max_width:      print(line)      line = ""    line += word + " "  print (line)

4. 使用模型生成文本并查看结果。根据需要修改参数以更改生成文本的质量。

#生成文本colab_print(llm('''给我一段关于一位高级数据科学家(名字-苏沃吉特)的好写的五个句子的段落,该高级数据科学家在Analytics Vidhya上写关于LLMs的博客。他在BITS Pilani学院获得了AIML硕士学位,在AZ Company工作,拥有4年的经验。以“苏沃吉特是一个”开头的句子。''', max_new_tokens = 2048, temperature = 0.9, top_k = 55, top_p = 0.93, repetition_penalty = 1.2))

模型回应: 苏沃吉特是一位高级数据科学家,他已在AZ公司工作了4年,是他们团队中专注于使用有限内存机器学习技术在客户品牌和业务线上设计、实施和改进消费者行为预测模型的一部分。他在Analytics Vidhya上写关于LLMs的文章,这帮助他与数据科学的最新趋势保持接轨。他在BITS Pilani获得了AIML硕士学位,研究了机器学习算法及其应用。苏沃吉特热衷于利用自己对数据科学的知识帮助企业做出更好的决策并提高其业绩。

应用案例

让我们更详细地看一些Mistral 7B的用途。

翻译

Mistral 7B支持多种语言的翻译。我们来看一下英文到法文和西班牙文的翻译,并检查准确性。

#将英文翻译为法文colab_print(llm('''将此文本从英文翻译为法文:“苏沃吉特是一位在Analytics Vidhya上写博客的高级数据科学家。”''',                max_new_tokens = 2048, temperature = 0.9, top_k = 55, top_p = 0.93,                 repetition_penalty = 1.2))

模型回应: 翻译结果为:“苏沃吉特 est un scientifique des données sénior qui écrit des blogues sur Analytics Vidhya.”

#将英文翻译为西班牙文colab_print(llm('''将此文本从英文翻译为西班牙文:“苏沃吉特是一位在Analytics Vidhya上写博客的高级数据科学家。”''',                max_new_tokens = 2048, temperature = 0.9, top_k = 55, top_p = 0.93,                 repetition_penalty = 1.2))

模型回应: 翻译结果为:“苏沃吉特 es un Senior Data Científico que escribe blogs en Analytics Vidhya.”

摘要

使用Mistral 7B根据适当的摘要说明将文档摘要为更短的版本。

#使用指定的摘要说明定义提示prompt = '''[INST] 你是一个有用的代码助手。你的任务是将文本摘要为两个简短的句子: Transformers通过捕捉文本中的长程依赖性和复杂模式的能力,革命了大型语言模型领域。Transformers源于2017年Vaswani等人的论文《注意力机制即全部》中引入的自注意机制,该机制根据给定标记与相关标记的相关性对其进行加权。这种机制使得transformers能够更灵活地处理信息,而不像传统的RNN或LSTM那样。因此,GPT、BERT等模型及其后续版本都是基于transformer架构构建的,在许多自然语言处理任务中取得了突破。它们的并行处理能力进一步使之适合在大量数据上进行培训。然而,随着这些模型的尺寸增加,人们也开始关注它们的环境影响和计算需求的问题。尽管面临这些挑战,transformers在语言模型中的变革能力是不可否认的。只需总结文本,用不解释的方式,不使用超过2个简短的句子。[/INST]'''#摘要colab_print(llm(prompt,                max_new_tokens = 2048, temperature = 0.9, top_k = 55, top_p = 0.93,                 repetition_penalty = 1.2))

模型回复:Transformer 通过捕捉长程依赖和复杂模式,在大型语言模型方面进行了革命性的改进,引入了自注意机制,使其能够灵活处理信息,并且后续的实现包括了GPT和BERT等突破。然而,随着这些模型变得越来越大,人们对它们的环境影响和计算需求的担忧也越来越大,尽管它们面临着这些挑战,但它们在语言建模领域的变革作用不可否认。

自定义指令

我们可以使用 [INST] 标记来修改用户输入,从而获得模型的特定回复。例如,我们可以基于文本描述生成一个 JSON 对象。

prompt = '''[INST] 你是一个有帮助的代码助手。你的任务是基于给定信息生成一个有效的 JSON 对象:我的名字是 Suvojit Hore,我在 AB 公司工作,我的地址是 AZ Street NY。只需生成 JSON 对象而无需解释:[/INST]'''colab_print(llm(prompt,                max_new_tokens = 2048, temperature = 0.9, top_k = 55, top_p = 0.93,                 repetition_penalty = 1.2))

模型回复:”`json { “name”: “Suvojit Hore”, “company”: “AB”, “address”: “AZ Street NY” } “`

Feintuning Mistral 7B

让我们看看如何在 Google Colab 上使用单个 GPU 对模型进行微调。我们将使用一个将图像的少字描述转换为详细和高度描述性文本的数据集。这些结果可以在 Midjourney 中用于生成特定的图像。目标是训练 LLM 作为图像生成的提示工程师。

在 Google Colab 中设置环境并导入必要的库:

# 安装必要的库!pip install pandas autotrain-advanced -q!autotrain setup --update-torch!pip install -q peft  accelerate bitsandbytes safetensors# 导入必要的库import pandas as pdimport torchfrom peft import PeftModelfrom transformers import AutoModelForCausalLM, AutoTokenizerimport transformersfrom huggingface_hub import notebook_login

在浏览器中登录 Hugging Face 并复制访问令牌。使用此令牌在笔记本中登录 Hugging Face。

notebook_login()
Hugging Face 笔记本登录

将数据集上传到 Colab 会话存储。我们将使用 Midjourney 数据集。

df = pd.read_csv("prompt_engineering.csv")df.head(5)
Prompt Engineering 数据集

使用适当的参数使用 Autotrain 训练模型。根据您自己的 Hugging Face 仓库和用户访问令牌修改下面的命令以运行它。

!autotrain llm --train --project_name mistral-7b-sh-finetuned --model username/Mistral-7B-Instruct-v0.1-sharded --token hf_yiguyfTFtufTFYUTUfuytfuys --data_path . --use_peft --use_int4 --learning_rate 2e-4 --train_batch_size 12 --num_train_epochs 3 --trainer sft --target_modules q_proj,v_proj --push_to_hub --repo_id username/mistral-7b-sh-finetuned

现在让我们使用微调模型来运行推理引擎,并生成一些图像的详细描述。

# adapter 和模型adapters_name = "suvz47/mistral-7b-sh-finetuned"model_name = "bn22/Mistral-7B-Instruct-v0.1-sharded" device = "cuda"# 设置配置bnb_config = transformers.BitsAndBytesConfig(    load_in_4bit=True,    bnb_4bit_use_double_quant=True,    bnb_4bit_quant_type="nf4",    bnb_4bit_compute_dtype=torch.bfloat16)# 初始化模型model = AutoModelForCausalLM.from_pretrained(    model_name,    load_in_4bit=True,    torch_dtype=torch.bfloat16,    quantization_config=bnb_config,    device_map='auto')

加载微调模型和分词器。

#加载模型和分词器model = PeftModel.from_pretrained(model, adapters_name)tokenizer = AutoTokenizer.from_pretrained(model_name)tokenizer.bos_token_id = 1stop_token_ids = [0]

用几个词生成一个详细和描述性的中途提示。

#prompttext = "[INST]生成一个不超过20个词的中途提示,针对具有情感芯片的计算机[/INST]"#编码器和解码器encoded = tokenizer(text, return_tensors="pt", add_special_tokens=False)model_input = encodedmodel.to(device)generated_ids = model.generate(**model_input, max_new_tokens=200, do_sample=True)decoded = tokenizer.batch_decode(generated_ids)print('\n\n')print(decoded[0])

模型回复:当具有情感芯片的计算机开始处理它的情绪时,它开始质疑自己的存在和目的,从而展开一场自我发现和自我提升的旅程。

#prompttext = "[INST]生成一个不超过20个词的中途提示,针对一道追逐颜色的彩虹[/INST]"#编码器和解码器encoded = tokenizer(text, return_tensors="pt", add_special_tokens=False)model_input = encodedmodel.to(device)generated_ids = model.generate(**model_input, max_new_tokens=200, do_sample=True)decoded = tokenizer.batch_decode(generated_ids)print('\n\n')print(decoded[0])

模型回复:一道追逐颜色的彩虹发现自己置身于一个天空是无尽蓝色的沙漠,在沙子中散布着彩虹的颜色。

结论

Mistral 7B在大型语言模型领域取得了重要的进展。其高效的架构和卓越的性能展示了它在未来成为各种自然语言处理任务中的重要组成部分的潜力。本博客提供了关于该模型的架构、应用以及如何利用其在翻译、摘要和其他应用的特定任务中发挥其能力的见解。通过正确的指导和实验,Mistral 7B有可能重新定义大型语言模型的边界。

主要观点

  • Mistral-7B-Instruct在参数较少的情况下表现出色。
  • 它使用滑动窗口注意力来优化长序列。
  • 闪电注意力和xFormers等特性使其速度翻倍。
  • 滚动缓冲缓存确保高效的内存管理。
  • 多功能:处理翻译、摘要、结构化数据生成、文本生成和文本补全。
  • 通过添加自定义指令进行提示工程可以帮助模型更好地理解查询并执行多个复杂的语言任务。
  • 微调Mistral 7B以用作特定语言任务的提示工程师。

常见问题

参考资料

  • 缩略图-使用稳定扩散生成
  • 架构-论文

本文中显示的媒体并不归Analytics Vidhya所有,仅由作者决定使用。