大模型下载、本地部署和调用攻略

news2024/9/24 14:52:19

零、下载大模型——以Qwen/Qwen2.5-7B为例

1、下载前的准备工作

1.1 仔细阅读模型的Model card介绍

里面会有支持的上下文长度、模型结构、参数量等基本信息

 1.2 查看模型文件

Tokenizer相关的文件:

  • merges.txt:这是用于Byte Pair Encoding(BPE)的词汇表的一部分。BPE是一种常见的子词切分算法,它会将常见的词或词组分解为更小的可重复的子单元。
  • tokenizer_config.json:这是tokenizer的配置文件,包含tokenizer的设置和参数。
  • tokenizer.json:这可能是tokenizer的主要文件,包含用于词汇表的具体数据。
  • vocab.json:这也是词汇表的一部分,通常包含词汇表中的所有单词及其对应的索引。

模型相关的文件:

  • config.json:这是模型的配置文件,包含模型的设置和参数。
  • generation_config.json:这是生成任务的配置文件,包含生成任务的设置和参数。
  • model-xxx.safetensors:这是模型的权重文件,包含模型的预训练权重。
  • model.safetensors.index.json:这可能是模型的索引文件,用于在加载模型时帮助定位权重。

       另外,原先pytorch模型存储格式.bin\.pth、Tensorflow模型存储格式.h5\.pb在hf生态上面将逐渐被淘汰,推荐认准.safetensors格式的存储格式下载。

        tips:hf上面的模型仓库也是用git管理的,建议学习完git用法后再学习git lfs的用法。

参考博文:​​​​浅析下载的模型文件结构及作用

一文读懂pytorch和huggingface的大模型存储格式

2、下载大模型

因为hf的官网在国内上不去,本教程推荐使用国内镜像站的方式下载

安装huggingface_hub

 pip install -U huggingface_hub

设置环境变量,使得下载时默认从国内的镜像站https://hf-mirror.com下载

export HF_ENDPOINT=https://hf-mirror.com

下载hf上面的模型——以Qwen/Qwen2.5-7B为例

huggingface-cli download --resume-download Qwen/Qwen2.5-7B --local-dir  Qwen/Qwen2.5-7B --exclude "*.bin"

参考教程:如何快速下载huggingface模型——全方法总结

一、本地部署工具简介和分类

      LLM(Large Language Models,大型语言模型)部署工具是专门设计用于在本地或私有环境中部署、管理和运行大型语言模型的软件解决方案。这些工具的目标是简化部署流程,提高模型运行效率,同时提供必要的优化和定制功能,以适应不同的应用场景和硬件环境。

按照应用场景定位可以进行如下分类:

1、综合部署和管理工具

        类似于LLM操作系统,旨在提供一个可以在任何地方运行的大型语言模型(LLM)聊天机器人生态系统,这一类项目允许用户在本地CPU和几乎任何GPU上运行大型语言模型,主要解决的痛点是跨平台操作的兼容性,适配足够多的主流硬件平台。

代表工具有:Ollama、LM Studio、GPT4All等

2、专用推理优化工具

        这类工具主要解决的痛点是用尽量少的资源跑起来足够大的模型,并且尽量不降低模型的性能,专注于提高模型的推理效率,研究通过硬件加速、量化、减枝等算法优化等方式减少推理时间和资源消耗,与通用的深度学习库相比较,只有前向计算过程。

代表工具有:TensorRT-LLM、SGLang、VLLM、XInference等

3、通用的深度学习库

        这类库主要是提供模型训练后的验证测试,开发者可以用来部署预训练的大语言模型时,一般被视作该模型的最好效果,主要可作为自己二次开发的参考对比。

代表工具有:Pytorch、Transformers等

二、综合部署和管理工具——以Ollama为例

        Ollama 是一个用于构建大型语言模型应用的工具,它提供了一个简洁易用的命令行界面和服务器,支持在Windows、Linux、MAC这三个主流操作系统部署轻松下载、运行和管理各种开源 LLM,支持目前最主流的模型文件格式GGUF 格式,并提供一套模型格式转换的工具,可以将训练完成pytorch、transformers模型文件格式无缝迁移成GGUF格式。

1、下载安装Ollama

下载ollama官方的脚本,可以在linux系统上一键安装

 wget https://ollama.com/install.sh

 执行安装脚本

