当前位置: 首页 > news >正文

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试

      • **背景与目标**
    • 一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】
    • 二.操作步骤
      • 2.1 在`x86-Linux`上生成`onnx`模型,以及`tflite`量化模型(避免在RK3588上安装过多依赖)
        • 2.1.1 创建容器
        • 2.1.2 安装依赖
        • 2.1.3 下载推理图片
        • 2.1.4 生成`onnx`模型
        • 2.1.5 `onnx`转`tensorflow`,验证结果是否正确
        • 2.1.6 `tensorflow saved_model` 转`tflite`,验证结果是否正确
      • 2.2 `RK3588`上运行`ArmNN`推理测试
        • 2.2.1 下载`ArmNN SDK`,设置环境变量
        • 2.2.2 创建`MSE`计算脚本
        • 2.2.3 测试`CPU-FP32`的`MSE`
        • 2.2.4 测试`GPU-FP32`的`MSE`
        • 2.2.4 测试`CPU-FP16`的`MSE`
        • 2.2.5 测试`GPU-FP16`的`MSE`
        • 2.2.6 测试`CPU-INT8`的`MSE`
        • 2.2.7 测试`GPU-INT8`的`MSE`
        • 2.2.8 性能测试

背景与目标

本文在RK3588芯片上完成了以下任务:

  1. 将PyTorch的ResNet-50模型转换为ONNX格式
  2. 将ONNX模型转换为TFLite(FP16、INT8)
  3. 在RK3588平台使用ArmNN 测试CPU和GPU上,不同精度模型的推理性能与精度损失
  4. 通过MSE(均方误差)和执行时间两个指标评估各模型表现

一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】

  • 模型:resnet50 输入:[1,3.224,224 float32] 输出:[1,1000 float32]
精度类型CPU推理时间(ms)GPU推理时间(ms)结果正确性(MSE)
ONNX FP32175.3971.74MSE:0.00000
TFLite FP16117.1066.84MSE:0.00000
TFLite INT846.88 MSE:4.3317627.59 MSE:4.28963CPU上推理的MSE: 4.276822

二.操作步骤

2.1 在x86-Linux上生成onnx模型,以及tflite量化模型(避免在RK3588上安装过多依赖)

