本地部署Qwen2大模型之五:vLLM与大语言模型的关系

本地部署Qwen2大模型之一:Ollama方式部署
第一篇记录了通过Ollama方式在本地部署Qwen2大模型的过程,操作很顺利,看到大模型反应的那一刻很是激动,大大增强了我继续探索的信心。
本地部署Qwen2大模型之二:vLLM方式部署
第二篇记录了通过vLLM方式在本地部署Qwen2大模型的过程,费了很多周折,包括在本地编译vLLM框架代码后安装等,虽然最后都以失败告终,但过程中做的各种尝试,加深了我对大模型和vLLM的认识。
本地部署Qwen2大模型之三:编译CPU版vLLM
第三篇记录了通过vLLM方式在本地部署Qwen2大模型的进一步尝试过程,也是历经艰辛但最后仍未能成功。这次换到了阿里云服务器上部署——个人做技术试验的服务器,配置非常有限,过程中确实也遇到因为内存不足而功败垂成的问题,其中最有价值的是通过各种调试方式,最后单步跟踪代码,终于搞清楚了vLLM部署大模型所涉及到的各种版本与硬件类型的对应关系,知道了我之前部署不成功的底层原因。
本地部署Qwen2大模型之四:模型参数调整
第四篇记录了通过vLLM方式在本地部署Qwen2大模型的更深入的探索,直到在本地部署成功。在这个过程中我更加深入地了解了大模型和vLLM的本质联系,互动方式,以及vLLM如何调整参数来优化大模型和实际硬件的适配,以达到在现有的软硬件设施上取得最佳性能的目的。

当然,现实中还有很多类型的软硬件组合,实际应用场景更是五花八门,具体的优化工作还需积累经验,学习之路才刚刚开始。经过这几天的动手实践,回头再来看大语言模型以及相关的部署工具,我有了更清晰的认识。本文就来做个简单的梳理,理解下vLLM和大模型以及两者的关系。文章完全是借助豆包来写的,可以说就是粘贴过来的,但内容就是我想要的,是按我的思路问出来的,也是被我选择的,是豆包和我配合完美的结果!

什么是大语言模型?

大语言模型(Large Language Model,简称 LLM)是一种基于深度学习的人工智能技术,是自然语言处理的核心研究内容之一。大语言模型通过大规模的数据集对模型进行训练,从而使其能够生成自然语言文本或理解语言文本的含义,其核心是基于深度学习架构,如 Transformer,利用大量参数来模拟人类语言的复杂规律,以达到接近人类水平的文本生成和理解能力。

发展历程

早期探索阶段:20 世纪 40 年代末和 50 年代开始采用计算机技术来研究和处理自然语言,1975 年提出的 n-gram 模型是常用的统计语言模型之一。随着神经网络的发展,又出现了神经语言模型。
重要突破阶段:2017 年 Google 发布的 Transformer 模型,为大语言模型的发展奠定了基础。2018 年,Google 的 BERT 和 OpenAI 的 GPT 等预训练语言模型的出现,推动了自然语言处理领域的快速发展。
快速发展阶段:2020 年,OpenAI 发布的 GPT-3 拥有 1750 亿个参数,正式开启了大语言模型时代。此后,各大科技公司纷纷推出自己的大语言模型,如谷歌的 Bard、百度的文心一言等。

关键技术

Transformer 架构:这是大语言模型的核心架构,采用自注意力机制,可以更好地捕捉语言中的长距离依赖关系,解决了递归神经网络在并行化处理上的限制,显著提升了模型处理大规模数据集的能力。
预训练和微调:先在大规模无监督数据上进行预训练,学习语言的通用特征和模式,然后在特定任务的有监督数据上进行微调,以适应不同的下游任务。
人类反馈强化学习(RLHF):通过收集人类的反馈数据,对模型进行进一步的微调,使模型的输出更符合人类的期望和偏好,从而提高模型的性能和可用性。
提示学习:通过设计合适的提示文本,引导模型生成符合要求的回答,从而在少量标注或无标注数据的情况下,实现对新任务的快速适应和学习。

特点

海量参数:通常具有数十亿甚至数万亿个参数,能够学习到更丰富的语言知识和语义信息,从而生成更准确、更自然的文本。
强大的语言理解和生成能力:可以解析复杂的文本,提取关键信息,进行逻辑推理,并生成连贯、有见地的回应,能够处理各种知识密集型任务,如法律分析、市场研究、科学发现等。
多任务学习能力:能够同时处理多种不同类型的语言任务,如文本生成、翻译、问答、摘要等,无需为每个任务单独训练一个模型。
上下文理解能力:能够根据输入文本的上下文信息,动态地调整生成的文本内容,使生成的文本更加符合语境和逻辑。

