当前位置:AIGC资讯 > AIGC > 正文

LLM入门——在Colab上部署Llama2

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部署

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

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: 模型将始终选择概率最高的词,生成的文本完全确定,没有随机性。 这通常用于生成确定性的回答或需要非常高的准确性时,但输出可能会缺乏创意和多样性。

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 规范化。

参考

收藏 | 看懂llama2 原理、模型和训练 HuggingFace 介绍 LangChain 介绍 langchain_community.llms.huggingface_pipeline.HuggingFacePipeline Langchain(十)进阶之prompt template的使用

总结

**文章总结:《LLM入门——在Colab上部署Llama2》**
---
**文章概述**
本文作为“LLM入门”系列的一部分,重点讲解了如何在Google Colab上使用基础步骤部署开源的Llama2大型语言模型。文章首先简单介绍了Llama2的特性及其获取方式,接着详细阐述了在Colab环境中部署Llama2的步骤及关键要点,非常适合LLM初学者参考。
**主要内容**
1. **LLama2 介绍**
- 项目背景:Llama2是Meta公司最新开源的语言大模型,拥有2万亿tokens的训练数据集,上下文长度从2048扩展到4096,提供7B、13B、70B三个不同参数规模的版本(B表示十亿)。
- 获取途径:Llama2模型可以通过Meta官网或Hugging Face的开源平台进行下载,初学者建议使用Hugging Face平台以简化流程。
2. **Colab 介绍**
- Colab是一个基于Google Cloud的免费云端Jupyter笔记本环境,提供CPU、GPU、TPU等计算资源,用户无需进行繁琐的配置即可用来编写和运行代码。
- 推荐理由:由于个人电脑性能对于运行大模型有限,Colab提供了免费且强大的计算资源,非常适合初学者练手和学习。
3. **Colab部署Llama2步骤**
- 前期准备:
- 安装必要的库,包括`transformers`、`einops`、`accelerate`和`langchain`等,其中`langchain`是构建LLM应用程序的重要框架。
- 登录Hugging Face以获取访问权限,非官方途径获取的模型可以跳过这一步。
- 模型下载与加载:
- 通过`transformers`库和`langchain_huggingface`模块加载Llama2模型及其分词器(Tokenizer)。
- 设定`pipeline`来指定文本生成任务的相关参数,如数据类型(`torch.bfloat16`以减少内存使用)、生成的最大长度等。
- 使用`HuggingFacePipeline`来封装`transformers.pipeline`实例,并通过设置温度(`temperature`)参数调整生成文本的多样性。
- 创建Prompt模板:
- 使用`langchain.PromptTemplate`定义一个标准化的提示模板,简化后续不同情境下的问题输入。
- 将Prompt模板与LLM模型相结合,形成一套可以处理用户查询的系统。
- 运行示例:通过向系统输入查询文本,模型将根据Prompt模板生成相应的回答。
**核心要点**
- **优点**:利用Colab的免费GPU资源,可以让初学者无需购买昂贵设备便能体验到LLM应用的乐趣。
- **关键库与工具**:`transformers`、`langchain`是部署LLM不可或缺的两个库,分别负责模型加载和应用程序构建。
- **注意事项**:
- 内存管理是运行模型时需重点关注的问题,尤其是在内存受限的环境(如Colab T4 GPU)中。
- 温度(`temperature`)参数对于调整生成文本的随机性和多样性至关重要。
**参考资源**
- 有关Llama2原理、训练和模型的详细解析文章与视频。
- Hugging Face和LangChain的官方文档及社区支持资源。
通过这篇文章,读者可以快速入门如何在Colab上部署和使用Llama2这类大型语言模型,为后续的LLM研究和应用开发打下基础。

更新时间 2024-09-23