MedSAM 项目排坑记录

MedSAM 项目排坑记录

  • 任务
  • 排坑过程
    • 配置python环境
    • 测试
    • 构建docker
    • 模型训练
      • 数据预处理
    • 单GPU训练
    • 最后推理

任务

做一个课程大作业,需要进行CVPR2024年医疗影像分割赛题的打榜(CVPR 2024: SEGMENT ANYTHING IN MEDICAL IMAGES ON LAPTOP)。看到官方给了一个baseline,也就是这个MedSAM,决定先在我本地把这个baseline跑出来试试效果。

排坑过程

配置python环境

创建conda环境:

conda create -n MEDSAM python=3.10 -y
conda activate MEDSAM

安装pytorch:

pip3 install torch

中间竟然报错我磁盘空间没有了。害,存的数据集太多了。清理了一点,还有点暂时舍不得清理。主要是有一个去年上智能机器人课时候,跑SLAM算法大作业时下载的KITTI数据集和其他几个数据集,占了400多G空间,还有之前下载的HM3D数据集100多G。打算这两天把那个项目代码再跑一遍,上传到平台上,然后把本地的删除。以后可能还要下载很多数据集,打算下血本买个西数的p40 2T硬盘。正好我电脑有雷电4接口,能发挥硬盘宣称的2000M速度。

克隆项目:

git clone -b LiteMedSAM https://github.com/bowang-lab/MedSAM/

其中-b是指定分支branch。
安装项目包:

pip3 install -e .

据这个博客参考博客所说,这个命令就是将当前项目以软链接并且可修改的形式安装到当前python环境中,具体来说就是执行setup.py脚本。

然后经典报错:

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
rosdep 0.22.2 requires catkin-pkg>=0.4.0, which is not installed.
rosdistro 0.9.0 requires catkin-pkg, which is not installed.
rosinstall 0.7.8 requires catkin-pkg, which is not installed.
rosinstall-generator 0.1.23 requires catkin-pkg>=0.1.28, which is not installed.
rospkg 1.5.0 requires catkin-pkg, which is not installed.
rospkg 1.5.0 requires distro>=1.4.0; python_version >= "3.8", which is not installed.

安装就好:

pip3 install empy==3.3.4 rospkg pyyaml catkin_pkg

测试

先要下载模型参数。打开work_dir/LiteMedSAM这个目录,发现里面有个readme,点开其中的链接,从那个链接的谷歌云盘上下载下来,放到这个目录就行。

接着下载示例数据,从那个here点进去,下载三个谷歌云盘文件。然后把他们放到test_demo这个文件夹下面。

最后运行推理脚本:

python CVPR24_LiteMedSAM_infer.py -i test_demo/imgs/ -o test_demo/segs

结果为:
在这里插入图片描述
感觉跟没跑一样。
看代码:

if __name__ == '__main__':img_npz_files = sorted(glob(join(data_root, '*.npz'), recursive=True))print(img_npz_files)efficiency = OrderedDict()efficiency['case'] = []efficiency['time'] = []for img_npz_file in tqdm(img_npz_files):print('in')start_time = time()if basename(img_npz_file).startswith('3D'):MedSAM_infer_npz_3D(img_npz_file)else:MedSAM_infer_npz_2D(img_npz_file)end_time = time()efficiency['case'].append(basename(img_npz_file))efficiency['time'].append(end_time - start_time)current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(current_time, 'file name:', basename(img_npz_file), 'time cost:', np.round(end_time - start_time, 4))efficiency_df = pd.DataFrame(efficiency)efficiency_df.to_csv(join(pred_save_dir, 'efficiency.csv'), index=False)

我打印出img_npz_files,发现是空列表。说明没读到文件啊。然后发现我是呆比:数据都没解压缩。解压后再运行:

python /home/lcy-magic/MedSAM/MedSAM/CVPR24_LiteMedSAM_infer.py -i /home/lcy-magic/MedSAM/MedSAM/test_demo/imgs/ -o test_demo/segs