局限性

计算资源需求大:训练和推理过程需要大量的计算资源支持,包括高性能的 CPU、GPU 或专用的人工智能芯片等,导致成本较高,且对硬件设备有一定的要求。
数据质量和偏见问题:模型的性能和输出结果在很大程度上依赖于训练数据的质量和多样性,如果数据存在偏差或不完整,可能会导致模型产生偏见或不准确的回答。
可解释性差:由于模型的复杂性和海量参数,其决策过程和生成结果往往难以解释,给模型的应用和信任带来了一定的挑战。
幻觉问题:有时会生成看似合理但实际上并不准确或不符合事实的内容,即产生幻觉现象,这在一些对准确性要求较高的应用场景中可能会带来问题。

什么是vLLM?

vLLM 是一个高效的大语言模型推理和服务库,它的全称是Virtual Large Language Model,也有人理解为Very Lightweight Large Model Server,可能前一个更契合。vLLM 诞生于加州大学伯克利分校,创建这个项目主要是为了解决大语言模型部署服务中的效率难题。作为它最关键的核心算法——PagedAttention革新了内存管理方式,显著地提升吞吐量。vLLM在开源社区吸引了大批开发者,它携手 Hugging Face 在电商大促等实际应用里证明了实力。2024年vLLM加入到 PyTorch 生态,在大语言模型推理服务领域站稳了脚跟,影响力不断扩大。

关键技术及优势

PagedAttention 技术:vLLM 使用 PagedAttention 技术来高效地管理注意力的键和值存储,它将每个序列的 KV 缓存划分为多个块,这些块可以存储在非连续的内存空间中,从而实现更灵活的内存管理,减少内存浪费,提高内存利用率,进而允许系统批处理更多的序列,增加 GPU 利用率,提升吞吐量。
动态批处理:采用自适应批处理方式,能将不同用户的请求动态合并为一个大批处理,减少设备闲置时间,提升吞吐量,更灵活地处理突发性大量请求,适用于多用户环境。
连续缓存:通过缓存常用的中间计算结果,避免不必要的数据传输和重复计算,大幅提升推理效率。
异步推理:支持异步推理,可同时处理多个推理任务,提升服务响应的及时性,特别适合处理并发请求,结合动态批处理与缓存机制,能最大化硬件利用率。
动态张量并行:将大型语言模型的计算分散到多个 GPU 或机器上,实现负载均衡,可根据硬件资源的可用性动态调整工作负载,避免 GPU 过载或空闲,提高硬件资源利用效率。

性能表现

高吞吐量:在相同的硬件条件下,vLLM 能够实现比 Hugging Face Transformers 等传统推理框架更高的吞吐量,例如在某些实验中,vLLM 的吞吐量比 Hugging Face Transformers 高出 14x-24x。
低延迟:借助上述的优化技术,vLLM 能够快速处理输入请求并生成响应,减少用户的等待时间,为实时交互应用提供了有力支持。
高效的内存管理:优化了内存使用,减少了内存开销,能够在内存有限的系统上运行更大的模型,降低了对硬件资源的要求,使得在资源受限的环境中部署大型语言模型成为可能。

功能特点

多模型支持:支持 GPT、OPT、BLOOM 等多个主流大语言模型,方便用户根据不同的应用场景和需求选择合适的模型。
多种解码算法支持:支持并行采样、波束搜索等多种解码算法,从而实现高吞吐量的服务,满足不同的文本生成需求。
流式输出:能够实时处理并输出结果,为用户提供更流畅的交互体验,适用于聊天机器人等实时性要求较高的应用。
与 Hugging Face 模型无缝集成:可以与流行的 Hugging Face 模型无缝集成,方便用户使用已有的模型和相关工具。
张量并行和流水线并行支持:支持分布式推理的张量并行计算和流水线并行计算,提高了模型的并行处理能力,进一步提升推理速度,适用于大规模的集群部署和高性能计算场景。
前缀缓存支持:能够缓存前缀的计算结果,减少重复计算,提高推理效率,尤其在处理长序列文本时效果更为显著。
多 LoRA 支持:支持多个低秩适配器(LoRA),方便用户对模型进行微调,提高模型的适应性和性能。

应用场景