2.1.1 创建容器
docker run -it --privileged --net=host \-v $PWD:/home -w /home --rm  nvcr.io/nvidia/pytorch:24.03-py3 /bin/bash
2.1.2 安装依赖
pip install tensorflow==2.15 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tensorflow_probability==0.22 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install onnx onnx-tf  -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install onnx-simplifier -i https://pypi.tuna.tsinghua.edu.cn/simple
2.1.3 下载推理图片
wget https://raw.githubusercontent.com/hi20240217/csdn_images/refs/heads/main/YellowLabradorLooking_new.jpg
2.1.4 生成onnx模型
cat> resnet50.py <<-'EOF'
import requests
from PIL import Image
from io import BytesIO
import torchvision.transforms as transforms
import torch
import numpy as np
import torchvision.models as models# 读取图片
image = Image.open("YellowLabradorLooking_new.jpg")# 定义预处理流程
preprocess = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])# 应用预处理
img_t = preprocess(image)
input_tensor = torch.unsqueeze(img_t, 0).float()input_np=input_tensor.numpy()# 保存预处理好的输入,用于后面量化和精度对比
np.savetxt('resnet50_input.txt',input_np.reshape(-1), delimiter=' ', fmt='%.6f')
np.save('resnet50_input.npy',input_np)# 加载预训练的ResNet50模型
model = models.resnet50(pretrained=True).float()
model.eval()  # 将模型设为评估模式# 执行前向推理
with torch.no_grad():output = model(input_tensor).numpy()# 保存推理的结果,用于后面对比精度
np.savetxt('resnet50_output.txt',output.reshape(-1), delimiter=' ', fmt='%.6f')# 获取预测类别
predicted = np.argmax(output)
print("Index:",predicted)input_names = ["input"]
output_names = ["output"]
torch.onnx.export(model, input_tensor, "resnet50.onnx", verbose=False, input_names=input_names, output_names=output_names)
EOF
python3 resnet50.py
onnxsim resnet50.onnx resnet50_opt.onnx
2.1.5 onnxtensorflow,验证结果是否正确
cat> onnx2tf.py<<-'EOF'  
import onnx
from onnx_tf.backend import prepare
onnx_model = onnx.load("resnet50_opt.onnx")   # 加载ONNX模型
tf_rep = prepare(onnx_model)                  # 转换为TensorFlow表示
tf_rep.export_graph("saved_model")            # 导出为SavedModel格式import tensorflow as tf
import numpy as np
tf_model = tf.saved_model.load("saved_model")
tf_model = tf_model.signatures["serving_default"]  # 获取推理函数# 验证结果是否符合预期
input_data = np.load('resnet50_input.npy')
tf_input = tf.constant(input_data)
tf_output = tf_model(tf_input)
print(tf_output.keys())
tf_output = tf_output["output"].numpy()
predicted = np.argmax(tf_output)
print("Index:",predicted)
EOF
rm saved_model -rf
python3 onnx2tf.py
2.1.6 tensorflow saved_modeltflite,验证结果是否正确
cat> tf2lite.py<<-'EOF'  
import numpy as np
import sys
import tensorflow as tfdef representative_dataset():for _ in range(1):data = tf.convert_to_tensor(np.load('resnet50_input.npy').astype(np.float32))yield [data]converter = tf.lite.TFLiteConverter.from_saved_model("saved_model")
converter.optimizations = [tf.lite.Optimize.DEFAULT]          # 启用默认优化quant_type=sys.argv[1]
output_path=sys.argv[2]if quant_type=="int8":converter.representative_dataset = representative_dataset                    # 设置代表数据集converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]  # 全整数支持
else:converter.target_spec.supported_types = [tf.float16]tflite_quant_model = converter.convert()
with open(output_path, "wb") as f:f.write(tflite_quant_model)# 推理验证部分
def validate_inference():# 加载原始模型original_model = tf.saved_model.load("saved_model")infer = original_model.signatures["serving_default"]# 加载量化模型interpreter = tf.lite.Interpreter(model_content=tflite_quant_model)interpreter.allocate_tensors()# 获取模型IO详细信息input_details = interpreter.get_input_details()output_details = interpreter.get_output_details()# 加载测试数据test_data = np.load('resnet50_input.npy')# 原始模型推理original_input = tf.constant(test_data, dtype=tf.float32)original_output = infer(original_input)original_output = list(original_output.values())[0].numpy()# 量化模型输入预处理input_shape = input_details[0]['shape']input_dtype = input_details[0]['dtype']# 处理量化参数(如果存在)if input_details[0]['quantization'] != (0, 0):scale, zero_point = input_details[0]['quantization']quantized_input = np.round(test_data / scale + zero_point)quantized_input = np.clip(quantized_input, np.iinfo(input_dtype).min,np.iinfo(input_dtype).max).astype(input_dtype)else:quantized_input = test_data.astype(input_dtype)# 设置输入并推理interpreter.set_tensor(input_details[0]['index'], quantized_input)interpreter.invoke()# 获取输出并反量化(如果需要)quant_output = interpreter.get_tensor(output_details[0]['index'])if output_details[0]['quantization'] != (0, 0):scale, zero_point = output_details[0]['quantization']quant_output = (quant_output.astype(np.float32) - zero_point) * scale# 计算误差指标print("Index:",np.argmax(original_output),np.argmax(quant_output))mse = np.mean((original_output - quant_output) ** 2)mae = np.mean(np.abs(original_output - quant_output))print("\n验证结果:")print(f"原始模型输出均值:{np.mean(original_output):.4f}")print(f"量化模型输出均值:{np.mean(quant_output):.4f}")print(f"均方误差 (MSE): {mse:.6f}")print(f"平均绝对误差 (MAE): {mae:.6f}")# 执行验证
validate_inference()
EOF
python3 tf2lite.py int8 resnet50_int8.tflite
python3 tf2lite.py fp18 resnet50_fp16.tflite

输出

# int8 (已经存在误差)
Index: 208 904
验证结果:
原始模型输出均值:0.0000
量化模型输出均值:0.0006
均方误差 (MSE): 4.276822
平均绝对误差 (MAE): 1.536772# fp16
Index: 208 208
验证结果:
原始模型输出均值:0.0000
量化模型输出均值:0.0000
均方误差 (MSE): 0.000003
平均绝对误差 (MAE): 0.001248

