LLM入门——在Colab上部署Llama2

LLM入门——在Colab上部署Llama2

2024/07/09

本文属于“LLM入门”系列,该系列是笔者自学LLM时记录的一些实践记录与心得,可能存在错误或过时的部分,请读者谅解。
对于LLM入门学者,我推荐从Large Language Model Course开始,这是一份优秀的学习路径指导。

本文为笔者二次整理的资料,重点关注在Colab上用基本方法部署Llama的指令过程。如有其他需求请参考对应博客:

Llama2

Llama2是meta最新开源的语言大模型,训练数据集2万亿token,上下文长度是由llama的2048扩展到4096,可以理解和生成更长的文本,包括7B、13B和70B三个模型。

其中其中B是Billion,代表十亿参数

以Llama2为代表的开源LLM基本都能在huggingface下载。Hugging Face 是一个旨在推动自然语言处理(NLP)技术和工具发展的开源社区和公司。他们致力于提供各种NLP任务中的最新技术、模型和工具,以及为开发者提供便捷的方式来使用、微调和部署这些技术。

当然你也别着急去下载,个人PC的性能在LLM方向能做的事有限,我推荐初学者先在Colab上练练手。

Colab

Colaboratory(简称为Colab)是由Google开发的一种基于云端的交互式笔记本环境。它提供了免费的计算资源(包括CPU、GPU和TPU),可让用户在浏览器中编写和执行代码,而无需进行任何配置和安装。

如何用Colab创建代码请参考【机器学习 | 深度学习】Colab是什么?以及如何使用它?

Llama2 访问

获取Llama的两种方式:

  • 官方申请:
    • 官网申请下载
    • huggingface获取官方库访问权限
  • huggingface第三方下载

具体方式请参考Llama2 部署及试用。如果后续有继续使用Llama做研究的需求,建议官方申请,实测一两小时内即可成功。官方申请有几点注意事项:

  • 官网/huggingface官方库申请时地区请选择"China"以外的任意选项
  • 优先huggingface官方库,官网提供的下载方式过于麻烦

Colab部署

参考:Getting Started with LlaMA 2: A Beginner’s Guide

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。接下来基于LangChain在Colab上部署使用meta-llama/Llama-2-7b-chat-hf。

总体来看,部署一个LLM可以归纳为以下步骤:

  1. Install required packages
  2. Import required libraries
  3. Download the model
  4. Load the model
  5. Create a prompt template
  6. Generate a response

Colab选择T4 GPU

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

下载相关库

!pip install -q transformers einops accelerate langchain bitsandbytes langchain-community langchain-core langchain-huggingface
  • 在命令 pip install -q 中,-q 一个选项,表示“quiet”(安静模式)。这个选项的作用是减少命令输出的冗长信息,只显示错误和警告信息。
  • Colab提供的代码编辑界面是Jupyter Notebook,Jupyter Notebook中输入命令行指令需要在指令前多放一个!
  • transformers:由 Hugging Face 开发的一个广泛使用的开源库,主要用于自然语言处理(NLP)任务。后续代码中有以下几点作用:
    • transformers.pipeline 是 Hugging Face transformers 库中的一个核心函数,提供了一个统一的接口,可以轻松地加载预训练模型,并在不同的NLP任务中使用。
    • AutoTokenizer 是 Hugging Face transformers 库中的一个重要工具,用于自动选择和加载与特定预训练模型相匹配的分词器。分词器的作用是将输入的文本转化为模型可以处理的形式(如token ID)。AutoTokenizer 提供了简化的接口,使用户可以方便地加载适合某个模型的分词器,而不必手动指定具体的分词器类。
  • einops einops是一个简洁优雅操作张量的库,并且支持对numpy,pytorch,tensorflow中的张量进行操作。
    • 在后续代码中被隐式调用
  • accelerate 是由 Hugging Face 开发的一个库,旨在简化和优化深度学习模型的训练和推理过程。
    • 在后续代码中被隐式调用
  • langchain 是一个用于构建和使用大语言模型(LLM)的库,旨在简化创建、管理和部署各种自然语言处理(NLP)任务的流程。
    • 只调用 langchain 出现报错langchain : ModuleNotFoundError: No module named ‘langchain_community’,还需要下载 langchain-community langchain-core langchain-huggingface。后续代码中有以下几点作用:
    • HuggingFacePipeline 是抽象的对象,但网上缺乏相关的介绍
    • PromptTemplate: Prompt template 是一种可复制的生成提示的方法。要创建 prompt template,可以使用 PromptTemplate 类创建一个简单的硬编码提示。Prompt template 可以接受任意数量的输入变量,并可以格式化以生成一个 prompt。