聊天机器人:为聊天机器人提供高效的推理服务,使其能够同时为多个用户提供实时响应,保证响应速度快且稳定,提升用户体验。
智能客服:在大型客户服务平台中,部署高效的智能助手,帮助同时处理数百个客户的查询,保持低延迟的响应时间,提高客户服务效率和质量。
大规模内容生成:可用于实现大规模、并发的实时内容生成平台,如新闻报道自动生成、社交媒体内容生成等,支持高吞吐量的请求并保证实时性,满足快速生成大量文本内容的需求。
模型实验和微调:研究人员可以使用 vLLM 进行推理测试,验证新模型的性能,方便进行模型的实验和微调,加速模型的研发和优化过程。

部署方式

易于集成:可以通过简单的 API 集成到现有的应用程序中,降低了部署的复杂度,方便开发者将其快速应用到实际项目中。
多种部署方式支持:支持使用 Docker、Kubernetes、Helm 等工具进行部署,还可以与 Nginx 负载均衡器配合使用,实现分布式推理和服务的高效部署和管理。

vLLM和大模型的结合点

vLLM和大模型的结合点在哪里,它们是怎么交互的,怎么各自发挥自己的功能呢?

结合点

性能优化需求:大模型因参数量大、计算复杂,推理时面临性能瓶颈,vLLM 的 PagedAttention 等技术可优化内存管理和计算资源利用,提升推理速度与吞吐量,满足大模型高效推理需求。
部署与应用拓展:大模型需在不同硬件环境和应用场景中部署,vLLM 支持多硬件平台和多种部署方式,可将大模型应用于更多领域和场景,如在资源受限的边缘设备上实现大模型的高效运行。
功能增强与互补:vLLM 提供的连续缓存、动态批处理等功能可增强大模型的性能表现,而大模型的强大语言理解和生成能力则为 vLLM 的应用提供了基础,两者结合实现更强大、更高效的语言处理功能。

交互方式

模型加载与初始化:通过 vLLM 的接口,将预训练好的大模型加载到内存中,并进行必要的初始化操作,如设置模型参数、加载词汇表等,使 vLLM 能够对大模型进行推理控制。
输入数据传递:将用户输入的文本或其他数据转换为适合大模型处理的格式,然后传递给 vLLM。vLLM 会对输入数据进行预处理,如分词、编码等,并将其组织成批次,以便高效地进行推理计算。
推理过程控制:vLLM 根据输入数据和配置参数,调用大模型的推理函数,控制推理的过程,包括生成文本的长度、采样策略、温度参数等,以实现不同的生成效果。
输出结果获取与处理:大模型生成的文本或其他输出结果由 vLLM 获取,并进行后处理,如解码、去除特殊标记等,将其转换为用户可理解的格式,然后返回给用户或应用程序。

各自发挥的功能

vLLM 的功能发挥

内存管理与优化:采用 PagedAttention 技术,将 KV 缓存划分为多个小块,根据输入动态分配内存,避免显存浪费,提高内存利用率,使大模型能在有限内存下处理更多请求。
高效推理调度:通过动态批处理和异步推理等机制,将多个用户请求合并成批次进行处理,减少设备闲置时间,提高 GPU 利用率,实现高吞吐量的推理服务,同时保证服务响应的及时性。
硬件适配与扩展:支持多种硬件平台,包括 NVIDIA、AMD 等厂商的 GPU 以及 CPU,可根据不同硬件环境优化性能,还支持分布式推理,实现多机多卡的并行计算,提升系统的整体性能和可扩展性。

大模型的功能发挥

语言理解与知识表示:基于海量数据训练,大模型学习到丰富语言知识和语义理解能力,能准确解析输入文本的含义、意图和上下文信息,为各种语言相关任务提供基础支持。
文本生成与创作:具备强大的文本生成能力,可根据输入提示生成连贯、有逻辑、符合语法的高质量文本,如文章写作、对话生成、故事创作等,满足不同应用场景的文本生成需求。
多领域应用支持:可应用于自然语言处理、计算机视觉、语音识别等多个领域,通过与其他技术和模型结合,解决如文本分类、情感分析、图像描述生成、语音助手等各种复杂的实际问题。

代码形式的结合示例

能从代码的层面解释上面的说明吗?
以下是一个简单的 Python 代码示例,来解释 vLLM 和大语言模型的结合、交互以及它们如何发挥各自功能。这里假设我们使用的是一个基于 PyTorch 的大语言模型,并使用 vLLM 进行推理优化。

import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer
from vllm import LLM, SamplingParams


