【ChatGLM2-6B】Docker下部署及微调
【ChatGLM2-6B】小白入门及Docker下部署
- 一、简介
- 1、ChatGLM2是什么
- 2、组成部分
- 3、相关地址
- 二、基于Docker安装部署
- 1、前提
- 2、CentOS7安装NVIDIA显卡驱动
- 1)查看服务器版本及显卡信息
- 2)相关依赖安装
- 3)显卡驱动安装
- 2、 CentOS7安装NVIDIA-Docker
- 1)相关环境准备
- 2)开始安装
- 3)验证&使用
- 3、 Docker部署ChatGLM2
- 1)下载对应代码包和模型包
- 2)上传至服务器并进行解压
- 3)下载镜像并启动容器
- 4)等待启动并访问页面
- 5)注意事项
- 三、开发环境搭建
- 1) 代码远程编辑配置
- 2) 一些基本的说明
- 四、使用
- 1、启动命令
- 2、接口调用方式
- 2、模型微调
- 1) 先安装依赖
- 2) 进行微调
- 3) 报错问题解决
- 4)微调完成
- 3、微调效果评估
- 1)修改evaluate.sh脚本
- 2)执行评估
- 3)评估结果
- 4、部署新模型
- 1)修改web_demo.sh文件
一、简介
1、ChatGLM2是什么
- 一个类似于ChatGPT的智能文本对话模型,支持页面方式进行对话(ChatGLM3已经支持图片分析和生成,这里由于研究仅限于文本,因此选择GLM2)
- 支持训练与微调
- 代码开源
2、组成部分
- 模型:基本的模型矩阵,重量级的参数,大约十几个G,可以理解为是程序的初始化参数配置信息
-
代码:加载模型的py代码,ChatGLM2已经封装好了多种加载和对话的方式,支持窗口对话、WEB页面对话、Socket对话、HTTP接口对话等方式。
3、相关地址
- GitHub地址: https://github.com/THUDM/ChatGLM2-6B
- 国内模型下载地址:https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/?p=%2F&mode=list
- 代码下载地址:https://github.com/THUDM/ChatGLM-6B
- docker下部署文档:https://www.luckzym.com/tags/ChatGLM-6B/
- windows下部署文档:https://github.com/ZhangErling/ChatGLM-6B/blob/main/deployment_windows.md
- 官方推荐指导手册:https://www.heywhale.com/mw/project/6436d82948f7da1fee2be59e
二、基于Docker安装部署
1、前提
安装了docker
16G以上显卡
2、CentOS7安装NVIDIA显卡驱动
-
先查看显卡是否已经安装,没有安装再进行安装,已安装就跳过此步
nvidia-smi # 如下图是已安装
如果没有相关信息,再进行显卡的安装。
1)查看服务器版本及显卡信息
# Linux查看显卡信息:(ps:若找不到lspci命令,可以安装 yum install pciutils)
lspci | grep -i vga# 使用nvidia GPU可以:
lspci | grep -i nvidia# 查看显卡驱动
cat /proc/driver/nvidia/version
- 系统:CentOS7 Linux
- 显卡:iGame GeForce RTX 3070 Ti Advanced OC 8G
2)相关依赖安装
- 安装依赖环境
yum install kernel-devel gcc -y
- 检查内核版本和源码版本,保证一致
ls /boot | grep vmlinu
rpm -aq | grep kernel-devel
- 屏蔽系统自带的
Nouveau
# 查看命令:
lsmod | grep nouveau
# 修改dist-blacklist.conf文件:
vim /lib/modprobe.d/dist-blacklist.conf
# 将nvidiafb注释掉:
blacklist nvidiafb # 然后添加以下语句:
blacklist nouveau
options nouveau modeset=0
可以在屏蔽之后重启系统并在命令行中输入lsmod | grep nouveau
查看命令观察是否已经将其屏蔽。
- 重建
Initramfs Image
步骤
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut /boot/initramfs-$(uname -r).img $(uname -r)
- 修改运行级别为文本模式
systemctl set-default multi-user.target
- 重新启动
reboot
3)显卡驱动安装
- 去到NVIDIA官网下载对应的显卡驱动
网址:https://www.nvidia.cn/Download/index.aspx?lang=cn
点击搜索即可弹出对应的下载软件包
- 开始安装其软件包
chmod +x NVIDIA-Linux-x86_64-525.105.17.run
./NVIDIA-Linux-x86_64-525.105.17.run
- 验证是否安装成功
nvidia-smi
到此CentOS7已完成NVIDIA
显卡驱动的安装
2、 CentOS7安装NVIDIA-Docker
1)相关环境准备
在开始之前我们需要确保已经安装好了Docker
的环境,并且也安装了Docker Compose
。
需要注意的是,因为
NVIDIA-Docker
软件的存在,我们不需要在宿主机上安装CUDA工具包,这样我们可以根据不同的需要选择合适的版本。
NVIDIA
容器工具包对应的Github
代码仓库地址:https://github.com/NVIDIA/nvidia-docker
2)开始安装
# 获得当前操作系统的发行版和版本,以便下载适用于NVIDIA Docker Toolkit的正确仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)# 下载NVIDIA Docker Toolkit仓库,并将其保存为文件到/etc/yum.repos.d/目录中,使得包管理器够定位并安装工具包
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo# 使用yum安装nvidia-container-toolkit软件包
sudo yum install -y nvidia-container-toolkit# 重新启动Docker守护程序,以便它识别通过安装NVIDIA Docker Toolkit进行的新配置更改
sudo systemctl restart docker
3)验证&使用
# 在现有的GPU上启动启用GPU的容器,并运行nvidia-smi命令
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi# 在两个GPU上启动启用GPU的容器,并运行nvidia-smi命令
docker run --gpus 2 nvidia/cuda:10.0-base nvidia-smi# 在特定的GPU上启动启用GPU的容器,并运行nvidia-smi命令
docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smidocker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi# 这个命令演示了如何为容器指定能力(图形、计算等)
# 请注意,这种方式很少使用
docker run --gpus all,capabilities=utility nvidia/cuda:10.0-base nvidia-smi
3、 Docker部署ChatGLM2
1)下载对应代码包和模型包
链接:https://pan.baidu.com/s/1RhoYQ6wL5eJM8Qd0K4BYAg?pwd=zws4
提取码:zws4
2)上传至服务器并进行解压
解压完成后的目录如下
3)下载镜像并启动容器
注意:在线环境直接使用以下代码启动即可,离线环境需要先手动下载和加载woshikid/chatglm2-6b镜像,然后在使用docker进行启动
docker run --gpus all --runtime=nvidia \
-p 7860:7860 \
-p 8000:8000 \
-p 8501:8501 \
-p 80:80 \
-v ./ChatGLM2-6B:/ChatGLM2-6B \
-v ./model/chatglm2-6b:/chatglm2-6b \
--name chatglm2-webdemo \
-dit woshikid/chatglm2-6b \
python web_demo.py
其中,-p表示端口映射,物理机的7860端口会映射容器的7860端口,这个端口是web页面的端口
-v后跟的参数表示将物理机上的对应目录映射进入docker容器中
以下是启动的不同的访问方式和端口信息:
woshikid/chatglm2-6b python cli_demo.py
-p 8000:8000 woshikid/chatglm2-6b python api.py
-p 8000:8000 woshikid/chatglm2-6b python openai_api.py
-p 7860:7860 woshikid/chatglm2-6b python web_demo.py
-p 8501:8501 woshikid/chatglm2-6b streamlit run web_demo2.py
4)等待启动并访问页面
http://ip:7860即可进入对话页面
5)注意事项
通过nvidia-smi命令可以查看显卡使用情况
另外,如果是自己从github上下载的官方代码,需要修改下web_demo.py代码允许远程访问,否则默认会只允许本机访问。
三、开发环境搭建
1) 代码远程编辑配置
通常,本地的代码开发机器性能不足以支持ChatGLM2-6B的运行,但是在服务器上去编辑代码又十分的不方便,因此使用一种可以远程开发的方法来进行开发。下面是对这种方法的步骤介绍:
各种开发工具基本上都有这种功能,这里以Idea或者PyCharm开发工具来说明,其原理是本地开发后,利用SFTP将代码推送到远程服务器来进行对应的调试。
1)首先打开IDEA或PyCharm开发工具,打开我们的代码。
2)打开开发环境配置。
3)新建一个SFTP配置,并在Connection中填写服务器连接配置信息。
4)点击Mappings,将本地的代码地址和服务器上的代码地址做映射,这里服务器上的代码地址是我们ChatGLM-6B的地址,用于映射到容器内部,然后点击确认。
5)代码推送。
6)这样,就可以实现本地编写代码,推送到远程进行调试了,十分的便捷。
报错的信息不用管,因为本地没有环境,所以只能当编辑器使用。
2) 一些基本的说明
四、使用
请先学习一篇文章,以了解什么是微调以及如何进行微调:https://zhuanlan.zhihu.com/p/641047705?utm_id=0
1、启动命令
基础镜像:woshikid/chatglm2-6b
docker run --gpus all --runtime=nvidia \
-p 7860:7860 \
-p 8000:8000 \
-p 8501:8501 \
-p 80:80 \
-v ./ChatGLM2-6B:/ChatGLM2-6B \
-v ./model/chatglm2-6b:/chatglm2-6b \
--name chatglm2-6b \
-dit woshikid/chatglm2-6b \
python web_demo.py
以下是启动的不同的访问方式和端口信息:
woshikid/chatglm2-6b python cli_demo.py
-p 8000:8000 woshikid/chatglm2-6b python api.pyW
-p 8000:8000 woshikid/chatglm2-6b python openai_api.py
-p 7860:7860 woshikid/chatglm2-6b python web_demo.py
-p 8501:8501 woshikid/chatglm2-6b streamlit run web_demo2.py
vim web_demo.py
2、接口调用方式
curl -X POST "http://127.0.0.1:8000" \-H 'Content-Type: application/json' \-d '{"prompt": "你好", "history": []}'
回复的内容:
{"response":"你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。","history":[["你好","你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]],"status":200,"time":"2023-03-23 21:38:40"
}
2、模型微调
微调参数文件为.json文件,先将你的微调数据和验证数据处理成如下格式:
{"content": "类型#裤*版型#宽松*风格#性感*图案#线条*裤型#阔腿裤", "summary": "宽松的阔腿裤这两年真的吸粉不少,明星时尚达人的心头爱。毕竟好穿时尚,谁都能穿出腿长2米的效果宽松的裤腿,当然是遮肉小能手啊。上身随性自然不拘束,面料亲肤舒适贴身体验感棒棒哒。系带部分增加设计看点,还让单品的设计感更强。腿部线条若隐若现的,性感撩人。颜色敲温柔的,与裤子本身所呈现的风格有点反差萌。"}
{"content": "类型#裙*风格#简约*图案#条纹*图案#线条*图案#撞色*裙型#鱼尾裙*裙袖长#无袖", "summary": "圆形领口修饰脖颈线条,适合各种脸型,耐看有气质。无袖设计,尤显清凉,简约横条纹装饰,使得整身人鱼造型更为生动立体。加之撞色的鱼尾下摆,深邃富有诗意。收腰包臀,修饰女性身体曲线,结合别出心裁的鱼尾裙摆设计,勾勒出自然流畅的身体轮廓,展现了婀娜多姿的迷人姿态。"}
{"content": "类型#上衣*版型#宽松*颜色#粉红色*图案#字母*图案#文字*图案#线条*衣样式#卫衣*衣款式#不规则", "summary": "宽松的卫衣版型包裹着整个身材,宽大的衣身与身材形成鲜明的对比描绘出纤瘦的身形。下摆与袖口的不规则剪裁设计,彰显出时尚前卫的形态。被剪裁过的样式呈现出布条状自然地垂坠下来,别具有一番设计感。线条分明的字母样式有着花式的外观,棱角分明加上具有少女元气的枣红色十分有年轻活力感。粉红色的衣身把肌肤衬托得很白嫩又健康。"}
{"content": "类型#裙*版型#宽松*材质#雪纺*风格#清新*裙型#a字*裙长#连衣裙", "summary": "踩着轻盈的步伐享受在午后的和煦风中,让放松与惬意感为你免去一身的压力与束缚,仿佛要将灵魂也寄托在随风摇曳的雪纺连衣裙上,吐露出<UNK>微妙而又浪漫的清新之意。宽松的a字版型除了能够带来足够的空间,也能以上窄下宽的方式强化立体层次,携带出自然优雅的曼妙体验。"}
其中content是向模型输入的内容,summary为模型应该输出的内容。
其中微调数据是通过本批数据对模型进行调试(文件是train.json),验证数据是通过这些数据验证调试的结果(文件是dev.json)。
1) 先安装依赖
pip install rouge_chinese -i https://pypi.douban.com/simple/
pip install nltk -i https://pypi.douban.com/simple/
pip install datasets -i https://pypi.douban.com/simple/
pip install jieba -i https://pypi.douban.com/simple/
pip install transformers -i https://pypi.douban.com/simple/
train.sh:微调
evaluate.sh: 调试结果评估
2) 进行微调
微调参数如下:
PRE_SEQ_LEN=128
LR=2e-2
NUM_GPUS=1torchrun --standalone --nnodes=1 --nproc-per-node=$NUM_GPUS main.py \--do_train \--train_file /chatglm2-6b/train.json \--validation_file /chatglm2-6b/dev.json \--preprocessing_num_workers 10 \--prompt_column content \--response_column summary \--overwrite_cache \--model_name_or_path /chatglm2-6b \--output_dir output/adgen-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \--overwrite_output_dir \--max_source_length 512 \--max_target_length 64 \--per_device_train_batch_size 1 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 16 \--predict_with_generate \--max_steps 3000 \--logging_steps 10 \--save_steps 1000 \--learning_rate $LR \--pre_seq_len $PRE_SEQ_LEN \
修改 train.sh
和 evaluate.sh
中的 train_file
、validation_file
和test_file
为你自己的 JSON 格式数据集路径,并将 prompt_column
和 response_column
改为 JSON 文件中输入文本和输出文本对应的 KEY。可能还需要增大 max_source_length
和 max_target_length
来匹配你自己的数据集中的最大输入输出长度。并将模型路径 THUDM/chatglm-6b
改为你本地的模型路径。 其中的LR=2e-2表示的是调整的权重,2e-2表示0.0002,可以适当降低,让模型也可以回答其他问题。
3) 报错问题解决
-
出现了$‘\r’: command not found错误
可能因为该Shell脚本是在Windows系统编写时,每行结尾是\r\n
而在Linux系统中行每行结尾是\n
在Linux系统中运行脚本时,会认为\r是一个字符,导致运行错误使用dos2unix 转换一下就可以了
dos2unix <文件名># dos2unix: converting file one-more.sh to Unix format ...
-bash: dos2unix: command not found
就是还没安装,安装一下就可以了
apt install dos2unix
-
报错RuntimeError: Library cudart is not initialized
可以把 --quantization_bit 4 去掉试试!!!
4)微调完成
3、微调效果评估
1)修改evaluate.sh脚本
2)执行评估
bash evaluate.sh
3)评估结果
微调评估的文件位于./output/adgen-chatglm2-6b-pt-128-2e-2/generated_predictions.txt
其中,labels 是 dev.json 中的预测输出,predict 是 ChatGLM-6B 生成的结果
4、部署新模型
1)修改web_demo.sh文件
设置端口及允许远程访问
相关文章:

