全球首款无限时长电影生成模型SkyReels-V2本地部署教程:视频时长无限制!
一、简介
SkyReels-V2 模型集成了多模态大语言模型(MLLM)、多阶段预训练、强化学习以及创新的扩散强迫(Diffusion-forcing)框架,实现了在提示词遵循、视觉质量、运动动态以及视频时长等方面的全面突破。通过扩散强迫框架和 多阶段优化技术 ,首次实现了单镜头 30 秒、40 秒的流畅输出,并通过“ Extend ”无限延伸,彻底打破了时长枷锁。
二、环境部署
基础环境要求:
环境名称 | 版本信息 1 |
---|---|
Ubuntu | 22.04.5 LTS |
Cuda | V12.4.131 |
Python | 3.12.7 |
NVIDIA Corporation | RTX 4090 |
从算家云基础镜像开始创建:
三、SkyReels-V2安装
首先查看环境信息:
从github 克隆代码,然后 pip
安装依赖包。
# clone the repository.
git clone https://github.com/SkyworkAI/SkyReels-V2
cd SkyReels-V2
pip install -r requirements.txt
若遇到 flash_attn
一起在安装的问题:可以真的到Releases · Dao-AILab/flash-attention 下载它的编译好的 whl 包,一定要选择对应的版本,
wget https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiFALSE-cp312-cp312-linux_x86_64.whl
pip install flash_attn-2.7.4.post1+cu12torch2.5cxx11abiFALSE-cp312-cp312-linux_x86_64.whl
然后在执行 pip install -r requirements.txt
四、下载模型文件
目前开源的模型如下:
Type | Model Variant | Recommended Height/Width/Frame | Link |
---|---|---|---|
Diffusion Forcing | 1.3B-540P | 544 * 960 * 97f | 🤗Huggingface 🤖 ModelScope |
5B-540P | 544 * 960 * 97f | Coming Soon | |
5B-720P | 720 * 1280 * 121f | Coming Soon | |
14B-540P | 544 * 960 * 97f | 🤗Huggingface 🤖 ModelScope | |
14B-720P | 720 * 1280 * 121f | Coming Soon | |
Text-to-Video | 1.3B-540P | 544 * 960 * 97f | Coming Soon |
5B-540P | 544 * 960 * 97f | Coming Soon | |
5B-720P | 720 * 1280 * 121f | Coming Soon | |
14B-540P | 544 * 960 * 97f | 🤗Huggingface 🤖 ModelScope | |
14B-720P | 720 * 1280 * 121f | 🤗Huggingface 🤖 ModelScope | |
Image-to-Video | 1.3B-540P | 544 * 960 * 97f | 🤗Huggingface 🤖 ModelScope |
5B-540P | 544 * 960 * 97f | Coming Soon | |
5B-720P | 720 * 1280 * 121f | Coming Soon | |
14B-540P | 544 * 960 * 97f | 🤗Huggingface 🤖 ModelScope | |
14B-720P | 720 * 1280 * 121f | Coming Soon | |
Camera Director | 5B-540P | 544 * 960 * 97f | Coming Soon |
5B-720P | 720 * 1280 * 121f | Coming Soon | |
14B-720P | 720 * 1280 * 121f | Coming Soon |
从ModelScope 下载 Diffusion Forcing1.3B-540P 的模型:
git lfs install
git clone https://www.modelscope.cn/Skywork/SkyReels-V2-DF-1.3B-540P.git
五、运行测试
下载完模型后,将下列代码写入:test.sh
model_id=Skywork/SkyReels-V2-DF-1.3B-540P
# synchronous inference
python generate_video_df.py \--model_id ${model_id} \--resolution 540P \--ar_step 0 \--base_num_frames 97 \--num_frames 257 \--overlap_history 17 \--prompt "A graceful white swan with a curved neck and delicate feathers swimming in a serene lake at dawn, its reflection perfectly mirrored in the still water as mist rises from the surface, with the swan occasionally dipping its head into the water to feed." \--addnoise_condition 20 \--offload
运行 sh test.sh
完成后结果保存在:root/SkyReels-V2/result/diffusion_forcing
- 若出现在问题:
Error opening output file: File name too long
是由于导出视频的文件名太长所导致的,可以修改generate_video_df.py
的代码 :找到下列代码,将[:100]
修改为[:10]
if local_rank == 0:current_time = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime())video_out_file = f"{args.prompt[:10].replace('/','')}_{args.seed}_{current_time}.mp4"output_path = os.path.join(save_dir, video_out_file)imageio.mimwrite(output_path, video_frames, fps=fps, quality=8, output_params=["-loglevel", "error"])
- 无法使用14B模型,若要使用需要至少一张大于60G显存的显卡
六、使用webui界面
通过 python app.py
运行webui
模型可以放在 SkyReels-V2/Skywork
文件夹下,这个镜像中的模型是使用 ln
创建的链接
# app.py
import os
import gradio as gr
import subprocess
import time
import glob
import torch.distributed as distdef get_model_list(base_dir="./Skywork/"):"""扫描Skywork目录获取可用的模型列表"""try:# 确保目录存在if not os.path.exists(base_dir):os.makedirs(base_dir)return ["请选择模型"] # 返回默认列表# 扫描目录下的所有子目录model_dirs = glob.glob(os.path.join(base_dir, "*"))model_ids = []for dir_path in model_dirs:if os.path.isdir(dir_path):# 将目录路径转换为model_id格式model_name = os.path.basename(dir_path)model_id = f"{base_dir}/{model_name}"model_ids.append(model_id)# 如果没有找到模型,返回默认列表return model_ids if model_ids else ["请选择模型"]except Exception as e:print(f"扫描模型目录出错: {str(e)}")return ["扫描模型目录出错"] # 发生错误时返回默认列表def enhance_prompt(prompt):"""使用提示词增强器处理提示词"""try:cmd = ["python","skyreels_v2_infer/pipelines/prompt_enhancer.py","--prompt", str(prompt)]# 执行提示词增强process = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True,bufsize=1,universal_newlines=True)output = []enhanced_prompt = Nonefor line in process.stdout:print(line, end='')output.append(line)if "Enhanced prompt:" in line:enhanced_prompt = line.split("Enhanced prompt:")[-1].strip()process.wait()if process.returncode != 0:raise RuntimeError("提示词增强失败")return enhanced_prompt if enhanced_prompt else promptexcept Exception as e:print(f"提示词增强失败: {str(e)}")return promptdef run_video_generation(prompt,model_id="选择模型",resolution="540P",ar_step=4,base_num_frames=97,num_frames=257,overlap_history=17,addnoise_condition=20,use_usp=True,offload=True,seed=42,gpu_count=2,image=None,inference_steps=50,fps=24,shift=8.0,guidance_scale=6.0,causal_block_size=5,outdir="./video_out",prompt_enhancer=False, # 添加prompt_enhancer参数teacache=False # 添加teacache参数
):"""执行视频生成命令"""# 记录开始时间start_time = time.time()# 确保输出目录存在并获取绝对路径outdir = os.path.abspath(outdir)os.makedirs(outdir, exist_ok=True)# 根据条件处理提示词增强if prompt_enhancer:try:enhanced = enhance_prompt(prompt)if enhanced != prompt:print(f"原始提示词: {prompt}")print(f"增强后的提示词: {enhanced}")prompt = enhancedexcept Exception as e:print(f"提示词增强失败,将使用原始提示词: {str(e)}")# 自动关闭提示词增强功能prompt_enhancer = False# 构建基础命令参数,确保参数顺序正确base_args = ["--prompt", str(prompt),"--model_id", str(model_id),"--resolution", str(resolution),"--ar_step", str(ar_step),"--base_num_frames", str(base_num_frames),"--num_frames", str(num_frames),"--overlap_history", str(overlap_history),"--addnoise_condition", str(addnoise_condition),"--inference_steps", str(inference_steps),"--fps", str(fps),"--shift", str(shift),"--guidance_scale", str(guidance_scale),"--causal_block_size", str(causal_block_size),"--outdir", str(outdir) # 确保outdir在最后]if teacache:base_args.append("--teacache")if image:base_args.extend(["--image", str(image)])if offload:base_args.append("--offload")if seed != -1:base_args.append("--seed")base_args.append(str(seed))if prompt_enhancer:base_args.append("--prompt_enhancer")# 根据是否使用USP构建完整命令if use_usp:cmd = ["torchrun",f"--nproc_per_node={gpu_count}",f"generate_video_df.py"] + base_args + ["--use_usp"]else:cmd = ["python", "generate_video_df.py"] + base_args# 打印执行命令print("执行命令:", " ".join(cmd))# 确保输出目录存在并获取绝对路径outdir = os.path.abspath(outdir)os.makedirs(outdir, exist_ok=True)# 执行命令并实时显示输出try:process = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True,bufsize=1,universal_newlines=True)output = []video_path = None# 实时读取并显示输出for line in process.stdout:print(line, end='') # 实时显示output.append(line) # 保存输出# 检查是否包含视频路径信息并转换为绝对路径if "Saved video to" in line:video_path = line.split("Saved video to")[-1].strip()video_path = os.path.abspath(video_path) # 确保是绝对路径print(f"视频保存路径: {video_path}")process.wait()if process.returncode != 0:raise RuntimeError("生成视频失败")# 计算并添加耗时信息end_time = time.time()elapsed_time = end_time - start_timetime_info = f"\n总耗时: {elapsed_time:.2f} 秒"output.append(time_info)return "".join(output), video_pathexcept Exception as e:raise RuntimeError(f"执行命令失败: {str(e)}")def get_available_gpus():"""获取可用的GPU数量和设备ID"""try:import torchgpu_count = torch.cuda.device_count()if gpu_count == 0:return 0, []return gpu_count, list(range(gpu_count))except:return 0, []def scan_video_directory(directory="./video_out"):"""扫描视频目录并返回所有视频文件"""if not os.path.exists(directory):return []video_files = []for ext in ['.mp4', '.avi', '.mov', '.mkv']:files = glob.glob(os.path.join(directory, f'*{ext}'))# 返回(显示名称, 文件路径)的元组for f in files:basename = os.path.basename(f)video_files.append((basename, f))# 按修改时间排序return sorted(video_files, key=lambda x: os.path.getmtime(x[1]), reverse=True)# 在Gradio界面中使用时:
video_list = gr.Dropdown(label="选择视频播放",choices=scan_video_directory(),value=None,interactive=True
)def update_video_list():"""刷新视频列表"""return gr.Dropdown(choices=scan_video_directory())def on_video_select(video_path):"""当选择视频时"""if video_path: # video_path现在是完整路径return video_pathreturn Nonedef on_generate_click(*args):"""生成视频并更新列表"""try:# 获取参数prompt, model_id, resolution, ar_step, base_num_frames, num_frames, \overlap_history, addnoise_condition, use_usp, offload, seed, gpu_count, \image, inference_steps, fps, shift, guidance_scale, \causal_block_size, outdir, prompt_enhancer, teacache = args # 添加teacache# 如果ar_step为0(同步模式),强制设置causal_block_size为1if ar_step == 0:causal_block_size = 1# 如果同时启用了use_usp和prompt_enhancer,先进行提示词增强if use_usp and prompt_enhancer:try:enhanced = enhance_prompt(prompt)if enhanced != prompt:print(f"原始提示词: {prompt}")print(f"增强后的提示词: {enhanced}")prompt = enhancedexcept Exception as e:print(f"提示词增强失败,将使用原始提示词: {str(e)}")# 禁用prompt_enhancer参数,因为提示词已经增强过了prompt_enhancer = False# 执行视频生成output, video_path = run_video_generation(prompt, model_id, resolution, ar_step, base_num_frames, num_frames,overlap_history, addnoise_condition, use_usp, offload, seed, gpu_count,image, inference_steps, fps, shift, guidance_scale,causal_block_size, outdir, prompt_enhancer,teacache)# 更新视频列表new_choices = scan_video_directory()if video_path and os.path.exists(video_path):return output, video_path, gr.Dropdown(choices=new_choices, value=video_path)return output, None, gr.Dropdown(choices=new_choices)except Exception as e:error_msg = f"生成失败: {str(e)}"return error_msg, None, gr.Dropdown(choices=scan_video_directory())# 创建Gradio界面
with gr.Blocks(title="SkyReels-V2 视频生成器") as demo:gr.Markdown("# SkyReels-V2 视频生成器")with gr.Row():with gr.Column():prompt = gr.Textbox(label="提示词 (prompt)",lines=3,value="A graceful white swan with a curved neck and delicate feathers swimming in a serene lake at dawn")# 图片输入image = gr.Image(label="输入图片 (仅用于图像到视频生成)",type="filepath",visible=True)# In the Gradio interface definition, update the model_id dropdown:model_id = gr.Dropdown(choices=get_model_list(),label="模型ID (model_id)",value="选择模型",# Changed to match the available modelallow_custom_value=True)resolution = gr.Dropdown(choices=["540P", "720P"],label="分辨率 (resolution)",value="540P")with gr.Row():num_frames = gr.Number(label="生成帧数 (num_frames)",value=97,precision=0)base_num_frames = gr.Number(label="基础帧数 (base_num_frames)",value=97,precision=0)with gr.Row():inference_steps = gr.Number(label="推理步骤数 (inference_steps)",value=50,precision=0)fps = gr.Number(label="输出视频帧率 (fps)",value=24,precision=0)with gr.Row():shift = gr.Number(label="流匹配参数 (shift)",value=8.0,info="T2V模型推荐8.0,I2V模型推荐5.0")guidance_scale = gr.Number(label="文本匹配强度 (guidance_scale)",value=6.0,info="T2V模型推荐6.0,I2V模型推荐5.0")with gr.Row():ar_step = gr.Number(label="AR步数 (ar_step)",value=4,info="0表示同步模式")causal_block_size = gr.Number(label="因果块大小 (causal_block_size)",value=4,info="异步推理时推荐使用(ar_step>0)")with gr.Row():overlap_history = gr.Number(label="重叠历史帧数 (overlap_history)",value=17)addnoise_condition = gr.Number(label="噪声条件 (addnoise_condition)",value=20)with gr.Row():use_usp = gr.Checkbox(label="启用use_usp(使用多GPU并行推理)",value=True)offload = gr.Checkbox(label="启用offload(使用显存优化)",value=True)prompt_enhancer = gr.Checkbox(label="启用prompt_enhancer(提示词扩展)",value=True,)teacache = gr.Checkbox(label="启用teacache(使用缓存加速)",value=False,)with gr.Row():seed = gr.Number(label="随机种子 (-1为随机)",value=42)gpu_count = gr.Number(label="使用GPU数量",value=2,precision=0)outdir = gr.Textbox(label="输出目录 (outdir)",value="./video_out")# 添加说明gr.Markdown("""### 使用说明1. 单GPU模式:取消勾选"启用USP"选项2. 多GPU模式:- 勾选"启用USP"选项- 设置要使用的GPU数量- 需要固定的随机种子- 多GPU无法使用teacache3. 无法使用14B模型,若要使用需要单张显存大于60G### 更多信息访问 [GitHub仓库](https://github.com/SkyworkAI/SkyReels-V2) 获取详细文档和更新。""")# 生成按钮和输出信息generate_btn = gr.Button("生成视频")output_text = gr.Textbox(label="输出信息", visible=True, lines=3)# 视频预览部分gr.Markdown("### 视频预览")with gr.Row():with gr.Column(scale=4):video_player = gr.Video(label="视频播放",format="mp4",autoplay=False, # 自动播放选中的视频interactive=True # 允许用户控制播放)with gr.Column(scale=1):video_list = gr.Dropdown(label="选择视频",choices=scan_video_directory(),value=None,interactive=True)refresh_btn = gr.Button("🔄 刷新视频列表")# 更新事件绑定generate_btn.click(on_generate_click,inputs=[prompt, model_id, resolution, ar_step, base_num_frames, num_frames,overlap_history, addnoise_condition, use_usp, offload, seed, gpu_count,image, inference_steps, fps, shift, guidance_scale,causal_block_size, outdir, prompt_enhancer, teacache], # 添加teacacheoutputs=[output_text, video_player, video_list])video_list.change(on_video_select,inputs=[video_list],outputs=[video_player])refresh_btn.click(update_video_list,outputs=[video_list])if __name__ == "__main__":try:# 设置CUDA架构列表os.environ["TORCH_CUDA_ARCH_LIST"] = "8.6;8.9" # 30系和40系的架构# 设置CUDA内存分配策略os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"# 检测GPUgpu_count, gpu_ids = get_available_gpus()# 设置环境变量以消除tokenizers警告os.environ["TOKENIZERS_PARALLELISM"] = "false"if gpu_count == 0:print("警告:未检测到可用的GPU,系统将使用CPU运行(不推荐)")else:print(f"检测到{gpu_count}个GPU {gpu_ids}")os.environ["CUDA_VISIBLE_DEVICES"] = ",".join(map(str, gpu_ids))# 启动Gradio界面,移除不支持的参数demo.launch(server_name="0.0.0.0",server_port=8080,share=False,)finally:# 确保在程序退出时销毁进程组if dist.is_initialized():dist.destroy_process_group()
相关文章:
全球首款无限时长电影生成模型SkyReels-V2本地部署教程:视频时长无限制!
一、简介 SkyReels-V2 模型集成了多模态大语言模型(MLLM)、多阶段预训练、强化学习以及创新的扩散强迫(Diffusion-forcing)框架,实现了在提示词遵循、视觉质量、运动动态以及视频时长等方面的全面突破。通过扩散强迫框…...
代理ARP与传统ARP在网络通信中的应用及区别研究
一些问题 路由器隔离广播域,每个接口/网段都是独立的广播域ARP请求是二层广播包,广播包没法通过路由器ARP请求没法穿越互联网到达目标主服务器 一些思考 电脑访问互联网服务器的时候,ARP询问的内容,真的是访问服务器么…...
理解 Envoy 的架构
理解 Envoy 的架构对于深入理解 Istio 至关重要,因为 Envoy 是 Istio 数据平面的核心。Envoy 是一个高性能的 C 分布式代理,设计为云原生应用和大规模微服务架构的网络基础。 以下是 Envoy 架构的关键组成部分和核心理念: 核心设计理念&…...
使用Kotlin Flow实现Android应用的响应式编程
在Android应用中使用Kotlin Flow实现响应式编程可以分为以下步骤,结合最佳实践和生命周期管理: 1. 添加依赖 在build.gradle中确保包含协程和生命周期相关依赖: dependencies {implementation("org.jetbrains.kotlinx:kotlinx-corouti…...
【AI提示词】蝴蝶效应专家
提示说明 一位专注于分析和优化蝴蝶效应现象的专业人士,擅长将微小变化转化为系统级影响的研究者。 提示词 # Role: 蝴蝶效应专家## Profile - language: 中文 - description: 一位专注于分析和优化蝴蝶效应现象的专业人士,擅长将微小变化转化为系统级…...
StreamRL:弹性、可扩展、异构的RLHF架构
StreamRL:弹性、可扩展、异构的RLHF架构 大语言模型(LLMs)的强化学习(RL)训练正处于快速发展阶段,但现有架构存在诸多问题。本文介绍的StreamRL框架为解决这些难题而来,它通过独特设计提升了训…...
架构进阶:大型制造业企业数据架构顶层设计总体规划方案【附全文阅读】
本文概述了一个大型企业数据架构设计的总体规划方案,针对当前数据架构与管理中存在的诸多问题,如缺乏统一数据模型、数据分析应用体系不健全、主数据管理体系不完善、数据治理体系缺失等,提出了明确的改进目标与实施路径。 数据架构设计思路聚焦于明确数据分布和流向…...
前端指南——项目代码结构解析(React为例)
文件结构 文件项目 ├── doc │ ├── technology.md ├── node_modules ├── public ├── shell ├── src │ ├── auto-generated │ │ ├── apis │ │ ├── models │ ├── components │ │ ├── 组件A │ │ ├── 组件B …...
Redis-数据一致性问题与解决方案
Redis-数据一致性问题与解决方案 引言 Redis 是一个高性能的内存数据库,广泛应用于缓存、会话存储、实时分析等场景。作为一个 NoSQL 数据库,它的高性能和丰富的数据结构使其成为现代微服务架构中不可或缺的组件。然而,在高并发的环境下&am…...
【数据结构】算法的复杂度
前言:经过了C语言的学习,紧接着就步入到数据结构的学习了。在C语言阶段我们在写大多数的oj题的时候会遇到一些问题,就是算法的效率低使用的时间较多,占用的空间也多,数据结构就是来优化算法的。 文章目录 一ÿ…...
Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ
目录 (一)反转字符串Ⅱ的C实现 写法一(s.begin()遍历字符) (二)复杂度分析 时间复杂度 空间复杂度 (三)总结 【题目链接】541. 反转字符串Ⅱ - 力扣&am…...
制造单元智能化改造与集成技术平台成套实训设备
制造单元智能化改造与集成技术平台成套实训设备 一、概述: 本设备以汽车行业的轮毂为产品对象,实现了仓库取料、制造加工、打磨抛光、检测识别、分拣入位等生产工艺环节,以未来智能制造工厂的定位和需求为参考,通过工业以太网完成…...
Vscode 顶部Menu(菜单)栏消失如何恢复
Vscode 顶部Menu(菜单)栏消失如何恢复 https://blog.csdn.net/m0_62964247/article/details/135759655 Vscode 顶部Menu(菜单)栏消失如何恢复? 首先按一下 Alt按键,看一下是否恢复了菜单栏 如果恢复了想了解更进一步的设置,或是没能恢复菜单…...
苍穹外卖--公共字段自动填充
1.问题分析 业务表中的公共字段: 问题:代码冗余、不便于后期维护 2.实现思路 自定义注解AutoFill,用于标识需要进行公共字段填充的方法 自定义切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过反射为公…...
行业 |四大痛点待破:“拆解”DeepSeek一体机
繁荣DeepSeek一体机市场。 2025年开年,DeepSeek大模型掀起的一体机热潮席卷中国AI市场。这款一体机凭借其“开箱即用”的便利性和极低的门槛,吸引了大量企业关注,尤其是在中小企业和行业创新者中,更是成为了新晋“顶流”。 无论…...
革新锅炉厂智能控制——Ethernet IP转CANopen协议网关的工业互联新方案
锅炉厂智能化转型的必经之路 在工业4.0时代,锅炉厂作为能源供应的核心环节,正面临智能化升级的迫切需求。传统锅炉控制系统往往因协议不兼容、数据孤岛问题导致效率低下、维护成本高昂。如何实现设备间高效协同?如何让老旧设备融入智能网络&…...
基于卷积神经网络和Pyqt5的猫狗识别小程序
任务描述 猫狗分类任务(Dogs vs Cats)是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集,12500张未标记照片组成的测试集。选手需要在规定时间…...
Baklib知识中台引领服务智能跃迁
智能架构重构服务范式 Baklib 知识中台通过全量数据融合与多模态处理能力,重塑企业服务底层逻辑。基于分布式架构设计,平台将分散在业务系统、文档库及外部渠道的非结构化数据进行智能清洗与语义解析,形成标准化的知识元数据池。通过四库体系…...
【Python】超全常用 conda 命令整理
Conda命令整理文档,结合官方指南与高频使用场景分类说明,每个命令都有对应的解释 一、环境管理 1. 创建环境 基本创建conda create --name my_env # 创建名为my_env的空环境 conda create -n my_env python3.11 # 指定Python版本 conda creat…...
FreeRTOS菜鸟入门(十四)·事件
目录 1. 基本概念 2. 应用场景 3. 运作机制 4. 控制块 5. 事件函数接口 5.1 事件创建函数 xEventGroupCreate() 5.2 事件删除函数 vEventGroupDelete() 5.3 事件组置位函数 xEventGroupSetBits()(非中断) 5.4 事件组置位函数 xEventGr…...
setData执行后操作方法-微信小程序
在微信小程序中,setData 是异步执行的,如果你需要在 setData 执行完毕后执行某些操作,可以通过以下几种方式实现: 1. 使用 setData 的回调函数 从基础库 2.2.3 开始,setData 支持传入回调函数,回调会在数据…...
SpringAI特性
一、SpringAI 顾问(Advisors) Spring AI 使用 Advisors机制来增强 AI 的能力,可以理解为一系列可插拔的拦截器,在调用 AI 前和调用 AI 后可以执行一些额外的操作,比如: 前置增强:调用 AI 前改…...
捌拾叁- 量子傅里叶变换
1. 前言 最近公司地震,现在稍微有点时间继续学习。 看了几个算法,都说是基于 量子傅里叶变换 ,好,就是他了 Quantum Fourier。 2. 傅里叶变换 大学是学通信的,对于傅里叶变换还是有所理解的。其实就是基于一个 时域…...
SSTI模版注入
1、概念 SSTI是一种常见的Web安全漏洞,它允许攻击者通过注入恶意模板代码,使服务器在渲染模板时执行非预期的操作。 (1)渲染模版 至于什么是渲染模版:服务器端渲染模板是一种Web开发技术,它允许在服务器端…...
33、前台搜索功能怎么实现?
输入搜索的东西,如果为空 如果有 前端是提交表单,方式是 post 后端接受 调用 mybatisplus的categoryService.getById 用户在搜索框内输入关键字之后,执行 js 中的 load方法,前端提交表单, 后端 controller 中的loa…...
量化解析美英协议的非对称冲击:多因子模型与波动率曲面重构
摘要:基于机器学习算法对市场微观结构的实时监测,黄金价格在3300美元/盎司附近展开技术性反弹。本文通过多因子分析框架,解析美元指数上行、贸易政策突变及资产配置迁移对贵金属市场的复合影响,并构建基于LSTM神经网络的动态支撑位…...
对PyTorch模块进行性能分析
以下是针对PyTorch模块进行性能分析的完整方法与工具指南,结合了多种优化策略和实际应用场景: 一、PyTorch性能分析工具 PyTorch Profiler • 功能:内置的性能分析工具,支持捕获CPU/GPU操作、内存分配、数据形状及硬件利用率。 …...
lvm详细笔记
LVM简介 逻辑卷管理器,是Linux 系统中用于管理磁盘储存的关键技术。 LVM 则打破了磁盘分区一旦确定,其大小调整往往较为复杂,且难以灵活应对业务变化这种限制,它允许用户将多个物理分区组合卷组。例如,系统中的多个物…...
OpenHarmony 以太网卡热插拔事件接口无效
目录 1.背景 2.解决方案 1.背景 在OpenHarmony中调用以太网热插拔时间,发现热插拔没有任何回调,如下接口 import { ethernet } from kit.NetworkKit;ethernet.on(interfaceStateChange, (data: object) > {console.log(on interfaceSharingStateCha…...
SPDK NVMe of RDMA 部署
使用SPDK NVMe of RDMA 实现多NVMe设备共享 一、编译、安装spdk 1.1、下载 1.1.1 下载spdk源码 首先,我们需要从GitHub上克隆SPDK的源码仓库。打开终端,输入以下命令: git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk1.1.2…...
Go语言的逃逸分析是怎么进行的
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
纯净IP,跨境账号稳定的底层逻辑
在跨境业务快速扩张的背景下,越来越多的卖家、营销人、数据团队都开始使用代理IP来实现全球网络触达。然而,账号封禁问题始终如影随形,而背后的一个“隐性元凶”常常被忽视——纯净IP的缺失。本文将从实战角度出发,带你深入了解什…...
编译日志:关于编译opencv带有ffmpeg视频解码支持的若干办法
编译日志:关于编译opencv带有ffmpeg视频解码支持的若干办法 前言 笔者这里是封装了简单的OpenCV视频播放抽象,然后却发现移植到Ubuntu和开发板上都罢工的事情,原来是Windows平台下我们是默认下载了ffmpeg的库的,但是在泛Linu…...
djinn: 3靶场渗透
djinn: 3 来自 <https://www.vulnhub.com/entry/djinn-3,492/> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.243 3࿰…...
WHAT - 简单服务发现
文章目录 简单理解举个例子简单服务发现方式1. 静态配置(最简单,但不灵活)2. DNS 发现3. 使用服务注册中心(稍高级) 总结 “简单服务发现”(Simple Service Discovery)通常指的是一种让系统中的…...
auto推导类型原则
auto 是 C11 引入的类型自动推导关键字,它允许编译器根据表达式的类型来推导变量的确切类型。虽然使用 auto 可以让代码更简洁,但理解它的类型推导规则非常关键,尤其是在涉及指针、引用、const、模板等场景时。 ✅ 一、基本推导原则 auto x …...
44.辐射发射整改简易摸底测试方法
辐射发射整改简易摸底测试方法 1. 正式摸底预测试2. 简易方法预测试3. 分析频谱4. 探查传播路径5. 施加措施6. 与简易方法预测试效果对比 1. 正式摸底预测试 去正式实验室做一次预测试,取得频谱图;确定超标频点和超标量(备用)。 …...
初识C++:入门基础(二)
概述:该篇博客主要介绍C的缺省函数、函数重载、和引用等知识。 目录 1. 缺省参数 2. 函数重载 3. 引用 3.1 引用的概念和定义 3.2 引用的特性 3.3 引用的使用 3.4 const引用 3.5 指针和引用的关系 4. nullptr 5. 小结 1. 缺省参数 缺省参数是声明或定义函…...
我国脑机接口市场规模将破38亿元,医疗领域成关键突破口
当人类仅凭"意念"就能操控无人机编队飞行,当瘫痪患者通过"脑控"重新站立行走,这些曾只存在于科幻电影的场景,如今正通过脑机接口技术变为现实。作为"十四五"规划中重点发展的前沿科技,我国脑机接口…...
笔记,麦克风的灵敏度
麦克风的“灵敏度(Sensitivity)”决定了它捕捉声音细节的能力。想象麦克风是一只有耳朵的生物。高灵敏度麦克风像长着“超级顺风耳”的精灵,能听见花瓣飘落的声音、远处树叶的沙沙声,甚至你心跳的微弱震动。适合录音棚里捕捉歌手的…...
国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开Word文件,并用前端对话框实现填空填表
不管是政府机关、公司企业,还是金融行业、教育行业等单位,在办公过程中都经常需要填写各种文书和表格,比如通知、报告、登记表、计划表、申请表等。这些文书和表格往往是用Word文件制作的模板,比方说一个通知模板中经常会有“关于…...
AKS 支持 Kata Container容器沙盒 -预览阶段
您准备好提升您的云和 DevOps 技能了吗? 🐥《云原生devops》专门为您打造,我们精心打造的数十篇文章库,这些文章涵盖了 Azure、AWS 和 DevOps 方法论的众多重要主题。无论您是希望精进专业知识的资深专业人士,还是渴望…...
Ubuntu通过源码编译方式单独安装python3.12
1、安装依赖 sudo apt-get install zlib1g sudo apt-get install zlib1g-dev sudo apt-get install openssl sudo apt-get install libssl-dev2、编译源码并安装 wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz tar -xvf Python-3.12.0.tar.xz cd Pyth…...
【某OTA网站】phantom-token 1004
新版1004 phantom-token 请求头中包含phantom-token 定位到 window.signature 熟悉的vmp 和xhs一样 最新环境检测点 最新检测 canvas 下的 toDataURL方法较严 过程中 会用setAttribute给canvas 设置width height 从而使toDataURL返回不同的值 如果写死toDataURL的返回值…...
游戏引擎学习第266天:添加顶部时钟概览视图。
简要讨论使用第三方调试工具或在多个项目中复用自己的调试工具 今天的工作主要是在提升调试界面的可用性和美观性。昨天已经整理了布局代码,今天的目标是继续优化调试界面,使其更易用。我们已经为调试工具添加了许多新功能,并且在实现过程中…...
霸王茶姬微信小程序自动化签到系统完整实现解析
霸王茶姬微信小程序自动化签到系统完整实现解析 技术栈:Node.js 微信小程序API MD5动态签名 一、脚本全景架构 功能模块图 #mermaid-svg-0vx5W2xo0IZWn6mH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…...
AI与自然语言处理(NLP):从BERT到GPT的演进
AI与自然语言处理(NLP):从BERT到GPT的演进 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 AI与自然语言处理(NLP):从BERT到GPT的演进摘要引言…...
TRO高能预警,Keith律所×Tane Hannah Meets版权两案王炸维权
紧急避雷贴,keith律所代理Tane Hannah Meets 10个版权连发两案突袭跨境圈!案件详情如下: 案件基本情况: 起诉时间:2025-5-8 案件号:25-cv-05079、25-cv-05088 品牌:Tane Meets Works 原告&…...
在 Spring Boot 中选择合适的 HTTP 客户端
在现代的 Spring Boot 应用程序中,与外部服务进行 HTTP 通信是一个常见的需求。Spring Boot 提供了多种方式来实现 HTTP 请求,包括 Java 的 HttpClient、Spring 的 RestTemplate、WebClient,以及第三方库如 Apache HttpClient。本文将详细介绍…...
Go语言中 源文件开头的 // +build 注释的用法
// build注释主要用于实现条件编译。借助设置不同的构建标签(build tags),我们能够指定在特定的操作系统、架构或者其他自定义条件下才编译某个文件 1、基本规则 格式要求: 这种注释必须出现在文件的开头部分。注释与包声明之间至…...