def main():
    # 加载大语言模型和对应的分词器
    model_name = "gpt2"
    tokenizer = GPT2Tokenizer.from_pretrained(model_name)
    model = GPT2LMHeadModel.from_pretrained(model_name)
    # 将模型移动到 GPU 上,如果可用
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)
    
    # 使用 vLLM 进行推理优化
    llm = LLM(model, tokenizer)
    
    # 输入的文本
    prompt = "Once upon a time"
    # 对输入进行编码
    input_ids = tokenizer.encode(prompt, return_tensors="pt").to(device)
    
    # 设置采样参数,例如生成文本的长度、温度等
    sampling_params = SamplingParams(max_tokens=50, temperature=0.7)
    
    # 使用 vLLM 进行推理
    outputs = llm.generate(input_ids, sampling_params)
    
    # 处理输出结果
    for output in outputs:
        generated_text = tokenizer.decode(output.outputs[0].token_ids)
        print(generated_text)


if __name__ == "__main__":
    main()

代码解释

导入必要的库
import torch:导入 PyTorch 库,用于深度学习计算和 GPU 加速。
from transformers import GPT2LMHeadModel, GPT2Tokenizer:从 transformers 库中导入 GPT2 模型和其对应的分词器,用于处理文本输入和模型加载。
from vllm import LLM, SamplingParams:从 vllm 库中导入 LLM 类和 SamplingParams 类,LLM 类将用于对大语言模型进行优化推理,SamplingParams 用于设置生成文本的参数。

加载大语言模型和分词器
model_name = “gpt2”:指定使用 GPT2 模型。
tokenizer = GPT2Tokenizer.from_pretrained(model_name):使用 GPT2Tokenizer 加载 GPT2 的分词器,用于将文本转换为模型可以处理的输入形式。
model = GPT2LMHeadModel.from_pretrained(model_name):使用 GPT2LMHeadModel 加载 GPT2 模型。
model.to(device):将模型移动到 GPU 上(如果可用),以利用 GPU 的计算能力进行加速。

使用 vLLM 进行推理优化
llm = LLM(model, tokenizer):将加载的 GPT2 模型和分词器传递给 vllm 的 LLM 类,对模型进行包装和优化。LLM 类将使用 vLLM 的技术,如 PagedAttention 等,来提高推理性能。

输入数据准备
prompt = “Once upon a time”:定义输入文本。
input_ids = tokenizer.encode(prompt, return_tensors=“pt”).to(device):使用分词器将输入文本编码为输入张量,并将其移动到相应的设备上。
设置采样参数
sampling_params = SamplingParams(max_tokens=50, temperature=0.7):创建 SamplingParams 对象,设置生成文本的最大长度为 50 个 tokens,温度参数为 0.7。温度参数控制生成文本的随机性,较低的值会使生成的文本更确定,较高的值会使生成的文本更具随机性。

使用 vLLM 进行推理
outputs = llm.generate(input_ids, sampling_params):调用 llm 对象的 generate 方法进行推理,传入输入张量和采样参数,vLLM 将对大语言模型的推理过程进行优化,如使用动态批处理、内存管理等技术,提高推理性能。

处理输出结果
for output in outputs::遍历生成的输出结果。
generated_text = tokenizer.decode(output.outputs[0].token_ids):使用分词器将生成的 token 序列解码为文本。
print(generated_text):打印生成的文本。

各自功能的体现

大语言模型(GPT2):
功能:通过 GPT2LMHeadModel.from_pretrained(model_name) 加载的 GPT2 模型学习了大量的语言知识,具有强大的语言理解和生成能力,能够根据输入的文本生成后续的文本内容。
发挥:将输入的文本表示为 input_ids 后,通过 model 进行计算,生成后续的文本 token 序列。

vLLM
功能:通过 LLM 类对 GPT2 模型进行包装,利用其内部的优化技术,如 PagedAttention 进行内存管理,提高内存利用率;通过动态批处理和异步推理等机制,提高推理性能。
发挥:在 llm.generate 步骤中,vLLM 会根据输入和采样参数,优化推理过程,如将多个输入合并成批次进行处理,提高推理的吞吐量和速度,最终输出优化后的推理结果。

这个示例展示了如何将 vLLM 和大语言模型结合使用,在实际应用中,你可以根据具体的大语言模型和任务需求,灵活调整代码,利用 vLLM 的特性和大语言模型的能力,实现更高效的语言处理和文本生成任务。

请注意,以上代码是一个简化的示例,实际应用中可能需要考虑更多的细节,例如处理更复杂的输入、更复杂的采样策略、分布式部署等。

你可能感兴趣的:(#,AI大模型,ai,AI编程,人工智能,机器学习,llama,语言模型)