当前位置: 首页 > news >正文

LLM学习笔记1——本地部署Meta-Llama-3.2-1B大模型

系列文章目录

参考博客
参考博客


文章目录

  • 系列文章目录
  • 前言与调用
  • 一、部署要求
  • 二、实现步骤
    • 0.深度学习环境
      • 错误1,验证pytorch版本时提示以下问题:
      • 错误2,验证pytorch版本时提示以下问题:
      • 错误3,有时候还会提示你有一些库没有安装,使用pip安装即可。
    • 1.transformers库安装
      • 使用pip安装
    • 2.模型下载
    • 3.模型调用
  • 三、模型结构
  • 四、总结


前言与调用

从Transformer架构的出现,到GPT与BERT系列,再到GPT3.5、文心的发布,再到Llama、Qwen、gemma、deepseek等开源。

一、Hugging Face的Transformers
这是一个强大的Python库,专为简化本地运行LLM而设计。其优势在于自动模型下载、提供丰富的代码片段,以及非常适合实验和学习。然而,它要求用户对机器学习和自然语言处理有深入了解,同时还需要编码和配置技能。

二、Llama.cpp
基于C++的推理引擎,专为Apple Silicon打造,能够运行Meta的Llama2模型。它在GPU和CPU上的推理性能均得到优化。Llama.cpp的优点在于其高性能,支持在适度的硬件上运行大型模型(如Llama 7B),并提供绑定,允许您使用其他语言构建AI应用程序。其缺点是模型支持有限,且需要构建工具。

三、Llamafile
由Mozilla开发的C++工具,基于llama.cpp库,为开发人员提供了创建、加载和运行LLM模型所需的各种功能。它简化了与LLM的交互,使开发人员能够轻松实现各种复杂的应用场景。Llamafile的优点在于其速度与Llama.cpp相当,并且可以构建一个嵌入模型的单个可执行文件。然而,由于项目仍处于早期阶段,不是所有模型都受支持,只限于Llama.cpp支持的模型。

四、Ollama
作为Llama.cpp和Llamafile的用户友好替代品,Ollama提供了一个可执行文件,可在您的机器上安装一个服务。安装完成后,只需简单地在终端中运行即可。其优点在于易于安装和使用,支持llama和vicuña模型,并且运行速度极快。然而,Ollama的模型库有限,需要用户自己管理模型。

五、vLLM
这是一个高吞吐量、内存高效的大型语言模型(LLMs)推理和服务引擎。它的目标是为所有人提供简便、快捷、经济的LLM服务。vLLM的优点包括高效的服务吞吐量、支持多种模型以及内存高效。然而,为了确保其性能,用户需要确保设备具备GPU、CUDA或RoCm。

六、TGI(Text Generation Inference)
由HuggingFace推出的大模型推理部署框架,支持主流大模型和量化方案。TGI结合Rust和Python,旨在实现服务效率和业务灵活性的平衡。它具备许多特性,如简单的启动LLM、快速响应和高效的推理等。通过TGI,用户可以轻松地在本地部署和运行大型语言模型,满足各种业务需求。经过优化处理的TGI和Transformer推理代码在性能上存在差异,这些差异体现在多个层面:

并行计算能力:TGI与Transformer均支持并行计算,但TGI更进一步,通过Rust与Python的联合运用,实现了服务效率与业务灵活性的完美平衡。这使得TGI在处理大型语言模型时,能够更高效地运用计算资源,显著提升推理效率。

创新优化策略:TGI采纳了一系列先进的优化技术,如Flash Attention、Paged Attention等,这些技术极大地提升了推理的效率和性能。而传统的Transformer模型可能未能融入这些创新优化。

模型部署支持:TGI支持GPTQ模型服务的部署,使我们能在单卡上运行启用continuous batching功能的更大规模模型。传统的Transformer模型则可能缺乏此类支持。

尽管TGI在某些方面优于传统Transformer推理,但并不意味着应完全放弃Transformer推理。在特定场景下,如任务或数据与TGI优化策略不符,使用传统Transformer推理可能更合适。当前测试表明,TGI的推理速度暂时逊于vLLM。TGI推理支持以容器化方式运行,为用户提供了更为灵活和高效的部署选项。

