大模型推理--Qwen2.5-Omni在A100上的初体验
过去的一周Qwen2.5-Omni产生了很高的热度,吸引了很多人的目光。它的多模态确实很吸引人,放出来的demo体验还算尚可(语音对话的延迟还是太大),所以就在A100 PCIe上实地部署了一下,初步对其速度进行了测试,以下是我的操作流程,供大家参考。
1.资源下载
1.1 下载git项目
首先下载官方git项目:
git clone https://github.com/QwenLM/Qwen2.5-Omni
该git没有太多有价值的资源,主要就是一个docker部署文件和一个web_demo,不过后续的流程基本都参考该git的readme实现,所以大家可以clone下来之后仔细研读readme。
1.2 下载模型文件
上面的git项目建议大家从魔塔社区下载,所以我就从modelscope进行了下载,命令如下:
pip install modelscope
modelscope download --model Qwen/Qwen2.5-Omni-7B
因为模型较大,下载时间估计在1小时以上,请慢慢等待。下载的模型可以放在上一步的git项目中。
2.环境配置
运行大模型除了显卡跑不起来之外,最麻烦的事情可能就是环境配置,往往需要折腾半天以上。幸好上面的git项目中提供了一个官方docker避免了我们自己搭建环境,个人建议就是直接使用该docker镜像,否则你会遇到很多麻烦,就像我一样。此外,官方还提供了一个Dockerfile,大家也可以采用该文件去手动构建可用的docker镜像。在此,我还是把自己的构建过程分享给大家,让大家在遇到相同问题时能不慌。
2.1 创建Docker容器
执行以下命令:
docker container run --net=host -v ~/Qwen2.5-Omni/:/workspace/Qwen2.5-Omni/ -it -d --name qwen2.5-omni --gpus device=7 cu12_torch250:1.0
docker container start 1602a
docker container exec -it 1602a bash
上述三条命令在后台创建一个容器,占用id为7的A100显卡,用的镜像叫cu12_torch250,这个镜像是我自己之前构造的,不是官方镜像。为了能长期使用该容器,我一般通过-d在后台启动,然后通过exec进入容器。退出容器通过ctrl+p加ctrl+q实现。
2.2 配置容器内软件环境
参照git中的readme卸载已安装的transformers库,并从源码安装特定版本的transformers库,执行如下命令:
pip uninstall transformers
pip install git+https://github.com/huggingface/transformers@f742a644ca32e65758c3adb36225aef1731bd2a8
pip install accelerate
pip install qwen-omni-utils[decord]
执行完第二步之后,pip list查看transformers版本为4.50.0.dev0。特别注意一点,第二步给出的版本号要仔细查看,git上的readme貌似给了两个不同的版本,有一个是不可用的。
在我的docker容器内,执行完第4步会提示:
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.
cugraph 23.12.0 requires cudf==23.12.*, which is not installed.
cugraph 23.12.0 requires dask-cudf==23.12.*, which is not installed.
cugraph-service-server 23.12.0 requires cudf==23.12.*, which is not installed.
cugraph-service-server 23.12.0 requires dask-cudf==23.12.*, which is not installed.
cuml 23.12.0 requires cudf==23.12.*, which is not installed.
cuml 23.12.0 requires dask-cudf==23.12.*, which is not installed.
dask-cuda 23.12.0 requires pynvml<11.5,>=11.0.0, which is not installed.
不过在后续的操作中没有用到报错的软件,所以我也没有去修复该错误。
官方git还建议按照flash-attn用来加速推理,命令如下:
pip install -U flash-attn --no-build-isolation
不过安装完之后flash-attn的版本应该是2.4.4。但是我之前已经安装过2.4.2.post1,所以就没有再重新安装。后续速度测试的时候还会提到flash-attn。
3. Web demo跑通
3.1 安装缺失的软件
可以直接用git中的requirements.txt来一键安装所有软件,不过大部分软件我都已经安装,为了不破坏原有安装软件的版本,我只安装了缺失的两个软件:
pip install gradio
pip install modelscope_studio
3.2 运行demo
启动命令为:
python web_demo.py --flash-attn2 --server-name '10.192.2.1'
在我的docker容器内,如果不加–flash-attn2则无法正常启动。启动之后提示可以通过http://10.192.2.1/7860访问网页。但是打开网页之后,摄像头、麦克风均因为网页不安全没有使用权限,只能通过offline页面上传音频文件进行体验。我上传了一个不到4s的音频文件,在经过十几秒的等待之后给我返回了结果。这个速度着实是慢的离谱啊!与魔塔和HF上相同的demo速度相比差得太远了。我又连续上传了几个音频文件,后台提示最后一轮推理的输入为:
[{‘role’: ‘system’, ‘content’: ‘You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.’}, {‘role’: ‘user’, ‘content’: [{‘type’: ‘audio’, ‘audio’: ‘/tmp/gradio/af6e0/test.wav’}]}, {‘role’: ‘assistant’, ‘content’: ‘嗯,那你好好洗个澡哈。洗完澡咱们再聊,有啥事儿都可以跟我说哦。’}, {‘role’: ‘user’, ‘content’: [{‘type’: ‘audio’, ‘audio’: ‘/tmp/gradio/4d4f8ecdb21/output5.wav’}]}, {‘role’: ‘assistant’, ‘content’: ‘中国最长的河流是长江。它全长约6300千米呢。你要是还想知道关于长江或者其他河流的事儿,可以再问我呀。’}, {‘role’: ‘user’, ‘content’: [{‘type’: ‘audio’, ‘audio’:‘/tmp/gradio/f57e72267b/output6.wav’}]}, {‘role’: ‘assistant’,‘content’: ‘我是阿里云研发的大规模语言模型,我叫通义千问,有什么我可以帮助你的吗?’}, {‘role’: ‘user’,‘content’: [{‘type’: ‘audio’, ‘audio’:‘/tmp/gradio/b83b0b07986/question.wav’}]}]
可以看出,它的多轮机制就是通过把之前的历史保留下来重复送给大模型推理实现的。这里有一个很大的问题,如果不做prefix Cache,历史会越来越长,推理速度也会越来越慢,不确定https://chat.qwen.ai/这个网址是如何实现的多轮。
这里还有另外一个疑问,因为还没有看过相关源码,所以不确定上述prompt中前几轮的wav文件会如何处理:是保持文本状态就一个单纯的文件链接,还是也会再提取音频的embedding信息。如果还会提取embedding信息,感觉重复计算又来了,如果不提取则感觉一个单纯的文件链接也没有什么意义。
4.速度测试
4.1 原始demo
鉴于3中的web_demo速度实在太慢了,所以我又仿照git中的示例代码在本地进行了速度验证。Demo代码如下:
import time
import torch
import soundfile as sffrom transformers import Qwen2_5OmniModel, Qwen2_5OmniProcessor
from qwen_omni_utils import process_mm_info# default: Load the model on the available device(s)
model = Qwen2_5OmniModel.from_pretrained("Qwen2.5-Omni-7B", torch_dtype="auto", device_map="auto", enable_audio_output=True)# 我们建议启用 flash_attention_2 以获取更快的推理速度以及更低的显存占用.
#model = Qwen2_5OmniModel.from_pretrained("Qwen2.5-Omni-7B", torch_dtype=torch.bfloat16, device_map="auto", attn_implementation="flash_attention_2", enable_audio_output=False)processor = Qwen2_5OmniProcessor.from_pretrained("Qwen2.5-Omni-7B")conversation = [{"role": "system","content": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",},{"role": "user","content": [{"type": "audio", "audio": "wav/test1.wav"},],},
]# set use audio in video
USE_AUDIO_IN_VIDEO = True# Preparation for inference
s = time.time()
text = processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False)
audios, images, videos = process_mm_info(conversation, use_audio_in_video=USE_AUDIO_IN_VIDEO)
inputs = processor(text=text, audios=audios, images=images, videos=videos, return_tensors="pt", padding=True, use_audio_in_video=USE_AUDIO_IN_VIDEO)
inputs = inputs.to(model.device).to(model.dtype)
e = time.time()
print(f'prepare time: {(e-s)*1000:.2f}ms')# Inference: Generation of the output text and audio
text_ids, audio = model.generate(**inputs, use_audio_in_video=USE_AUDIO_IN_VIDEO, return_audio=True)
s = time.time()
print(f'generate time: {(s-e)*1000:.2f}ms')
print(text_ids)text = processor.batch_decode(text_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)
e = time.time()
print(f'batch_decode time: {(e-s)*1000:.2f}ms')
print(text)sf.write("output.wav",audio.reshape(-1).detach().cpu().numpy(),samplerate=24000,
)
在上面的代码中我们暂时没有使用flash-attn进行加速,然后通过enable_audio_output=True来选择合成音频。还是web_demo测试时不到4s的音频文件,运行上述demo会打印: prepare time: 943ms, generate time: 11723ms,这个推理速度基本和web_demo一致,太慢了。
然后设置enable_audio_output=False,generate的参数设置return_audio=False来避免生成音频文件,则generate速度就可以由11.7s降低到1.7s。这说明推理耗时的大头都被TTS模块给占据了,不做TTS可以大幅提升推理速度。
4.2 stream demo
原始的demo中,一个4s不到的音频generate时间为1.7s,这个速度够快吗?我感觉还是挺慢的。所以我把原始demo改成流式输出,看看Qwen2.5生成每个token的速度有多快。Stream demo代码如下:
import time
import torch
import datetime
import builtins
import soundfile as sf
from threading import Threadfrom transformers import Qwen2_5OmniModel, Qwen2_5OmniProcessor, AutoTokenizer, TextIteratorStreamer
from qwen_omni_utils import process_mm_infodef custom_print(*args, **kwargs):current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]original_print(f'[{current_time}]', *args, **kwargs)# change print function to add time stamp
original_print = builtins.print
builtins.print = custom_print# default: Load the model on the available device(s)
model = Qwen2_5OmniModel.from_pretrained("Qwen2.5-Omni-7B", torch_dtype="auto", device_map="auto", enable_audio_output=False)# 我们建议启用 flash_attention_2 以获取更快的推理速度以及更低的显存占用.
#model = Qwen2_5OmniModel.from_pretrained("Qwen2.5-Omni-7B", torch_dtype=torch.bfloat16, device_map="auto", attn_implementation="flash_attention_2", enable_audio_output=False)processor = Qwen2_5OmniProcessor.from_pretrained("Qwen2.5-Omni-7B")
tokenizer = AutoTokenizer.from_pretrained("Qwen2.5-Omni-7B")
streamer = TextIteratorStreamer(tokenizer)conversation = [{"role": "system","content": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",},{"role": "user","content": [{"type": "audio", "audio": "wav/test1.wav"},],},
]# set use audio in video
USE_AUDIO_IN_VIDEO = True# Preparation for inference
s = time.time()
text = processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False)
audios, images, videos = process_mm_info(conversation, use_audio_in_video=USE_AUDIO_IN_VIDEO)
inputs = processor(text=text, audios=audios, images=images, videos=videos, return_tensors="pt", padding=True, use_audio_in_video=USE_AUDIO_IN_VIDEO)
inputs = inputs.to(model.device).to(model.dtype)
e = time.time()
print(f'prepare time: {(e-s)*1000:.2f}ms')# Inference: Generation of the output text and audio
generation_kwargs = {'streamer':streamer,'use_audio_in_video':USE_AUDIO_IN_VIDEO,'return_audio':False,**inputs
}
thread = Thread(target=model.generate, kwargs=generation_kwargs)
thread.start()
for token in streamer:print(token)
上述demo和原始demo类似,但是通过TextIteratorStreamer来实现逐token生成。另外,我修改了一下print,让它打印一下时间,重新跑一下会生成如下输出:
[2025-04-03 09:06:07.465] 嗯
[2025-04-03 09:06:07.542]
[2025-04-03 09:06:07.577] ,那你
[2025-04-03 09:06:07.610] 好好
[2025-04-03 09:06:07.644] 洗
[2025-04-03 09:06:07.679] 个
[2025-04-03 09:06:07.727] 澡
[2025-04-03 09:06:07.769] 哈
[2025-04-03 09:06:07.808]
[2025-04-03 09:06:07.847] 。洗
[2025-04-03 09:06:07.886] 完
[2025-04-03 09:06:07.924] 澡
[2025-04-03 09:06:07.963] 咱们
[2025-04-03 09:06:08.001] 再
[2025-04-03 09:06:08.034] 聊
[2025-04-03 09:06:08.067]
[2025-04-03 09:06:08.108] ,有
[2025-04-03 09:06:08.151] 啥
[2025-04-03 09:06:08.194] 事儿
[2025-04-03 09:06:08.228] 都可以
[2025-04-03 09:06:08.262] 跟我说
[2025-04-03 09:06:08.295] 哦
[2025-04-03 09:06:08.329]
[2025-04-03 09:06:08.362]
[2025-04-03 09:06:08.363] 。<|im_end|>
通过分析每两行之间的时间差,大概可以知道每个token的生成时间大概为30~40ms左右,也即每秒大概生成2、30个token。我感觉这个速度还是挺慢的。
4.3 batch demo
官方git中提到,在不生成音频的情况下,还可以通过batch的方式进行推理。我又仿照官方给出的示例代码写了一个batch demo,代码如下:
import time
import torch
import soundfile as sffrom transformers import Qwen2_5OmniModel, Qwen2_5OmniProcessor
from qwen_omni_utils import process_mm_info# default: Load the model on the available device(s)
model = Qwen2_5OmniModel.from_pretrained("Qwen2.5-Omni-7B", torch_dtype="auto", device_map="auto", enable_audio_output=False)# 我们建议启用 flash_attention_2 以获取更快的推理速度以及更低的显存占用.
#model = Qwen2_5OmniModel.from_pretrained("Qwen2.5-Omni-7B", torch_dtype=torch.bfloat16, device_map="auto", attn_implementation="flash_attention_2", enable_audio_output=False)processor = Qwen2_5OmniProcessor.from_pretrained("Qwen2.5-Omni-7B")conversation1 = [{"role": "system","content": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",},{"role": "user","content": [{"type": "audio", "audio": "wav/test1.wav"},],},
]conversation2 = [{"role": "system","content": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",},{"role": "user","content": [{"type": "audio", "audio": "wav/test2.wav"},],},
]conversation3 = [{"role": "system","content": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",},{"role": "user","content": [{"type": "audio", "audio": "wav/test3.wav"},],},
]conversation4 = [{"role": "system","content": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",},{"role": "user","content": [{"type": "audio", "audio": "wav/test4.wav"},],},
]conversation5 = [{"role": "system","content": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",},{"role": "user","content": [{"type": "audio", "audio": "wav/test5.wav"},],},
]conversations=[conversation1, conversation2, conversation3, conversation4, conversation5]# set use audio in video
USE_AUDIO_IN_VIDEO = True# Preparation for inference
s = time.time()
text = processor.apply_chat_template(conversations, add_generation_prompt=True, tokenize=False)
audios, images, videos = process_mm_info(conversations, use_audio_in_video=USE_AUDIO_IN_VIDEO)
inputs = processor(text=text, audios=audios, images=images, videos=videos, return_tensors="pt", padding=True, use_audio_in_video=USE_AUDIO_IN_VIDEO)
inputs = inputs.to(model.device).to(model.dtype)
e = time.time()
print(f'prepare time: {(e-s)*1000:.2f}ms')# Inference: Generation of the output text and audio
text_ids = model.generate(**inputs, use_audio_in_video=USE_AUDIO_IN_VIDEO, return_audio=False)
s = time.time()
print(f'generate time: {(s-e)*1000:.2f}ms')
print(text_ids)text = processor.batch_decode(text_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)
e = time.time()
print(f'batch_decode time: {(e-s)*1000:.2f}ms')
print(text)
在上述代码中,我将5个长度在1~4s之间的音频文件一起灌给Qwen2.5-Omni进行推理,prepare的耗时大概在2.2s,generate的时间大概在4.4s。这个速度肯定比顺序算5个文件要快,但是整体的速度还是很慢。大概就是:5个4s的音频文件batch推理需要7s,这根本就无法用在实时的环境下,只适合离线场景。
5.推理加速
目前我还没有跑通官方给出的两种加速思路:flash-attn和vLLM,后续跑通会及时更新,先把我的教训分享给大家。
5.1 flash-attn
前面提到我没有按照官方的要求安装最新版的flash-attn,因为之前已经安装过一次。上一节给出的demo中在加载模型时有对应的flash-attn支持,但是我试用了一下发现速度根本没有变化,不知道是咋回事。然后我又尝试利用命令pip install -U flash-attn --no-build-isolation安装最新版的flash-attn,但是安装过程极为漫长,我都下班了也没有安装完,遂杀了下周重试。
5.2 vLLM
官方还给出了vLLM示例。但是用的vLLM版本不是主版本,所以需要我们自己进行源码编译。编译命令如下:
git clone -b qwen2_omni_public_v1 https://github.com/fyabc/vllm.git
cd vllm
pip install .
看着很简单,但是你一执行就会发现此路根本行不通。问题出在哪呢?就出在安装过程特别漫长,占用资源特别巨大,你一个不注意就把你机器整崩了。首先,当安装过程提示Installing build dependencies时,你要耐心等待,该步骤会耗时3个小时以上。其次,当上述步骤完成之后,还会触发torch2.6.0和transformers4.50.3等一系列软件的更新,如果安装完毕就会导致你的docker容器环境大变样。更为恶心的是,更新了transformers库又把上面刚新装的transformers库给覆盖了,上述demo变得无法跑通,还得按照前面提到的流程更新transformers库,幸好我没有安装成功。最后,当安装进行到最后一步Building wheels for collected packages,你要及时打开你的top命令,你就会发现你的所有核都被占满了,内存也在慢慢增长。我用的服务器内存是500G,结果一会不到就全部占满了。之前安装flash-attn的时候也经历过一次,当时的后果就是服务器挂了被迫重启。所以这次在安装vLLM的时候当内存快爆掉的时候我就把它杀了,最终也没有成功安装vLLM。
所以,最好的方式还是要使用官方的docker镜像,等有了新的实验结果及时同步给大家。
6.疑问
我看魔塔和git上的issue累积越来越多,感觉是官方一下子被整懵了。我个人觉得现在放出来的这个Qwen2.5-Omni有点仓促上马的意味,相当不完善。有很多人也包括我都有一个疑问:为什么https://chat.qwen.ai/给出的demo可以比较好的支持流式对话(当然延迟比较大,一般在2~4s),但是HF和魔塔上给出的demo却是需要上传文件的形式?如何实现纯粹的流式推理?毕竟上传文件这种形式在实际中没有太大意义。另一个疑问,为什么我自己用A100搭建的web_demo速度这么慢,与HF和魔塔上的速度对比差异太大了,官方最好能给一个比较明确的运行方式和硬件配置。还有,我自己测试flash-attn速度没有变化,这个是和我安装的flash-attn不是最新版有关吗?最后,Qwen2.5-Omni的多轮是如何实现的,如何避免prompt重复推理的?
不知道大家有没有发现,Freeze-Omni的作者wang xiong也是Qwen2.5-Omni的作者。理论上,Qwen2.5-Omni应该可以比较快得具有Freeze-Omni那样的流式推理能力(我怀疑https://chat.qwen.ai/这个网址就是按照Freeze-Omni那样实现的)。Freeze-Omni这个项目挺好的,但是是基于Qwen2做的,所以效果要比Qwen2.5-Omni略差,期待wang xiong大佬能快速开源一个新版的Freeze-Omni。Freeze-Omni的另一个问题是成本太高了,单卡单用户,根本无法上线。Qwen2.5-Omni相比Freeze-Omni效果有提升,但是也不完美,它的知识可能和Qwen2是一样的,比较老旧。我问了他一个问题:特朗普还是美国总统吗?它回答不是了。所以基本上来说,Qwen2.5-Omni也还属于一个玩具,无法与线上几十B的大模型效果相匹配,希望这个月发布的Qwen3能大幅提升文本效果。
紧跟着Qwen2.5-Omni的发布,百度也发布了自己的端到端语音大模型,号称双L20卡的并发可以做到几百以上,如果真是如此那端到端语音大模型终于迎来了商业落地的重大时刻。不过根据百度以往的习惯,他们的技术都不开源,基本属于自嗨的一种状态,业界也没有人真正去follow。希望李彦宏这次被Deepseek刺激之后,往后多多开源,让我们这些小企业能真正受益。
相关文章:
大模型推理--Qwen2.5-Omni在A100上的初体验
过去的一周Qwen2.5-Omni产生了很高的热度,吸引了很多人的目光。它的多模态确实很吸引人,放出来的demo体验还算尚可(语音对话的延迟还是太大),所以就在A100 PCIe上实地部署了一下,初步对其速度进行了测试&am…...
二分查找例题
本篇基于b站灵茶山艾府。 34. 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你…...
新增一种线性回归的增量学习框架,已更新31个模型!Matlab回归预测大合集又更新啦!
目录 效果图基本介绍程序设计参考资料 效果图 基本介绍 一种线性回归的增量学习框架,程序研究的主要内容是线性回归模型的增量学习实现及其在房价预测中的应用,旨在通过分块处理数据逐步更新模型,以适应动态数据环境并减少计算资源消耗。 详…...
P1025 [NOIP 2001 提高组] 数的划分(DFS)
题目描述 将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。 例如:n7,k3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1. 问有多少种不同的分法。 输入格式 n,k …...
SQL Server存储过程和触发器的使用
存储过程 (1)创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。 1. Create PROCEDURE test number1 int output --输出参数,可以从程序中返回信息 2. As 3. begin 4. D…...
Elastic 的 OpenTelemetry 分发版(EDOT)现已正式发布:开源、可用于生产环境的 OTel
作者:来自 Elastic Miguel Luna 及 Bahubali Shetti Elastic 自豪地宣布正式发布 Elastic OpenTelemetry 分发版(Elastic Distributions of OpenTelemetry - EDOT),其中包含 Elastic 自定义版本的 OpenTelemetry Collector 以及多…...
springMVC-Json交互处理
什么是JSON JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。 采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也…...
MySQL中的索引
explain关键字, MySQL索引特性 索引的概念 MySQL 索引是一种用于提高数据库查询效率的数据结构 数据库表中存储的数据都是以记录为单位的,如果在查询数据时直接一条条遍历表中的数据记录,那么查询的时间复杂度将会是 O ( N )。索引的价值在…...
AI小白:JavaPython开发环境双轨制搭建指南
文章目录 1 Python深度学习环境配置1.1 Anaconda生态体系建设1.2 JupyterLab高效工作流魔法命令与可视化调试扩展插件配置指南 2 Java深度学习方案:DL4J实战2.1 企业级部署架构设计2.2 集成传统Java系统Spring Boot微服务封装模型性能优化技巧 1 Python深度学习环境…...
《比特城的机密邮件:加密、签名与防篡改的守护之战》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 第一章:风暴前的密令 比特城的议会大厅内,首席长老艾德文握着一卷足有半人高的羊皮纸,眉头紧锁。纸上是即将颁布的《新纪元法典》——这份文件不仅内…...
Redis之布隆过滤器
面试场景切入 针对于电话号码问题的痛点 布隆过滤器是什么? 由一个初值都为0的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素。 设计思想 本质就是判断具体数据是否存在于一个大的集合中。布隆过滤器是一种类似Set的数据结构&#…...
这是一份简单优雅的Prompt Engineering教程
Prompt Engineering(提示工程)是通过精心设计输入文本(prompt)来引导大型语言模型(LLM)生成更准确、相关且符合预期的输出的技术。其核心在于通过调整提问的措辞、结构、上下文和附加信息,优化模…...
Java基础 4.6
1.成员方法练习 //编写类A:判断一个数是奇数还是偶数,返回boolean //根据行、列、字符打印对应行数和列数的字符,比如:行4 列4 字符# 则打印相应的效果 public class MethodExercise01 {public static void main(String[] args) …...
DApp实战篇:前端技术栈一览
前言 在前面一系列内容中,我们由浅入深地了解了DApp的组成,从本小节开始我将带领大家如何完成一个完整的DApp。 本小节则先从前端开始。 前端技术栈 在前端开发者速入:DApp中的前端要干些什么?文中我说过,即便是在…...
C++中如何比较两个字符串的大小--compare()函数实现
一、现在有一个问题描述:有两个字符串,要按照字典顺序比较它们的大小(注意所有的小写字母都大于所有的大写字母 )。 二、代码 #include <bits/stdc.h> using namespace std;int main() {string str1 "apple";…...
c++中的auto关键字
在 C 中,auto 是一个类型推断关键字(C11 引入),允许编译器根据变量的初始化表达式自动推导其类型。它极大地简化了代码编写,尤其在涉及复杂类型或模板的场景中。以下是 auto 的详细说明: 1. 基本用法 1.1 …...
zk源码—1.数据节点与Watcher机制及权限二
大纲 1.ZooKeeper的数据模型、节点类型与应用 (1)数据模型之树形结构 (2)节点类型与特性(持久 临时 顺序 ) (3)节点的状态结构(各种zxid 各种version) (4)节点的版本(version cversion aversion) (5)使用ZooKeeper实现锁(悲观锁 乐观锁) 2.发布订阅模式࿱…...
交换机和集线器的区别
集线器(Hub)—— 大喇叭广播站 工作原理: 集线器像村里的“大喇叭”,收到任何消息都会广播给所有人。 比如A对B说“你好”,全村人(C、D、E)都能听到,但只有B会回…...
微服务系统记录
记录下曾经工作涉及到微服务的相关知识。 1. 架构设计与服务划分 关键内容 领域驱动设计(DDD): 利用领域模型和限界上下文(Bounded Context)拆分业务,明确服务边界。通过事件风暴(Event Storm…...
同花顺客户端公司财报抓取分析
目标客户端下载地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要难点在登陆,获取token中的 jgbsessid (每次重新登录这个字段都会立即失效,且有效期应该是15天的) 抓取jgbsessid 主要通过安装mitmproxy 使用 mitmdump + 下边的脚本实现监听接口…...
二叉树与红黑树核心知识点及面试重点
二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义:每个节点最多有两个子节点(左子节点和右子节点) 术语: 根节点:最顶层的节点 叶子节点:没有子节点的节点 深度…...
Rocket-JWT鉴权
目录 一、概述 二、相关依赖 三、环境准备 3.1 创建项目 3.2 读取私钥信息 3.3 token数据负载 3.4 生成token 四、Web鉴权 4.1 验证载体 4.2 接收请求 五、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rocket-JWT鉴权] ❤博主广交技术好友,喜…...
2025 年网络安全终极指南
我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权,而是所有用户的共同责任。通过简单的行动,我们可以保护我们的数据、隐私和财务,降低成为…...
横扫SQL面试——PV、UV问题
📊 横扫SQL面试:UV/PV问题 🌟 什么是UV/PV? 在数据领域,UV(Unique Visitor,独立访客) 和 PV(Page View,页面访问量) 是最基础也最重要的指标&…...
ctf-show-杂项签到题
下载文件,解压需要密码,用010打开没看出什么 然后用Advanced Archive Password Recovery暴力破解,发现没用 怀疑是伪解密,解压出来发现加密受损用随波逐流修复加密文件 打开修复的加密文件直接得flag flag:flag{79d…...
对解释器模式的理解
对解释器模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1096)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用解释器模式1、代码2、“缺点” 三、采用解释器模式1、代码2、“优点” 四、思考1、解释器模式的意义…...
高频面试题(含笔试高频算法整理)基本总结回顾64
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
python入门之从安装python及vscode开始
本篇将解决三个问题: 1. 如何下载及安装官方python? 2. 如何下载及安装vscode? 3. 如何配置vscode的python环境? 一、python下载及安装 1.搜索python,找到官网并打开 2.找到download,按需选择版本下载 …...
OpenGL学习笔记(模型材质、光照贴图)
目录 光照与材质光照贴图漫反射贴图采样镜面光贴图 GitHub主页:https://github.com/sdpyy OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 光照与材质 在现实世界里&…...
视觉_transform
visual_transform 图像分块 (Patch Embedding) 假设输入图像为 x ∈ R ∗ H ∗ ∗ W ∗ ∗ C ∗ x∈R^{*H**W**C*} x∈R∗H∗∗W∗∗C∗ C 是图像的通道数(例如,RGB图像的 C3) 将图像分割成N个大小为P*CP的patch,每个patch的大…...
Redis的安装及通用命令
二. Redis 的安装及通用命令 1. Ubuntu 安装 Redis (1) 切换到 root 用户: su root(2) 搜索 Redis 软件包 apt search redis(3) 安装 Redis apt install redis(4) 查看 Redis netstat -anp | grep redis(5) 切换到 Redis 目录下 cd /etc/redis/(6) 修改 Redis 配置文件:…...
Python 实现的运筹优化系统代码详解(0-1规划背包问题)
一、引言 在数学建模与实际决策场景的交织领域中,诸多复杂问题亟待高效且精准的解决方案。0-1 规划作为一种特殊且极为重要的优化方法,宛如一把万能钥匙,能够巧妙开启众多棘手问题的解决之门。它专注于处理决策变量仅能取 0 或 1 这两种极端状…...
护网蓝初面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
音视频学习(三十二):VP8和VP9
VP8 简介 全称:Video Processing 8发布者:原 On2 Technologies(2010 被 Google 收购)定位:开源视频压缩标准,主要竞争对手是 H.264应用: WebRTC 视频通信HTML5 <video> 标签(…...
美国mlb与韩国mlb的关系·棒球9号位
MLB(Major League Baseball,美国职业棒球大联盟)作为全球最高水平的职业棒球联赛,与韩国市场流行的“MLB”时尚品牌之间存在着授权合作关系,但两者在业务范畴和品牌定位上存在显著差异。 一、品牌授权背景:…...
免费在线PUA测试工具:识别情感操控,守护情感健康
免费在线PUA测试工具:识别情感操控,守护情感健康 你是否曾经在感情中感到困惑、不安,甚至怀疑自己?今天为大家推荐一个专业的PUA测试工具,帮助你识别是否正在经历情感操控。 测试工具链接:PUA测试工具 什么…...
nginx中的try_files指令
try_files 是 Nginx 中一个非常有用的指令,用于按顺序检查文件是否存在,并返回第一个找到的文件。如果所有指定的文件都不存在,则执行回退逻辑,如重定向到一个指定的 URI 或返回一个错误代码。 作用 文件查找:按顺序检…...
[特殊字符] 驱动开发硬核特训 · Day 4
主题:从硬件总线到驱动控制 —— I2C 协议与传感器驱动开发全解析 I2C(Inter-Integrated Circuit)总线是一种广泛用于嵌入式设备的串行通信协议,因其低成本、简单布线和多从设备支持,成为连接各种传感器(温…...
Python 实现玻璃期货数据处理、入库与分析:从代码到应用
Python 实现期货数据处理与分析:从代码到应用 引言 在金融市场中,期货数据的处理和分析对于投资者和分析师来说至关重要。Python 凭借其丰富的库和简洁的语法,成为了处理和分析期货数据的强大工具。本文将详细解读一段用于处理期货持仓和行…...
神经网络之损失函数
引言:损失函数 (Loss Function)是机器学习和深度学习中非常重要的一个概念。用于衡量模型的预测值与真实值之间的差异,从而指导模型优化其参数以最小化这种差异。 一、损失函数作用 量化误差:损失函数是将预测值和真实…...
在Ubuntu内网环境中为Gogs配置HTTPS访问(通过Apache反向代理使用IP地址)
一、准备工作 确保已安装Gogs并运行在HTTP模式(默认端口3000) 确认服务器内网IP地址(如192.168.1.100) 二、安装Apache和必要模块 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、创建SSL证书 1. 创建证书存储目录…...
printf
printf() 是 C 和 C 标准库中的一个输出函数,位于 <cstdio> 头文件中。下面为你详细介绍它的相关知识点。 1. 基本使用 printf() 函数的作用是按照指定格式将数据输出到标准输出设备(通常是控制台)。其基本语法如下: cpp …...
Leetcode 311 Sparse Matrix Multiplication 稀疏矩阵相乘
Problem Given two sparse matrices A and B, return the result of AB. You may assume that A’s column number is equal to B’s row number. Example: A [[ 1, 0, 0],[-1, 0, 3] ]B [[ 7, 0, 0 ],[ 0, 0, 0 ],[ 0, 0, 1 ] ]| 1 0 0 | | 7 0 0 | | 7 0 0 | AB …...
mysql和sqlite关于data数据的识别问题
<input type"date" name"birthday" value""> # 表单传入的日期 birthday request.form.get(birthday) # 获取日期 birthday Column(birthday, Date, comment出生日期, nullableTrue) # 数据库的数据字段模型 birthday_str request…...
2024 天梯赛——工业园区建设题解
思路 将点 i i i 视为固定点, 点 j j j 视为灵活点,其中 s i 1 s_{i} 1 si1, s j 0 s_{j} 0 sj0。维护四个队列,其中 q 0 q_{0} q0 和 q 1 q_{1} q1 分别维护还没有被选用的固定点 和 灵活点, Q 0 Q…...
亚马逊AI新功能上线:5大亮点解锁精准消费预测
在人工智能技术不断重塑跨境电商生态之际,全球电商巨头亚马逊(Amazon)再次迈出关键一步。近日,亚马逊正式对其卖家中心推出一系列基于AI的新功能,聚焦于消费数据预测、用户行为洞察、库存智能管理与个性化营销服务等方…...
opus+ffmpeg+c++实现录音
说明: opusffmpegc实现录音 效果图: step1:C:\Users\wangrusheng\source\repos\WindowsProject1\WindowsProject1\WindowsProject1.cpp // WindowsProject1.cpp : 定义应用程序的入口点。 //#include "framework.h" #include "Windows…...
ComfyUI的本地私有化部署使用Stable Diffusion文生图
什么是ComfyUI ? ComfyUI是一个基于节点流程的Stable Diffusion操作界面。以下是关于它的详细介绍: 特点与优势 高度可定制:提供丰富的节点类型,涵盖文本处理、图像处理、模型推理等功能。用户可根据需求自由组合节点࿰…...
【学习笔记17】Windows环境下安装RabbitMQ
一. 下载RabbitMQ( 需要按照 Erlang/OTP 环境的版本依赖来下载) (1) 先去 RabbitMQ 官网,查看 RabbitMQ 需要的 Erlang 支持:https://www.rabbitmq.com/ 进入官网,在 Docs -> Install and Upgrade -> Erlang V…...
【LeetCode 热题100】55:跳跃游戏(详细解析)(Go语言版)
🚀 LeetCode 热题 55:跳跃游戏(Jump Game)完整解析 📌 题目描述 给定一个非负整数数组 nums,你最初位于数组的第一个下标。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一…...