解压后长这样
这回就好了:
在这里插入图片描述

构建docker

在MedSAM目录下运行:

docker build -f Dockerfile -t litemedsam .

会用很长时间。
测试docker。先给可执行权限:

sudo chmod -R 777 ./*

然后运行:

docker container run -m 8G --name litemedsam --rm -v $PWD/test_demo/imgs/:/workspace/inputs/ -v $PWD/test_demo/litemedsam-seg/:/workspace/outputs/ litemedsam:latest /bin/bash -c "sh predict.sh"

其中PWD这个环境变量是当前路径,所以也要在在MedSAM目录下运行。
成功:
在这里插入图片描述
保存docker为一个压缩文件:

docker save litemedsam | gzip -c > litemedsam.tar.gz

时间也比较漫长。成功:
在这里插入图片描述

最后运行:

python /home/lcy-magic/MedSAM/MedSAM/evaluation/compute_metrics.py -s test_demo/litemedsam-seg -g test_demo/gts -csv_dir ./metrics.csv

没问题

模型训练

数据预处理

首先模型参数咱已经有了,应该不用再下载了。但要下载数据。在他的demo dataset链接里,下载这个压缩包:
在这里插入图片描述
然后再MedSAM文件夹下新建data文件夹,把这个压缩包放过去解压缩。
数据处理那个指令太长了,写个shell脚本吧:

touch pre_CT_MR.sh
chmod 777 pre_CT_MR.sh
gedit pre_CT_MR.sh

写入以下语句(参考:参考博客):

#!/bin/bash~/anaconda3/envs/MEDSAM/bin/python pre_CT_MR.py \-img_path data/FLARE22Train/images \-img_name_suffix _0000.nii.gz \-gt_path data/FLARE22Train/labels \-gt_name_suffix .nii.gz \-output_path data \-num_workers 4 \-prefix CT_Abd_ \-modality CT \-anatomy Abd \-window_level 40 \-window_width 400 \--save_nii

执行脚本:

./pre_CT_MR.sh

报错:

./pre-processing.sh: 行 3: activate: 没有那个文件或目录
Traceback (most recent call last):File "/home/lcy-magic/MedSAM/MedSAM/pre_CT_MR.py", line 12, in <module>import cc3d
ModuleNotFoundError: No module named 'cc3d'
./pre-processing.sh: 行 7: -img_name_suffix:未找到命令
./pre-processing.sh: 行 8: -gt_path:未找到命令
./pre-processing.sh: 行 9: -gt_name_suffix:未找到命令
./pre-processing.sh: 行 10: -output_path:未找到命令
./pre-processing.sh: 行 11: -num_workers:未找到命令
./pre-processing.sh: 行 12: -prefix:未找到命令
./pre-processing.sh: 行 13: -modality:未找到命令
./pre-processing.sh: 行 14: -anatomy:未找到命令
./pre-processing.sh: 行 15: -window_level:未找到命令
./pre-processing.sh: 行 16: -window_width:未找到命令
./pre-processing.sh: 行 17: --save_nii:未找到命令

那就安装cc3d:

pip3 install connected-components-3d

再运行,又报错:

usage: pre_CT_MR.py [-h] [-modality MODALITY] [-anatomy ANATOMY] [-img_name_suffix IMG_NAME_SUFFIX] [-gt_name_suffix GT_NAME_SUFFIX] [-img_path IMG_PATH][-gt_path GT_PATH] [-output_path OUTPUT_PATH] [-num_workers NUM_WORKERS] [-window_level WINDOW_LEVEL] [-window_width WINDOW_WIDTH][--save_nii]
pre_CT_MR.py: error: unrecognized arguments: -prefix CT_Abd_

查看python脚本可以发现,其他参数都是读取的,CT_Abd_参数是根据其他参数拼接得到的。而且结果和命令行给出的一致。那就不再需要命令行指定了。
在这里插入图片描述

于是我简单粗暴地把这一行删掉了,再运行没问题:
在这里插入图片描述
接下来做格式转换,照样改成shell脚本:

touch npz_to_npy.sh
chmod 777 npz_to_npy.sh
gedit npz_to_npy.sh

写入:

#!/bin/bash~/anaconda3/envs/MEDSAM/bin/python npz_to_npy.py \-npz_dir data/MedSAM_train \-npy_dir data/npy \-num_workers 4

运行:

./npz_to_npy.sh

结果:
在这里插入图片描述
感觉是文件路径不对,看了下文件。果然,训练数据还在下一级目录。应该把脚本改成:

#!/bin/bash~/anaconda3/envs/MEDSAM/bin/python npz_to_npy.py \-npz_dir data/MedSAM_train/CT_Abd \-npy_dir data/npy \-num_workers 4

再运行就没问题了:

Converting npz to npy: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:05<00:00,  7.55it/s]

单GPU训练

同样,构建脚本:

touch train_one_gpu.sh
chmod 777 train_one_gpu.sh
gedit train_one_gpu.sh

写入:

#!/bin/bash~/anaconda3/envs/MEDSAM/bin/python train_one_gpu.py \-data_root data/MedSAM_train/CT_Abd \-pretrained_checkpoint lite_medsam.pth \-work_dir work_dir \-num_workers 4 \-batch_size 4 \-num_epochs 10# ~/anaconda3/envs/MEDSAM/bin/python train_one_gpu.py \
#     -data_root data/MedSAM_train/CT_Abd \
#     -resume work_dir/medsam_lite_latest.pth \
#     -work_dir work_dir \
#     -num_workers 4 \
#     -batch_size 4 \
#     -num_epochs 10

如果从lite_medsam开始微调就注释下面的,如果从上次中断的训练开始微调就注释上面的。
运行:

./train_one_gpu.sh

报错:

Pretained weights lite_medsam.pth not found, training from scratch
MedSAM Lite size: 9791300
Traceback (most recent call last):File "/home/lcy-magic/MedSAM/MedSAM/train_one_gpu.py", line 408, in <module>train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers, pin_memory=True)File "/home/lcy-magic/anaconda3/envs/MEDSAM/lib/python3.10/site-packages/torch/utils/data/dataloader.py", line 350, in __init__sampler = RandomSampler(dataset, generator=generator)  # type: ignore[arg-type]File "/home/lcy-magic/anaconda3/envs/MEDSAM/lib/python3.10/site-packages/torch/utils/data/sampler.py", line 143, in __init__raise ValueError(f"num_samples should be a positive integer value, but got num_samples={self.num_samples}")
ValueError: num_samples should be a positive integer value, but got num_samples=0

哦,他这个readme又写错了。现在训练用的是npy数据不是npz的。所以脚本应该改成:

#!/bin/bash~/anaconda3/envs/MEDSAM/bin/python train_one_gpu.py \-data_root data/npy \-pretrained_checkpoint lite_medsam.pth \-work_dir work_dir \-num_workers 4 \-batch_size 4 \-num_epochs 10# ~/anaconda3/envs/MEDSAM/bin/python train_one_gpu.py \
#     -data_root data/npy \
#     -resume work_dir/medsam_lite_latest.pth \
#     -work_dir work_dir \
#     -num_workers 4 \
#     -batch_size 4 \
#     -num_epochs 10

再次运行,报错:

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 36.00 MiB. GPU 0 has a total capacity of 7.79 GiB of which 47.56 MiB is free. Including non-PyTorch memory, this process has 6.72 GiB memory in use. Of the allocated memory 6.42 GiB is allocated by PyTorch, and 123.97 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation.  See documentation for Memory Management  (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)

又没显存了。。。而且batch_size已经是4了,很小了。我试了下,只有改成1或者2我这里才不报错。这两天有空还是尝试把核显跟独显的功能分开吧,多省点显存。
但也会有新报错:

Traceback (most recent call last):File "/home/lcy-magic/MedSAM/MedSAM/train_one_gpu.py", line 443, in <module>loss.backward()File "/home/lcy-magic/anaconda3/envs/MEDSAM/lib/python3.10/site-packages/torch/_tensor.py", line 522, in backwardtorch.autograd.backward(File "/home/lcy-magic/anaconda3/envs/MEDSAM/lib/python3.10/site-packages/torch/autograd/__init__.py", line 266, in backwardVariable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass
RuntimeError: GET was unable to find an engine to execute this computation

也就是找不到反向传播的工具了。
什么原因呐?好像是显卡驱动问题,但有人说他重装一下torch就好了,我也打算这样先试一下参考issue:

pip uninstall torch
pip3 install torch torchvision

结果还是不行。我想我的torch是2.2.1的,这个项目要求是2.1.2的。我回退一下版本试试?

pip3 install torch==2.1.2 torchvision

再运行还是同样的错误。那应该就是我的驱动版本问题了。
检查驱动版本:
在这里插入图片描述
这个时候我发现我忽略了前面一大堆的报错信息:

Error: /usr/local/cuda/lib64/libcudnn_cnn_train.so.8: undefined symbol: _ZTIN10cask_cudnn14BaseKernelInfoE, version libcudnn_cnn_infer.so.8
Could not load library libcudnn_cnn_train.so.8. Error: /usr/local/cuda/lib64/libcudnn_cnn_train.so.8: undefined symbol: _ZTIN10cask_cudnn14BaseKernelInfoE, version libcudnn_cnn_infer.so.8

搜了一下这个,我就明白了。根据参考博客所说,应该是之前有个系统的cudnn,pip安装torch又有一个cudnn。指向错了,指到系统的了。反正我一般都用pip安装torch,不源码安装,我就把系统的cundnn删掉就好。我没有删,先按照博主所说,把bashrc那一行注释掉了:

#export CUDA_HOME=/usr/local/cuda
#export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}
#export PATH=${CUDA_HOME}/bin:${PATH}

也source了,但还是同样报错。我一怒之下,还是删了吧:

cd /usr/local/cuda/lib64
sudo rm -f libcudnn*
cd /usr/local/cuda/include
sudo rm -f cudnn*

再回去运行bash脚本,就没问题了:
在这里插入图片描述
慢慢等结果了。遛个弯回来,发现到epoch3时候报错终止了。报错很长,主要是这部分:

RuntimeError: main thread is not in main loop
Tcl_AsyncDelete: async handler deleted by the wrong thread

参照参考博客进行解决。修改为:

# from matplotlib import pyplot as plt
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt

还发现,那个sh还有个地址不对,应该把模型参数地址改为:

-pretrained_checkpoint work_dir/LiteMedSAM/lite_medsam.pth \

这次训练完成:
在这里插入图片描述

最后推理

老样子:

touch train_one_gpu.sh
chmod 777 train_one_gpu.sh
gedit train_one_gpu.sh

写入:

#!/bin/bash~/anaconda3/envs/MEDSAM/bin/python inference_3D.py \-data_root data/MedSAM_test/CT_Abd \-pred_save_dir ./preds/CT_Abd \-medsam_lite_checkpoint_path work_dir/medsam_lite_latest.pth \-num_workers 4 \--save_overlay \-png_save_dir ./preds/CT_Abd_overlay \--overwrite

运行:

./inference_3D.sh

又报错报了一堆,提取最主要的:

Traceback (most recent call last):File "/home/lcy-magic/MedSAM/MedSAM/inference_3D.py", line 319, in <module>medsam_lite_model.load_state_dict(medsam_lite_checkpoint)File "/home/lcy-magic/anaconda3/envs/MEDSAM/lib/python3.10/site-packages/torch/nn/modules/module.py", line 2153, in load_state_dictraise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for MedSAM_Lite:Missing key(s) in state_dict:

和:

Unexpected key(s) in state_dict: "model", "epoch", "optimizer", "loss", "best_loss".

有missing key还有unexpected key,感觉像是整个文件搞错了,不是某一句的问题。
报错发生在medsam_lite_model.load_state_dict(medsam_lite_checkpoint)查看代码可以知道medsam_lite_checkpoint来自于bash脚本提供的-medsam_lite_checkpoint_path work_dir/medsam_lite_latest.pth \

查看发现缺失是有这个文件的。不知道具体错哪了,换成medsam_lite_best.pth也不对,换成work_dir/LiteMedSAM/lite_medsam.pth \就好了:
在这里插入图片描述

但这个应该是最初下载下来的,不是我训练的。在加载模型后打印一下看看:

medsam_lite_checkpoint = torch.load(medsam_lite_checkpoint_path, map_location='cpu')
print(medsam_lite_checkpoint.keys())

对于work_dir/medsam_lite_latest.pth \:

dict_keys(['model', 'epoch', 'optimizer', 'loss', 'best_loss'])

对于work_dir/LiteMedSAM/lite_medsam.pth \:
在这里插入图片描述
看到这个博客参考博客懂了,因为训练用的GPU,测试用的CPU,所以出的问题。改为:

medsam_lite_model.load_state_dict(medsam_lite_checkpoint,False)

就正常了。但这可能不是正确的解决办法。
测试一下:
这是之前的结果图:
在这里插入图片描述
我把save_overlay参数设为True,运行后:
在这里插入图片描述
似乎没啥问题。暂时先这样了。

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

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

相关文章

docker离线搭建仓库

要在Docker中搭建本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具&#xff08;如Terminal或PowerShell&#xff09;&#xff0c;运行以下命令来创建一个新的容器并将其设置为本地…

vulhub中ThinkPHP 多语言本地文件包含漏洞复现

ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前&#xff0c;存在一处本地文件包含漏洞。当多语言特性被开启时&#xff0c;攻击者可以使用lang参数来包含任意PHP文件。 虽然只能包含本地PHP文件&#xff0c;但在开启了register_argc_argv且安装了pcel/pear的环…

如何在Win系统本地部署Jupyter Notbook交互笔记并结合内网穿透实现公网远程使用

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

2024第二届语言,教育与艺术鉴赏国际会议(ICLEAA 2024)

2024第二届语言&#xff0c;教育与艺术鉴赏国际会议&#xff08;ICLEAA 2024&#xff09; 一、【会议简介】 我们非常荣幸地邀请您参加2024第二届语言&#xff0c;教育与艺术鉴赏国际会议&#xff08;ICLEAA 2024&#xff09;&#xff0c;该会议将在美丽的苏州举行。 ICLEAA …

美团面试拷打:Redis 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

目录&#xff1a; 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨…

如何在Win系统部署Tomcat服务并实现远程访问内网站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学…

AIOps常见问题

AIOps的自动化通常指什么&#xff1f; AIOps 平台的自动化一般包括以下几个方面&#xff1a; 数据收集和整合&#xff1a;AIOps 平台可以从多个 IT 基础架构组件、应用需求与性能监视工具以及服务工单系统等数据源中收集并整合运维数据&#xff0c;形成一个全面的数据平台。数…

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来&#xff0c;已经在目标检测领域取得了显著的进展&#xff0c;以其快速和准确的特点而广受欢迎。 论文地址&#xf…

CentOS网络故障排查秘笈:实战指南

前言 作为一名热爱折腾 Linux 的技术达人&#xff0c;我深知网络故障会让人抓狂&#xff01;在这篇文章里&#xff0c;我和你分享了我的心得体会&#xff0c;从如何分析问题、识别瓶颈&#xff0c;到利用各种神器解决网络难题。不管你是新手小白还是老鸟大神&#xff0c;这里都…

凌鲨微应用开发流程

微应用开发流程 使用vite,nextjs等框架创建前端项目引入需要的api包通过调试界面进行调试 创建前端项目 vite yarn create vitenextjs yarn create next-app引入需要的api包 名称权限说明http跨域访问跨域http访问tauri提供的apilinksaas-minapp/api打开浏览器读本地文件…

【经验分享】 3D新手玩转VisionPro的工作流

第一步:文字生产图片 这样的工具有很多,stable diffusion,Midjourney等来生成图像 第二步:使用图片生3d模型工具 在线的工具有:https://huggingface.co/spaces/stabilityai/TripoSRhttps://huggingface.co/spaces/stabilityai/TripoSR 效果图 代码框架:Gi

CentOS7.9基于Apache2.4+Php7.4+Mysql8.0架构部署Zabbix6.0LTS 亲测验证完美通过方案

前言: Zabbix 由 Alexei Vladishev 创建,目前由 Zabbix SIA 主导开发和支持。 Zabbix 是一个企业级的开源分布式监控解决方案。 Zabbix 是一款监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康和完整性的软件。 Zabbix 使用灵活的通知机制,…

蓝桥杯-排序

数组排序 Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序&#xff0c;并且时按从小到大的顺序。 package Work;import java.util.*;public class Imcomplete {public static void main(String args[]) {int arr[]new int [] {1,324,4,5,7,2};Arrays.sort(arr)…

安装系统后,如何单个盘空间扩展多个盘空间?

1、计算机-管理-存储-磁盘空间 2、压缩C盘符&#xff0c;分出多余空间 3、将多余空间扩展&#xff0c;然后修改盘符名称

SpringBoot自动装配详解

SpringBoot自动装配 在讲之前先了解一下&#xff0c;手动装配的流程。 在没有Spring Boot的情况下&#xff0c;你需要手动配置和添加相关依赖&#xff0c;以实现类似于Spring Boot自动装配的功能。主要步骤&#xff1a; 引入Spring相关依赖&#xff1a; 首先&#xff0c;你需…

基于springboot+vue实现食品安全管理系统项目【项目源码+论文说明】

基于springboot实现食品安全管理系统演示 摘要 食品行业同其他行业有很多的差别&#xff0c;食品行业不仅要管食品的生产和销售&#xff0c;还要管食品的库存和保质期&#xff0c;那么对于食品管理者来说&#xff0c;就存在着一定的难度。况且食品的种类复杂&#xff0c;存储条…

Redis分段锁,如何设计?

问题场景&#xff1a;热点库存扣减问题 秒杀场景&#xff0c;有一个难度的问题&#xff1a;热点库存扣减问题。 既要保证不发生超卖 又要保证高并发 如果解决这个高难度的问题呢&#xff1f; 答案就是使用redis 分段锁。 什么是分布式锁&#xff1f; 一个分布式系统中&am…

关于OpenAI最新的成果Sora的思考

目录 前言: 1.Sora的技术特点 1.1技术架构 1.2算法原理&#xff1a; 1.2.1自然语言处理&#xff08;NLP&#xff09;&#xff1a; 1.2.2深度学习&#xff1a; 1.2.3视频生成与编码&#xff1a; 1.3实现过程&#xff1a; 1.3.1NLP&#xff08;自然语言处理&#xff09;模…

手写分布式配置中心(三)增加实时刷新功能(短轮询)

要实现配置自动实时刷新&#xff0c;需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version&#xff0c;新增配置的时候为1&#xff0c;每次更新配置就加1。 Overridepublic long insertConfigDO(…

Vue3 中的代理原理详解

Vue3 中的代理原理详解 Vue3 中引入了代理&#xff08;Proxy&#xff09;机制&#xff0c;取代了 Vue2 中的 Object.defineProperty() 机制&#xff0c;用于实现数据响应式。代理机制是 ES6 中新增的特性&#xff0c;它可以用来自定义对象中的操作&#xff0c;比如属性查找、赋…