【ChatGLM2-6B】Docker下部署及微调
【ChatGLM2-6B】小白入门及Docker下部署 一、简介1、ChatGLM2是什么2、组成部分3、相关地址 二、基于Docker安装部署1、前提2、CentOS7安装NVIDIA显卡驱动1)查看服务器版本及显卡信息2)相关依赖安装3)显卡驱动安装 2、 CentOS7安装NVIDIA-Doc…...
输入两个整数,输出它们的乘积。 ← Python 及 C++ 代码比较
【题目描述】 输入两个整数,输出它们的乘积。【Python代码】 x,ymap(int,input().split()) print(x*y) 【C代码】 #include<bits/stdc.h> using namespace std;int x,y; int main() {cin>>x>>y;cout<<x*y<<endl;return 0; }/* in:…...

C语言——从键盘输人一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year 0;printf("请输入年份:");scanf("%d",&year);if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d是闰年\n",year);}else{p…...

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法
如果你是公众人物、企业或拥有个人品牌的人,那么拥有在线形象很重要。然而,你可能会发现,通过谷歌搜索,陌生人可以获得你的个人信息,如联系方式、地址和财务信息,这会让你感到不安。 幸运的是,…...

【同一局域网下】两台电脑之间互ping
两台电脑互ping 首先需要连接同一网咯关闭需要ping的电脑的防火墙 关闭防火墙步骤(以win11系统为例): 设置 --> 隐私和安全性 --> Windows 安全中心 打开Windows安全中心 防火墙和网络保护 --> 选择正在使用的网络 关闭 ping其他…...

