大模型 - Langchain-Chatchat小白本地部署踩坑血泪史

news2024/11/27 8:34:43

环境介绍

  • windows 11
  • python 3.9.9
  • 显卡 GTX970 4G显存 (可怜巴巴)
  • 内存 24G

一、下载 Langchain-Chatchat

注意:这里先不要执行依赖下载,如果项目是通过 PyCharm 打开,就不要着急下载依赖,跟着往下面走,因为 pip 安装默认不走虚拟环境,如果所有的 python 项目都使用同一个依赖目录,会导致其他项目版本依赖出现问题,这是 pip 安装的一个特新,不像 Java 中 maven 依赖可以管理不同版本的依赖

git clone https://github.com/chatchat-space/Langchain-Chatchat.git

二、PyCharm 打开项目并配置解释器和虚拟环境

第一步:点击右下角,弹出如下内容,选择 Interpreter Settings
在这里插入图片描述
第二步:点击 Add Interpreter
在这里插入图片描述
第三步:配置虚拟环境和解释器
在这里插入图片描述

三、虚拟环境配置好了之后再下载依赖

# 安装全部依赖
pip install -r requirements.txt 
pip install -r requirements_api.txt
pip install -r requirements_webui.txt

四、下载模型

国内下载大模型地址:

  • huggingface国内镜像站:www.hf-mirror.com
  • 阿里巴巴的模搭社区:www.modelscope.cn

4.1 嵌入模型下载 bge-large-zh-v1.5

可以通过 git 的方式进行下载,但是 git 下载太慢了,还是直接通过浏览器下载

第一步:点我直接进入下载页面,选择时间最新的进入
在这里插入图片描述
第二步:进入后,点击模型文件
在这里插入图片描述
第三步: 选择全部文件进行下载
在这里插入图片描述
第四步: 下载完毕后,统一使用目录进行管理

例如我的 LLMs 目录下分不同的模型名称

在这里插入图片描述

4.2 下载大模型 Qwen-1_8B-Chat

为什么我会选择此模型,而不是选择 chatglm3-6b
因为我的显存只有 4G,在 model_config.py.example27 行注释说明了情况
如果读者的显存宽裕的情况下,可以选择官方示例的模型进行下载

下载方式和 #4.1 一样,只不过这个模型比嵌入模型大了很多,等待时间比较久

五、初始化配置文件

此时 Qwen-1_8B-Chat 模型应该还在下载中,我们就并行操作,做不依赖大模型的事情

配置文件存放目录:Langchain-Chatchat -> configs
根目录 Langchain-Chatchat> 为执行的路径,后面的才是指令

$ Langchain-Chatchat> python copy_config_example.py

执行完毕后,configs 文件夹内多了一些 .py 的文件

在这里插入图片描述
这里就不一一例举文件的作用了,官方给了解答:点我进入配置文件详细介绍

六、初始化本地知识库

本地知识库必须要嵌入模型 bge-large-zh-v1.5 下载完毕才能操作,到这一步应该都下载完成了

6.1 model_config.py 配置

关于嵌入模型的配置,一共有两个地方需要修改

第一步: 非必须做(由于笔者显存有限,把嵌入模型的事情交给 CPU 做,减轻 GPU 压力)

# 把 auto 修改为 cpu
#EMBEDDING_DEVICE = "auto"
EMBEDDING_DEVICE = "cpu"

