高性能 :DeepSeek-V3 inference 推理时反量化实现 fp8_cast_bf16
FP8 (8 bits) & FP16 (16 bits)
- FP8 和 BF16 都是浮点数格式(floating-point formats),
float
通过科学计数法表示数据,float = [符号位+指数位+系数位]
FP8 (8 bits):SEEEMMMM | FP16 (16 bits):SEEEEEMMMMMMMMMM |
---|---|
S (1 bit) | S (1 bit) |
EEE (3 bits) | EEEEE (5 bits) |
MMMM (4 bits) | MMMMMMMMMM (10 bits) |
- FP8:1位符号位、3位指数位、4位尾数位。
- FP16:1位符号位、5位指数位、10位尾数位。
特性 | FP8 | BF16 |
---|---|---|
位数 | 8 位 | 16 位 |
存储需求 | 非常低 | 低(但高于 FP8) |
精度 | 精度非常低,仅适合低精度计算 | 较低的精度,但比 FP8 精度高 |
范围 | 较小的数值范围 | 与 FP32 相似,具有广泛的数值范围 |
主要用途 | 主要用于训练中的权重表示 | 主要用于训练和推理,尤其适用于加速机器学习 |
优点 | 极大的存储节省和计算加速 | 适用于大规模深度学习模型,精度损失较小 |
fp8_cast_bf16
- FP8到BF16转换: 主要通过
weight_dequant
函数将FP8权重转换为BF16格式。
import os # 导入操作系统接口模块,用于文件和目录操作
import json # 导入JSON模块,用于读取和写入JSON格式的数据
from argparse import ArgumentParser # 导入ArgumentParser类,用于命令行参数解析
from glob import glob # 导入glob模块,用于文件路径模式匹配
from tqdm import tqdm # 导入tqdm模块,用于显示进度条import torch # 导入PyTorch库
from safetensors.torch import load_file, save_file # 从safetensors库导入load_file和save_file函数from kernel import weight_dequant # 从kernel模块导入weight_dequant函数,用于权重解量化def main(fp8_path, bf16_path):"""将FP8权重转换为BF16并保存转换后的权重。该函数从指定的目录读取FP8权重,将其转换为BF16格式,并将转换后的权重保存到另一个指定的目录。它还更新了模型索引文件,反映出这些更改。参数:fp8_path (str): 存放FP8权重和模型索引文件的目录路径。bf16_path (str): 保存转换后的BF16权重的目录路径。异常:KeyError: 如果缺少所需的scale_inv张量,则会引发此异常。注意:- 假定FP8权重存储为safetensor文件。- 该函数缓存已加载的safetensor文件以优化内存使用。- 函数更新模型索引文件,删除对scale_inv张量的引用。"""# 设置默认数据类型为bfloat16torch.set_default_dtype(torch.bfloat16)os.makedirs(bf16_path, exist_ok=True) # 如果输出目录不存在,则创建它model_index_file = os.path.join(fp8_path, "model.safetensors.index.json") # 模型索引文件路径with open(model_index_file, "r") as f:model_index = json.load(f) # 读取模型索引文件weight_map = model_index["weight_map"] # 获取权重映射# 用于缓存已加载的safetensor文件loaded_files = {}fp8_weight_names = [] # 用于存储FP8权重的名称def get_tensor(tensor_name):"""从缓存的safetensor文件中检索张量,如果没有缓存则从磁盘加载。参数:tensor_name (str): 要检索的张量名称。返回:torch.Tensor: 检索到的张量。异常:KeyError: 如果在safetensor文件中找不到指定的张量,则引发此异常。"""file_name = weight_map[tensor_name] # 获取该张量所在的文件名if file_name not in loaded_files: # 如果该文件未加载file_path = os.path.join(fp8_path, file_name) # 构建文件路径loaded_files[file_name] = load_file(file_path, device="cuda") # 加载文件并缓存return loaded_files[file_name][tensor_name] # 返回缓存的张量# 获取所有safetensor文件路径,并按字母排序safetensor_files = list(glob(os.path.join(fp8_path, "*.safetensors")))safetensor_files.sort()# 遍历所有的safetensor文件for safetensor_file in tqdm(safetensor_files):file_name = os.path.basename(safetensor_file) # 获取文件名current_state_dict = load_file(safetensor_file, device="cuda") # 加载当前safetensor文件loaded_files[file_name] = current_state_dict # 将文件缓存起来new_state_dict = {} # 用于存储转换后的新权重字典for weight_name, weight in current_state_dict.items(): # 遍历文件中的所有权重if weight_name.endswith("_scale_inv"): # 如果权重是scale_inv,跳过continueelif weight.element_size() == 1: # 如果权重是FP8(即1字节)scale_inv_name = f"{weight_name}_scale_inv" # 对应的scale_inv张量名称try:# 尝试获取对应的scale_inv张量scale_inv = get_tensor(scale_inv_name)fp8_weight_names.append(weight_name) # 将FP8权重名称记录下来new_state_dict[weight_name] = weight_dequant(weight, scale_inv) # 转换为BF16except KeyError:# 如果没有找到scale_inv张量,则跳过转换print(f"Warning: Missing scale_inv tensor for {weight_name}, skipping conversion")new_state_dict[weight_name] = weight # 保留原始权重else:new_state_dict[weight_name] = weight # 如果不是FP8,直接保留原始权重# 保存转换后的权重new_safetensor_file = os.path.join(bf16_path, file_name)save_file(new_state_dict, new_safetensor_file)# 内存管理:保持仅2个最近使用的文件if len(loaded_files) > 2:oldest_file = next(iter(loaded_files)) # 获取最老的文件del loaded_files[oldest_file] # 删除最老的文件torch.cuda.empty_cache() # 清理缓存# 更新模型索引文件new_model_index_file = os.path.join(bf16_path, "model.safetensors.index.json")for weight_name in fp8_weight_names: # 遍历所有FP8权重scale_inv_name = f"{weight_name}_scale_inv" # 对应的scale_inv名称if scale_inv_name in weight_map:weight_map.pop(scale_inv_name) # 从weight_map中删除scale_inv权重with open(new_model_index_file, "w") as f:json.dump({"metadata": {}, "weight_map": weight_map}, f, indent=2) # 保存更新后的索引文件if __name__ == "__main__":# 设置命令行参数解析parser = ArgumentParser()parser.add_argument("--input-fp8-hf-path", type=str, required=True) # 输入FP8权重路径parser.add_argument("--output-bf16-hf-path", type=str, required=True) # 输出BF16权重路径args = parser.parse_args()main(args.input_fp8_hf_path, args.output_bf16_hf_path) # 调用主函数进行转换
weight_dequant
- 引入包,建议先阅读Triton向量相加 的基础示例以理解Triton的工作方式。
from typing import Tuple
import torch
import triton
import triton.language as tl # Triton 语言(Triton Language)允许用户在 GPU 上编写高效的并行计算内核https://github.com/triton-lang/triton
from triton import Config
weight_dequant
函数用于将量化的权重张量(x
)进行反量化处理,恢复到浮动值。以下是注释的解释:
def weight_dequant(x: torch.Tensor, s: torch.Tensor, block_size: int = 128) -> torch.Tensor:"""Dequantizes the given weight tensor using the provided scale tensor.Args:x (torch.Tensor): The quantized weight tensor of shape (M, N).s (torch.Tensor): The scale tensor of shape (M, N).block_size (int, optional): The block size to use for dequantization. Defaults to 128.Returns:torch.Tensor: The dequantized weight tensor of the same shape as `x`.Raises:AssertionError: If `x` or `s` are not contiguous or if their dimensions are not 2."""assert x.is_contiguous() and s.is_contiguous(), 'Input tensors must be contiguous' # 确保输入张量是连续的(即内存布局连续)assert x.dim() == 2 and s.dim() == 2, 'Input tensors must have 2 dimensions' # 确保输入张量 x 和 s 都是二维的M, N = x.size() # 获取输入张量 x 的尺寸 M (行数) 和 N (列数)# 创建一个和 x 形状相同的新张量 y,用来保存反量化后的结果y = torch.empty_like(x, dtype=torch.get_default_dtype())# 定义一个 grid 函数来计算 triton 内核所需的网格大小# triton.cdiv 是向上取整除法,用来确保我们分配足够的线程处理每个块grid = lambda meta: (triton.cdiv(M, meta['BLOCK_SIZE']), triton.cdiv(N, meta['BLOCK_SIZE']))# 调用 triton 内核 `weight_dequant_kernel` 进行反量化操作# 将 quantized weight `x` 和 scale `s` 与结果张量 `y` 一起传递给内核# `M`, `N`, `block_size` 作为额外的参数传递weight_dequant_kernel[grid](x, s, y, M, N, BLOCK_SIZE=block_size)# 返回反量化后的张量 yreturn y
- 计算网格大小:
grid = lambda meta: (triton.cdiv(M, meta['BLOCK_SIZE']), triton.cdiv(N, meta['BLOCK_SIZE']))
: 使用triton.cdiv
来计算块的数量。triton.cdiv
是向上取整除法,用于确定每个维度需要多少个块来处理M
和N
大小的数据。meta['BLOCK_SIZE'])
是每个块处理的元素数量(默认值为 128)。
weight_dequant_kernel
- Nvidia GPU CUDA使用grid、block、thread进行索引。
- 实现反量化的核函数(模型可能使用的是LSQ(Learned Step Quantization)Quantization,仅有量化步长参数),通过
weight_dequant_kernel[grid](x, s, y, M, N, BLOCK_SIZE=block_size)
调用:
@triton.jit # 使用 Triton 编译器将此函数编译为高效的 GPU 内核
def weight_dequant_kernel(x_ptr, s_ptr, y_ptr, M, N, BLOCK_SIZE: tl.constexpr):"""Dequantizes weights using the provided scaling factors and stores the result.Args:x_ptr (tl.pointer): Pointer to the quantized weights.s_ptr (tl.pointer): Pointer to the scaling factors.y_ptr (tl.pointer): Pointer to the output buffer for dequantized weights.M (int): Number of rows in the weight matrix.N (int): Number of columns in the weight matrix.BLOCK_SIZE (tl.constexpr): Size of the block for tiling.Returns:None"""# 获取当前线程在程序中的编号pid_m = tl.program_id(axis=0) # 获取当前行维度上的线程编号,pid_m 和 pid_n 的范围由矩阵的尺寸 M 和 N,以及线程块的大小 BLOCK_SIZE 决定pid_n = tl.program_id(axis=1) # 获取当前列维度上的线程编号,pid_m 的值从 0 到 ceil(M / BLOCK_SIZE) - 1# 计算矩阵列的块数n = tl.cdiv(N, BLOCK_SIZE) # 使用向上取整除法计算列方向上的块数# 计算当前线程块在行和列方向上的偏移量offs_m = pid_m * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE) # 当前块在行方向的偏移量offs_n = pid_n * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE) # 当前块在列方向的偏移量# 将行和列的偏移量组合成一个二维的索引数组offs = offs_m[:, None] * N + offs_n[None, :] # 将行和列偏移量结合,得到每个元素的全局索引,offs_m[:, None]形状会变成 (BLOCK_SIZE, 1),相加广播后变为(BLOCK_SIZE, BLOCK_SIZE)# 使用掩码保证我们不会超出矩阵的边界mask = (offs_m[:, None] < M) & (offs_n[None, :] < N) # 掩码,确保线程不会访问超出矩阵范围的数据# 加载量化后的权重数据(量化后的值)x = tl.load(x_ptr + offs, mask=mask).to(tl.float32) # 从内存中加载量化后的数据,并转换为 float32 类型# 加载缩放因子s = tl.load(s_ptr + pid_m * n + pid_n) # 从内存中加载对应的缩放因子,s_ptr是指向缩放因子数组的指针,pid_m * n + pid_n计算出当前线程块在缩放因子数组中的位置。# 执行去量化操作:去量化 = 量化值 * 缩放因子y = x * s # 去量化的计算公式# 将去量化后的数据存储到输出缓存中tl.store(y_ptr + offs, y, mask=mask) # 将去量化后的值存储到输出内存中,使用掩码确保数据存储在合法的范围内,`offs` 是索引,`mask=mask` 确保只有合法的元素被存储
相关文章:
高性能 :DeepSeek-V3 inference 推理时反量化实现 fp8_cast_bf16
FP8 (8 bits) & FP16 (16 bits) FP8 和 BF16 都是浮点数格式(floating-point formats),float通过科学计数法表示数据,float [符号位指数位系数位] FP8 (8 bits):SEEEMMMMFP16 (16 bits):SEEEEEMMMMM…...
kakailio官网推荐的安装流程ubuntu 22.04
https://kamailio.org/docs/tutorials/6.0.x/kamailio-install-guide-git/ # 非必须项 wget -O- https://deb.kamailio.org/kamailiodebkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/kamailio.gpg在/etc/apt/sources.list文件追加以下内容 deb [signed-by/usr/sh…...
能否通过蓝牙建立TCP/IP连接来传输数据
前言: 最近在做一个项目时,产生了一个疑问:能否通过蓝牙建立TCP/IP连接来传输数据 查阅了一些文章,可以得出结论:不行 下面是我截取的两篇个人认可的文章的回答: 文章一: 蓝牙是一种短距离无…...
git基础使用--1--版本控制的基本概念
文章目录 git基础使用--1--版本控制的基本概念1.版本控制的需求背景,即为啥需要版本控制2. 集中式版本控制SVN3. 分布式版本控制 Git4. SVN和Git的比较 git基础使用–1–版本控制的基本概念 1.版本控制的需求背景,即为啥需要版本控制 先说啥叫版本&…...
高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案
目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行(下载) 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…...
高级java每日一道面试题-2025年01月30日-框架篇[SpringBoot篇]-如何理解 Spring Boot 配置加载顺序 ?
如果有遗漏,评论区告诉我进行补充 面试官: 如何理解 Spring Boot 配置加载顺序 ? 我回答: 在 Java 高级面试中讨论 Spring Boot 配置加载顺序时,理解其机制对于有效管理和调试应用程序配置至关重要。Spring Boot 通过一系列预定义的规则来确定如何加载和覆盖配置…...
代码随想录day06
242.有效的字母异位词 刚学哈希表想着使用unordered_set来实现,结果无法通过,原因是对字母异位词理解有问题,字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。对字母出现的次数有要求&am…...
C#常用744单词
1.visual 可见的 2.studio 工作室 3.dot 点 4.net 网 5.harp 尖端的,锋利的。 6.amework 骨架,构架,框架 7.beta 测试版,试用版 8.XML(全称:eXtensible Markup Language)…...
14.PPT:中国注册税务师协会宣传【26】
目录 NO12 NO3/4/5 NO678 【文本框水平/垂直居中】【文本框内容水平/垂直居中】 NO12 坑:注意❗Word文档的PPt素材.docx的标题大纲是混乱的,虽然他设置了,所以我们需要重新设置 设计→主题视图→幻灯片母版→删除版式插入logo NO3/4…...
Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与…...
简单3步部署本地国产大模型DeepSeek大模型
简单3步部署本地国产大模型DeepSeek大模型 DeepSeek是最近非常火的开源大模型,国产大模型 DeepSeek 凭借其优异的性能和对硬件资源的友好性,受到了众多开发者的关注。 无奈,在使用时候deepseek总是提示服务器繁忙,请稍后再试。 …...
Redis常见数据类型与编码方式
⭐️前言⭐️ 本小节围绕Redis中常见的数据类型与编码方式展开。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主日常练习代码均已上传GitHu…...
利用matlab寻找矩阵中最大值及其位置
目录 一、问题描述1.1 max函数用法1.2 MATLAB中 : : :的作用1.3 ind2sub函数用法 二、实现方法2.1 方法一:max和find2.2 方法二:max和ind2sub2.3 方法对比 三、参考文献 一、问题描述 matlab中求最大值可使用函数max,对于一维向量࿰…...
解锁云电脑爽玩TGA游戏,ToDesk、海马云等多款云电脑游戏横测
作为一名游戏爱好者,我深入研究了云电脑技术在游戏娱乐中的应用。通过对比传统游戏机与云电脑的成本效益,我发现云电脑以其低成本和灵活性脱颖而出。我以自身为例,分析了云电脑如何满足对游戏体验的高要求。在测评中,我选择了ToDe…...
蓝桥杯思维训练(五)
文章目录 子集II1191.K次串联后最大子数组之和 子集II 子集II 思路分析: 求解子集的问题的关键就是,通过递归与回溯,我们就是得确定以某个元素开始的子集,对于这个题目来说,比较麻烦的一点就是,存在重复的…...
kaggle视频行为分析1st and Future - Player Contact Detection
这次比赛的目标是检测美式橄榄球NFL比赛中球员经历的外部接触。您将使用视频和球员追踪数据来识别发生接触的时刻,以帮助提高球员的安全。两种接触,一种是人与人的,另一种是人与地面,不包括脚底和地面的,跟我之前做的这…...
2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品
2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出…...
结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策
针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理,利用深度学习和自然语言处理技术进行特征挖掘,进而进行消费者情感分析,得到消费者偏好 在第一阶段,我们主要关注如何通过深度学习和自然语…...
Linux系统安装Nginx详解(适用于CentOS 7)
目录 1. 更新系统包 2. 安装EPEL仓库 3. 安装Nginx 4. 启动Nginx服务 5. 设置Nginx开机自启 6. 检查Nginx状态 7. 配置防火墙 8. 访问Nginx默认页面 9. 配置Nginx(可选) 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...
Qt常用控件 输入类控件
文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1,录入用户信息1.4 例子2,正则验证手机号1.5 例子3,验证输入的密码1.6 例子4,显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1,获取输入框的内容2.4 例…...
[LeetCode]全排列I,II
全排列I 给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入࿱…...
力扣.270. 最接近的二叉搜索树值(中序遍历思想)
文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案,并且要返回最小的那一个,为了解决这个问题,我门则要利用上二叉搜索树中序遍历为有序序列的特性,具体到代码中&a…...
Spring 核心技术解析【纯干货版】- VIII:Spring 数据访问模块 Spring-Tx 模块精讲
在企业级开发中,事务管理是保障数据一致性和完整性的重要手段。Spring 作为 Java 生态中广泛使用的框架,其事务管理模块(Spring-Tx)不仅提供了强大的功能,还极大地简化了开发者在不同技术栈中的事务处理工作。无论是编…...
Vue混入(Mixins)与插件开发深度解析
Vue混入(Mixins)与插件开发深度解析 Vue混入(Mixins)与插件开发深度解析1. Vue混入(Mixins)核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…...
Linux里的容器被OOM killed的两种情况
生产上遇到过几次容器实例被OOM的现象,总结一下LInux OOM的两种触发条件。我的虚拟机是ubuntu 24.0.4版本,分配4G内存,在我的虚拟机上复现这两种case。 一 宿主机物理内存不够 当linux上所有应用程序的内存需求加起来超出了物理内存&#x…...
十一、CentOS Stream 9 安装 Docker
一、Docker 环境安装 1、软件源(仓库)信息 使用如下命令可列出当前系统配置的所有软件源(仓库)信息 # 列出所有软件源 dnf repolist 这表明系统有三个仓库 AppStream 、 BaseOS、Extras-Common 被启用 2、配置软件源镜像 使用如下命令可配置 Docker 软件包下载的镜像地址 …...
【数据结构】链表应用-链表重新排序
重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题? 我选用了迭代法来反转链表。这是一种经典且高…...
e2studio开发RA2E1(9)----定时器GPT配置输入捕获
e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...
qt使用MQTT协议连接阿里云demo
qt使用Mqtt协议连接阿里云。 在配置好qt关于MQTT的环境之后,主要就是根据MQTT的连接参数进行连接即可。 环境配置推荐链接QT编译并部署QtMqtt相关环境跑测demo【超详细教程】_mqtt qt开发教程-CSDN博客 连接核心代码,主要就是根据阿里云的MQTT相关参数进行配置实现连…...
Python分享20个Excel自动化脚本
在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。 本文将分享20个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。 1. Excel单…...
DNN(深度神经网络)近似 Lyapunov 函数
import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # from torchviz import make_dot import torchviz# 1. Lyapunov 函数近似器(MLP 结构) class LyapunovNet(nn.Module):def __init__(self, input_dim…...
什么是数据库代理
数据库代理(DB Proxy)是一种位于应用程序和数据库服务器之间的中间件,充当两者之间的“中间人”。它的核心目标是优化数据库访问、提升性能、增强安全性,并简化数据库架构的复杂度,尤其在高并发、分布式或云环境中应用…...
深入浅出 DeepSeek V2 高效的MoE语言模型
今天,我们来聊聊 DeepSeek V2 高效的 MoE 语言模型,带大家一起深入理解这篇论文的精髓,同时,告诉大家如何将这些概念应用到实际中。 🌟 什么是 MoE?——Mixture of Experts(专家混合模型&#x…...
【创建模式-单例模式(Singleton Pattern)】
赐萧瑀 实现方案饿汉模式懒汉式(非线程安全)懒汉模式(线程安全)双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草,板荡识诚臣。 勇夫安识义,智者必怀仁…...
计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
6. 【Vue实战--孢子记账--Web 版开发】-- 主币种设置
从这篇文章开始我们将一起实现孢子记账的功能,这篇文章实现主币种设置。这个功能比较简单,因此我们从这个功能开始做。 一、功能 根据项目前期的需求调研,用户需要在设置主币种的时候查看汇率信息(别问为什么有这么个需求&#…...
RabbitMQ深度探索:前置知识
消息中间件: 消息中间件基于队列模式实现异步 / 同步传输数据作用:可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点: HTTP 请求基于响应的模型,在高并发的情况下,客户端发送大量的请求…...
【文件上传、秒传、分片上传、断点续传、重传】
文章目录 获取文件对象文件上传(秒传、分片上传、断点续传、重传)优化 获取文件对象 input标签的onchange方法接收到的参数就是用户上传的所有文件 <html lang"en"><head><title>文件上传</title><style>#inp…...
设计模式Python版 组合模式
文章目录 前言一、组合模式二、组合模式实现方式三、组合模式示例四、组合模式在Django中的应用 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式…...
python开发:爬虫示例——GET和POST请求处理
一、Get请求 import json import requests#输入示例:urlhttps://www.baidu.com #RequestHeader:F12标头-请求标头-原始-复制到这(忽略第一句) def GetRequest(url,RequestHeader""):try:dic{}RequestHeaderList RequestHeader.s…...
【3分钟极速部署】在本地快速部署deepseek
第一步,找到网站,下载: 首先找到Ollama , 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 ,文件不是很大,下载也比较的快 第二部就是安装了 : 安装完成后提示…...
【归属地】批量号码归属地查询按城市高速的分流,基于WPF的解决方案
在现代商业活动中,企业为了提高营销效果和资源利用效率,需要针对不同地区的市场特点开展精准营销。通过批量号码归属地查询并按城市分流,可以为企业的营销决策提供有力支持。 短信营销:一家连锁餐饮企业计划开展促销活动…...
大数据sql查询速度慢有哪些原因
1.索引问题 可能缺少索引,也有可能是索引不生效 2.连接数配置:连接数过少/连接池比较小 连接数过 3.sql本身有问题,响应比较慢,比如多表 4.数据量比较大 -这种最好采用分表设计 或分批查询 5.缓存池大小 可能是缓存问题ÿ…...
安卓路由与aop 以及 Router-api
安卓路由(Android Router)和AOP(面向切面编程)是两个在Android开发中常用的概念。下面我将详细讲解这两个概念及其在Android开发中的应用。 一、安卓路由 安卓路由主要用于在应用程序中管理不同组件之间的导航和通信。它可以简化…...
游戏引擎学习第89天
回顾 由于一直没有渲染器,终于决定开始动手做一个渲染器,虽然开始时并不确定该如何进行,但一旦开始做,发现这其实是正确的决定。因此,接下来可能会花一到两周的时间来编写渲染器,甚至可能更长时间…...
备战蓝桥杯-洛谷
今天打算写一些洛谷上面的题目 P10904 [蓝桥杯 2024 省 C] 挖矿 https://www.luogu.com.cn/problem/P10904 看了大佬写的题解才写出来这道题的:题解:P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷专栏 思路: 这是一道贪心的题目,用…...
动手学图神经网络(9):利用图神经网络进行节点分类 WeightsBiases
利用图神经网络进行节点分类Weights&Biases 引言 在本篇博客中,将深入探讨如何使用图神经网络(GNNs)来完成节点分类任务。以 Cora 数据集为例,该数据集是一个引用网络,节点代表文档,推断每个文档的类别。同时,使用 Weights & Biases(W&B)来跟踪实验过程和…...
如何在 FastAPI 中使用本地资源自定义 Swagger UI
要自定义 FastAPI 中的 Swagger UI,且使用本地资源来代替 CDN。只是需要稍微修改一下。 修改后的代码: 步骤: 挂载本地静态文件目录:我们将本地的 Swagger UI 资源文件(如 .js, .css, favicon.png 等)放…...
Swift 进阶:Observation 框架中可观察(@Observable)对象的高级操作(上)
概述 在 WWDC 24 中苹果推出了全新的 Observation 框架,借助于它我们可以更加细粒度的监听可观察(@Observable)对象 。同时,SwiftUI 自身也与时偕行开始全面支持 @Observable 对象的“嵌入”。 然而在这里,我们却另辟蹊径来介绍 @Observable 对象另外一些“鲜为人知”的故…...
aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API
aws(学习笔记第二十七课) 使用aws API Gatewaylambda体验REST API 学习内容: 使用aws API Gatewaylambda 1. 使用aws API Gatewaylambda 作成概要 使用api gateway定义REST API,之后再接收到了http request之后,redirect到lambda进行执行。…...