Danswer 接入 Llama 2 模型 | 免费在 Google Colab 上托管 Llama 2 API

news2024/11/27 11:32:37

一、前言

前面在介绍本地部署免费开源的知识库方案时,已经简单介绍过 Danswer《Danswer 快速指南:不到15分钟打造您的企业级开源知识问答系统》,它支持即插即用不同的 LLM 模型,可以很方便的将本地知识文档通过不同的连接器接入到 Danswer,然后实现本地基于知识库的语义检索。它是完全开源的(MIT 许可证)并且免费使用。

1.1、为什么选择 Danswer

默认设置下,Danswer 使用 OpenAI 的 GPT 系列模型,由于很多时候我们因为数据隐私问题需要在本地部署离线的知识库系统,需要接入本地开源的模型,今天本文将简单介绍下如何使用开源模型 Llama 2 接入 Danswer。

至于为什么选择 Danswer,简单啰嗦一下,更具体的信息可以访问官方文档:

  • 它是完全开源的(MIT 许可证)并且免费使用。

  • 允许您即插即用不同的 LLM 模型,例如 GPT、HuggingFace、GPT4All、Llama cpp,甚至自定义自托管模型。

  • 具有开箱即用的关键功能,如文档访问控制、前端 UI、管理仪表板、轮询文档更新和灵活的部署选项。

  • 与 Slack、GitHub、GoogleDrive 等其他工具的连接器的不错列表。

1.2、为什么选择 Llama 2

自从 Meta 公司发布了最新的 LLaMA 2 模型并且开源之后,在LLM领域掀起了一阵不小的浪潮,至少从各种排行榜和评估结果来看,Llama 2 在开源界要优于其它的产品,它击败了 Falcon-40B(之前最好的开源基础模型),与 GPT-3.5 相当,仅低于 GPT-4 和 PALM 2(均为闭源模型,分别由 OpenAI 和 Google 拥有)。

从以上排行榜不难看出,基本上整个列表大部分的开源模型都是由 Llama 2 衍生品组成的。

二、在 Google Colab 上托管 Llama 2 模型

Llama 2 型号有 3 种不同尺寸:7B、13B 和 70B 参数。700 亿参数版本需要多个 GPU,因此无法免费托管。在 13B 和 7B 版本中,13B 版本更强大,但需要一些压缩(量化或降低浮点精度)才能适合单个中档 GPU。幸运的是,Llama cpp 库使这变得相当简单。这里我们将以 Llama 2 13B量化模型来进行演示。

在开始之前,请确保在 Google Colab 上设置了 T4 GPU 运行时

2.1、安装依赖

  • 运行 FastAPI 服务器所需的依赖项

  • 通过 Ngrok 创建公共模型服务 URL 所需的依赖项

  • 运行 Llama2 13B(包括量化)所需的依赖项

# 构建 Llama cpp
!CMAKE_ARGS="-DLLAMA_CUBLAS=on" FORCE_CMAKE=1 pip install llama-cpp-python

# 如果出现依赖解析器的错误提示,可以忽略
!pip install fastapi[all] uvicorn python-multipart transformers pydantic tensorflow

# 这将在 Google Colab 实例中下载并设置 Ngrok 可执行文件
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip -o ngrok-stable-linux-amd64.zip

Ngrok 用于通过公共 URL 访问 FastAPI 服务器。

用户需要创建一个免费账户并提供他们的身份验证令牌以使用 Ngrok。免费版本只允许一个本地隧道,并且身份验证令牌用于跟踪此使用限制。

在 Ngrok 设置页面上获取 Auth token,如图中红框所示

# https://dashboard.ngrok.com/signup
!./ngrok authtoken <YOUR-NGROK-TOKEN-HERE>

2.2、创建 FastAPI 应用

这里提供了一个与 Llama 2 模型交互的 API。可以根据需要在下面的代码中更改模型版本。在这个演示示例中,我们将使用 130 亿参数版本,该版本经过微调以进行指令(聊天)跟随。尽管进行了压缩,但它仍然比 70 亿变体更强大。

%%writefile app.py
from typing import Any

from fastapi import FastAPI
from fastapi import HTTPException
from pydantic import BaseModel
from huggingface_hub import hf_hub_download
from llama_cpp import Llama
import tensorflow as tf