2.2 RK3588上运行ArmNN推理测试

2.2.1 下载ArmNN SDK,设置环境变量
wget https://github.com/ARM-software/armnn/releases/download/v25.02/ArmNN-linux-aarch64.tar.gz
tar -xf ArmNN-linux-aarch64.tar.gz
export LD_LIBRARY_PATH=$PWD:$PWD/delegate:$LD_LIBRARY_PATH
2.2.2 创建MSE计算脚本
cat> compute_mse.py<<-'EOF'  
import numpy as np
import sys
l = np.loadtxt(sys.argv[1], delimiter=' ').reshape(-1)
r = np.loadtxt(sys.argv[2], delimiter=' ').reshape(-1)
print(l.shape,r.shape)
print(l[:8])
print(r[:8])
mse=np.mean((l - r) ** 2)
print(f'MSE:{mse:.5f}')
EOF
2.2.3 测试CPU-FP32MSE
./ExecuteNetwork -c CpuAcc -m resnet50_opt.onnx -I 1 -d resnet50_input.txt -w temp.txt
cat temp.txt | awk -F, '{print $2}' | awk -F: '{print $2}' | sed 's/ /\n/g' > resnet50_fp32_cpu_pred.txt
python3 compute_mse.py resnet50_fp32_cpu_pred.txt resnet50_output.txt

输出

(1000,) (1000,)
[-0.964521  1.21882  -2.75427  -1.55273  -0.906159 -1.08674  -3.01336  0.647321]
[-0.964521  1.218818 -2.754273 -1.552727 -0.906162 -1.086741 -3.013363 0.647324]
MSE:0.00000
2.2.4 测试GPU-FP32MSE
./ExecuteNetwork -c GpuAcc -m resnet50_opt.onnx -I 1 -d resnet50_input.txt -w temp.txt
cat temp.txt | awk -F, '{print $2}' | awk -F: '{print $2}' | sed 's/ /\n/g' > resnet50_fp32_gpu_pred.txt
python3 compute_mse.py resnet50_fp32_gpu_pred.txt resnet50_output.txt

输出

(1000,) (1000,)
[-0.964525  1.21881  -2.75427  -1.55272  -0.906155 -1.08674  -3.01337  0.64732 ]
[-0.964521  1.218818 -2.754273 -1.552727 -0.906162 -1.086741 -3.013363 0.647324]
MSE:0.00000
2.2.4 测试CPU-FP16MSE
./ExecuteNetwork -c CpuAcc -m resnet50_fp16.tflite -I 1 -d resnet50_input.txt -w temp.txt
cat temp.txt | awk -F, '{print $2}' | awk -F: '{print $2}' | sed 's/ /\n/g' > resnet50_fp16_cpu_pred.txt
python3 compute_mse.py resnet50_fp16_cpu_pred.txt resnet50_output.txt

输出

(1000,) (1000,)
[-0.965583  1.21759  -2.75328  -1.55201  -0.907105 -1.08602  -3.01482   0.646945]
[-0.964521  1.218818 -2.754273 -1.552727 -0.906162 -1.086741 -3.013363  0.647324]
MSE:0.00000
2.2.5 测试GPU-FP16MSE
./ExecuteNetwork -c GpuAcc -m resnet50_fp16.tflite -I 1 -d resnet50_input.txt -w temp.txt
cat temp.txt | awk -F, '{print $2}' | awk -F: '{print $2}' | sed 's/ /\n/g' > resnet50_fp16_gpu_pred.txt
python3 compute_mse.py resnet50_fp16_gpu_pred.txt resnet50_output.txt

输出

(1000,) (1000,)
[-0.965581  1.21759  -2.75328  -1.55201  -0.907109 -1.08602  -3.01482   0.646946]
[-0.964521  1.218818 -2.754273 -1.552727 -0.906162 -1.086741 -3.013363  0.647324]
MSE:0.00000
2.2.6 测试CPU-INT8MSE
./ExecuteNetwork -c CpuAcc -m resnet50_int8.tflite -I 1 -d resnet50_input.txt -w temp.txt
cat temp.txt | awk -F, '{print $2}' | awk -F: '{print $2}' | sed 's/ /\n/g' > resnet50_int8_cpu_pred.txt
python3 compute_mse.py resnet50_int8_cpu_pred.txt resnet50_output.txt

输出