第二步: 必须做(配置嵌入模型存放的磁盘位置 #4.1 处存放的位置)

备注:这里只是列出改动的地方,而不是需要你删除多余的配置

MODEL_PATH = {
    "embed_model": {
    	# 这里配置 4.1 处存放的位置,我的位置是: E:\\LLMs\\bge-large-zh-v1.5\\
    	# 这里要注意,再 windows 里面用双反斜杠, \b 被视为转义符
    	"bge-large-zh-v1.5": "E:\\LLMs\\bge-large-zh-v1.5\\",
    }
}   

6.2 kb_config.py 配置(可选)

该文件主要是配置向量数据库,我使用的是默认的 faiss 数据库,所以对我而言,这个文件没有改动,新手不建议轻易改动这些
如果想使用其他的向量数据库,需要找到 requirements.txt 中对应的依赖下载后才能使用

6.3 初始化本地知识库到向量数据库内

注意执行命令的目录位置:项目根目录 Langchain-Chatchat> 为执行的路径,后面的才是指令

$ Langchain-Chatchat> python init_database.py --recreate-vs

现象描述:
Langchain-Chatchat -> knowledge_base -> samples -> content 内的所有内容向量化后保存到
Langchain-Chatchat -> knowledge_base -> samples -> vector_store -> bge-large-zh-v1.5 数据库内

这个过程也比较漫长,耐心等待即可

七、配置大模型 Qwen-1_8B-Chat

大模型配置需要改动两个文件:

7.1 model_config.py 配置

修改 Langchain-Chatchat 启动的大模型列表

# 1. 配置模型列表
# LLM_MODELS = ["chatglm3-6b", "zhipu-api", "openai-api"]
# 修改上面的内容,改成下这样
# 我有 openai 的 key,可以使用,如果读者没有,就去掉 "openai-api"
LLM_MODELS = ["Qwen-1_8B-Chat", "openai-api"]

# 2. 配置 openai(可选)
# 配置 openai,如果读者没有,则可以跳过这里
ONLINE_LLM_MODEL = {
    "openai-api": {
        "model_name": "gpt-4",
        "api_base_url": "https://api.openai.com/v1",
        "api_key": "sk-ofNUwgIXYXFvCENYEdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "openai_proxy": "",
    },
    ......
}

# 3. 配置大模型本地磁盘存放地址
MODEL_PATH = {
	# 忽略这里,只是给你参照,这里配置的是嵌入模型
	"embed_model": {
		......
	},
	# 这里才是配置大模型的地方
	"llm_model": {
		# 大模型存放地址,windows 要使用 \\ 分割
		"Qwen-1_8B-Chat": "E:\\LLMs\\Qwen-1_8B-Chat\\",
		......
	}
}	

7.2 server_config.py 配置

FSCHAT_MODEL_WORKERS = {
    "default": {
    	......
    }
    # 直接复制这块儿内容
    "Qwen-1_8B-Chat": {
        "device": "cuda",
    },
    ......
}

7.3 执行启动 Langchain-Chatchat 服务

注意执行命令的目录位置:项目根目录 Langchain-Chatchat> 为执行的路径,后面的才是指令

$ Langchain-Chatchat> python startup.py -a

八、成功或者失败

8.1 成功(没有经历坎坷的人生是不完整的)

成功后,界面如下,可以进行愉快的聊天了
界面
输出的日志如下:

Loading checkpoint shards:   0%|          | 0/2 [00:00<?, ?it/s]
Loading checkpoint shards:  50%|█████     | 1/2 [00:01<00:01,  1.45s/it]
Loading checkpoint shards: 100%|██████████| 2/2 [00:02<00:00,  1.18s/it]
Loading checkpoint shards: 100%|██████████| 2/2 [00:02<00:00,  1.22s/it]
2024-06-12 21:44:50 | ERROR | stderr | 
2024-06-12 21:44:52 | INFO | model_worker | Register to controller
2024-06-12 21:44:52 | DEBUG | urllib3.connectionpool | Starting new HTTP connection (1): 127.0.0.1:20001
2024-06-12 21:44:52 | DEBUG | urllib3.connectionpool | http://127.0.0.1:20001 "POST /register_worker HTTP/1.1" 200 4
2024-06-12 21:44:52 | DEBUG | asyncio | Using proactor: IocpProactor
2024-06-12 21:44:58,276 - proactor_events.py[line:623] - DEBUG: Using proactor: IocpProactor
INFO:     Started server process [20188]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:7861 (Press CTRL+C to quit)


==============================Langchain-Chatchat Configuration==============================
操作系统:Windows-10-10.0.22631-SP0.
python版本:3.9.9 (tags/v3.9.9:ccb0e6a, Nov 15 2021, 18:08:50) [MSC v.1929 64 bit (AMD64)]
项目版本:v0.2.10
langchain版本:0.0.354. fastchat版本:0.2.35


当前使用的分词器:ChineseRecursiveTextSplitter
当前启动的LLM模型:['Qwen-1_8B-Chat', 'openai-api'] @ cuda
{'device': 'cuda',
 'host': '127.0.0.1',
 'infer_turbo': False,
 'model_path': 'E:\\LLMs\\Qwen-1_8B-Chat',
 'model_path_exists': True,
 'port': 20002}
{"api_base_url": "https://api.openai.com/v1",
 "api_key": "sk-ofNUwgIXYXFvCENYEdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 'device': 'auto',
 'host': '127.0.0.1',
 'infer_turbo': False,
 'model_name': 'gpt-4',
 'online_api': True,
 'openai_proxy': '',
 'port': 20002}
当前Embbedings模型: bge-large-zh-v1.5 @ cpu


服务端运行信息:
    OpenAI API Server: http://127.0.0.1:20000/v1
    Chatchat  API  Server: http://127.0.0.1:7861
    Chatchat WEBUI Server: http://127.0.0.1:8501
==============================Langchain-Chatchat Configuration==============================



  You can now view your Streamlit app in your browser.

  URL: http://127.0.0.1:8501

8.2 失败(完整的人生)

8.2.1 Torch not compiled with CUDA enabled 错误

2024-06-12 21:53:34 | ERROR | stderr | Process model_worker - Qwen-1_8B-Chat:
2024-06-12 21:53:34 | ERROR | stderr | Traceback (most recent call last):
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\env\Python\Python39\lib\multiprocessing\process.py", line 315, in _bootstrap
2024-06-12 21:53:34 | ERROR | stderr |     self.run()
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\env\Python\Python39\lib\multiprocessing\process.py", line 108, in run
2024-06-12 21:53:34 | ERROR | stderr |     self._target(*self._args, **self._kwargs)
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\startup.py", line 391, in run_model_worker
2024-06-12 21:53:34 | ERROR | stderr |     app = create_model_worker_app(log_level=log_level, **kwargs)
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\startup.py", line 219, in create_model_worker_app
2024-06-12 21:53:34 | ERROR | stderr |     worker = ModelWorker(
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\fastchat\serve\model_worker.py", line 77, in __init__
2024-06-12 21:53:34 | ERROR | stderr |     self.model, self.tokenizer = load_model(
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\fastchat\model\model_adapter.py", line 277, in load_model
2024-06-12 21:53:34 | ERROR | stderr |     model, tokenizer = adapter.load_compress_model(
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\fastchat\model\model_adapter.py", line 111, in load_compress_model
2024-06-12 21:53:34 | ERROR | stderr |     return load_compress_model(
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\fastchat\model\compression.py", line 199, in load_compress_model
2024-06-12 21:53:34 | ERROR | stderr |     compressed_state_dict[name] = tmp_state_dict[name].to(
2024-06-12 21:53:34 | ERROR | stderr |   File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\torch\cuda\__init__.py", line 289, in _lazy_init
2024-06-12 21:53:34 | ERROR | stderr |     raise AssertionError("Torch not compiled with CUDA enabled")
2024-06-12 21:53:34 | ERROR | stderr | AssertionError: Torch not compiled with CUDA enabled

这是一个非常棘手的问题
错误原因是因为在配置文件 model_config.pyserver_config.py 中我们都选择大模型运行在 GPU 上,但是由于 windows 系统并没有给我们把显卡硬件资源调用给串起来,导致无法在显卡上执行模型的推理

点击我快速进入到解决教程内

8.2.2 输入一个很大的问题,无法完整返回,并且后端报错如下

提问内容:springboot 启动原理
在这里插入图片描述
图片中显然是没有回答完毕的,查看后端日志如下:

2024-06-12 22:04:58,969 - utils.py[line:38] - ERROR: object of type 'NoneType' has no len()
Traceback (most recent call last):
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\server\utils.py", line 36, in wrap_done
    await fn
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain\chains\base.py", line 385, in acall
    raise e
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain\chains\base.py", line 379, in acall
    await self._acall(inputs, run_manager=run_manager)
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain\chains\llm.py", line 275, in _acall
    response = await self.agenerate([inputs], run_manager=run_manager)
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain\chains\llm.py", line 142, in agenerate
    return await self.llm.agenerate_prompt(
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 554, in agenerate_prompt
    return await self.agenerate(
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 514, in agenerate
    raise exceptions[0]
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 617, in _agenerate_with_cache
    return await self._agenerate(
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain_community\chat_models\openai.py", line 525, in _agenerate
    return await agenerate_from_stream(stream_iter)
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 87, in agenerate_from_stream
    async for chunk in stream:
  File "D:\dev\wrkspaces\py_workspace\Langchain-Chatchat\.venv\lib\site-packages\langchain_community\chat_models\openai.py", line 496, in _astream
    if len(chunk["choices"]) == 0:
TypeError: object of type 'NoneType' has no len()
2024-06-12 22:04:58,994 - utils.py[line:40] - ERROR: TypeError: Caught exception: object of type 'NoneType' has no len()

这个问题更加离谱,我明明没有使用 openai 但是在 openai.py 文件内报错,进入到 .venv\lib\site-packages\langchain_community\chat_models\openai.py 文件报错的位置修改代码如下:

在这里插入图片描述
重新启动项目后,继续问相同的问题,观察最后一次输出的内容

============================================
ChatCompletionChunk(id=None, choices=None, created=None, model=None, object=None, system_fingerprint=None, text='**NETWORK ERROR DUE TO HIGH TRAFFIC. PLEASE REGENERATE OR REFRESH THIS PAGE.**\n\n(CUDA out of memory. Tried to allocate 2.00 MiB (GPU 0; 4.00 GiB total capacity; 3.49 GiB already allocated; 0 bytes free; 3.54 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF)', error_code=50002)
============================================

根据以上的信息中,描述了错误信息:
text=' **NETWORK ERROR DUE TO HIGH TRAFFIC. PLEASE REGENERATE OR REFRESH THIS PAGE.** \n\n(CUDA out of memory. Tried to allocate 2.00 MiB (GPU 0; 4.00 GiB total capacity; 3.49 GiB already allocated; 0 bytes free; 3.54 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF)
哦,原来是我的显存不足导致的

重启后,紧接着换了一些简单问题,回答还是没什么大问题的
在这里插入图片描述

九、总结

9.1 换一个好点的显卡,就不用这么折磨了

由于我的显卡显存只有 4G,导致出现奇怪的问题,排查这问题就用了很多时间,不过好在我有足够的耐心去解决问题,而不是放弃。发工资买个好显卡 ~~~

9.2 按着一步一步来,总结出思路

刚入门大模型,没有自己的方法论,一路上踩了不少的坑,通过本文也算是将自己的遭遇记录了一次,方便自己以后看也提供给广大入门的同胞避坑

9.3 试试将大模型跑在 CPU

后续抽空试试将 Qwen-1_8B-Chat 跑在 CPU 上试试,目前还没试过,不知道能不能行

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

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

相关文章

算法第六天:力扣第977题有序数组的平方

一、977.有序数组的平方的链接与题目描述 977. 有序数组的平方的链接如下所示&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 输入对话框QInputDialog 文章编号&#xff1a;…

vue3+electron搭建桌面软件

vue3electron开发桌面软件 最近有个小项目, 客户希望像打开 网易云音乐 那么简单的运行起来系统. 前端用 Vue 会比较快一些, 因此决定使用 electron 结合 Vue3 的方式来完成该项目. 然而, 在实施过程中发现没有完整的博客能够记录从创建到打包的流程, 摸索一番之后, 随即梳理…

图的遍历介绍

概念 特点 无论是进行哪种遍历&#xff0c;均需要通过设置辅助数组标记顶点是否被访问来避免重复访问&#xff01;&#xff01;&#xff01;&#xff01; 类型 深度优先遍历 可以实现一次遍历访问一个连通图中的所有顶点&#xff0c;只要连通就能继续向下访问。 因此&#x…

getDay 与 getUTCDay 本质区别

背景 我在做这个实验的时候是北京时间&#xff1a;2024年6月12日 下午16&#xff1a;32分许 研究方向 本文探讨 getDay 与 getUTCDay 本质区别 测试用例 如果你现在的时区设置的是 &#xff08;UTC08:00&#xff09; 北京&#xff0c;重庆&#xff0c;香港特别行政区&#x…

二刷算法训练营Day29 | 回溯算法(5/6)

目录 详细布置&#xff1a; 1. 491. 非递减子序列 2. 46. 全排列 3. 47. 全排列 II 详细布置&#xff1a; 1. 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序…

智能盒子如何检测进气压力传感器?

进气压力传感器是一种用于测量发动机进气系统中压力的传感器。安装在发动机的进气管路或进气歧管上&#xff0c;用于监测进气压力的变化。进气压力传感器的作用是将测量到的压力信号转换为电信号&#xff0c;以便发动机控制单元(ECU)可以根据压力变化来调整燃油喷射量、点火时机…

[ue5]建模场景学习笔记(6)——必修内容可交互的地形,交互沙(4)

1.需求分析&#xff1a; 现在我们已经有了可以在世界内近于无限的跑动痕迹&#xff0c;现在需要对痕迹进行细化&#xff0c;包括例如当人物跳起时便不再绘制痕迹&#xff0c;以及痕迹应该存在深浅&#xff0c;应该由两只脚分别绘制&#xff0c;同时也应该对地面材质进行进一步处…

优质短视频素材下载网站有哪些?分享优质短视频素材下载资源

在抖音等短视频平台上取得成功的关键之一是制作出具有视觉吸引力的内容。好的素材可以极大地提升视频的质量和观看体验&#xff0c;吸引更多观众。为了帮助抖音视频制作者找到优质的素材&#xff0c;这里详细介绍几个提供高清视频素材的下载网站。 蛙学府&#xff1a; 蛙学府是…

----几种接口的使用---

Compareable接口 对于给数组中的变量成员排序&#xff0c;我们能想到用sort&#xff0c;根据成员之间的大小进行排序&#xff0c;那么如果数组中的成员是对象的话&#xff0c;单单只是用sort去排序肯定是步成功的&#xff0c;因为并不知道要根据什么去排序&#xff0c; 这时要…

RNA-seq上下游分析snakemake流程

学习完snakemake后写的第一个流程是RNA-seq上游定量和下游的质控和差异分析。 使用fastp处理fastq文件&#xff0c;在使用START比对到基因组同时得到raw count&#xff0c;使用非冗余外显子长度作为基因的长度计算FPKM、TPM&#xff0c;同时也生成了CPM的结果。 非冗余外显子…

6.nginx负载均衡

说明 增加服务器的数量,将请求分发到各个服务器上。 将原来请求集中到单个服务器上的情况改为将请求分发到多个服务器上。 案例 浏览器请求地址http://ip/edu/a.html, 负载均衡的效果,平分到8080和8081两台服务上中。 准备工作 tomcat8080配置 tomcat8081配置 直接通过…

服务器通的远程桌面连接不上,服务器通的远程桌面连接不上解决方法

当面临服务器远程桌面连接不上的问题时&#xff0c;专业的处理方式需要遵循一系列步骤来确保问题得到准确且高效的解决。以下是一些建议的解决方法&#xff1a; 一、初步排查与诊断 1. 检查网络连接&#xff1a; - 确保本地计算机与服务器之间的网络连接是稳定的。 - 尝…

上岸北科大计算机专业难度有多大?北京科技大学计算机考研考情分析!

北京科技大学计算机与通信工程学院源于1973年成立的计算机及应用专业&#xff0c;经过近40年的建设&#xff0c;学院在学科建设、科学研究水平和教育教学质量上实现了跨越式的发展与大力提升。学院目前设有计算机科学与技术系、软件工程系、通信工程系、物联网与电子工程系、信…

算法专题总结链接地址

刷力扣的时候会遇到一些总结类型的题解&#xff0c;在此记录&#xff0c;方便自己以后找 前缀和 前缀和https://leetcode.cn/problems/unique-substrings-in-wraparound-string/solutions/432752/xi-fa-dai-ni-xue-suan-fa-yi-ci-gao-ding-qian-zhui-/ 单调栈 单调栈https:…

python代码生成mac地址流水号工具

因为公司需要生成mac地址流水号&#xff0c;网上写的工具是用字符串拼接的方式&#xff0c;需要考虑很多情况会有遇到0缺位等问题&#xff0c;其实python本身支持大数字计算&#xff0c;所以只需要把用户输入的地址转换成int&#xff0c;直接for循环里面自增输出即可&#xff0…

【微信小程序】开发环境配置

目录 小程序的标准开发模式&#xff1a; 注册小程序的开发账号 安装开发者工具 下载 设置外观和代理 第一个小程序 -- 创建小程序项目 查看项目效果 第一种&#xff1a;在模拟器上查看项目效果 项目的基本组成结构 小程序代码的构成 app.json文件 project.config…

12.【Orangepi Zero2】基于orangepi_Zero_2 Linux的智能家居项目

基于orangPi Zero 2的智能家居项目 需求及项目准备 语音接入控制各类家电&#xff0c;如客厅灯、卧室灯、风扇回顾二阶段的Socket编程&#xff0c;实现Sockect发送指令远程控制各类家电烟雾警报监测&#xff0c; 实时检查是否存在煤气泄漏或者火灾警情&#xff0c;当存在警情时…

5.在Nginx中管理目录并允许浏览器中浏览和下载目录的文件

nginx.conf文件配置 charset utf-8; 防止文件名称为乱码。 autoindex on; 开启目录列表展示。 root /usr/local/software; 文件管理目录&#xff0c;浏览器浏览文件所在目录。

【C++进阶】RBTree封装map与set

1.红黑树的迭代器 1.1 begin() begin()就是红黑树的开头&#xff0c;那么对于红黑树来说按照中序序列是该树的最左节点。 Iterator Begin(){Node* leftMin _root;while (leftMin->_left){leftMin leftMin->_left;}return Iterator(leftMin);} 1.2 end() begin()就是…