Lidar AI Solution环境配置

news2024/11/19 6:31:46

目录

  • Lidar AI Solution环境配置
    • 前言
    • 1. Lidar AI Solution
      • 1.1 Pipeline overview
      • 1.2 GetStart
    • 2. CUDA-BEVFusion
      • 2.1 3D目标检测(nuScenes验证集)
      • 2.2 演示
      • 2.3 模型和数据
      • 2.4 前置条件
      • 2.5 快速开始推理
        • 2.5.1 下载模型和数据到CUDA-BEVFusion文件夹
        • 2.5.2 配置environment.sh
        • 2.5.3 编译运行
      • 2.6 可能遇到的问题
        • 2.6.1 问题1:/usr/bin/ld:cannot find -lspconv
        • 2.6.2 问题2:/libspconv.so:file format not recognized
    • 3. CUDA-CenterPoint
      • 3.1 模型和数据
      • 3.2 前置条件
      • 3.3 环境
      • 3.4 编译运行
    • 4. CUDA-PointPillars
      • 4.1 模型和数据
      • 4.2 前置条件
      • 4.3 环境
      • 4.4 编译运行
    • 结语
    • 下载链接
    • 参考

Lidar AI Solution环境配置

前言

开源项目 Lidar AI Solution 的环境配置,记录自己环境配置过程,仅供自己参考,只进行最最最基本的运行,不涉及任何原理分析(主要是不会😂)

博主环境如下:

系统:Ubuntu20.04

显卡:RTX3060

显卡驱动:510.108.03

CUDA:11.6

cuDNN:8.4.0

TensorRT:8.4.1

整个环境配置的重点和难点在于整个项目的完整拉取

以下内容均 Copy 自 Lidar AI Solutin 的 README 文档,请大家熟读熟读熟读文档

1. Lidar AI Solution

Lidar AI Solution 项目为自动驾驶 3D-Lidar 提供了一个高性能的解决方案🚀🚀🚀,在加速 sparse convolution/CenterPoint/BEVFusion/OSD/Conversion 方面做得非常好

在这里插入图片描述

图1-1 title

1.1 Pipeline overview

在这里插入图片描述

图1-2 pipeline.png

1.2 GetStart

sudo apt-get install git-lfs
git clone --recursive https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution
cd Lidar_AI_Solution

一定一定一定要按照上述方法完整拉取整个项目(PS:完整项目在 Linux 下大概有 365M 的大小),不要去直接点击 Code ==> DownZIP 下载,也不要直接 git clone 下载,因为该项目依赖于其他项目,因此加上 --recursive 指令是为了循环克隆子项目。

注意:项目的完整拉取非常非常非常重要,后续的问题基本上都是因为没有完整的拉取整个项目所导致的

接下来我们就来聊聊如何完整的拉取整个 repo

首先如果在 Linux 下执行上述指令你会发现由于访问的是外网会非常缓慢,当然你如果有一个好的代理应该是没有问题的,博主之前下了一晚上才下完,但是由于网络经常断开,因此也不能确保整个项目是否完整。当然网上也提供了一些快速高效下载方法,博主也没去折腾了,感兴趣的可以看看 git clone --recursive快速高效下载方法

由于在 Linux 上没有找到合适的代理,也不愿去折腾高速下载方法,因此博主决定在 Windows 下去拉取整个 repo (主要是因为 Windows 下有代理🤣)

在此之前你需要在 Windows 下面安装 git 和 git lfs,比较简单,这里提供博主主要参考的文章:

  • git 安装:Windows系统Git安装教程
  • git 下载地址:https://git-scm.com/downloads
  • git lfs 安装:Windows安装Git LFS
  • git lfs 下载地址:https://github.com/git-lfs/git-lfs/releases/tag/v3.3.0

将 git 和 git lfs 安装完成后,就可以在 cmd 窗口正常执行 git 指令了,指令如下:(PS:一定要记得开代理)

sudo apt-get install git-lfs
git clone --recursive https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution

完整的项目拉取如下图所示:

在这里插入图片描述

图1-3 LiDAR-AI-Solution完整项目拉取

下载完成以后把整个项目拷贝到 Linux 进行后续操作就行,值得注意的是,从 Windows 拉取的代码放在 Linux 下会有一个小小的 bug,这个我们之后也会提到。

这里博主也提供下博主自己拉取的整个 repo,感兴趣的可以自行下载,下载链接 Baidu Drive (注意该代码下载于 2023/5/25 日,若有改动请参考最新)

至此,整个项目文件就准备好了,对于每个任务可以查看对应子文件夹下的 README 文档

2. CUDA-BEVFusion

Copy 自 CUDA-BEVFusion 的 README.md 文档

这个 repo 包含使用 CUDA & TensorRT 进行 BEVFusion 推理的源码和模型

在这里插入图片描述

图2-1 cuda-bevfusion推理

2.1 3D目标检测(nuScenes验证集)

  • 对于所有模型,我们使用 BEVFusion-Base 配置
    • 相机分辨率为 256x701
  • 对于相机的 backbone 我们选择 SwinTiny 和 ResNet50
ModelFrameworkPrecisionmAPNDSFPS
Swin-Tiny
BEVFusion-Base
PytorchFP32+FP1668.5271.388.4(on RTX3090)
ResNet50PytorchFP32+FP1667.9370.97-
ResNet50TensorRTFP1667.8970.9818(on ORIN)
ResNet50-PTQTensorRTFP16+INT867.6670.8125(on ORIN)
  • 注:我们在 ORIN 测试的时间是基于 nuScenes 6019 验证集样本的平均值
    • 因此激光雷达点的数量是影响 FPS 的主要原因
    • 请参考 3DSparseConvolution 的 README 查看更多细节

2.2 演示

在这里插入图片描述

图2-2 cuda-bevfusion演示

2.3 模型和数据

  • 为了快速体验,我们提供了 nuScenes 的样例数据,你可以从 Baidu Drive 下载,它包含如下内容:
    • 6 视角的相机图像
    • camera/lidar/ego 的转换矩阵
    • 用于 bevfusion-pytorch 数据的 example-data.pth,允许导出 onnx 不用依赖于完整的数据集
  • 所有的模型都可以从 Baidu Drive 下载,它包含如下内容:
    • swin-tiny onnx models
    • resnet50 onnx 和对应的 pytorch models
    • resnet50 int8 onnx 和对应的 PTQ models

2.4 前置条件

为了构建 bevfusion,我们需要以依赖以下库:

  • CUDA >= 11.0
  • CUDNN >= 8.2
  • TensorRT >= 8.5.0
  • libprotobuf-dev == 3.6.1
  • Compute Capability >= sm_80
  • Python >= 3.6

上面性能表中的数据是我们在 Nvidia Orin 平台上,使用 TensorRT-8.6、cuda-11.4 以及 cudnn8.6 得到的

关于 CUDA、CUDNN、TensorRT 的安装可以参考 Ubuntu20.04部署YOLOv5 或者 Ubuntu20.04软件安装大全 这里不再赘述

你可能会发现博主的 TensorRT 版本似乎并不满足要求,是的,但博主没去安装高版本的 TensorRT,先将就用吧,后续推理也就提示了一个 API 的警告,并没有太大的错误。软件版本不要求完全一致,但是需要尽可能的对应

2.5 快速开始推理

:在安装完 apt install git-lfs 以后请使用 git clone --recursive 来拉取整个项目,确保依赖的完整性

2.5.1 下载模型和数据到CUDA-BEVFusion文件夹

  • 从 Baidu Drive 下载 model.zip
  • 从 Baidu Drive 下载 nuScenes-example-data.zip
# 下载模型和数据到 CUDA-BEVFusion 文件夹
cd CUDA-BEVFusion

# 解压模型和数据压缩文件
unzip model.zip
unzip nuScenes-example-data.zip