(1000,) (1000,)
[-1.57105   1.45883  -2.30047  -1.2344    0.168327  1.12218  -0.617199  -1.12218 ]
[-0.964521  1.218818 -2.754273 -1.552727 -0.906162 -1.086741 -3.013363  0.647324]
MSE:4.33176
2.2.7 测试GPU-INT8MSE
./ExecuteNetwork -c GpuAcc -m resnet50_int8.tflite -I 1 -d resnet50_input.txt -w temp.txt
cat temp.txt | awk -F, '{print $2}' | awk -F: '{print $2}' | sed 's/ /\n/g' > resnet50_int8_gpu_pred.txt
python3 compute_mse.py resnet50_int8_gpu_pred.txt resnet50_output.txt

输出

(1000,) (1000,)
[-1.40273   1.62716  -2.30047  -1.17829   0.336654  1.06607  -0.617199  -1.12218 ]
[-0.964521  1.218818 -2.754273 -1.552727 -0.906162 -1.086741 -3.013363  0.647324]
MSE:4.28963
2.2.8 性能测试
./ExecuteNetwork -c CpuAcc -m resnet50_opt.onnx -I 5 -N 
./ExecuteNetwork -c GpuAcc -m resnet50_opt.onnx -I 5 -N ./ExecuteNetwork -c CpuAcc -m resnet50_fp16.tflite -I 5 -N 
./ExecuteNetwork -c GpuAcc -m resnet50_fp16.tflite -I 5 -N ./ExecuteNetwork -c CpuAcc -m resnet50_int8.tflite -I 5 -N 
./ExecuteNetwork -c GpuAcc -m resnet50_int8.tflite -I 5 -N 

输出

Info: Execution time: 175.39 ms.
Info: Execution time: 71.74 ms.Info: Execution time: 117.10 ms.
Info: Execution time: 66.84 ms.Info: Execution time: 46.88 ms.
Info: Execution time: 27.59 ms.

相关文章:

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试 **背景与目标** 一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】二.操作步骤2.1 在x86-Linux上生成onnx模型,以及tflite量化模型(避免在RK3588上安装过多依赖)2.1.1 创建容器2.1.2 安装依赖2.1.3 下载推…...

力扣第5题:最长回文子串(动态规划)

小学生一枚&#xff0c;自学信奥中&#xff0c;没参加培训机构&#xff0c;所以命名不规范、代码不优美是在所难免的&#xff0c;欢迎指正。 标签&#xff1a; 字符串、动态规划、中心扩散法 语言&#xff1a; C 题目&#xff1a; 给你一个字符串s&#xff0c;找到s中最长的…...

HCIP实验五

一、实验拓扑图&#xff1a; 二、实验需求分析&#xff1a; 1. PreVal策略&#xff1a;要求确保R4通过R2到达192.168.10.0/24 &#xff0c;需在R4上针对去往该网段路由配置PreVal策略&#xff0c;为经R2的路径赋予更高优先值&#xff0c;影响本地路由表选路。 2. AS Path策略…...

python Numpy-数组

目录 Numpy&#xff1a; 一、Ndarray 1 定义 2 数组的属性方法 2.1 数组的维度&#xff1a;np.ndarray.shape 2.2 元素的类型&#xff1a;np.ndarray.dtype 2.3 数组元素的个数&#xff1a;np.ndarray.size 2.4 转置 3 ndarray 所存储元素的数据类型 4 数组创建 4.1 a…...

数据库分库分表从理论到实战

1.分库分表基础理论 1.1 分库分表基本概念 定义&#xff1a;分库分表是一种将单一数据库中的数据分散存储到多个数据库或表中的技术方案&#xff0c;其核心思想是通过"分而治之"的方式解决数据库性能瓶颈问题。分库&#xff1a;将表按业务或数据量拆分到不同数据库中…...

Java异常处理与File类终极指南

Java异常处理与File类终极指南 目录 异常体系全维度拆解异常处理十五种高阶模式自定义异常企业级实践File类深度探索与NIO进化论分布式系统异常处理架构性能调优与安全防护全网最全异常代码库一、异常体系全维度拆解 1.1 Java异常DNA解析 // 异常类的核心继承关系 public cla…...

pmap中的mode列,脏页,写时复制