七、DeepSpeed
微软精心打造的开源深度学习优化库,以系统优化和压缩为核心,深度优化硬件设备、操作系统和框架等多个层面,更利用模型和数据压缩技术,极大提升了大规模模型的推理和训练效率。DeepSpeed-Inference,作为DeepSpeed在推理领域的扩展,特别针对大语言模型设计。它巧妙运用模型并行、张量并行和流水线并行等技术,显著提升了推理性能并降低了延迟。

本博客尝试只使用Hugging Face的Transformers库调用模型,看看能否实现简洁的调用。

一、部署要求

部署要求
在这里插入图片描述

二、实现步骤

0.深度学习环境

深度学习环境搭建,参考往期博文

因为LLM使用的环境可能会更新更高,所以使用的基础环境如下:

NVIDIA-SMI 525.60.11
cuda 12.1.0
cudnn 8.9.2

根据cuda版本选择对应的pytorch、torchvision、python环境。

以下版本截止2024年4月29日:
直接选择最新的那一档,cuda12.1,Python3.10,PyTorch2.2.0,torchvision0.17.0。
在这里插入图片描述

使用anaconda安装以下内容,安装方式参考往期博文:

python 3.10
PyTorch 2.2.0
torchvision 0.17.0

错误1,验证pytorch版本时提示以下问题:

OSError: libmkl_intel_lp64.so: cannot open shared object file: No such file or directory

在这里插入图片描述

修改环境变量配置文件:

gedit ~/.bashrc

在~/.bashrc文件末尾另起一行添加:

export LD_LIBRARY_PATH=/home/xxx/anaconda3/lib:$LD_LIBRARY_PATH

更新环境变量配置文件:

source ~/.bashrc

查看是否更新成功:

echo $LD_LIBRARY_PATH
# 输出必须带有/home/xxx/anaconda3/lib才算成功

错误2,验证pytorch版本时提示以下问题:

OSError: libcudart.so.12: cannot open shared object file: No such file or directory

1、确认CUDA和cudnn是否正确安装,版本是否对应。

# 查看当前cuda的版本
nvcc --version
#查看cudnn版本
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

2、如果确定安装了对应版本的CUDA和cudnn,查看 ~/.bashrc环境变量是否正确包含了 对应的库文件路径。

export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda/bin:$PATH

3、如果安装了CUDA和cudnn,确定版本正确,成功链接,那么移动或者重写 ~/.bashrc环境变量中的CUDA和cudnn库文件路径,然后更新。

错误3,有时候还会提示你有一些库没有安装,使用pip安装即可。


1.transformers库安装

使用pip安装

huggingface的Transformers库要求的深度学习环境版本如下:

Python 3.8+
Flax 0.4.1+ / PyTorch 1.11+ / TensorFlow 2.6+

建议尽量在anaconda虚拟环境中安装Transformers库。

首先,创建一个3.10版本的虚拟环境并激活:

conda create -n your_env_name python=3.10
source activate your_env_name

然后,在虚拟环境中安装Flax 0.4.1+或PyTorch 1.11+或TensorFlow 2.6+神经网络算法库(选择其中之一):

具体安装方法,参考往期博文

最后,安装Transformers库:

# transformers >= 4.43.0
pip install transformers

提示成功安装Transformers库和大部分依赖库,但有个别依赖库安装失败,比如Pillow库:
在这里插入图片描述
在这里插入图片描述

单独安装Pillow库:

pip install Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn

如果还提示却别的库也是这样安装就好。

查看虚拟环境中的库:

conda list

在这里插入图片描述


2.模型下载

大部分模型都可以在huggingface网站下载,直接点击Clone repository选项,选择git方式下载:

Llama-3.2-1B模型huggingface下载地址

在这里插入图片描述

git clone https://huggingface.co/meta-llama/Llama-3.2-1B

用这种方法下载不仅需要上外网,而且下载速度还会比较慢,除此之外有一些模型下载使用还需要向官方申请许可,比如:
在这里插入图片描述

这里使用一些取巧的方法:

使用国内阿里的大模型平台modelscope魔搭网站下载

Llama-3.2-1B模型modelscope下载地址modelscope,直接点击模型文件,点击下载模型:

在这里插入图片描述

它会提供一些不同的下载命令:

在这里插入图片描述

这里直接使用modelscope库下载:

# 先安装modelscope库
pip install modelscope# 不加–local_dir选项,会使得模型保存在临时文件(/home/xxx/.cache/modelscope/hub)中,不方便查找
modelscope download --model LLM-Research/Llama-3.2-1B# 加上–local_dir选项,使得模型保存在指定文件夹文件(/home/xxx/LLM-Research/Meta-Llama-3.2-1B-Instruct)中,方便查找
modelscope download --model LLM-Research/Llama-3.2-1B --local_dir /home/xxx/Llama-3.2-1B

