LLM入门——在Colab上部署Llama2
2024/07/09
本文属于“LLM入门”系列,该系列是笔者自学LLM时记录的一些实践记录与心得,可能存在错误或过时的部分,请读者谅解。
对于LLM入门学者,我推荐从Large Language Model Course开始,这是一份优秀的学习路径指导。
本文为笔者二次整理的资料,重点关注在Colab上用基本方法部署Llama的指令过程。如有其他需求请参考对应博客:
- 可视化调用Llama2 / 在线试用 Llama2 / colab 一键部署:Llama2 部署及试用
- 跳过笔者的碎碎念,直接阅读笔者参考的原始资料:Getting Started with LlaMA 2: A Beginner’s Guide
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部署
LangChain 是一个用于开发由语言模型驱动的应用程序的框架。接下来基于LangChain在Colab上部署使用meta-llama/Llama-2-7b-chat-hf。
总体来看,部署一个LLM可以归纳为以下步骤:
- Install required packages
- Import required libraries
- Download the model
- Load the model
- Create a prompt template
- 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
- 如何获取口令参考如何获取HuggingFace的Access Token;如何获取HuggingFace的API Key
- shell中后续问你Add token as git credential? (Y/n),直接输入
n
- 如果你选择非官方(无需权限获取)的LLM,这一步应该可以略过
模型下载加载
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:
- 模型将始终选择概率最高的词,生成的文本完全确定,没有随机性。
- 这通常用于生成确定性的回答或需要非常高的准确性时,但输出可能会缺乏创意和多样性。
- 高温度值(例如,temperature=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 规范化。