写时复制&#xff08;Copy-on-Write&#xff0c;简称 COW&#xff09; 是一种计算机编程中的优化技术&#xff0c;主要用于内存或存储资源的管理。其核心思想是&#xff1a;只有在真正需要修改数据时&#xff0c;才会执行实际的复制操作&#xff0c;从而避免不必要的资源开销。…...

通过COM获取正在运行的Excel实例并关闭 c#实现

利用COM对象模型获取正在运行的Excel实例并关闭。示例代码如下&#xff1a; using Excel Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; try { Excel.Application excelApp (Excel.Application)Marshal.GetActiveObject("Excel.Applicatio…...

运行在华为云kubernetes应用接入APM服务

1 APM概述 在云时代微服务架构下应用日益丰富&#xff0c;纷杂的应用异常问题接踵而来。应用运维面临巨大挑战&#xff1a; 分布式应用关系错综复杂&#xff0c;应用性能问题分析定位困难&#xff0c;应用运维面临如何保障应用正常、快速完成问题定位、迅速找到性能瓶颈的挑战…...

虚幻引擎5-Unreal Engine笔记之摄像头camera

虚幻引擎5-Unreal Engine笔记之摄像头camera code review! 目录 第一部分&#xff1a;摄像头的基础概念 1.1 UE5 中摄像头的定义与作用1.2 UE5 中摄像头的类型与分类 第二部分&#xff1a;摄像头的代码结构与分类 2.1 摄像头是类还是组件&#xff1f;2.2 组件的本质&#xff…...

mysql的基础命令

1.SQL的基本概念 SQL 是用于管理和操作关系型数据库的标准编程语言。是所有关系型数据库&#xff08;如 MySQL、PostgreSQL、Oracle 等&#xff09;的通用语言。 SQL语句分类 DDL: Data Defination Language 数据定义语言 CREATE&#xff0c;DROP&#xff0c;ALTER DML: Da…...

去中心化算力池:基于IPFS+智能合约的跨校GPU资源共享平台设计

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、问题背景&#xff1a;高校算力孤岛的困境 现状痛点 各高校GPU集群利用率差异显著&…...

数据库(二):ORM技术

什么是 ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09; 是一种用于实现 对象模型&#xff08;面向对象&#xff09;与关系模型&#xff08;数据库&#xff09;之间映射的技术&#xff0c;使程序员可以通过操作对象的方式访问数据库数据&#xff0c;而无…...

Oracle基础知识

目录 1.别名的使用 2.AND的优先级高于OR 3.where后面可以接别名&#xff0c;order by后面不可以 4.Oracle中SQL的执行顺序(重点) 5.dual万用表 6.是否区分大小写 7.Oracle常用数据类型 8.Oracle常用函数 (1)length字符、lengthb字节和cast强制类型转换 (2)数据类型转…...

使用 vite-plugin-dynamic-base 实现运行时动态设置上下文路径

我们一般会在编译之前设置上下文&#xff0c;那么如何在编译之后动态设置上下文的路径&#xff1f; 本文使用的技术栈是 Go&#xff08;Gin&#xff09; Vue.js&#xff08;Vite&#xff09; 本文使用到的第三方包&#xff1a;https://github.com/chenxch/vite-plugin-dynam…...

spark-shuffle 类型及其对比

1. Hash Shuffle 原理&#xff1a;将数据按照分区键进行哈希计算&#xff0c;将相同哈希值的数据发送到同一个Reducer中。特点&#xff1a;实现简单&#xff0c;适用于数据分布均匀的场景。但在数据分布不均匀时&#xff0c;容易导致某些Reducer处理的数据量过大&#xff0c;产…...

力扣-快乐数

1.题目要求 2.题目链接 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 3.题目分析 首先,因为需要频繁地用到数字变为各个位上的平方的过程,我们可以将"对于一个正整数,每一次将该数替换为它每个位置的数字的平方和"这一操作抽象出来&#xff0c;定义成一个…...

每日算法刷题Day10 5.19:leetcode不定长滑动窗口求最长/最大4道题,结束定长滑动窗口,用时1h

不定长滑动窗口 不定长滑动窗口主要分为三类&#xff1a;求最长子数组&#xff0c;求最短子数组&#xff0c;以及求子数组个数。 注&#xff1a;滑动窗口相当于在维护一个队列。右指针的移动可以视作入队&#xff0c;左指针的移动可以视作出队。 滑动窗口【基础算法精讲 03】…...