# 在 T4 GPU 上拟合 Llama2-13B 需要 GGML 模型
GENERATIVE_AI_MODEL_REPO = "TheBloke/Llama-2-13B-chat-GGML"
GENERATIVE_AI_MODEL_FILE = "llama-2-13b-chat.ggmlv3.q5_1.bin"

model_path = hf_hub_download(
    repo_id=GENERATIVE_AI_MODEL_REPO,
    filename=GENERATIVE_AI_MODEL_FILE
)

llama2_model = Llama(
    model_path=model_path,
    n_gpu_layers=64,
    n_ctx=2000
)

# 测试推理
print(llama2_model(prompt="Hello ", max_tokens=1))

app = FastAPI()

# 这里定义了端点所期望的数据 JSON 格式,根据需要进行更改
class TextInput(BaseModel):
    inputs: str
    parameters: dict[str, Any] | None

@app.get("/")
def status_gpu_check() -> dict[str, str]:
    gpu_msg = "Available" if tf.test.is_gpu_available() else "Unavailable"
    return {
        "status": "I am ALIVE!",
        "gpu": gpu_msg
    }

@app.post("/generate/")
async def generate_text(data: TextInput) -> dict[str, str]:
    try:
        params = data.parameters or {}
        response = llama2_model(prompt=data.inputs, **params)
        model_out = response['choices'][0]['text']
        return {"generated_text": model_out}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

2.3、启动 FastAPI 服务器

由于需要下载模型并将其加载到 GPU 上,初始运行时间会很长。

注意:中断 Google Colab 运行时会发送 SIGINT 并停止服务器。

# 此单元格很快完成,因为它只需要启动服务器
# 服务器将开始下载模型,并需要一段时间才能启动
# 约 5 分钟
!uvicorn app:app --host 0.0.0.0 --port 8000 > server.log 2>&1 &

检查 server.log 日志以查看进度。在继续之前,请等待模型加载完成并使用下一个单元格进行检查。

# 如果看到 "Failed to connect",那是因为服务器仍在启动中
# 等待模型下载完成和服务器完全启动
# 检查 server.log 文件以查看状态
!curl localhost:8000

2.4、使用 Ngrok 为 FastAPI 服务器创建公共 URL。

重要提示:如果您通过电子邮件创建了一个账户,请验证您的电子邮件,否则下面的两个单元格将无法正常工作。

如果您通过 Google 或 GitHub 账户注册,那就没问题了。

# 这将启动 Ngrok 并创建一个公共 URL。
from IPython import get_ipython
get_ipython().system_raw('./ngrok http 8000 &')

检查下一个单元格生成的 URL,它应该显示 FastAPI 服务器正在运行,并且 GPU 可用。

要访问模型的端点,只需在 URL 后面添加 /generate

curl --location --request POST '<REPLACE-WITH-YOUR-NGROK-PUBLIC-URL>/generate' \
--header 'Content-Type: application/json' \
--data-raw '{
    "inputs": "请介绍下 Danswer 如何接入 Llama 2 模型?",
    "parameters": {
        "temperature": 0.0,
        "max_tokens": 25
    }
}'
# 获取公共 URL
# 如果无法正常工作,请确保您已验证您的电子邮件。
# 然后再次运行上一个代码单元格和这个代码单元格。
!curl -s http://localhost:4040/api/tunnels | python3 -c "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

2.5、关闭服务

要关闭进程,请在一个新的单元格中运行以下命令:

!pkill uvicorn
!pkill ngrok

[Google Colab 代码]

https://colab.research.google.com/drive/1HhqGGzV-q1m0igdhpGt5Wmf8VmDiyIcn#scrollTo=liqVEsGfZPse

三、在 Danswer 中接入 Llama 2 模型

Danswer 可以通过 REST 请求向任意模型服务器发出请求。可以选择传入访问令牌。要自定义请求格式和响应处理,可能需要更新/重建 Danswer 容器。

3.1、部署 Danswer

Danswer 提供 Docker 容器,可以轻松部署在任何云上,无论是在单个实例上还是通过 Kubernetes。在本演示中,我们将使用 Docker Compose 在本地运行 Danswer。

首先拉去 danswer 代码:

git clone https://github.com/danswer-ai/danswer.git

接下来导航到部署目录:

cd danswer/deployment/docker_compose

Danswer 默认使用的模型是 GPT-3.5-Turbo,如果想使用开源的如 Llama 2 模型API,通过创建 .env 文件来覆盖一些默认值(针对 Linux 显示),将 Danswer 配置为使用新的 Llama 2 端点:

GEN_AI_MODEL_PROVIDER=custom  
GEN_AI_API_ENDPOINT=<REPLACE-WITH-YOUR-NGROK-PUBLIC-URL>/generate  

3.3、添加文档到 Danswer

这里我们将 Danswer 文档网站建立索引。只需要在Web连接器中添加文档URL地址即可。

3.4、从 Danswer 获取答案

单击 Danswer 徽标返回主页,现在您可以询问有关新索引文档的问题。

四、总结

本文主要介绍了如何在Google Colab上托管Llama 2模型,并将其接入Danswer。Danswer是一个开源的知识问答系统,支持不同的LLM模型,可以方便地将本地知识文档接入到Danswer,实现基于知识库的语义检索。

虽然使用 Google Colab 可以免费托管您的 LLM,但是需要注意以下几点:

  • Google Colab 更适用于开发目的,如果您想要永久端点,可能需要投资专用硬件,因为在一段时间不活动后,Google Colab 将回收实例。也可考虑在 HF 上托管。

  • 免费套餐中不支持高端 GPU 如 A100。

  • 在免费套餐中,每个会话最多只能申请 12 小时的实例。

五、References

[1] Danswer 代码:https://github.com/danswer-ai/danswer

[2] Danswer 文档:https://docs.danswer.dev/

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

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

相关文章

Linux中的高级IO

文章目录 1.IO1.1基本介绍1.2基础io的低效性1.3如何提高IO效率1.4五种IO模型1.5非阻塞模式的设置 2.IO多路转接之Select2.1函数的基本了解2.2fd_set理解2.3完整例子代码&#xff08;会在代码中进行讲解&#xff09;2.4优缺点 3.多路转接之poll3.1poll函数的介绍3.2poll服务器3.…

初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)

接上次博客&#xff1a;初阶JavaEE&#xff08;14&#xff09;表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗&#xff1f; Cookie是HTTP请求header中的一个属性&#xff0c;是一种用于在浏览器和服务器之间持久存储数据的机制&#xff0c;允许网站…

【51单片机】蜂鸣器(学习笔记)

一、蜂鸣器 1、蜂鸣器介绍 鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率固定无源蜂鸣器&#xff1a;内部不带振荡源&…

Educational Codeforces Round 157 (Rated for Div. 2) F. Fancy Arrays(容斥+组合数学)

题目 称一个长为n的数列a是fancy的&#xff0c;当且仅当&#xff1a; 1. 数组内至少有一个元素在[x,xk-1]之间 2. 相邻项的差的绝对值不超过k&#xff0c;即 t(t<50)组样例&#xff0c;每次给定n(1<n<1e9),x(1<x<40), 求fancy的数组的数量&#xff0c;答案…

【错误解决方案】ModuleNotFoundError: No module named ‘my_fake_useragent‘

1. 错误提示 ModuleNotFoundError: No module named my_fake_useragent&#xff0c;这意味着你试图导入一个名为 my_fake_useragent 的模块&#xff0c;但Python找不到这个模块。 2. 解决方案 检查模块名是否正确: 确保你试图导入的模块名是正确的。也许你拼写错误或者大小写不…

NeurIPS 2023 | 基于多模态统一表达的跨模态泛化

©PaperWeekly 原创 作者 | 夏炎 学校 | 浙江大学 研究方向 | 多模态 论文标题&#xff1a; Achieving Cross Modal Generalization with Multimodal Unified Representation 模型&代码地址&#xff1a; https://github.com/haihuangcode/CMG 在本文中&#xff0c;我们…

LeetCode 面试题 16.17. 连续数列

文章目录 一、题目二、C# 题解 一、题目 给定一个整数数组&#xff0c;找出总和最大的连续数列&#xff0c;并返回总和。 示例&#xff1a; 输入&#xff1a; [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a; 6 解释&#xff1a; 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。…

树结构及其算法-线索二叉树

目录 树结构及其算法-线索二叉树 C代码 树结构及其算法-线索二叉树 虽然我们把树转换为二叉树可减少空间的浪费——由2/3降低到1/2&#xff0c;但是如果仔细观察之前使用链表建立的n节点二叉树&#xff0c;那么会发现用来指向左右两个节点的指针只有n-1个链接&#xff0c;另…

