商业人工智能和大型语言模型 (LLM) 有一个很大的缺点:隐私。在处理敏感数据或专有数据时,我们无法从这些工具中获益。因此,我们需要了解如何在本地运行私人 LLM。开源模型提供了一种解决方案,但它们也有自己的挑战和优势。

设定期望值

开源软件种类繁多,有数以千计的模型可供选择,从 Meta 等大型组织提供的模型到个人爱好者开发的模型,各有不同。然而,运行这些模型也面临着一系列挑战:

  • 它们可能需要强大的硬件,须拥有足够的内存和一个 GPU
  • 尽管开源模型在不断改进,但它们的功能通常仍无法与 ChatGPT 等更完善的产品相提并论,因为 ChatGPT 得益于庞大的工程师团队的支持
  • 并非所有模型都能用于商业用途。

不过,正如同谷歌的一份文件所指出的,开源和闭源模型之间的差距正在缩小。

Hugging Face 和 Transformers

Hugging Face 相当于机器学习和人工智能的 Docker Hub,提供了大量开源模型。并且,Hugging Face 会定期对模型进行基准测试,并提供排行榜,帮助用户选择最佳模型。

Hugging Face 还提供了一个 Python 库 transformers,可以简化本地运行一个 LLM 的过程。下面的示例使用该库运行了一个较旧的 GPT-2 microsoft/DialoGPT-medium 模型。第一次运行时,Transformers 会下载模型,你可以与它进行五次交互。该脚本还需要安装 PyTorch。

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-medium", padding_side='left')
model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-medium")
# source: https://huggingface.co/microsoft/DialoGPT-medium
# Let's chat for 5 lines
for step in range(5):
# encode the new user input, add the eos_token and return a tensor in Pytorch
new_user_input_ids = tokenizer.encode(input(">> User:") + tokenizer.eos_token, return_tensors='pt')
# append the new user input tokens to the chat history
bot_input_ids = torch.cat([chat_history_ids, new_user_input_ids], dim=-1) if step > 0 else new_user_input_ids
# generated a response while limiting the total chat history to 1000 tokens,
chat_history_ids = model.generate(bot_input_ids, max_length=1000, pad_token_id=tokenizer.eos_token_id)
# pretty print last output tokens from bot
print("DialoGPT: {}".format(tokenizer.decode(chat_history_ids[:, bot_input_ids.shape[-1]:][0], skip_special_tokens=True)))

Transformers 优势

  • 自动下载模型
  • 提供代码片段
  • 理想的实验和学习工具

Transformers 劣势

  • 需要对 ML 和 NLP 有扎实的了解
  • 需要具备编码和配置技能

LangChain

我们在本地运行 LLM 的另一种方法是使用 LangChain。LangChain 是一个用于构建人工智能应用程序的 Python 框架。它提供抽象和中间件,以便在其支持的模型之上开发人工智能应用程序。例如,下面的代码向 microsoft/DialoGPT-medium 模型提出了一个问题:

from langchain.llms.huggingface_pipeline import HuggingFacePipeline
hf = HuggingFacePipeline.from_model_id(
model_id="microsoft/DialoGPT-medium", task="text-generation", pipeline_kwargs={"max_new_tokens": 200, "pad_token_id": 50256},
)
from langchain.prompts import PromptTemplate
template = """Question: {question}
Answer: Let's think step by step."""
prompt = PromptTemplate.from_template(template)
chain = prompt | hf
question = "What is electroencephalography?"
print(chain.invoke({"question": question}))

LangChain 优势

  • 更便捷的模型管理
  • 实用的 AI 应用程序开发工具

**LangChain 劣势

**

  • 速度有限,与 Transformers 相同
  • 仍须编写应用程序的逻辑代码或创建合适的用户界面

Llama.cpp

Llama.cpp 是一个基于 C 和 C++ 的 LLM 推理引擎,针对苹果芯片进行了优化,可运行 Meta 的 Llama2 模型。

一旦我们克隆了资源库并构建了项目,我们就可以使用 Llama.cpp 运行一个模型:

$ ./main -m /path/to/model-file.gguf -p "Hi there!"

Llama.cpp 优势

  • 性能高于基于 Python 的解决方案
  • 在适中的硬件上支持 Llama 7B 等大型模型
  • 提供绑定,以便在通过 Llama.cpp 运行推理的同时使用其他语言构建 AI 应用程序

Llama.cpp 劣势

  • 模型支持有限
  • 需要构建工具

Llamafile

Llamafile 由 Mozilla 开发,为运行 LLM 提供了一个用户友好的替代方案。Llamafile 以其可移植性和创建单文件可执行文件的能力而著称。

下载 llamafile 和任何 GGUF 格式的模型后,我们就可以用以下命令启动本地浏览器会话:

$ ./llamafile -m /path/to/model.gguf

Llamafile 优势

  • 与 Llama.cpp 相同的速度优势
  • 可以创建嵌入模型的单一可执行文件

Llamafile 劣势

  • 该项目仍处于早期阶段
  • 不支持所有模型,只支持 Llama.cpp 支持的模型

Ollama

Ollama 是 Llama.cpp 和 Llamafile 的替代品,对用户更加友好。你可以下载一个可执行文件,在你的机器上安装一个服务。安装完成后,打开终端并运行:

$ ollama run llama2

Ollama 优势

  • 易于安装和使用
  • 可以运行 Ilama 和 vicuña 模型
  • 运行速度极快

Ollama 劣势

  • 提供有限的模型库
  • 自行管理模型,不能重复使用自己的模型
  • 无法调整运行 LLM 的选项
  • 暂无 Windows 版本

GPT4ALL