FreeSWITCH 纯内网配置

纯内网&#xff0c;且同一个网段&#xff0c;Fs 可简化配置&#xff0c;要点是: 1. 不需要事先配置 directory&#xff0c;任意号码都可以注册&#xff0c;且无挑战 2. 呼叫无挑战 不需要考虑那么多安全问题 配置如下&#xff1a; 1. 全局变量 <X-PRE-PROCESS cmd"…...

STL中list的模拟

这里写目录标题 list 的节点 —— ListNodelist 的 “导览员” —— ListIteratorlist 的核心 —— list 类构造函数迭代器相关操作容量相关操作 结尾 在 C 的 STL&#xff08;标准模板库&#xff09;中&#xff0c;list 是一个十分重要的容器&#xff0c;它就像一个灵活的弹簧…...

【iOS】类结构分析

前言 之前我们已经探索得出对象的本质就是一个带有isa指针的结构体&#xff0c;这篇文章来分析一下类的结构以及类的底层原理。 类的本质 类的本质 我们在main函数中写入以上代码&#xff0c;然后利用clang对其进行反编译&#xff0c;可以得到c文件 可以看到底层使用Class接…...

Android 万能AI证件照 v1.3.2

在日常的生活和工作场景里&#xff0c;证件照的身影随处可见。找工作投简历时&#xff0c;它是展现你形象的 “第一张名片”&#xff1b;办理各类证件&#xff0c;缺了它可不行&#xff1b;参加各种考试报名&#xff0c;同样需要它。可以说&#xff0c;证件照虽小&#xff0c;却…...

【Java】封装在 Java 中是怎样实现的?

包 关于包有两个关键字 package : 声明当前类属于哪个包 和 import : 允许当前类使用其他类或接口时不使用全限定名 , 也就是导包 . IDEA 的普通项目文件包括 src : 包含源码和资源文件 和 out : 包含编译产物字节码文件 . 在 IDEA 开发环境建包会在 src 源码目录中生成 , 可…...

牛客网 NC14736 双拆分数字串 题解

牛客网 NC14736 双拆分数字串 题解 题目分析 解题思路 通过分析&#xff0c;我们可以发现&#xff1a; 当n≤3时&#xff0c;无法构造出双拆分数字串&#xff0c;因为数字位数太少对于n>3的情况&#xff0c;我们可以构造两种特殊形式&#xff1a; 当n为奇数时&#xff0c…...

超长文本注意力机制如何突破传统 O(n²) 瓶颈

介绍了当前在超长文本&#xff08;可达百万级及以上 Token&#xff09;生成与预测中&#xff0c;注意力机制如何突破传统 O(n) 瓶颈&#xff0c;并阐释多种高效注意力算法如何支持 超长上下文处理能力。 概览 当前主流 Transformer 在处理长序列时&#xff0c;由于每个 Token…...

异丙肌苷市场:现状、挑战与未来展望

摘要 本文聚焦异丙肌苷市场&#xff0c;深入分析了其市场规模与增长趋势、应用价值与市场驱动因素、面临的挑战以及竞争格局。异丙肌苷作为一种具有重要应用价值的改性核苷衍生物&#xff0c;在药物研发和治疗领域展现出潜力&#xff0c;但市场发展也面临诸多挑战。文章最后为…...

JAVA面向对象——对象和类的基本语法

JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型&#xff1a;变量&#xff08;如 int max 15;&#xff09;。数据结构&#xff1a;数组&#xff08;一维/二维&#xff09;、对象&#xff08;特殊数据结构&#xff0c;用于存储复…...

【windows】音视频处理工具-FFmpeg(合并/分离)

一、FFmpeg介绍 FFmpeg是一个‌开源的跨平台音视频处理框架。 法国计算机程序员 Fabrice Bellard 于 2000 年创建。 “FF”&#xff08;代表 “Fast Forward”&#xff0c;快进之意&#xff09;与 “mpeg”&#xff08;流行的视频压缩标准 MPEG&#xff0c;即运动图像专家组&am…...

Java并发编程:从基础到高级实战

在现代软件开发中&#xff0c;并发编程已成为不可或缺的核心技能。随着多核处理器的普及和分布式系统的发展&#xff0c;能否编写高效、线程安全的并发程序直接决定了应用程序的性能和可靠性。Java作为一门成熟的企业级编程语言&#xff0c;提供了丰富的并发编程工具和API&…...