Hugging Face登录

!huggingface-cli login

模型下载加载

from langchain_huggingface import HuggingFacePipeline
from transformers import AutoTokenizer
import transformers
import torch

model = "meta-llama/Llama-2-7b-chat-hf"

tokenizer = AutoTokenizer.from_pretrained(model, truncation=True)

pipeline = transformers.pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
    max_length=1000,
    eos_token_id=tokenizer.eos_token_id
)
  • AutoTokenizer.from_pretrained 是 Hugging Face 的 transformers 库中一个便捷的方法,用于根据模型名称或路径加载预训练分词器(Tokenizer)。
    • truncation=True 的意思是允许截断。当我们使用 tokenizer 处理输入文本时,如果输入文本的长度超过我们设定的 max_length,那么就需要进行截断。
  • 这里重点关注下pipeline = transformers.pipeline
    • 网上有不少教程使用model = AutoModelForCausalLM.from_pretrained(model_name, token=True)加载模型,默认情况下,这种方式加载模型会使用 float32(32位浮点数)作为其张量的数据类型。但是Colab提供的T4 GPU资源受限,实践中会出现ran out of RAM报错。
    • torch_dtype=torch.bfloat16 通过使用较低精度的浮点数,显著减少了内存使用,从而可以在Colab上运行
llm = HuggingFacePipeline(pipeline = pipeline, model_kwargs = {'temperature':0})
  • 这一步基于pipline创建一个HuggingFacePipeline
  • 在自然语言生成任务中,温度(temperature)参数用于调节生成文本的多样性和随机性。具体来讲,温度 (temperature) 是一个浮点数,用于控制生成模型输出的概率分布。它影响模型对每个词的选择概率,从而调节生成文本的多样性和随机性。
    • 高温度值(例如,temperature=1.0 或更高):
      • 生成的文本更随机,词的选择概率分布更平坦。
      • 结果更加多样化,但也可能导致不太连贯或不符合上下文的输出。
    • 低温度值(例如,temperature=0.1 或更低):
      • 生成的文本更确定,模型倾向于选择概率最高的词。
      • 结果更连贯和符合上下文,但多样性降低。
    • 温度为 0:
      • 模型将始终选择概率最高的词,生成的文本完全确定,没有随机性。
      • 这通常用于生成确定性的回答或需要非常高的准确性时,但输出可能会缺乏创意和多样性。

Prompt Template

from langchain import PromptTemplate

template = """
              You are an intelligent chatbot that gives out useful information to humans.
              You return the responses in sentences with arrows at the start of each sentence
              {query}
           """

prompt = PromptTemplate(template=template, input_variables=["query"])

llm_chain = prompt | llm
  • Prompt template 是一种可复制的生成提示的方法,可以帮助我们针对不同情况的同类型问题简化prompt设计。它包含一个文本字符串(“template”),可以从最终用户处获取一组参数并生成一个提示。
  • PromptTemplate 类允许用户定义一个模板,该模板包含占位符变量,这些变量将在实际使用时被具体的输入值替换。这样可以确保输入提示的一致性和结构化,使得生成模型能够更好地理解和响应输入。
    • 参数 template: 一个字符串模板,包含占位符变量。模板定义了生成模型输入的结构。代码中的占位符变量为 {query}
    • input_variables: 一个字符串列表,列出模板中所有的占位符变量名。这些变量将在生成模型调用时被具体的值替换。
  • 在本文代码中,要求Llama模型回答用户的查询,并以编号的形式回答问题。
  • prompt | llm 是 langchain.PromptTemplate 的新语法特性,替代了原先的 LLMChain 函数。该指令使用提供的输入键值(如果有的话,还包括内存键值)格式化提示模板,将格式化的字符串传递给LLM并返回LLM输出。
print(llm_chain.run('What are the 3 causes of glacier meltdowns?'))
  • 至此,模型已经部署并对查询给出了响应:
    在这里插入图片描述
  • 可以看到,模型的输入查询已经按照 Prompt Template 规范化。

参考

  • 14
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值