# 下面是解压后整个文件夹的结构
CUDA-BEVFusion
|-- example-data
    |-- 0-FRONT.jpg
    |-- 1-FRONT_RIGHT.jpg
    |-- ...
    |-- camera_intrinsics.tensor
    |-- ...
    |-- example-data.pth
    `-- points.tensor
|-- src
|-- qat
|-- model
    |-- resnet50int8
    |   |-- bevfusion_ptq.pth
    |   |-- camera.backbone.onnx
    |   |-- camera.vtransform.onnx
    |   |-- default.yaml
    |   |-- fuser.onnx
    |   |-- head.bbox.onnx
    |   `-- lidar.backbone.xyz.onnx
    |-- resnet50
    `-- swint
|-- bevfusion
`-- tool

2.5.2 配置environment.sh

好,在正式配置之前我们需要解决一个小bug,也就是之前提到过的,当你在 Windows 下面拉取代码放到 Linux 上面时会导致执行 shell 脚本时报错,如下图所示:

在这里插入图片描述

图2-3 执行shell脚本出错

原因是 Windows 和 Linux 的 .sh 脚本文件格式不同,如果在脚本中有空行,脚本是在 Windows 下进行编辑之后传到 Linux 上去执行的话,就会出现这个问题

Windows 下的换行符是\r\n,而 Linux 下的换行符是 \n,没有识别/r,所以会导致上述错误,这个属于脚本编码的问题

解决办法是在对应脚本文件目录下,执行以下命令即可

vim enviroment.sh
:set ff=unix
:wq

上述通过 vim 编辑器打开脚本文件后设置格式为 Linux 格式并保存退出

参考自 Linux下执行Shell脚本出现$‘\r‘: command not found解决方法

因此,如果你的项目是从 Windows 复制到 Linux 下的话,可能存在上述问题,请将 tools 文件夹下的所有脚本文件均按照上述方法修改为 Linux 格式,请确保 tools 下所有 .sh 文件格式均修改完成

OK! 解决了上述小 bug 之后按照 README.md 就可以正常执行推理了

1. 安装 python 依赖库

sudo apt install libprotobuf-dev
pip install onnx

如果需要使用 Python 推理的话需要安装

这里有些问题需要和大家讨论下,我看 Issues 里面有人提问说推理遇到了一些问题,杜老师是说 sudo apt install libprotobuf-dev=3.6.1 但是我安装时说找不到对应版本,如下图所示:

在这里插入图片描述

图2-4 libprotobuf-dev版本找不到

我们可以使用 apt-cache show package 查找指定包的详情,参考自 【Linux】使用apt-get查询并安装指定版本的软件

sudo apt update
sudo apt-cache show package

在这里插入图片描述

图2-5 查找libprotobuf-dev

可以看到查找有多个版 3.6.1.3-2ubuntu5.2、3.6.1.3-2ubuntu5,博主随便安装了一个指令如下:

sudo apt install libprotobuf-dev=3.6.1.3-2ubuntu5.2

但是在后续执行 Python 推理的时候出现如下警告,最终能编译完成,但是执行的时候直接 Segmentation fault 崩溃了

在这里插入图片描述

图2-6 python推理时出错

从编译警告不难看出,protobuf编译的版本是 3.20.3 与要求的版本 3.6.1 并不匹配,博主之前有安装过 protobuf,而 CMakeLists.txt 中是通过 find_pakcage 去找 protobuf 的,找到了之前下载的 3.20.3 版本,还有一些其它的警告也是与 protobuf 相关的,因此可能需要自己手动指定下 protobuf 的头文件和库文件路径,让它正常匹配到所对应的 3.6.1 版本,而不是其它的版本。

因此,博主最终也没解决 Python 推理,等有时间再去折腾吧,C++ 的推理一切正常,下面我们继续。

2. 在 environments.sh 文件中修改 TensorRT/CUDA/CUDNN/BEVFusion 变量

# 修改为你当前使用的路径
export TensorRT_Lib=/path/to/TensorRT/lib
export TensorRT_Inc=/path/to/TensorRT/include
export TensorRT_Bin=/path/to/TensorRT/bin

