【大模型实战篇】Mac本地部署RAGFlow的踩坑史

1. 题外话

        最近一篇文章还是在11月30日写的,好长时间没有打卡了。最近工作上的事情特别多,主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed,后续会带来一些分享。今天的文章主要聚焦在RAG。

        近期调研了一系列开源的RAG框架(约20多个开源项目),相对来说,RAGFlow【1】更贴合我的需求,因此就花了一些时间去研究,本文分享下在Mac系统本地化部署的实践。通过本地化部署和使用,能够更好的帮助你分析其中的一些能力以及理解代码。不过话说回来,虽然RAGFlow的demo使用还是挺可以的,但开源项目的代码质量和文档质量不得不令人吐槽,希望该项目的作者能够重视起来。

2. Mac系统部署   

       我们采用从源码部署的模式【2】。由于0.15.1似乎对mac的支持不够,因此回退到0.14.1版本。后续的安装是基于0.14.1版本进行,这个需要说明一下。

        这里说一下我本地的mac系统信息:

芯片:Apple M2 Pro

内存:16G

macOS: Ventura 13.4

2.1 资源要求

  • CPU ≥ 4 cores
  • RAM ≥ 16 GB
  • Disk ≥ 50 GB
  • Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1

Mac查看cpu信息

> sysctl -a | grep machdep.cpu

machdep.cpu.cores_per_package: 10

machdep.cpu.core_count: 10

machdep.cpu.logical_per_package: 10

machdep.cpu.thread_count: 10

machdep.cpu.brand_string: Apple M2 Pro

2.2 安装pipx

> python -m pip install --user pipx

配置启动:

> python -m site --user-base

> nano ~/.zshrc

添加以下指令到.zshrc:

export PATH="/path/to/user_base/bin:$PATH"

生效:

> source ~/.zshrc

接下来可以使用pipx:

> pipx

usage: pipx [-h] [--quiet] [--verbose] [--global] [--version]

            {install,install-all,uninject,inject,pin,unpin,upgrade,upgrade-all,upgrade-shared,uninstall,uninstall-all,reinstall,reinstall-all,list,interpreter,run,runpip,ensurepath,environment,completions}

            ...

Install and execute apps from Python packages.

Binaries can either be installed globally into isolated Virtual Environments

or run directly in a temporary Virtual Environment.

2.3 安装poetry

pipx install poetry 

配置:

export POETRY_VIRTUALENVS_CREATE=true POETRY_VIRTUALENVS_IN_PROJECT=true

2.4 安装依赖包

瘦身版:

~/.local/bin/poetry install --sync --no-root

完整版:

~/.local/bin/poetry install --sync --no-root --with full

注意:此时安装会报xgboost的安装错误,原因是xgboost 包的版本 1.5.0 不支持 PEP 517 构建标准,而 Poetry 默认使用 PEP 517 来处理依赖包的安装【3】。

解决方案为编辑 pyproject.toml 文件,在 [tool.poetry.dependencies] 部分,调整 xgboost 的版本范围,xgboost = "^1.6.0", 然后保存修改。

使用以下命令重新生成 poetry.lock 文件:

~/.local/bin/poetry lock

根据 pyproject.toml 文件的依赖定义,更新或重新生成 poetry.lock 文件。完成后再次执行

~/.local/bin/poetry install --sync --no-root

安装依赖顺利完成。

2.5 启动第三方服务 

使用 Docker Compose 启动 ‘base’ 服务(MinIO、Elasticsearch、Redis 和 MySQL)

docker compose -f docker/docker-compose-base.yml up -d

这里也遇到docker compose的问题,可能需要涉及到重新安装,看你的版本,如果是高版本,则需要安装一个docker-compose的extension包,否则安装docker-compose。确保你的docker-compose版本在v2.26.1及以上。

另外,可以添加docker的国内加速镜像,能够顺利一些。

2.6 启动 RAGFlow 后端服务 

在 docker/entrypoint.sh 文件中注释掉 nginx 这一行。

# /usr/sbin/nginx

回退路径到ragflow目录,激活 Python 虚拟环境:

> source .venv/bin/activate

> export PYTHONPATH=$(pwd)

如果无法访问 HuggingFace,可以设置 HF_ENDPOINT 环境变量以使用镜像站点:

推荐一个 huggingface 的镜像站:https://hf-mirror.com/

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

在ragflow路径下运行 entrypoint.sh 脚本来启动后端服务:

bash docker/entrypoint.sh

这里直接使用源码,可能会报错路径问题, /ragflow/docker/service_conf.yaml.template: No such file or directory。 需要调整一下路径【3】。具体如下:

#!/bin/bash# replace env variables in the service_conf.yaml file
rm -rf ./conf/service_conf.yaml
while IFS= read -r line || [[ -n "$line" ]]; do# Use eval to interpret the variable with default valueseval "echo \"$line\"" >> ./conf/service_conf.yaml
done < ./docker/service_conf.yaml.template# unset http proxy which maybe set by docker daemon
export http_proxy=""; export https_proxy=""; export no_proxy=""; export HTTP_PROXY=""; export HTTPS_PROXY=""; export NO_PROXY=""#/usr/sbin/nginxexport LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/PY=python3
if [[ -z "$WS" || $WS -lt 1 ]]; thenWS=1
fifunction task_exe(){while [ 1 -eq 1 ];do$PY rag/svr/task_executor.py $1;done
}for ((i=0;i<WS;i++))
dotask_exe  $i &
donewhile [ 1 -eq 1 ];do$PY api/ragflow_server.py
donewait;

另外启动过程中,可能会报一些module not found的错误,python依赖包罗列如下:

beartype, pycryptodomex, pdfplumber, polars, datrie, hanziconv, roman_numbers, cn2an strenum, tiktoken, xxhash, elasticsearch_dsl, valkey, flask_login, word2number, infinity

如果启动成功,可以看待下述的信息:

2.6 启动 RAGFlow 前端服务 

安装前端依赖项:

注:需要安装node

> cd web

> npm install --force

 安装依赖的过程又有点麻烦,出现很多次timeout

配置一下镜像:

npm config set registry https://registry.npmmirror.com/

在 .umirc.ts 中将 proxy.target 更新为 http://127.0.0.1:9380

vim .umirc.ts

启动 RAGFlow 前端服务:

npm run dev

3. 系统界面展示

4. 服务关闭

开发完成后停止 RAGFlow 服务 

停止 RAGFlow 前端服务:

pkill npm 

停止 RAGFlow 后端服务:

pkill -f “docker/entrypoint.sh”

5. 参考材料

【1】https://github.com/infiniflow/ragflow

【2】Launch the RAGFlow Service from Source

【3】源码部署RAGFlow-0.14.1

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

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

相关文章

推荐5款局域网IP扫描工具,支持电脑+Android!

在日常网络管理中&#xff0c;快速扫描局域网中的设备和IP地址是一项基本但非常重要的任务。无论是排查网络问题还是进行设备管理&#xff0c;一款好用的 IP 扫描工具都能让你事半功倍。 如何选择适合自己需求的局域网 IP 扫描工具&#xff1f;有哪些功能强大又易于上手的工具…

python修改ppt中的文字部分及插入图片

批量修改ppt中的某个模块&#xff0c;或者批量制作奖状等场景会用到&#xff1b; import os import pandas as pd from pptx import Presentation from pptx.util import Inchesfilepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/批量制作/file1时段预警_副本.pp…

计算机网络—————考研复试

第一章、计算机网络体系结构 1. OSI参考模型和TCP/IP模型&#xff1a; OSI与TCP/IP的记忆方法&#xff1a;只需把OSI的七层记住&#xff0c;将应用层、表示层、会话层一起记&#xff0c;到TCP/IP变成应用层。物理层和数据链路层换成网络接口层。把网络层换个字变成网际层。 而…