GPT4ALL 是一款易于使用的桌面应用程序,具有直观的 GUI。它支持本地模型运行,并可通过 API 密钥连接 OpenAI。它的突出特点是能够处理本地文档的上下文,确保隐私。

GPT4ALL 优势

  • 具有友好UI的替代方案
  • 支持各种策划模型

GPT4ALL 劣势

  • 机型选择有限
  • 部分机型有商业用途限制

结论

选择合适的工具在本地运行 LLM 取决于您的需求和专业知识。从 GPT4ALL 等用户友好型应用程序,到 Llama.cpp 等技术性更强的选项,以及基于 Python 的解决方案,可提供多种选择。可见开源模式正在迎头赶上,提供了对数据和隐私的更多控制。随着这些模型的发展,它们或有望与 ChatGPT 等产品竞争。

在本地运行 LLMs 的 6 种方法的更多相关文章

  1. 在本地运行Kubernetes的3种主流方式

    作者简介 Chris Tozzi,曾担任记者和Linux管理员.对开源技术.敏捷基础架构以及网络问题兴趣浓厚.目前担任高级内容编辑,并且是Fixate IO的DevOps分析师. 原文链接: http ...

  2. CentOS7创建本地YUM源的三种方法

    这篇文章主要介绍了CentOS7创建本地YUM源的三种方法,本文讲解了使用CentOS光盘作为本地yum源.如何为CentOS创建公共镜像.创建完全自定义的本地源等内容,需要的朋友可以参考下     ...

  3. mac学习Python第一天:安装、软件说明、运行python的三种方法

    一.Python安装 从Python官网下载Python 3.x的安装程序,下载后双击运行并安装即可: Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. MAC 系统一般 ...

  4. openstack中运行定时任务的两种方法及源代码分析

    启动一个进程,如要想要这个进程的某个方法定时得进行执行的话,在openstack有两种方式: 一种是通过继承 periodic_task.PeriodicTasks,另一种是使用loopingcall ...

  5. Linux:检查当前运行级别的五种方法

    运行级就是Linux操作系统当前正在运行的功能级别.存在七个运行级别,编号从0到6.系统可以引导到任何给定的运行级别.运行级别由数字标识. 每个运行级别指定不同的系统配置,并允许访问不同的进程组合.默 ...

  6. JS本地保存数据的几种方法

    1.Cookie 这个恐怕是最常见也是用得最多的技术了,也是比较古老的技术了.COOKIE优点很多,使用起来很方便 但它的缺点也很多: 比如跨域访问问题:无法保存太大的数据(最大仅为4KB):本地保存 ...

  7. 77.JS本地保存数据的几种方法

    1.Cookie 这个恐怕是最常见也是用得最多的技术了,也是比较古老的技术了.COOKIE优点很多,使用起来很方便 但它的缺点也很多: 比如跨域访问问题:无法保存太大的数据(最大仅为4KB):本地保存 ...

  8. IDEA引入本地jar包的几种方法

    有时候,项目需要引入一些第三方的依赖,这时候,就需要导入这些jar包.以下分享两种方式: 方式一.使用IDEA程序引入jar包 1.首先,点他! 2.然后,点他! 3.再然后,点他! 4.最后,在这里 ...

  9. Mac运行exe的几种方法,欢迎补充!

    1. 用wine直接运行exe.安装wine后有个放exe的文件夹,双击后会自动包装运行.看起来挺方便的,就怕暂用资源比较大: http://www.youtube.com/watch?v=eYISV ...

  10. VC 获 取 当前程序运行路径的几种方法

    1.使用APi函数GetModuleFileName char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH);        //获取 ...

随机推荐

  1. [转帖]linux求数组的交集,shell/bash 交集、并集、差集

    方法一(直接用文件名):取两个文本文件的并集.交集.差集 并: sort -m 交: sort -m 差 file1 - file2: sort -m 方法二(用变量参数):取两个文本文件的并集.交集 ...

  2. [转帖]jemalloc内存分配算法

    https://www.cnblogs.com/xiaojiesir/p/15450732.html jemalloc内存分配算法简介 jemalloc 是由 Jason Evans 在 FreeBS ...

  3. OpenSSH 9.2P1升级以及版本显示的处理过程

    说明 本次维护的时间是 2023-2-9 最新已发布的补丁是 OpenSSH9.2P1版本 其他本本应该是类似处理. 下载介质 在 OpenSSH官网打开相关界面. http://www.openss ...

  4. CentOS确认网口是否插入网线的办法

    最近公司的机器存在网络问题, 部分网络总是不通, 比较奇怪. 最近一直想处理好. 第一步: 先查看网口的设备信息 可以使用 ip link show 可以讲网口信息都展示出来. 一般情况下  NO-C ...

  5. 学习React中的jsx-保证你看的明明白白

    安装react的脚手架 1==>行 npx create-react-app myreactdemo01 解释一下: npx create-react-app 你的项目名称 npx create ...

  6. ffmpeg修改文件格式

    http://ffmpeg.org/ 官网下载windows版本 进这个文件夹 随便找一个格式的文件我这里以mp4 放在这个文件夹里面 然后状态栏输入cmd 输入下方命令代码 ffmpeg -i 66 ...

  7. 【windows Server 2019系列】 构建IIS服务器

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Web服务器也称为WWW(World Wide W ...

  8. Swift中常见的String用法,Array高阶使用,Set集合操作

    String字符串常见用法 生成字符串 创建字符串 let greeting = "Hello, world!" let name = String("John" ...

  9. React 的学习笔记一 (未完结)

    一.React 是什么 React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库.使用 React 可以将一些简短.独立的代码片段组合成复杂的 UI 界面,这些代码片段被称作 ...

  10. 自定义RecyclerView下拉刷新上拉加载更多

    自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多