export CUDA_Lib=/path/to/cuda/lib64
export CUDA_Inc=/path/to/cuda/include
export CUDA_Bin=/path/to/cuda/bin
export CUDA_HOME=/path/to/cuda

export CUDNN_Lib=/path/to/cudnn/lib

# resnet50/resnet50int8/swint
export DEBUG_MODEL=resnet50int8

# fp16/int8
export DEBUG_PRECISION=int8
export DEBUG_DATA=example-data
export USE_Python=OFF

博主修改后如下所示:

export TensorRT_Lib=/opt/TensorRT-8.4.1.5/lib
export TensorRT_Inc=/opt/TensorRT-8.4.1.5/include
export TensorRT_Bin=/opt/TensorRT-8.4.1.5/bin

export CUDA_Lib=/usr/local/cuda-11.6/lib64
export CUDA_Inc=/usr/local/cuda-11.6/include
export CUDA_Bin=/usr/local/cuda-11.6/bin
export CUDA_HOME=/usr/local/cuda-11.6/

export CUDNN_Lib=/usr/local/cuda-11.6/lib64


# resnet50/resnet50int8/swint
export DEBUG_MODEL=resnet50int8

# fp16/int8
export DEBUG_PRECISION=int8
export DEBUG_DATA=example-data
export USE_Python=OFF

3.在终端上执行 enviroment.sh 文件

bash tool/enviroment.sh

博主执行完之后如下图所示:

在这里插入图片描述

图2-7 执行enviroment.sh文件

2.5.3 编译运行

1.利用 tensorRT 构建模型

bash tool/build_trt_engine.sh

博主执行完之后如下图所示:

在这里插入图片描述

图2-8 执行build_trt_engine.sh文件

2.编译并运行程序

bash tool/run.sh

博主执行完之后如下图所示:

在这里插入图片描述

图2-9-1 执行run.sh文件

在这里插入图片描述

图2-9-2 执行run文件

在这里插入图片描述

图2-9-3 执行run文件

在这里插入图片描述

图2-9-4 执行run文件

build/cuda-bevfusion.jpg 如下图所示:

在这里插入图片描述

图2-10 build/cuda-bevfusion.jpg

至此,CUDA-BEVFusion 的环境配置到这里就结束了!!!

后续的 onnx 和 PTQ 模型导出的细节、Python推理、进一步的性能提升相关内容需要大家自行去了解了

2.6 可能遇到的问题

2.6.1 问题1:/usr/bin/ld:cannot find -lspconv

分析:没有找到稀疏卷积的库文件,其库文件位于 libraries/3DSparseConvolution/libspconv 中,如果你没有完整拉取整个项目会发现该文件夹下的 lib 文件为空,导致无法找到库文件

解决办法:完整拉取整个项目

在这里插入图片描述

图2-11 问题1

2.6.2 问题2:/libspconv.so:file format not recognized

分析:这个问题在 Issues 17 有人遇到,博主遇到这个问题是因为在问题 1 中的 libspconv.so 找不到时利用手动添加的方式,手动下载库文件导致的

解决办法:完整拉取整个项目

在这里插入图片描述

图2-12 问题2

3. CUDA-CenterPoint

Copy 自 CUDA-CenterPoint 的 README.md 文档

这个 repo 包含使用 CUDA & TensorRT 进行 CenterPoint 推理的源码和模型

整个推理分为以下几个阶段:

  • Voxelization with CUDA kernel
  • 3D backbone with NV spconv-scn
  • RPN & CenterHead with TensorRT
  • Decode & NMS with CUDA kernel

3.1 模型和数据

这个 demo 使用 nuScenes Dataset 中的激光雷达数据,onnx 模型可以通过给定的脚本从下面给出的 checkpoint 中导出

DatasetCheckpointConfig
nuScenesepoch_20.pthnusc_centerpoint_voxelnet_0075voxel_fix_bn_z

