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

news2024/12/27 12:44:23

大型语言模型(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 os
 import urllib.request
 
 
 def download_file(file_link, filename):
     # Checks if the file already exists before downloading
     if not os.path.isfile(filename):
         urllib.request.urlretrieve(file_link, filename)
         print("File downloaded successfully.")
     else:
         print("File already exists.")
 
 # Dowloading GGML model from HuggingFace
 ggml_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 Llama
 
 llm = 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 os
 import urllib.request
 from llama_cpp import Llama
 
 
 def download_file(file_link, filename):
     # Checks if the file already exists before downloading
     if not os.path.isfile(filename):
         urllib.request.urlretrieve(file_link, filename)
         print("File downloaded successfully.")
     else:
         print("File already exists.")
 
 
 # Dowloading GGML model from HuggingFace
 ggml_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_text
 
 
 generate_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.coloradmin.cn/o/736943.html

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

相关文章

MongoDB教程-5

复制是跨多个服务器同步数据的过程。复制在不同的数据库服务器上提供数据的多个副本,从而提供冗余并提高数据可用性。复制可防止数据库丢失单个服务器。复制还允许您从硬件故障和服务中断中恢复。通过增加数据拷贝,您可以将其中一个用于灾难恢复、报告或…

Spring系列4 -- Bean的作用域和生命周期

目录 1. 案例 2. 作用域定义 2.1 Bean的6种作用域 2.2 设置作用域 3. Sring的执行流程 4. Bean的生命周期 思考: 为什么不是先进行初始化然后再进行设置属性呢? 1. 案例 假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中…

【面试】Hbase

逻辑模型 1 NameSpace 命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。Hbase有两个自带的命名空间,分别是hbase和default, hbase中存放的是HBase内置的表, default表是用户默认使用的命名空间。 2 Region 类似于关系型数据库的表…

综合 案例

案例1:淘宝焦点图布局 基本结构 1.大盒子我们类名为: tb-pro淘宝广告 2.里面先放一张图片 3.左右两个按钮用链接。左箭头prev 右箭头 next 4.底侧小圆点用ul 类名为pro-nav 注意: 1.如果一个盒子既有left属性也有right属性,则默认会执行lef…

Nvidia Jetson Orin系列配置教程

Nvidia Jetson Orin系列配置教程包含Orin系列的安装及配置办法,目前最为推荐的办法是通过Nvidia SDK Manager进行安装,详细内容如下: 法1:通过Nvidia SDK Manager进行安装 1.下载工具 前往Nvidia SDK Manager下载工具 2.安装工…

Lesson3-3:OpenCV图像处理---图像平滑

图像平滑 学习目标 了解图像中的噪声类型了解平均滤波,高斯滤波,中值滤波等的内容能够使用滤波器对图像进行处理 1 图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高…

MySQL之CRUD及常见面试题讲解

目录 一、CRUD是什么 二、什么是SQL注入 三、行转列的使用 四、CRUD中常用关键词 关键词: GROUP BY HAVING ORDER BY 五、聚合函数和连表查询 聚合函数 连表查询 六、DELETE、TRUNCATE、DROP的区别 七、MySQL常见面试题讲解 一、CRUD是什么 CRUD是一个常…

ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)

目录 1&#xff0c;异常等级&#xff08;Exception Level&#xff09; 2&#xff0c;Execution states&#xff0c;执行状态 AArch64的异常等级 AArch32的异常等级 3&#xff0c;异常等级切换 4&#xff0c;执行状态切换&#xff08;AArch64 <> AArch32&#xff09;…

文件下载功能(简单粗暴)

文件下载功能 // 模板下载 export const modelLoadInterface (data: any) > {return get<Response>(tsureexapp-exchange/config/points/grant/export.json, data, {skipErrorHandler: true,}); };import {modelLoadInterface} from "/services/CommunicationF…

山西电力市场日前价格预测【2023-07-11】

日前价格预测 预测明日&#xff08;2023-07-11&#xff09;山西电力市场全天平均日前电价为419.66元/MWh。其中&#xff0c;最高日前价格为490.80元/MWh&#xff0c;预计出现在11: 45。最低日前电价为365.06元/MWh&#xff0c;预计出现在24: 00。 价差方向预测 1&#xff1a;实…

关于Xxl-job执行器自动注册不了的问题

最近项目里面用到了xxljob&#xff0c;然后按照官方文档自己搭建了一个&#xff0c;发现一个问题&#xff0c;就是执行器自动注册不了&#xff0c;然后一顿百度&#xff0c;发现是这个配置的问题&#xff1a; 这个 xxl.job.executor.appname 是执行器的名称&#xff0c;是要和页…

Jenkisn远程执行Shell命令

Jenkisn远程执行gating 1、安装插件 SSH plugin** 系统管理Manage Jenkins->管理插件Plugin Manager->搜索SSH plugin并安装 2、配置 Credentials凭据 系统管理Manage Jenkins->凭据插件Manage Credentials-> 凭据的类型有很多&#xff0c;本次学习用户名与密…

关于Arduino UNO R3主控板(CH340)驱动问题

网上买了一个Arduino UNO R3的标准版产品&#xff0c;开始学习智能编程工具。主要是给小孩子提高一点兴趣爱好&#xff0c;还有就是想在创客实验方面找点素材。 问题&#xff1a; 刚拆包安装驱动遇到一个问题&#xff0c;按说明装了Arduino UNO R3主控板驱动&#xff0c;但就是…

这所院校学硕年年国家线,8人过线,全部录取!保护一志愿!

一、学校及专业介绍 山东科技大学&#xff0c;简称“山科大&#xff0c;SDUST”&#xff0c;山东省重点建设应用基础型人才培养特色名校和高水平大学“冲一流”建设高校。&#xff08;我也第一次听说冲一流这个概念图片&#xff09; 1.1 招生情况 山东科技大学通信2023年一共…

【正点原子STM32连载】第五十三章 照相机实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第五…

【大学生自动化测试基础selenium】pageObjece

目录 目录 base_page层 common层 read_data.py send_email.py test_log.py page层 page_ECShop_Login.py testcase层 conftest.py test_login.py venv层 pytest.ini run.tests.py requirements.txt 目录 base_page层 # basepage 基础页面层&#xff08;基类&am…

算法leetcode|61. 旋转链表(rust重拳出击)

文章目录 61. 旋转链表&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 61. 旋转链表&#xff1a; 给你一个链表的头节点 head &#xf…

Mysql-------SQL:DDL数据定义语言、DDM数据操作语言、DQL数据库查询语言、DQL数据控制语言

MySQL MySQL是一个关系型数据库管理系统&#xff0c;其数据是保存在不同的数据表中&#xff0c;而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性 SQL MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言&#xff0c; SQL语言可以分为&am…

JDY-31 蓝牙传输模块的使用、调试和传输

JDY-31 蓝牙基于蓝牙 3.0 SPP 设计&#xff0c;这样可以支持 Windows、Linux、android 数据透传&#xff0c; 工作频段 2.4GHZ&#xff0c;调制方式 GFSK&#xff0c;最大发射功率 8db&#xff0c;最大发射距离 30 米&#xff0c;支持用户通过 AT 命令修改设备名、波特率等指令…

java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…