【精选】Ajax技术知识点合集
Ajax技术详解 Ajax简介 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建 交互式、快速动态应用的网页开发技术,无需重新加载整个网页的情况下,能够更新页面局 部数据的技术。通过在…...

智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水循环算法4.实验参数设定5.算法结果6.参考文献7.…...
java-netty知识点笔记和注意事项
如何获取ctx的id 使用ctx.ctx.toString()就可以了 public void channelRead(ChannelHandlerContext ctx, Object msg) {//传来的消息包装成字节缓冲区String byteBuf (String) msg; // ByteBuf byteBuf (ByteBuf) msg;//Netty提供了字节缓冲区的toString方法ÿ…...
英伟达不同系列GPU介绍
英伟达有以下几个系列的产品线,并介绍它们的特点和主要应用领域: 1. GeForce系列(G系列): - 特点:GeForce系列是英伟达主打的消费级GPU产品线,注重提供高性能的图形处理能力和游戏特性。它们…...

C语言——I /深入理解指针(二)
一、数组名的理解 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且 是数组⾸元素的地址,我们来做个测试。 #include <stdio.…...

MySQL使用函数和存储过程实现:向数据表快速插入大量测试数据
实现过程 1.创建表 CREATE TABLE user_info (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,phone_number VARCHAR(11) DEFAULT NULL,email VARCHAR(255) DEFAULT NULL,address VARCHAR(255) DEF…...
力扣labuladong——一刷day59
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣549. 二叉树中最长的连续序列二、力扣1325. 删除给定值的叶子节点 前言 像求和、求高度这种基本的二叉树函数很容易写,有时候只要在它们的后…...

接口性能测试 —— Jmeter并发与持续性压测
接口压测的方式: 1、同时并发:设置线程组、执行时间、循环次数,这种方式可以控制接口请求的次数 2、持续压测:设置线程组、循环次数,勾选“永远”,调度器(持续时间),这种…...

redis报错3
INFO: Initializing SpringDispatcherServletdispatcherServlet...

Proteus的网络标号与总线
Proteus为了减少过多、复杂的连线,可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号,意味着在Proteus上相同的网络标号是连在一起的,所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…...

4、stable diffusion
github 安装anaconda环境 conda env create -f environment.yaml conda activate ldm安装依赖 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch pip install transformers4.19.2 diffusers invisible-watermark pip install -e…...
LeetCode51. N-Queens
文章目录 一、题目二、题解 一、题目 The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. You may return the answe…...

前端vue3——html2canvas给网站截图生成宣传海报
文章目录 ⭐前言⭐选择html2canvas实现网页截图💖 截图 ⭐图片url截图显示不出来问题💖 解决 ⭐最终效果💖 定义海报 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端vue3——html2canvas给网站截图生成宣传…...
C语言实现串的部分算法
一、简介 串(string)(或字符串)是由零个或多个字符组成的有序序列,一般记为 sa1a2....an s为串的名,用单引号括起来的时字符序列串的值,串中字符的数目n称为串的长度。 零个字符的串称为空串…...

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)
文章目录 1.实现目标2.实现过程2.1 数据与预处理2.2 GeoJson解析2.3 Mesh构建与属性存储2.4 核心代码2.5 材质2.6 蓝图应用测试3.参考资料1.实现目标 在之前的文章中,基于GeoJson数据加载,实现了绘制单面功能,但只支持单个要素Feature。本文这里实现对Geojson内所有面要素的…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...