如何快速导出、备份微信通讯录好友联系人微信号

6-9 如果因工作需要&#xff0c;你有多个微信&#xff0c;并且你的业务开发的客户都在这些微信里&#xff0c;将会面临一个问题&#xff0c;那就是备份问题&#xff0c;因为通过微信做业务&#xff0c;如果遇到微信不小心被封号&#xff0c;或者离职的交接等情况&#xff0c;客…

【Mybatis小白从0到90%精讲】03:编写Mapper,第一个入门程序

文章目录 前言一、创建mysql user表二、注解方式三、XML方式四、编写main方法调用前言 映射器Mapper是 MyBatis 中最重要的文件,简单的讲主要用来映射SQL语句。 映射器有两种实现方式:注解方式、XML文件方式(推荐)。 接下来演示通过两种方式,开发Mybatis第一个入门程序,…

GEE数据集——2019、2020、2021、2022和2023年全球固定宽带和移动(蜂窝)网络性能Shapefile 格式数据集

全球固定宽带和移动&#xff08;蜂窝&#xff09;网络性能 全球固定宽带和移动&#xff08;蜂窝&#xff09;网络性能&#xff0c;分配给缩放级别 16 网络墨卡托图块&#xff08;赤道处约 610.8 米 x 610.8 米&#xff09;。数据以 Shapefile 格式和 Apache Parquet 格式提供&…

安装MySQL时出现 由于找不到 MSVCR120.dll,无法继续执行代码。重新安装程序可能会解决此问题。

--------------------------- mysqld.exe - 系统错误 --------------------------- 由于找不到 MSVCR120.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。 --------------------------- 确定 --------------------------- 安装MySQL时出现 “This appl…

C语言实现九九乘法表

学习C语言后&#xff0c;我们会发现打印九九乘法表是很简单的&#xff0c;话不多说&#xff0c;我们上代码&#xff01; 目录 1.函数代码 2.运行结果 1.函数代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i 1;int j 1;int n 0;//行数in…

麒麟系统 UFW 操作文档

麒麟系统 UFW 操作文档 1. UFW 介绍 ufw&#xff08;简单防火墙 Uncomplicated FireWall&#xff09;真正地简化了 iptables&#xff0c;虽然 ufw 的底层依 然会调用 iptables&#xff0c;但是配置防火墙规则时操作更加方便&#xff0c;命令更加简洁&#xff0c;本文档主要介…

49基于matlab的Non dominated sorting genetic algorithm -II(NSGA-Ⅱ)多目标遗传算法

基于matlab的Non dominated sorting genetic algorithm -II&#xff08;NSGA-Ⅱ&#xff09;多目标遗传算法&#xff0c;其优势是降低了非劣排序遗传算法的复杂性&#xff0c;具有运行速度快&#xff0c;解集的收敛性好的优点&#xff0c;成为其他多目标优化算法性能的基准。程…

Python自定义函数练习(持续更新中~)

1.计算矩阵的面积和周长&#xff1a; class Rectangle:def __init__(self, width, height):self.width widthself.height heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width self.height)if __name__ "__main__"…

Ubuntu网络IP地址一直显示127.0.0.1

问题描述&#xff1a; 终端输入ip a显示127.0.0.1&#xff0c;原来类似192.168.231.1的地址不见了。 ip a 点击网络配置&#xff08;ubuntu桌面版&#xff09;&#xff0c;发现无线网络模块看不见了 正常情况应该有wired 模块&#xff0c;就是下面标红的 解决方案&#xff1a…

c语言实现http下载功能,显示进度条和下载速率

#include <stdio.h>//printf #include <string.h>//字符串处理 #include <sys/socket.h>//套接字 #include <arpa/inet.h>//ip地址处理 #include <fcntl.h>//open系统调用 #include <unistd.h>//write系统调用 #include <netdb.h>//…

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PSO-VMD粒子群算法PSO优化VMD变分模态分解 可直接运行 分解效果…

Linux C/C++下抓包分析mysql流量(协议解析)

MySQL通信协议是一个有状态的协议&#xff0c;主要用于MySQL客户端与服务器之间的通信。这个协议在MySQL客户端连接器&#xff08;如Connector/C、Connector/J等&#xff09;、MySQL Proxy以及主从复制中都有实现。 该协议的特性包括&#xff1a;支持SSL、压缩和认证等功能。 …