bash install.sh

一路Enter选择默认配置,完成安装后的信息:

>>> Installing ollama to /usr/local
>>> Downloading Linux amd64 bundle
################################################################################################################################## 100.0%################################################################################################################################## 100.0%
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.
WARNING: No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode.

2、启动Ollama

启动ollama服务

ollama serve &

确认ollama服务是否启动

systemctl status ollama.service

ollama服务已经正常启动的信息:

ollama.service - Ollama Service
     Loaded: loaded (/etc/systemd/system/ollama.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-09-22 12:23:31 EDT; 1min 43s ago
   Main PID: 2631176 (ollama)
      Tasks: 26 (limit: 618829)
     Memory: 2.5G (peak: 2.5G)
        CPU: 20.460s
     CGroup: /system.slice/ollama.service
             └─2631176 /usr/local/bin/ollama serve

3、部署自己的模型

3.1 安装转换工具llm/llama.cpp

克隆官方的ollama/ollama 仓库:

git clone https://github.com:ollama/ollama.git
cd ollama

 获取该仓库中的子模块llama.cpp:

git submodule init
git submodule update llm/llama.cpp

安装llama.cpp的依赖:

pip3 install -r llm/llama.cpp/requirements.txt -i https://mirrors.cloud.tencent.com/pypi/simple

3.2 模型格式转换——以Qwen/Qwen2.5-7B为例

执行llm/llama.cpp/convert_hf_to_gguf.py脚本转换GGUF模型格式

python3 llm/llama.cpp/convert_hf_to_gguf.py /mnt/models/Qwen/Qwen2.5-7B  --outfile Qwen2.5-7B.gguf --outtype f16

转换GGUF模型格式成功后输出的信息

INFO:hf-to-gguf:Set model quantization version
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:Qwen2.5-7B.gguf: n_tensors = 339, total_size = 15.2G
Writing: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| 15.2G/15.2G [00:44<00:00, 346Mbyte/s]
INFO:hf-to-gguf:Model successfully exported to Qwen2.5-7B.gguf

3.3  新建ollama识别的模型

modelfile文件是与Ollama 创建和共享模型的顶层文件,ollama需根据modelfile文件和对应的.gguf模型文件新建自己的模型

具体参数的含义参见ollama的官方文档

https://github.com/ollama/ollama/blob/main/docs/modelfile.md

同时根据阿里Qwen官方的文档

https://qwen.readthedocs.io/en/latest/run_locally/ollama.html

新建一个 Qwen2.5-7B.modelfile文件

FROM /home/vslyu/Documents/ollama/Qwen2.5-7B.gguf

# set the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 0.7
PARAMETER top_p 0.8
PARAMETER repeat_penalty 1.05
PARAMETER top_k 20

TEMPLATE """{{ if .Messages }}
{{- if or .System .Tools }}<|im_start|>system
{{ .System }}
{{- if .Tools }}

# Tools

You are provided with function signatures within <tools></tools> XML tags:
<tools>{{- range .Tools }}
{"type": "function", "function": {{ .Function }}}{{- end }}
</tools>

For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call>
{{- end }}<|im_end|>
{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1 -}}
{{- if eq .Role "user" }}<|im_start|>user
{{ .Content }}<|im_end|>
{{ else if eq .Role "assistant" }}<|im_start|>assistant
{{ if .Content }}{{ .Content }}
{{- else if .ToolCalls }}<tool_call>
{{ range .ToolCalls }}{"name": "{{ .Function.Name }}", "arguments": {{ .Function.Arguments }}}
{{ end }}</tool_call>
{{- end }}{{ if not $last }}<|im_end|>
{{ end }}
{{- else if eq .Role "tool" }}<|im_start|>user
<tool_response>
{{ .Content }}
</tool_response><|im_end|>
{{ end }}
{{- if and (ne .Role "assistant") $last }}<|im_start|>assistant
{{ end }}
{{- end }}
{{- else }}
{{- if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ end }}{{ .Response }}{{ if .Response }}<|im_end|>{{ end }}"""

# set the system message
SYSTEM """You are Qwen, created by Alibaba Cloud. You are a helpful assistant."""
ollama create Qwen2.5-7B -f Qwen2.5-7B.modelfile

 3.4  运行模型

ollama run Qwen2.5-7B

 成功运行模型,对话输出:

└─$ ollama run Qwen2.5-7B
>>> 请问你是谁
我是Qwen,由阿里巴巴云开发的AI助手。有什么我可以帮助你的吗?

参考教程:Ollama:从入门到进阶

三、专用推理优化工具——以SGLang为例

SGLang开启QWen2.5-7B模型服务

python -m sglang.launch_server --model-path /media/huiwei/models/Qwen/Qwen2.5-7B --tp 2 --enable-p2p-check --disable-cuda-graph

模型交互

from sglang import function, system, user, assistant, gen, set_default_backend, RuntimeEndpoint

@function
def multi_turn_question(s, question_1, question_2):
    s += system("You are Qwen, created by Alibaba Cloud. You are a helpful assistant.")
    s += user(question_1)
    s += assistant(gen("answer_1", max_tokens=256))
    s += user(question_2)
    s += assistant(gen("answer_2", max_tokens=256))

set_default_backend(RuntimeEndpoint("http://localhost:30000"))

state = multi_turn_question.run(
    question_1="What is the capital of China?",
    question_2="List two local attractions.",
)

for m in state.messages():
    print(m["role"], ":", m["content"])

print(state["answer_1"])

四、通用的深度学习库——以Transformers为例

from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B", trust_remote_code=True)

# use auto mode, automatically select precision based on the device.
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B",
    device_map="auto",
    trust_remote_code=True
).eval()