3.2 前置条件

为了构建 centerpoint 推理需要 CUDATesorRT、libspconv 库,注意 libspconv 在 Tesla 平台只支持 sm_80 & sm_86,在嵌入式平台只支持 sm_87

3.3 环境

Tesla 平台

  • Ubuntu20.04 x86_64 with Nvidia Tesla A30

  • CUDA 11.4 + cuDNN 8.4.1 + TensorRT 8.4.12.5

嵌入式平台

  • Nvidia Drive Orin 6.0.3.0

  • CUDA 11.4 + cuDNN 8.3.3 + TensorRT 8.4.10.4

3.4 编译运行

在编译运行之前还需要做几件事情

首先,如果你的项目是从 Windows 下面复制到 Linux 下面的,请按照之前 CUDA-BEVFusion 所讲,将 tool 文件夹下的所有 .sh 脚本文件格式均修改为 Linux 格式,具体方法请参照 2.5.2 小节,这里不再赘述

然后,你需要修改 CMakeLists.txt 中的内容,具体修改如下:

# 30行 修改tensorRT路径
set(TENSORRT_ROOT         /opt/TensorRT-8.4.1.5)

# 31行 修改CUDA路径
set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda-11.6)

最后,在 data 文件夹下创建一个 prediction 文件夹用于保存预测结果信息

在测试数据上运行检测过程,指令如下:

cd CUDA-CenterPoint
bash tool/build.trt.sh
mkdir -p build && cd build
cmake .. && make -j
./centerpoint ../data/test/ --verbose

在这里插入图片描述

图3-1 CUDA-CenterPoint模型构建过程

在这里插入图片描述

图3-2 CUDA-CenterPoint编译过程

在这里插入图片描述

图3-3 CUDA-CenterPoint运行过程

至此,CUDA-CenterPoint 的环境配置到这里就结束了!!!

后续的可视化推理结果以及推理结果评估博主没有尝试,感兴趣的可以自己看看

在这里插入图片描述

图3-4 CUDA-CenterPoint结果可视化

4. CUDA-PointPillars

Copy 自 CUDA-PointPillars 的 README.md 文档

这个 repo 包含使用 TensorRT 进行 pointpillars 推理的源码和模型,模型由 OpenPCDet 创建由 onnx_graphsurgeon 修改

整个推理分为 4 个阶段:

  • Convert points cloud into 4-channle voxels
  • Extend 4-channel voxels to 10-channel voxel features
  • Run TensorRT engine to get 3D-detection raw data
  • Parse bounding box, class type and direction

4.1 模型和数据

这个 demo 使用 KITTI 数据集中的激光雷达数据,onnx 文件可以通过 tool 文件夹下的脚本从预训练模型中导出

4.2 前置条件

为了构建 pointpillars 推理,需要 TensorRTCUDA 以及在 TensorRT 中的 PillarScatter layer 插件

4.3 环境

  • Nvidia Jetson Xavier/Orin + Jetpack 5.0
  • CUDA 11.4 + cuDNN 8.3.2 + TensorRT 8.4.0

4.4 编译运行

由于我们拉取的 Lidar_AI_Solution 项目已经包含了 CUDA-PointPillars 因此不需要单独去拉取该 repo 了

在正式编译运行之前还需要修改下对应的 CMakeLists.txt 文件,修改内容如下:

# 61行 修改TensorRT头文件路径
set(TENSORRT_INCLUDE_DIRS /opt/TensorRT-8.4.1.5/include)

# 62行 修改TensorRT库文件路径
set(TENSORRT_LIBRARY_DIRS /opt/TensorRT-8.4.1.5/lib)

修改完成后执行如下指令完成编译:

mkdir build && cd build
cmake .. && make -j$(nproc)
./demo

${nproc} 会显示当前进程可用的CPU数量,博主的数量为12,上述指令等价于

cmake .. && make -j12

编译过程如下图所示:

在这里插入图片描述

图4-1 CUDA-PointPillars编译过程