在这里插入图片描述

这样在绕过许可证的同时,也能避免外网问题,快速下载。


3.模型调用

使用以下代码可以简单调用这个模型:

from transformers import AutoModelForCausalLM, AutoTokenizerdef load_model_and_tokenizer(model_directory):"""从本地目录加载模型和分词器。"""tokenizer = AutoTokenizer.from_pretrained(model_directory)# 添加特殊的填充令牌tokenizer.add_special_tokens({'pad_token': '[PAD]'})model = AutoModelForCausalLM.from_pretrained(model_directory)# model.half()return model, tokenizerdef generate_text(model, tokenizer, prompt, max_new_tokens):"""使用提供的模型和分词器生成文本。"""# 编码输入提示inputs = tokenizer(prompt, return_tensors='pt', padding=True, truncation=True)input_ids = inputs['input_ids']attention_mask = inputs['attention_mask']# 生成文本output = model.generate(input_ids=input_ids,attention_mask=attention_mask,max_new_tokens=max_new_tokens,pad_token_id=tokenizer.eos_token_id,no_repeat_ngram_size=2,repetition_penalty=1.5,top_k=50,top_p=0.95,temperature=1.0,do_sample=True,num_return_sequences=1,num_beams=2,  # 设置 num_beams > 1early_stopping=True)# 解码生成的文本generated_text = tokenizer.decode(output[0], skip_special_tokens=True)return generated_textdef chat_with_model(model, tokenizer, max_new_tokens):"""与模型进行聊天对话。"""print("Chat with the model! Type 'exit' to end the conversation.")prompt = "You are an Intelligent Traffic Rules Q&A Assistant, and when user ask you questions, you will provide me with traffic knowledge.Next, user will ask you questions, please answer them.\n"# once_input = input("User1:")## if once_input.lower() == 'exit':#     print("Assistant: Goodbye! Stay safe on the roads!")#     exit()## input_to_model = prompt + "\nUser2:" + once_input + "\nAssistant"## response = generate_text(model, tokenizer, input_to_model, max_new_tokens)print("111", prompt)while True:user_input = input("User3: ")if user_input.lower() == 'exit':print("Assistant: Goodbye! Stay safe on the roads!")breakinput_to_model = prompt + user_input + "\nAssistant"# 更新对话历史# 生成模型的回答response = generate_text(model, tokenizer, input_to_model, max_new_tokens)print(response)def main():model_directory = "/LLM/Llama-3.2-1B/"max_new_tokens = 100  # 生成新 token 的最大数量# 加载模型和分词器model, tokenizer = load_model_and_tokenizer(model_directory)# 确保模型处于评估模式model.eval()# 开始聊天对话chat_with_model(model, tokenizer, max_new_tokens)if __name__ == "__main__":main()

简单问答:

在这里插入图片描述

三、模型结构

未完待续。。。

四、总结

一方面Meta-Llama-3.2-1B太小,很多回答都是胡言乱语,另一方面对模型的调用只依靠了一个Hugging Face的Transformers库,实际的使用体验相当不好,想要更好的体验可能需要在更工程化的框架下去调用模型,比如ollama等。

这篇博客记录于2024年,Meta-Llama-3.2发布不久,看见有1B的模型就心血来潮测试了一下,测试完后因为工作忙碌就忘记发布了,直到24年年末的deepseekV3以及今年过年时的R1如此出圈爆火,打算年后回来测试一下,才发现这篇博客被遗忘了。

后续有时间会继续更新学习有关llama的模型结构。

相关文章:

LLM学习笔记1——本地部署Meta-Llama-3.2-1B大模型

系列文章目录 参考博客 参考博客 文章目录 系列文章目录前言与调用一、部署要求二、实现步骤0.深度学习环境错误1,验证pytorch版本时提示以下问题:错误2,验证pytorch版本时提示以下问题:错误3,有时候还会提示你有一些…...

Nginx反代Ollama接口跨域、无法逐字输出问题

场景 本地部署deepseek模型,用的Ollama管理,内网穿透到公网,在通过nginx反代ollama接口。 问题描述 跨域问题 nginx转发时请求头中需要加入origin,并且origin还要和ollama接口同源(协议、ip、端口一致)。…...

