- docker ------ compose设置容器使用GPU - 巴蜀秀才 - 博客园 (cnblogs.com)
- 巧用 Docker Compose 管理 GPU 资源-腾讯云开发者社区-腾讯云 (tencent.com)
- ROADMAP 2024 · Issue #162 · infiniflow/ragflow (github.com)
- https://demo.ragflow.io/
- !!!https://blog.csdn.net/wzj_110/article/details/136406091
关键字:
ragflow、docker compose、最大token数问题、添加 LLM、configmap、subPath、Ollama
Ollama 可以设置的环境变量包括:
- `OLLAMA_HOST`:定义了 Ollama 监听的网络接口。通过设置`OLLAMA_HOST=0.0.0.0`,可以让 Ollama 监听所有可用的网络接口,从而允许外部网络访问。0.0.0.0:11434
- `OLLAMA_MODELS`:指定了模型镜像的存储路径。D:\ollama直接拷贝文件到该目录后ollama list就可用!
- `OLLAMA_KEEP_ALIVE`:控制模型在内存中的存活时间。设置`OLLAMA_KEEP_ALIVE=24h`可以让模型在内存中保持 24 小时,提高访问速度。
- `OLLAMA_PORT`:允许更改 Ollama 的默认端口。例如,设置`OLLAMA_PORT=8080`可以将服务端口从默认的 11434 更改为 8080。
- `OLLAMA_NUM_PARALLEL`:决定了 Ollama 可以同时处理的用户请求数量。设置`OLLAMA_NUM_PARALLEL=4`可以让 Ollama 同时处理两个并发请求。
- `OLLAMA_MAX_LOADED_MODELS`:限制了 Ollama 可以同时加载的模型数量。设置`OLLAMA_MAX_LOADED_MODELS=4`可以确保系统资源得到合理分配。
***:2024-07-08发布的v0.8.0版本:
- 2024-07-08 支持 Graph。
- 2024-06-27 Q&A 解析方式支持 Markdown 文件和 Docx 文件。支持提取出 Docx 文件中的图片。支持提取出 Markdown 文件中的表格。
- 2024-06-14 Q&A 解析方式支持 PDF 文件。
- 支持将文件移动到文件管理器中的特定文件夹。
1、一共5个镜像:2024/6/13
$ git clone https://github.com/infiniflow/ragflow.git
$ cd ragflow/docker
$ chmod +x ./entrypoint.sh
$ docker compose up -d #老失败,以下单独拉取
docker pull infiniflow/ragflow:dev 【RAGFLOW_VERSION=dev 10.1GB】
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.3 【STACK_VERSION=8.11.3】
docker pull mysql:5.7.18
docker pull quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z
docker pull redis:7.2.4
- docker compose up命令(-d:表示以守护进程(后台)模式运行)会根据 docker-compose.yml 文件中定义的服务配置,创建并启动相关的容器,自动下载 RAGFlow 的“开发版本 ”docker 镜像。如果你想下载并运行特定版本的 docker 镜像,在 docker/.env 文件中找到 RAGFLOW_VERSION 变量,将其改为对应版本。例如 RAGFLOW_VERSION=v0.7.0
atc@WIN11-Room208:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
infiniflow/ragflow dev 9fa1045436e3 26 hours ago 29.4GB
swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow dev 9fa1045436e3 26 hours ago 29.4GB
redis 7.2.4 5a93f6b2e391 2 months ago 173MB
quay.io/minio/minio RELEASE.2023-12-20T01-00-02Z 5702ea361420 5 months ago 206MB
docker.elastic.co/elasticsearch/elasticsearch 8.11.3 2892d2363c3c 6 months ago 2.19GB
mysql 5.7.18 d178dffba8d8 6 years ago 575MB
运行后:
atc@WIN11-Room208:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd77411ab716 swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow:dev "./entrypoint.sh" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:9380->9380/tcp ragflow-server
8ca697b33948 redis:7.2.4 "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:6379->6379/tcp ragflow-redis
b57e6da21132 quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z "/usr/bin/docker-ent…" 4 hours ago Up 4 hours 0.0.0.0:9000-9001->9000-9001/tcp ragflow-minio
eb7df0b4d1f9 docker.elastic.co/elasticsearch/elasticsearch:8.11.3 "/bin/tini -- /usr/l…" 4 hours ago Up 4 hours (healthy) 9300/tcp, 0.0.0.0:1200->9200/tcp ragflow-es-01
abaeb3b121e0 mysql:5.7.18 "docker-entrypoint.s…" 4 hours ago Up 4 hours (healthy) 0.0.0.0:5455->3306/tcp ragflow-mysql
2、访问: enter http://IP_OF_YOUR_MACHINE, default HTTP serving port 80,随便注册一个账户即可。
http://192.168.1.16:80
3、RAGFlow中模型提供商设置:添加ollama:
- 宿主机运行Ollama,添加用户环境变量 OLLAMA_HOST:0.0.0.0【Ollama binds 127.0.0.1 port 11434 by default. Change the bind address with the OLLAMA_HOST environment variable.】
- 模型提供商添加 LLM页面,基础 Url处输入:192.168.1.16:11434/api(or 192.168.1.16:11434 or 192.168.1.16:11434/v1 or 192.168.1.16:11434/v1/api/ 都行!),模型名称:qwen2:7b(下拉框不显示,得输入正确格式)
- ollama ps命令可以展示当前加载的模型、所占的内存大小以及使用的处理器类型(GPU 或 CPU),Forever和4 minutes from now是模型的有效期。(限制 Ollama 只使用其中的一部分,可以设置 CUDA_VISIBLE_DEVICES 为 GPU 的逗号分隔列表);Install CUDA drivers:CUDA Toolkit 12.5
4、?问题:回答大概只有50个字,然后就截断卡掉了。
- https://demo.ragflow.io/线上的没这个问题,配置除了模型其它都一样;切换多个本地模型测试,应该与模型没关系。
- 以下这设置了模型输出的最大长度,以标记(单词或单词片段)的数量来衡量。假如设为1,输出更短(1个token),应该生效了。但是设置大了,只输出50个左右就被截断了?
- 把上图 “最大token数” 关闭后,正常!
https://github.com/infiniflow/ragflow/blob/v0.7.0/api/db/services/dialog_service.py
def chat(dialog, messages, stream=True, **kwargs):
assert messages[-1]["role"] == "user", "The last content of this conversation is not from user."
llm = LLMService.query(llm_name=dialog.llm_id)
if not llm:
llm = TenantLLMService.query(tenant_id=dialog.tenant_id, llm_name=dialog.llm_id)
if not llm:
raise LookupError("LLM(%s) not found" % dialog.llm_id)
max_tokens = 1024
else: max_tokens = llm[0].max_tokens
......
def message_fit_in(msg, max_length=4000):
used_token_count, msg = message_fit_in(msg, int(max_tokens * 0.97))
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
5、yaml 特殊符号语法。涉及的'知识点': configmap资源对象、yaml'|- |+ >'语法 。目的: 彻底解决'YAML 多行文本'格式化'丢失'问题。
在">"符号应用的'多行文本'值中,所有'换行符'都会被视为'空格'
> 右尖括号,用来表示'折叠换行',只有'空白行'才会被识别为'换行',原来的换行符都会被转换成'空格'
竖线符'|',这在 yaml 中表示保留换行,每行的'缩进和行尾空白'都会被'去掉',而额外的缩进会被保留
"|+": 保留'每行尾部的换行符\n'的同时,'保留'内容结尾处的换行符\n
"|-": 保留'每行尾部的换行符\n'的同时,'删除'内容结尾处的换行符\n
"|-":保留'行尾'换行符,但不保留'字符末尾'的换行符
">+":将行尾换行符'替换'成空格,保留'字符末尾'的换行符
">-":将行尾换行符替换成空格,'不保留'字符末尾的换行符
换行主要使用 | 和 > , '|'保留行尾'换行符', '>'将行尾换行符替换成'空格'
保留字符末尾的换行使用'+',删除字符末尾的换行使用'-',一般用于与'|'和'>'组合使用
K8S的yaml文件'只允许'有'空格'
6、docker-compose移植到K8S笔记:
- RagFlow仅仅是将文件上传(是知识库上传;文件管理上传使用ES[100Gi],然后链接到知识库)至MinIO[20Gi],文件的解析需要手工点击触发,根据文件创建一个或多个异步任务,通过 Redis消息队列进行暂存,方便异步执行。
- RagFlow使用Elasticsearch存储上传文档数据(是文件管理上传后链接到知识库;知识库上传使用MinIO)、向量数据、任务信息。
- RagFlow使用MySQL存储:用户信息、系统配置信息(比如配置知识库名称)、任务定义、执行状态、结果等,
6.1、ragflow-mysql:init-file参数在K8S需要加等号。
docker-compose:
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
--tls_version="TLSv1.2,TLSv1.3"
--init-file /data/application/init.sql
K8S:
args:
- "--max_connections=1000"
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_general_ci"
- "--default-authentication-plugin=mysql_native_password"
- "--tls_version=`TLSv1.2,TLSv1.3`"
- "--init-file=/data/application/init.sql"
mountPath: /var/lib/mysql 【mysql,rag_flow目录的属主mysql:mysql】(改成mountPath: /var/lib/mysql/rag_flow也一样)后启动失败,注释掉,如下所示OK。
root@ragflow-mysql-67767758d5-t28mt:/var/lib/mysql# pwd
/var/lib/mysql
root@ragflow-mysql-67767758d5-t28mt:/var/lib/mysql# ls
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem rag_flow server-key.pem
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-cert.pem sys
报错STATUS从Error变成CrashLoopBackOff:Back-off restarting failed container mysql;[ERROR] --initialize specified but the data directory has files in it. Aborting.表示初始化 MySQL 数据目录时,发现该目录中已经存在文件,确保运行 MySQL 初始化进程的用户具有对数据目录的适当读写权限。
[root@k8s-master01 yaml]# k -n ragflow get pod -owide
NAME READY STATUS
ragflow-mysql-5d8db678c7-559ww 0/1 Error->CrashLoopBackOff
# k -n ragflow describe pod ragflow-mysql-5d8db678c7-559ww
State: Terminated
Reason: Error
Exit Code: 1
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 23s default-scheduler Successfully assigned ragflow/ragflow-mysql-5d8db678c7-559ww to k8s-node06
Normal SuccessfulAttachVolume 23s attachdetach-controller AttachVolume.Attach succeeded for volume "pvc-0511cbe3-bbea-4663-b53e-1940a51412bc"
Normal Pulled 5s (x3 over 21s) kubelet Container image "core.harbor.domain/mizy/mysql:5.7.18" already present on machine
Normal Created 5s (x3 over 21s) kubelet Created container mysql
Normal Started 4s (x3 over 20s) kubelet Started container mysql
Warning BackOff 3s (x3 over 17s) kubelet Back-off restarting failed container mysql in pod ragflow-mysql-5d8db678c7-559ww_ragflow(54458dba-d327-4c1d-81fa-53b6721dd767)
[root@k8s-master01 yaml]# k -n ragflow logs ragflow-mysql-5d8db678c7-559ww
Initializing database
2024-06-25T13:18:17.359396Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2024-06-25T13:18:17.362660Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2024-06-25T13:18:17.362695Z 0 [ERROR] Aborting
mountPath: /var/lib/mysql 持久化该目录后,目录里内容少了,说明是挂载该目录的问题。
root@ragflow-mysql-54866bf5db-72ck2:/var/lib/mysql# pwd
/var/lib/mysql
root@ragflow-mysql-54866bf5db-72ck2:/var/lib/mysql# ls
auto.cnf ib_buffer_pool ib_logfile0 ib_logfile1 ibdata1 lost+found
- 按以下加了subPath好了!!!
volumeMounts:
- name: ragflow-mysql
mountPath: /var/lib/mysql
subPath: mysql
6.2、ragflow-minio:k8s命令需要加minio(docker-compose没有minio,直接是server),即minio server --console-address ':9001' /data
docker-compose:
command: server --console-address ":9001" /data
k8s:
command: ["/bin/sh","-c","--"]
args: ["minio server --console-address ':9001' /data"]
6.3、Deployment的containerPort和Service的targetPort端口号保持一致(这里通过name引用)。流量通过 Service 的 targetPort 转发到对应的后端Pod的containerPort; port是Service暴露在ClusterIP 上的端口。