在这里插入图片描述

图4-2 CUDA-PointPillars运行过程

至此,CUDA-PointPillars 的环境配置到这里就结束了!!!

结语

这篇博客主要介绍了 Lidar_AI_Solution 的环境配置,也就是将 README 文档重新 Copy 了一次,没有涉及到任何的原理分析,大家在环境配置过程中一定要熟读 README 文档,不要忘记安装对应的库和包,除此之外,可以到 Issues 里面多看看别人遇到的一些问题,可能你也遇到过。

该 repo 中涉及到了大量的知识,包括剪枝、量化、部署、BEV感知、Lidar点云、3D检测…,集大成者,感觉把前面所学的剪枝、量化、自动驾驶CV课程全都串起来了呀,如果大家对这个 repo 感兴趣的话可以自行研究。

最后如果大家觉得这个 repo 对你有帮助的话,不妨帮忙点个 ⭐️ 支持一波!!!

下载链接

  • git 下载地址

  • git lfs 下载地址

  • Lidar AI Solution 完整项目下载地址

  • CUDA-BEVFuison 数据下载

  • CUDA-BEVFusion 模型下载

参考

  • Lidar AI Solution

  • git clone --recursive快速高效下载方法

  • Windows系统Git安装教程

  • Windows安装Git LFS

  • Ubuntu20.04部署YOLOv5

  • Ubuntu20.04软件安装大全

  • Linux下执行Shell脚本出现$‘\r‘: command not found解决方法

  • 【Linux】使用apt-get查询并安装指定版本的软件

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

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

相关文章

力扣贪心算法专题(三)力扣题 452、435、763、56、738、968、714 思路及C++实现

文章目录 贪心算法452. 用最少数量的箭引爆气球435. 无重叠区间做法1 右边界排序 不重叠区间做法2 右边界排序 不重叠区间做法3 左边界排序 重叠区间 763.划分字母区间做法1做法2 56. 合并区间738.单调递增的数字暴力解法贪心算法 968.监控二叉树714.买卖股票的最佳时机含手续费…

CSDN周赛55期 - 简单分析

上期周赛被判抄袭了。。。无语。我从第一期周赛一步步走来,所有题我都做过,我还需要抄袭? 虽然第一时间去申诉,但貌似并没什么用。算了,C站的审核也就这样了,失望寒心。 本期还是《计算之魂》主题赛——不得…

JavaScript 基础 DOM (四)