大学资产管理系统中的下载功能设计与实现

大学资产管理系统是高校信息化建设的重要组成部分,它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展,下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…...

股指入门:股指期货是什么意思?在哪里可以做股指期货交易?

股指期货是一种以股票指数为标的物的期货合约,也可以称为股票指数期货或期指。 股指期货是什么意思? 股指期货是一种金融衍生品,其标的资产是股票市场上的股指,例如标普500指数、道琼斯工业平均指数、上证50指数等。 股指期货允…...

< OS 有关 > 利用 google-drive-ocamlfuse 工具,在 Ubuntu 24 系统上 加载 Google DRIVE 网盘

Created by Dave On 8Feb.2025 起因: 想下载 StableDiffusion,清理系统文件时把 i/o 搞到 100%,已经删除到 apt 缓存,还差 89MB,只能另想办法。 在网上找能不能挂在 Google 网盘,百度网盘,或 …...

Golang的引用类型和指针

在Golang中,引用类型和指针是两个容易混淆的概念,但它们有本质的区别。理解它们的区别对于编写高效、正确的Go代码至关重要。 1. 引用类型 引用类型是Go语言中某些内置类型的统称,它们的值在传递时共享底层数据,而不是复制数据。…...

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上,其内部结构如图4-1所示。作为单一芯片的计算机,它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU,由运算器和控制器两个部分构成;…...

32. C 语言 安全函数( _s 尾缀)

本章目录 前言什么是安全函数?安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1:strcpy_s 和 strcat_s示例 2:memcpy_s示例 3:strtok_s 总结 …...

Android T(13) 源码分析 — BufferQueue 的分析

Android T(13) 源码分析 — BufferQueue 的分析 文章目录 Android T(13) 源码分析 — BufferQueue 的分析前言摘要一、Java 层的 BufferQueue 分析二、原生层的 BufferQueue 分析1、BLASTBufferQueue 的创建2、BLASTBufferQueue 的更新3、Surface 的创建 总结 前言 该系列文章…...

Vite+TS项目中配置路径别名

在使用 Vite 和 TypeScript 的项目中配置路径别名,可以简化模块导入路径,提高代码的可读性和维护性。以下是详细的步骤和示例代码: 1. 配置 Vite 别名 前置条件 下载types/node 下面引入的path会用到 npm install types/node --save-dev原…...

看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单

文章目录 系列文章现象原因分析时间点含义正常情况测试市场反应诱导跟风操纵股价意图系列文章 看盘细节系列 篇一:集合竞价尾盘突变 现象 集合竞价中 9 点 18 分通过一笔大单或连续几笔大单将股价打到 3% 以下或以上,9 点 19 分又迅速撤单。从而在分时图上留下一根长长的上…...

Java继承简介

继承的本质:是代码的复用,重复使用已经定义好的方法和域(即全局变量) 要掌握继承首先要了解Java方法的重载和重写 方法的重载和重写 方法的重载 当前方法名相同,但是参数类型不同,发生重载 类比数学函…...

redis之哨兵集群搭建

一:哨兵集群工作概览图 1.监控:sentinel通过心跳监控redis的master和slave实例是否正常工作 2.故障转移:假如master出现故障,sentinel会选举一个slave作为新的master,当故障实例恢复后身份会变成slave,会以…...

保姆级AI开发环境搭建

目录 windows下环境搭建1. Python环境搭建2. 下载vLLM2.1 安装CUDA2.2 安装Pytorch2.3 安装vllm 3. 部署Deepseek(huggingface)3.1 DeepSeek的优化建议 4. ollama快速部署Deepseek4.1 下载Ollama4.2 配置Ollma4.2 运行模型4.3 其他Ollama命令 linux下环境…...

Arduino 型号的对比

常见 Arduino 型号的对比表格 涵盖了不同型号的关键参数和特点,方便你根据项目需求进行选择: 型号Arduino UnoArduino Mega 2560Arduino LeonardoArduino NanoArduino Due微控制器ATmega328PATmega2560ATmega32U4ATmega328P 或 ATmega168SAM3X8E&#…...

Kafka系列之:定位topic只能保存最新数据的原因

Kafka系列之:定位topic只能保存最新数据的原因 一、背景二、定位排查方向三、深入排查一、背景 kafka topic保存的数据少,topic只能保存最新的数据二、定位排查方向 能想到的定位排查方向:topic能存储的数据量、topic数据保存的时间、topic数据大小./bin/kafka-configs.sh -…...