springboot534售楼管理系统(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本售楼管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

计算机体系结构期末复习3:GPU架构及控制流问题

目录 一、GPU设计思路 1.简化流水线、增加核数 2.单指令多线程&#xff08;SIMT&#xff09; 3.同时驻留大量线程 4.总思路&#xff1a;多线程单指令多线程 二、GPU的控制流问题 1.什么是控制流问题 2.怎么应对分支分歧 一、GPU设计思路 1.简化流水线、增加核数 2.单指…

[实用指南]如何将视频从iPhone传输到iPad

概括 将视频从 iPhone 传输到 iPad 时遇到问题&#xff1f;您可能知道一种方法&#xff0c;但不知道如何操作。此外&#xff0c;您要传输的视频越大&#xff0c;完成任务就越困难。那么如何将视频从 iPhone 传输到 iPad&#xff0c;特别是当您需要发送大视频文件时&#xff1f…

httpslocalhostindex 配置的nginx,一刷新就报404了

当你的Nginx配置导致页面刷新时报404错误时&#xff0c;通常是由于以下几个原因造成的&#xff1a; 静态文件路径配置错误&#xff1a;Nginx没有正确地指向静态文件的目录。前端路由问题&#xff1a;如果是SPA&#xff08;单页应用&#xff09;&#xff0c;刷新页面时Nginx没有…

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片

药片(药丸)和胶囊识别数据集&#xff0c;使用yolo&#xff0c;pasical voc xml, coco json格式标注&#xff0c;可识别药片和胶囊两种标签&#xff0c;2445张原始图片 数据集分割 训练组80&#xff05; 1967图片 有效集13% 317图片 测试集7% 161图片 预处…

解决winform中comboBox下拉不够长的问题

默认情况下的combobox 可以看到comboBox不够长 导致信息显示不完成 解决方法 修改属性&#xff1a;DropDownWidth为308 修改前修改后

HTML——43.创建表格

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表格</title></head><body><!--table标签用来定义表格&#xff0c;border属性表示边框--><!--tr标签表示表格中的一行--><!--th标签表示表…

在 Ubuntu 上安装和使用 `opus-tools` 的详细教程

目录 1. **安装 opus-tools**2. **opus-tools 常用命令** 2.1 **opusenc - 编码音频文件为 Opus 格式**示例 1&#xff1a;将 WAV 文件编码为 Opus 格式示例 2&#xff1a;设置编码比特率示例 3&#xff1a;使用变比特率&#xff08;VBR&#xff09;示例 4&#xff1a;设置声道…

[硬件] DELL BIOS 相关注意事项

前言 前段时间重装系统. DELL BIOS属实资料少, 又难用. 这里给出相关的注意事项, 并且配上图片. BIOS相关注意事项 进入BIOS ESC/F2/ F12. 都可以进入BIOS, 当进U盘的入Win PE系统时, 使用F12 效果更佳. 关闭安全模式 切换到Boot Configuration选项,将Secure Boot选项off选…

ip归属地怎么判定?如何查看自己ip属地

在当今数字化时代&#xff0c;IP地址作为互联网通信的基础&#xff0c;扮演着至关重要的角色。而IP归属地的判定与查看&#xff0c;不仅关乎网络安全、隐私保护&#xff0c;还直接影响到社交平台的信任机制与信息传播的真实性。本文将深入探讨IP归属地的判定原理以及如何查看自…

大数据与机器学习(它们有何关系?)

想了解大数据和机器学习吗&#xff1f;我们将为你解释它们是什么、彼此之间有何关联&#xff0c;以及它们为何在数据密集型应用中如此重要。 大数据和机器学习是如何相互关联的&#xff1f; 大数据指的是传统存储方法无法处理的海量数据。机器学习则是计算机系统从观察结果和…

前端安全措施:接口签名、RSA加密、反调试、反反调试、CAPTCHA验证

文章目录 引言I 设置防爬虫功能使用robots.txt文件通过配置HTTP头部中的X-Robots-TagII 禁止打开开发者工具反复清空控制台无限debugger反调试检查是否按下了F12或其他调试快捷键禁用右键监听调试快捷键例子III 屏蔽粘贴/复制/剪切/选中IV 知识扩展: javascript内置命令调试分…

Mac M2 Pro安装MySQL 8.4.3

絮絮叨叨 MacBook Pro&#xff0c;芯片&#xff1a;Apple M2 Pro, macOS: Sonoma 14.0一直知道很多软件对Mac M1或M2的支持不好&#xff0c;但没想到在安装MySQL 8.x上也让我吃尽了苦头本文除了介绍如何安装MySQL 8.4.3外&#xff0c;还会记录笔者遇到的一些问题以及解决方法 …

基于Sentinel的服务保护方案的三种方式(请求限流、线程隔离、服务熔断)超详细讲解

目录 1、三种方式介绍 1.1请求限流 1.2 线程隔离方案 1.3 服务熔断 2、基于sentinel实现 2.1 启动sentinel 2.2 基于springboot整合sentinel 2.2.1请求限流 2.2.2请求隔离 2.2.2.1 OpenFeign整合Sentinel 2.2.3 服务熔断 2.2.3.1 编写降级代码 2.2.3.2 服务熔断 1、…

EasyExcel(环境搭建以及常用写入操作)

文章目录 EasyExcel环境搭建1.创建模块 easyexcel-demo2.引入依赖3.启动类创建 EasyExcel写1.最简单的写入1.模板2.方法3.结果 Write01.xlsx 2.指定字段不写入Excel1.模板2.方法3.结果 Write02.xlsx 3.指定字段写入excel1.模板2.方法3.结果 Write03.xlsx 4.按照index顺序写入ex…

周记-唐纳德的《计算机程序设计艺术》

用代码生成代码 开发一个协议&#xff0c;字段有些多&#xff0c;每个字段是QT的属性&#xff0c;需要写Q_PROPERTY&#xff0c;一个一个编辑的话比较繁琐&#xff0c;耗费时间。后来就用代码生成了头文件和源文件&#xff0c;get和set还有signal函数&#xff0c;内容基本都是…

python钉钉机器人

上代码 #coding:utf-8 import sys import time import hmac import hashlib import base64 import urllib.parse import requeststimestamp str(round(time.time() * 1000)) secret 你的secret secret_enc secret.encode(utf-8) string_to_sign {}\n{}.format(timestamp, …