prompt = "Give me a short introduction to large language model."
messages = [
    {"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
    {"role": "user", "content": prompt},
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512,
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

有用的资源推荐

GitHub - WangRongsheng/awesome-LLM-resourses: 🧑‍🚀 全世界最好的LLM资料总结 | Summary of the world's best LLM resources.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样

git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净&#xff0c;像刚clone下来一样 code review! 文章目录 git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净&#xff0c;像刚clone下来一样1.实现该功能的 Bash 脚本示例2.改进版&#xff1a;增加了gi…

【第十八章:Sentosa_DSML社区版-机器学习之协同过滤】

【第十八章&#xff1a;Sentosa_DSML社区版-机器学习之协同过滤】 1.算子介绍 协同过滤是推荐系统中常用的一种方法。该算法旨在填补用户-产品关联矩阵中缺少的项。在算法中&#xff0c;用户和产品都是通过一组少量的潜在因素描述&#xff0c;这些潜在因素可以用于预测用户-产…

彻底掌握Android中的ViewModel

彻底掌握Android中的ViewModel ViewModel 属于Android Jetpack库的一部分&#xff0c;是一种业务逻辑或屏幕状态容器。它提供了在配置更改&#xff08;如屏幕旋转&#xff09;后依旧保留相应状态的特性&#xff0c;帮助开发者以更加清晰和可维护的方式处理UI相关的数据&#x…

MySQL安装文档-Windows

文章目录 MySQL安装1. 安装2. 配置 MySQL安装 1. 安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装 安装MySQL的相关组件&#xff0c;这个过程可能需要耗时几分钟&#xff0c;耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 2. 配置 安装好MySQL之后…

从零开始构建GPT风格的LLM分类器 微调GPT模型进行垃圾邮件分类

在这篇文章中&#xff0c;我想向您展示如何将预训练的大型语言模型&#xff08;LLM&#xff09;转变为强大的文本分类器。 为什么专注于分类&#xff1f; 首先&#xff0c;将预训练模型微调为分类器提供了一种温和而有效的微调入门方式。其次&#xff0c;许多现实世界和商业挑…

SpringBoot技术栈的网上超市开发实践

2 系统开发技术 这部分内容主要介绍本系统使用的技术&#xff0c;包括使用的工具&#xff0c;编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今&#xff0c;已经超过25年了&#xff0c;依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

python类的call方法与init方法

1. call方法 在对象被调用了的时候就会调用call方法a(666) class A:def __call__(self, args):print(call 方法被调用了,args) aA() a(666) 2.init方法 创建对象的时候 init 方法被调用 class A:def __init__(self,args):print(创建对象的时候 init 方法被调用了,args) aA(…

shardingjdbc-读写分离配置

文章目录 1、application.yml2、shardingsphere.yaml3、创建实体类 User4、创建 UserMapper5、添加依赖6、读写分离测试7、事务测试 我们的主从复制已经提前搭建好&#xff1a; mysql-搭建主从复制&#xff1a;https://blog.csdn.net/m0_65152767/article/details/142214434 1…

使用 Python 模拟光的折射,反射,和全反射

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【一句话点破】【C++重要题目】基类与派生类的成员变量值被对象调用的结果(二)

【一句话点破】基类/派生类的成员变量由哪个对象初始化的&#xff0c;哪个对象调用该成员变量时就用由它初始化的值 [尤其找准是基类对象or派生类对象的值] 【重要例题】15浙工大卷二读程序5题 可运行代码如下 #include "bits/stdc.h" #include<iostream> u…

畅阅读微信小程序

畅阅读微信小程序 weixin051畅阅读微信小程序ssm 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用j…

CVE-2024-1112 Resource Hacker 缓冲区溢出分析

漏洞简述 CVE-2024-1112 是 Resource Hacker 软件的一个缓冲区溢出漏洞。该漏洞存在于版本 3.6.0.92 中。由于软件在处理命令行中的文件路径时未对文件字符串长度进行限制&#xff0c;过长的字符串参数导致内存被过度写入&#xff0c;从而引发缓冲区溢出。 漏洞复现 构造长度…

简单的评论系统【JavaScript】

这段代码实现了一个简单的评论系统&#xff0c;用户可以输入评论并提交&#xff0c;评论会显示在页面上&#xff0c;同时可以通过点击“删除”按钮来删除相应的评论。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head…

Excel名字查重筛选,查找重复内容原来这么简单

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f50d; 在处理大量数据时&#xff0c;尤其是人员名单或客户信息时&#xff0c;确保没有重复的名字是非常重要的。在Excel中&#xff0c;有几种方法可以帮助我们快速查找和处理重复的名字。今天&#xff0c;我们将介绍…

2024年9月24日历史上的今天大事件早读

1550年9月24日 明代戏剧家汤显祖出生 1852年9月24日 法国人吉法尔制造的用蒸汽机推进的飞船试飞成功 1884年9月24日 中国近代化学的先驱徐寿逝世 1905年9月24日 吴樾壮炸五大臣&#xff0c;身殉革命 1909年9月24日 京张铁路通车 1910年9月24日 剧作家曹禺诞生 1930年9月2…

Python基础练习题‌100道电子版及源码文件

Python基础练习题‌&#xff0c;旨在帮助学习者巩固和提升Python编程技能。以下是一些精选的练习题目&#xff0c;包括但不限于&#xff1a; 基础语法练习‌&#xff1a;涉及变量定义、数据类型、运算符、条件语句、循环等基础语法结构的应用。例如&#xff0c;编写程序来处理数…

使用Adobe XD进行制作SVG字体

制作SVG字体的办法有很多&#xff0c;我这里选择了Adobe XD进行制作。 1.选择画布尺寸 2 输入文本 设置字体样式 3 设置画布背景 4 转换字体&#xff08;物件&#xff09;路径 5 设置组 复制SVG代码 6 放入到Html中 <!DOCTYPE html> <html lang"zh">&l…

稀疏向量 milvus存储检索RAG使用案例

参考&#xff1a; https://milvus.io/docs/hybrid_search_with_milvus.md milvus使用不方便&#xff1a; 1&#xff09;离线计算向量很慢BGEM3EmbeddingFunction 2&#xff09;milvus安装环境支持很多问题&#xff0c;不支持windows、centos等 在线demo&#xff1a; https://co…

基于单片机的智能窗帘控制系统-设计说明书

设计摘要&#xff1a; 智能窗帘控制系统是一种利用单片机技术实现的智能化控制系统&#xff0c;可以实现窗帘的自动开合和定时控制功能。本系统的设计基于单片机技术&#xff0c;结合传感器、电机和执行器等硬件设备&#xff0c;实现对窗帘的智能化控制。通过传感器采集环境信…

同一网络下两台电脑IP一样吗?探究局域网内的IP分配机制

在日常生活和工作中&#xff0c;我们经常会在同一网络环境下使用多台电脑。这时&#xff0c;一个常见的问题就会浮现&#xff1a;同一网络下两台电脑IP一样吗&#xff1f;这个问题看似简单&#xff0c;但实际上涉及到局域网内的IP分配机制。本文将深入探讨这一问题&#xff0c;…