AtCoder Beginner Contest 391(A~E题题解)

A - Lucky Direction 思路&#xff1a;纯模拟的一个水题 #include <bits/stdc.h> using namespace std; #define int long long string s; signed main() { cin>>s;for(int i0;i<s.size();i){char cs[i];if(cN){cout<<"S";}else if(c…...

mysql mvcc 锁 关系

多版本并发控制&#xff08;MVCC&#xff09;是一种用于数据库并发控制的机制&#xff0c;它可以在保证数据一致性的同时&#xff0c;提高数据库的并发性能。下面结合 MVCC 机制&#xff0c;详细阐述常见的四种事务隔离级别&#xff08;读未提交、读已提交、可重复读、串行化&a…...

安卓手机基于 Termux 安装 AList 并设置开机自启的详细教程

安装 AList 安装 Termux&#xff1a; 点击下载 更新软件包&#xff1a;打开 Termux&#xff0c;运行以下命令以更新软件包列表并升级已安装的软件包&#xff1a; bash复制 pkg update && pkg upgrade安装 AList&#xff1a;运行以下命令安装 AList&#xff1a; bash复…...

LeetCode:503.下一个更大元素II

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[…...

实验5 配置OSPFv2验证

实验5 配置OSPFv2验证 1.实验目的 &#xff08;1&#xff09;OSPFv2 验证的类型和意义。 &#xff08;2&#xff09;配置基于区域的 OSPFv2 简单口令验证和 MD5 验证的方法。 &#xff08;3&#xff09;配置基于链路的 OSPFv2 简单口令验证和 MD5 验证的方法。 2.实验准备 配置…...

第二节 docker基础之---镜像构建及挂载

查看当前镜像&#xff1a; [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [rootdocker ~]#很明显docker是咱们新搭建的所以目前还没有镜像 1&#xff0c;搜索镜像&#xff1a; [rootdocker ~]# docker search centos 搜索镜像并过滤是官…...

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码&#xff08;Masked Autoencoding&#xff09;在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…...

记录一下 在Mac下用pyinstallter 打包 Django项目

安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…...

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡&#xff08;Bias-Variance Tradeoff&#xff09; 1. 引言 在机器学习模型的训练过程中&#xff0c;我们常常面临一个重要的挑战&#xff1a;如何平衡 偏差&#xff08;Bias&#xff09; 和 方差&#xff08;Variance&#xff09;&#xff0c;以提升模型的泛…...

deepseek本地部署-linux

1、官网推荐安装方法&#xff08;使用脚本&#xff0c;我绕不过github&#xff0c;未采用&#xff09; 登录ollama下载网站https://ollama.com/download/linux&#xff0c;linux下有下载脚本。 正常来说&#xff0c;在OS系统下直接执行脚本即可。 2、手动安装方法 2.1获取ol…...

解决使用python提取word文档中所有的图片时图片丢失的问题

python解析word文档&#xff0c;提取文档中所有的图片并保存&#xff0c;并将原图位置用占位符替换。 问题描述 利用python-dox库解析word文档&#xff0c;并提取里面的所有图片时发现会出现一摸一样的图片只解析一次&#xff0c;导致图片丢失&#xff0c;数量不对的情况。 …...

【Spring相关知识】Spring应用如何优雅使用消息队列

文章目录 概述**核心概念****使用场景****快速入门**1. 添加依赖2. 配置 Binder3. 定义消息通道4. 发送和接收消息5. 运行应用 **高级特性****优点****适用场景** 概述 Spring Cloud Stream 是一个用于构建消息驱动微服务的框架&#xff0c;它基于 Spring Boot 和 Spring Inte…...

人工智能:从概念到未来

人工智能&#xff1a;从概念到未来 一、引言 在当今数字化时代&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;已从科幻小说和电影中的幻想逐渐走进现实&#xff0c;成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…...

CUDA Graph

cudaGraphLaunch 是 NVIDIA CUDA API 中的一个函数&#xff0c;用于在 CUDA Graphs 中启动一个已实例化的图。 CUDA Graphs 简介 CUDA Graphs 是 NVIDIA CUDA 编程模型中的一种技术&#xff0c;旨在优化 GPU 程序的性能。它允许将一系列连续的 GPU 操作&#xff08;如计算和数…...