使用Llama.cpp在CPU上快速的运行LLM

大型语言模型(llm)正变得越来越流行,但是它需要很多的资源,尤其时GPU。在这篇文章中,我们将介绍如何使用Python中的llama.cpp库在高性能的cpu上运行llm。

大型语言模型(llm)正变得越来越流行,但是它们的运行在计算上是非常消耗资源的。有很多研究人员正在为改进这个缺点而努力,比如HuggingFace开发出支持4位和8位的模型加载。但它们也需要GPU才能工作。虽然可以在直接在cpu上运行这些llm,但CPU的性能还无法满足现有的需求。而Georgi Gerganov最近的工作使llm在高性能cpu上运行成为可能。这要归功于他的llama.cpp库,该库为各种llm提供了高速推理。

原始的llama.cpp库侧重于在shell中本地运行模型。这并没有为用户提供很大的灵活性,并且使用户很难利用大量的python库来构建应用程序。而最近LangChain的发展使得我可以可以在python中使用llama.cpp。

在这篇文章中,我们将介绍如何在Python中使用llama-cpp-python包使用llama.cpp库。我们还将介绍如何使用LLaMA -cpp-python库来运行Vicuna LLM。

llama- pcp -python

 pip install llama-cpp-python

更详细的安装说明,请参阅llama- pcp -python文档:https://github.com/abetlen/llama-cpp-python#installation-from-pypi-recommended。

使用LLM和llama-cpp-python

只要语言模型转换为GGML格式,就可以被llama.cpp加载和使用。而大多数流行的LLM都有可用的GGML版本。

需要注意的重要一点是,在将原始llm转换为GGML格式时,它们就已被量化过了。量化的好处是在不显著降低性能的情况下,减少运行这些大型模型所需的内存。例如,在不到4GB的RAM中可以加载大小为13GB的70亿个参数模型。

在本文中,我们使用GGML版本的Vicuna-7B,该模型可从HuggingFace下载:https://huggingface.co/CRD716/ggml-vicuna-1.1-quantized。

下载GGML文件并加载LLM

可以使用以下代码下载模型。该代码还在尝试下载文件之前检查该文件是否已经存在。

 import osimport urllib.requestdef download_file(file_link, filename):# Checks if the file already exists before downloadingif not os.path.isfile(filename):urllib.request.urlretrieve(file_link, filename)print("File downloaded successfully.")else:print("File already exists.")# Dowloading GGML model from HuggingFaceggml_model_path = "https://huggingface.co/CRD716/ggml-vicuna-1.1-quantized/resolve/main/ggml-vicuna-7b-1.1-q4_1.bin"filename = "ggml-vicuna-7b-1.1-q4_1.bin"download_file(ggml_model_path, filename)

下一步是加载模型:

 from llama_cpp import Llamallm = Llama(model_path="ggml-vicuna-7b-1.1-q4_1.bin", n_ctx=512, n_batch=126)

在加载模型时,应该设置两个重要参数。

n_ctx:用于设置模型的最大上下文大小。默认值是512个token。

上下文大小是输入提示符中的令牌数量和模型可以生成的令牌最大数量的总和。具有较小上下文大小的模型生成文本的速度比具有较大上下文大小的模型快得多。

n_batch:用于设置在生成文本时要批处理的提示令牌的最大数量。默认值是512个token。

应该仔细设置n_batch参数。降低n_batch有助于加速多线程cpu上的文本生成。但是太少可能会导致文本生成明显恶化。

使用LLM生成文本

下面的代码编写了一个简单的包装器函数来使用LLM生成文本。

 def generate_text(prompt="Who is the CEO of Apple?",max_tokens=256,temperature=0.1,top_p=0.5,echo=False,stop=["#"],):output = llm(prompt,max_tokens=max_tokens,temperature=temperature,top_p=top_p,echo=echo,stop=stop,)output_text = output["choices"][0]["text"].strip()return output_text

llm对象有几个重要的参数:

prompt:模型的输入提示。该文本被标记并传递给模型。

max_tokens:该参数用于设置模型可以生成的令牌的最大数量。此参数控制文本生成的长度。默认值是128个token。

temperature:温度,介于0和1之间。较高的值(如0.8)将使输出更加随机,而较低的值(如0.2)将使输出更加集中和确定。缺省值为1。

top_p:温度采样的替代方案,称为核采样,其中模型考虑具有top_p概率质量的标记的结果。所以0.1意味着只考虑包含前10%概率质量的标记。

echo: 用于控制模型是否返回(回显)生成文本开头的模型提示符。

stop:用于停止文本生成的字符串列表。如果模型遇到任何字符串,文本生成将在该标记处停止。用于控制模型幻觉,防止模型产生不必要的文本。

llm对象返回如下形式的字典对象:

 {"id": "xxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",  # text generation id "object": "text_completion",              # object name"created": 1679561337,                    # time stamp"model": "./models/7B/ggml-model.bin",    # model path"choices": [{"text": "Q: Name the planets in the solar system? A: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune and Pluto.", # generated text"index": 0,"logprobs": None,"finish_reason": "stop"}],"usage": {"prompt_tokens": 14,       # Number of tokens present in the prompt"completion_tokens": 28,   # Number of tokens present in the generated text"total_tokens": 42}}

可以使用output"choices"[“text”]从字典对象中提取生成的文本。

使用Vicuna-7B生成文本的示例代码

 import osimport urllib.requestfrom llama_cpp import Llamadef download_file(file_link, filename):# Checks if the file already exists before downloadingif not os.path.isfile(filename):urllib.request.urlretrieve(file_link, filename)print("File downloaded successfully.")else:print("File already exists.")# Dowloading GGML model from HuggingFaceggml_model_path = "https://huggingface.co/CRD716/ggml-vicuna-1.1-quantized/resolve/main/ggml-vicuna-7b-1.1-q4_1.bin"filename = "ggml-vicuna-7b-1.1-q4_1.bin"download_file(ggml_model_path, filename)llm = Llama(model_path="ggml-vicuna-7b-1.1-q4_1.bin", n_ctx=512, n_batch=126)def generate_text(prompt="Who is the CEO of Apple?",max_tokens=256,temperature=0.1,top_p=0.5,echo=False,stop=["#"],):output = llm(prompt,max_tokens=max_tokens,temperature=temperature,top_p=top_p,echo=echo,stop=stop,)output_text = output["choices"][0]["text"].strip()return output_textgenerate_text("Compose an engaging travel blog post about a recent trip to Hawaii, highlighting cultural experiences and must-see attractions.",max_tokens=356,)

生成的文本如下:

 Hawaii is a state located in the United States of America that is known for its beautiful beaches, lush landscapes, and rich culture. It is made up of six islands: Oahu, Maui, Kauai, Lanai, Molokai, and Hawaii (also known as the Big Island). Each island has its own unique attractions and experiences to offer visitors.One of the most interesting cultural experiences in Hawaii is visiting a traditional Hawaiian village or ahupuaa. An ahupuaa is a system of land use that was used by ancient Hawaiians to manage their resources sustainably. It consists of a coastal area, a freshwater stream, and the surrounding uplands and forests. Visitors can learn about this traditional way of life at the Polynesian Cultural Center in Oahu or by visiting a traditional Hawaiian village on one of the other islands.Another must-see attraction in Hawaii is the Pearl Harbor Memorial. This historic site commemorates the attack on Pearl Harbor on December 7, 1941, which led to the United States' entry into World War II. Visitors can see the USS Arizona Memorial, a memorial that sits above the sunken battleship USS Arizona and provides an overview of the attack. They can also visit other museums and exhibits on the site to learn more about this important event in American history.Hawaii is also known for its beautiful beaches and crystal clear waters, which are perfect for swimming, snorkeling, and sunbathing.

总结

在这篇文章中,我们介绍了如何在Python中使用llama.cpp库和llama-cpp-python包。这些工具支持基于cpu的llm高性能执行。

Llama.cpp几乎每天都在更新。推理的速度越来越快,社区定期增加对新模型的支持。在Llama.cpp有一个“convert.py”可以帮你将自己的Pytorch模型转换为ggml格式。

llama.cpp库和llama-cpp-python包为在cpu上高效运行llm提供了健壮的解决方案。如果您有兴趣将llm合并到您的应用程序中,我建议深入的研究一下这个包。

本文源代码:

https://avoid.overfit.cn/post/257997272e4a454cae9d01556332d6a0

本文作者:Ashwin Mathur

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干了4年外包,技术落后得明显,感觉要被行业优化了

先说一下自己的情况。大专生,19年通过校招进入深圳某软件公司,干了接近4年的测试,今年年中旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了4年,…

Django实现简单的音乐播放器 1

使用django框架开发一个简单的音乐播放器。 效果: 目录 环境准备 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 配置时区 配置语言 配置子应用路由 在pla…

WHERE条件和ON条件的区别

目录 总结: 1.inner join方式关联 2.left join方式关联 实例 1.建表 2.left join 主表的on和where条件 3.left join 关联表的on和where条件 总结: 1.inner join方式关联 on条件(无论是对主表字段的限制还是对关联表字段的限制&#…

Python实现PSO粒子群优化算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一…

代码随想录算法训练营 个人总结

训练营周期:2023/5/10 - 7/8,共计60天 LeetCode记录: 参加训练营之前,就有想刷LeetCode的想法,一方便没有头绪地不知道按什么顺序刷题,另一方面也没有找到很好的讲解材料,都是自己看LeetCode页面…

瑞芯微 RK356x 基于Android11移植usb接口rtl8723du wifi和蓝牙一体化

开发环境 平台: 瑞芯微RK356x 操作系统:Android11 WiFi、蓝牙芯片:RTL8723DU 通讯类型:USB协议 RTL8723du介绍 Realtek RTL8723DU是一个高度集成的单片机802.11b/g/n 1T1R WLAN,和一个集成的蓝牙2.1/4.2单片机,USB 2.0多功能。…

为什么我要自己做一个周易软件

周易是中国数千年流传下来传统文化,在八字、六壬、六爻、奇门遁甲、梅花易数等预测占卜方面应用广泛。很多传统易学工作者或爱好者采用手工排盘的方式,进行相关的排盘。当然现代更多的易学人士采用各自习惯的排盘软件进行排盘,大大节省了排盘…

如何快速将文字转换为语音?三种方法分享给你!

在我们的日常工作和生活中,经常会遇到需要将文字转换为语音的需求。大多数人可能会选择手动阅读并录制,但这种方式既耗时又繁琐,效率并不高。今天,我将为大家介绍三种可以快速将文字转换为语音的方法,让我们一起来看看…

spring-注解开发bean

注解开发bean 使用Component定义bean 在配置文件中通过组建扫描加载bean 3.也可以通过不要配置文件,定义类,使用Configuration,来代替配置文件 基于注解定义bean 1.component,大部分的bean都可以通过这个来定义 1.1Controller&#xf…

剑指Offer-29-顺时针打印矩阵

剑指Offer-29题 题目描述:顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 **题解思路:**使用 模拟 的方法 定义四个边界变量表示当前要遍历的边界:上(top)、下(bottom)、左(left)、右(right)&am…

ActiveMQ详细入门教程系列

一、什么是消息中间件 两个系统或两个客户端之间进行消息传送,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 消息中…

【vue学习】权限管理系统前端实现6-主页面布局

1.新建layout文件夹 新建index.vue 添加router const routes [{path: /,name: 首页,component: () > import(../layout)}, 2.登录添加跳转 loginRef.value.validate(async (valid)>{if(valid){try{let resultawait requestUtil.post("login?"qs.stringify(l…