正则表达式正则表达式 正则基本使用 定义规则 const reg /表达式/其中/ /是正则表达式字面量正则表达式也是对象 使用正则 test()方法 用来查看正则表达式与指定的字符串是否匹配 如果正则表达式与指定的字符串匹配 ,返回true,否则false reg.test(…

eclipse环境配置

eclipse环境配置 0. 前言1. 下载eclipse2. 下载sdk3. 配置sdk环境变量4. 验证sdk其他 0. 前言 本节记录如何配置eclipse的sdk配置 操作系统:Windows10 专业版 开发环境:eclipse 1. 下载eclipse 来这边下载一下eclipse 菜鸟教程 完事之后打开eclips…

回归测试概念和4种回归测试策略——你想知道的都在这里啦!

前言: 回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的工作…

Tomcat源码:Acceptor与Poller、PollerEvent

参考资料: 《Tomcat源码解析系列(十一)ProtocolHandler》 《Tomcat源码解析系列(十二)NioEndpoint》 前文: 《Tomcat源码:启动类Bootstrap与Catalina的加载》 《Tomcat源码:容器…

绝对不能错过的7个零基础免费的ChatGPT镜像网站

还在为打不开openai官网烦心?本文帮你实现ChatGPTMidJourney自由( ̄∇ ̄)/ 📒收集了一些截至目前(2023年5月25日午12:00)可以免费访问,并且零基础也能正常使用的镜像网站,后续将持续维护更新(。&a…

(2)lordPE脱壳

1.寻找OEP 1.1第一种情况 1.修改OD选项,调试设置"事件"为系统断点,直接打开"查看"->"内存",设置00400000下F2断点,单步F8找到0040****开头的OEP例如:00401528 1.2第二种情况 进入od后如果直…

Github疯传!200本经典计算机书籍!

好书在精不在多,每一本经典书籍都值得反复翻阅,温故而知新! 下面分享几本计算机经典书籍,都是我自己看过的。 重构 改善既有代码的设计 就像豆瓣评论所说的,看后有种醍醐灌顶、欲罢不能的感觉。无论你是初学者&#…

数据结构与算法02:数组和链表

目录 【数组】 为什么Go语言的切片是成倍扩容? 【链表】 单链表 循环链表 双向链表 双向循环链表 数组和链表如何选择? 如何使用链表实现 LRU 缓存淘汰算法? 链表的一些操作 【每日一练】 【数组】 数组(Array&#…

JMeter参数化四种实现方式

1 参数化释义 什么是参数化?从字面上去理解的话,就是事先准备好数据(广义上来说,可以是具体的数据值,也可以是数据生成规则),而非在脚本中写死,脚本执行时从准备好的数据中取值。 参…

Sentinel热点key

1.基本介绍 官方文档 何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如: 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制用户 ID 为参数&…

HyDE、UDAPDR(LLM大模型用于信息检索)

本篇博文继续整理LLM在搜索推荐领域的应用,往期文章请往博主主页查看更多。 Precise Zero-Shot Dense Retrieval without Relevance Labels 这篇文章主要做zero-shot场景下的稠密检索,通过借助LLM的力量不需要Relevance Labels,开箱即用。作…

【数据结构】---几分钟简单几步学会手撕链式二叉树(上)

文章目录 前言🌟一、二叉树链式结构的实现🌏1.1 前置说明💫快速创建一棵简单的二叉树 🌏1.2 二叉树的遍历的时间、空间复杂度🌏1.3 二叉树的遍历💫1.3.1 前序、中序以及后序遍历:💫1…

深入理解hashmap底层实现原理

目录 总体介绍 HashMap元素的存储 在hashmap中添加元素 HashMap的扩容机制 HashMap的线程安全性 1.添加和删除元素时存在不安全性 2.进行扩容操作时存在不安全性 3.哈希冲突存在不安全性 4.线程之间的不可见性导致安全问题 总体介绍 HashMap是我们用于元素映射使用频率最…

MySQL——子查询

来一篇 MySQL-子查询 记录一下这个美好的时光,学习记录篇,下文中所有SQL 语句 均可在 MySQL DB 学习Demo 此处下载SQL语句执行,有相关DB 与 表。 1. 需求分析与问题解决 1.1 实际问题 现有解决方式一: SELECT salary FROM employees WHERE last_name = Abel SELECT last…

【算法】【算法杂谈】旋转数组的二分法查找

aTOC 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介绍 原问题 给定一个从小到大有序的数组,该数组存在重复的数&#xf…

【数据安全-02】AI打假利器数字水印,及java+opencv实现

AIGC 的火爆引燃了数字水印,说实话数字水印并不是一项新的技术,但是这时候某些公司拿出来宣传一下特别应景,相应股票蹭蹭地涨。数字水印是什么呢,顾名思义,和我们在pdf中打的水印作用差不多,起到明确版权、…

【拒绝爆零】C++编程考试常见栽区

前言 在OI赛制中,我们可能会因为一些细节原因导致题目爆零。下面,是我列举的一些常见的坑: 1.极值未赋值 这个错误在运行时就能检查出来,但还是会浪费一定的时间,所以我们还是避开这些小插曲为好。 2.定义变量遇到…

利用无代码工具开发一款小程序

目录 无代码工具开发小程序的流程需求分析阶段模型设计阶段页面搭建阶段创建项目创建数据表组件搭建 预览发布总结 日常我们开发小程序的时候都是要从写代码开始,但是写代码这个事只有专业开发才可以干,那作为普通人,如果也希望开发小程序&am…