在 Excel 中使用东方仙盟软件————仙盟创梦IDE

安装插件 用仙盟创梦编写插件代码 源码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 东方仙盟.仙盟创梦IDE_招标系统 {public static class 仙盟创梦_招标专…...

win7无线网络名称显示为编码,连接对应网络不方便【解决办法】

使用多个网络时可能需要切换到打印机的网络来打印东西&#xff0c;但是win7的编码问题导致不知道哪个网络是对应网络&#xff0c;可以使用批处理命令来自动连接道指定网络 将这个代码用文本文件打开后粘贴&#xff0c;然后另存为ansi格式的bat文件 代码中使用两种方式进行连接…...

.NET 10 - 尝试一下Minimal Api的Validation新特性

1.简单介绍 2025年11月微软将会发布.NET10&#xff0c;这是LTS(Long Term Support)版本。当前.NET10已经处于Preview4版本&#xff0c;微软对Runtime, Library, SDK, C#, Asp.NET Core, MAUI等都做了很多enhancement。近些年微软对Minimal Api一直在持续地更新。在.NET8中, Mi…...

C# Task 与 SynchronizationContext

示例代码 using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks;namespace Test {internal class Program{static void Main(string[] args){_mainThreadSynchronizationContext new ThreadSynchronizationContext(&qu…...

iOS Runtime与RunLoop的对比和使用

Runtime 机制 核心概念 Objective-C 的动态特性&#xff1a;Objective-C 是一门动态语言&#xff0c;很多工作都是在运行时而非编译时决定的消息传递机制&#xff1a;方法调用实际上是发送消息 objc_msgSend(receiver, selector, ...)方法决议机制&#xff1a;动态方法解析、…...

JavaSenderMail发送邮件(QQ及OFFICE365)

前言 这是今天处理的公司安排的一个任务&#xff1a;客户系统发送offices365邮件报错535 之前没怎么解除邮件业务&#xff0c;于是先搭个简单的QQ邮件Demo熟悉一下吧&#xff0c;没有啥公网内网的麻烦&#xff08;之前听说有内网限制&#xff0c;我还处理了一些环境上的问题&…...

八股文--JVM(2)

⭐️⭐️6.类加载 类加载器 JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码加载到JVM中&#xff0c;从而让程序启动 1.启动类加载器 ----JAVA_HOME/jre/libC编写加载的是JAVA_HOME/jre/lib 2.拓展类加载器 ----JAVA_HOME/jre/lib/ext 3.应用类加载器 ----C…...

【HTML-3】HTML 中的水平线与换行:基础元素详解

在网页设计中&#xff0c;合理的布局和内容分隔对于提升用户体验至关重要。HTML 提供了两个简单但强大的元素来实现这些功能&#xff1a;水平线 (<hr>) 和换行 (<br>)。本文将深入探讨这两个元素的用法、最佳实践以及现代替代方案。 1. 水平线 <hr> 元素 1…...

绿色云计算:数字化转型与可持续发展的完美融合

目录 引言 绿色云计算的概念与定义 云计算的环境影响与绿色云计算的重要性 绿色云计算的技术实践与策略 绿色云计算的案例研究与最佳实践 绿色云计算的挑战与限制 绿色云计算的未来趋势与预测 结论与展望 引言 随着云计算技术的迅猛发展和广泛应用&#xff0c;其环境影…...

AMO——下层RL与上层模仿相结合的自适应运动优化:让人形行走操作(loco-manipulation)兼顾可行性和动力学约束

前言 自从去年24年Q4&#xff0c;我司侧重具身智能的场景落地与定制开发之后 去年Q4&#xff0c;每个月都会进来新的具身需求今年Q1&#xff0c;则每周都会进来新的具身需求Q2的本月起&#xff0c;一周不止一个需求 特别是本周&#xff0c;几乎每天都有国企、名企通过我司找到…...

大模型——多模态检索的RAG系统架构设计

文章目录 1. 系统架构设计核心组件 2. 跨模态向量空间对齐方案方法一&#xff1a;预训练对齐模型&#xff08;如CLIP&#xff09;方法二&#xff1a;跨模态投影网络方法三&#xff1a;联合微调 3. 混合检索策略4. 关键问题解决Q: 如何解决模态间向量尺度不一致&#xff1f;Q: 如…...

BUUCTF——Kookie

BUUCTF——Kookie 进入靶场 一个登录页面 左上角提示让以admin身份登录 找到了cookie 应该与cookie相关 测试了一下admin admin没登上 We found the account cookie / monster 回头看了一下 这个是不是账号密码 测试一下 成功登入 但是没有flag 应该还是跟cookie相关 …...

代码随想录算法训练营

力扣684.冗余连接【medium】 力扣.冗余连接Ⅱ【hard】 一、力扣684.冗余连接【medium】 题目链接&#xff1a;力扣684.冗余连接 left x300 视频链接&#xff1a;代码随想录 题解链接&#xff1a;灵茶山艾府 1、思路 可以从前向后遍历每一条边&#xff08;因为优先让前面的边连上…...

服务器磁盘不同格式挂载区别

在Linux系统中&#xff0c;磁盘不同格式挂载的核心区别主要体现在‌文件系统类型‌和‌挂载方式‌两个方面&#xff0c;以下为具体差异分析&#xff1a; 一、文件系统类型区别 磁盘格式即文件系统类型的选择直接影响挂载后的性能和功能&#xff1a; ‌常见文件系统比较‌ ‌e…...

AI智能分析网关V4人员摔倒检测打造医院/工厂等多场景智能安全防护体系

一、方案背景​ 随着全球老龄化加剧&#xff0c;我国老年人口占比持续攀升&#xff0c;老年人摔倒伤亡事件频发&#xff0c;居家、养老机构等场景的摔倒防控成为社会焦点。同时&#xff0c;工厂、医院、学校等人员密集场所也易发生意外摔倒安全事故。传统人工监控存在视觉疲劳…...

window 显示驱动开发-准备 DMA 缓冲区

显示微型端口驱动程序必须及时准备 DMA 缓冲区。 当 GPU 处理 DMA 缓冲区时&#xff0c;通常调用显示微型端口驱动程序来准备下一个 DMA 缓冲区&#xff0c;以便提交到 GPU。 若要防止 GPU 耗尽&#xff0c;显示微型端口驱动程序在准备和提交后续 DMA 缓冲区时所花费的时间必须…...

程序设计实践--排序(1)

&#xff11;、插入排序&#xff08;一个数组&#xff09; #include<bits/stdc.h> using namespace std; const int N1e35; int a[N]; int n; int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}for(int i1;i<n;i){int va[i];int ji-1;while(j>1&am…...

window 显示驱动开发-GDI 硬件加速

Windows 7 引入的 GDI 硬件加速功能在图形处理单元 (GPU) 上提供加速的核心图形设备接口 (GDI) 操作。 若要指示 GPU 和驱动程序支持此功能&#xff0c;显示微型端口驱动程序必须将DXGKDDI_INTERFACE_VERSION设置为 > DXGKDDI_INTERFACE_VERSION_WIN7。 显示微型端口驱动程…...

驱动开发硬核特训 · Day 31:理解 I2C 子系统的驱动模型与实例剖析

&#x1f4da; 训练目标&#xff1a; 从驱动模型出发&#xff0c;掌握 I2C 子系统的核心结构&#xff1b;分析控制器与从设备的注册流程&#xff1b;结合 AT24 EEPROM 驱动源码与设备树实例&#xff0c;理解 i2c_client 与 i2c_driver 的交互&#xff1b;配套高质量练习题巩固理…...

网络安全之网络攻击spring临时文件利用

0x00 传统攻击流程 我们之前传统的攻击流程由以下几个步骤来完成 攻击者找到可以控制目标JDBC连接fakeServer的地方目标向fakeServer发起连接请求fakeServer向目标下发恶意数据包目标解析恶意数据包并完成指定攻击行为&#xff08;文件读取、反序列化&#xff09;&#xff0c…...

统一端点管理(UEM):定义、优势与重要性

统一终端管理&#xff08;UEM&#xff09;​​是一种通过单一平台集中管理、监控和保护企业所有终端设备&#xff08;如笔记本电脑、移动设备、服务器、物联网设备等&#xff09;的综合性策略。其核心在于跨操作系统&#xff08;Windows、macOS、iOS、Android等&#xff09;实现…...