GPTQ vs AWQ vs GGUF(GGML) 速览和 GGUF 文件命名规范

简单介绍一下四者的区别。

参考链接:GPTQ - 2210.17323 | AWQ - 2306.00978 | GGML | GGUF - docs | What is GGUF and GGML?

文章目录

    • GPTQ vs AWQ vs GGUF(GGML) 速览
      • GGUF 文件命名
      • GGUF 文件结构
      • 文件名解析答案
    • 附录
      • GGUF 文件命名
      • GGUF 文件结构

GPTQ vs AWQ vs GGUF(GGML) 速览

  • GPTQ (Generalized Post-Training Quantization)
    GPTQ 是一种基于近似二阶信息的后训练量化技术,能够将模型的权重位宽降低到 3-4 bits,在大幅减少模型大小和计算成本的同时还能保持模型性能。在极端情况下还能量化到 2 bits 甚至 3 进制,但会有一定的性能损失。

  • AWQ (Activation-aware Weight Quantization)

    image-20241004182540373

    AWQ 不会量化模型的所有权重,保留了对模型性能重要的一小部分权重,大大减少了量化损失。如图所示,这里比较极端,是 INT3 量化:

    • 图 a:RTN量化(Round-to-Nearest)
      将权重直接四舍五入到目标位宽,导致性能明显下降,PPL 达到 43.2。

    • 图 b:保护 1% 的显著权重,使用混合精度形式
      这里展示了一种改进策略,即保留 1% 最重要的权重通道使用高精度(FP16),其余使用低精度(INT3)。PPL 降低到 13.0。虽然这种方法能保住性能,但由于需要不同精度切换,硬件效率不高。但这一策略证明了并非所有权重都对模型性能同等重要。

    • 图 c:AWQ 提出的通道缩放量化方法

      AWQ 通过通道缩放保护显著权重,利用激活分布找到重要的权重并缩放它们的值来减少量化误差。相比混合精度形式,AWQ 提升了硬件效率,同时性能与图 b 一致,PPL 也为到 13.0。

  • GGML (GPT-Generated Model Language)
    「显存不够内存来凑」,这是一种文件格式,支持在CPU和GPU上进行推理。

  • GGUF (GPT-Generated Unified Format):
    GGUF 是 GGML 的升级版,提升了扩展和兼容性。

GGUF 文件命名

参考链接:GGUF - docs

GGUF 格式将加载模型所需的所有信息封装在一个文件中,简化了模型的分发和部署。同时,GGUF 文件命名遵循 <BaseName><SizeLabel><FineTune><Version><Encoding><Type><Shard>.gguf 的规则,方便人们快速识别模型的关键信息。具体说明如下:

  • BaseName:模型的基础名称或架构名称,例如 Llama
  • SizeLabel:模型的参数规模标签,表示模型的参数数量及可能的专家数量,格式为 <expertCount>x<count><scale-prefix>
    • expertCount:表示专家模型中的专家数量。如果模型没有使用 Mixture of Experts (MoE) 架构,可以省略。
    • Count
      • Q: 表示百万亿(quadrillion)参数。
      • T: 表示万亿(trillion)参数。
      • B: 表示十亿(billion)参数。
      • M: 表示百万(million)参数。
      • K: 表示千(thousand)参数。
        当前主流大模型多为 B 级参数(十亿级),但未来 T(万亿级)模型可能会成为主流。
    • 附加属性:在某些情况下,-<attributes><count><scale-prefix> 可以进一步细化模型的描述,添加额外的参数,例如 Q, K, T,这些表示量化方式或其他模型特性。例如:
      • Q4: 表示 4-bit 量化。
        示例:
      • 7B: 表示 70 亿参数的模型。
      • 4x3T: 表示有 4 个专家的 3 万亿参数模型。
      • 2x10B-Q4: 表示有 2 个专家且采用 Q4 量化的 100 亿参数模型。
  • FineTune:微调目标描述(如 ChatInstruct)。
  • Version(可选):模型的版本号,格式为 v<Major>.<Minor>,没提供则假设为 v1.0
  • Encoding:权重编码方案(如 Q4_0 表示 4-bit 量化)。
  • Type:文件类型,如 LoRA(适配器)或 vocab(仅包含词汇表)。
  • Shard(可选):模型分片信息,格式为 <ShardNum>-of-<ShardTotal>,适用于大型模型。例如 00003-of-00009 表示第 3 个分片,共 9 个分片,注意分片编号从 00001 开始,而非 00000

验证命名是否符合规范的正则:

^(?<BaseName>[A-Za-z0-9\s]*(?:(?:-(?:(?:[A-Za-z\s][A-Za-z0-9\s]*)|(?:[0-9\s]*)))*))-(?:(?<SizeLabel>(?:\d+x)?(?:\d+\.)?\d+[A-Za-z](?:-[A-Za-z]+(\d+\.)?\d+[A-Za-z]+)?)(?:-(?<FineTune>[A-Za-z0-9\s-]+))?)?-(?:(?<Version>v\d+(?:\.\d+)*))(?:-(?<Encoding>(?!LoRA|vocab)[\w_]+))?(?:-(?<Type>LoRA|vocab))?(?:-(?<Shard>\d{5}-of-\d{5}))?\.gguf$

尝试理解下面三个来自官方文档的文件命名,看看你能否正确解析:

  1. Mixtral-8x7B-v0.1-KQ2.gguf
  2. Hermes-2-Pro-Llama-3-8B-F16.gguf
  3. Grok-100B-v1.0-Q4_0-00003-of-00009.gguf

在文章的末尾会给出解析答案,现在请停下来思考。

GGUF 文件结构

*diagram by @mishig25(/Users/home/Downloads/agent/LLM-API-Guide-and-Demos/Guide/assets/313174776-c3623641-3a1d-408e-bfaf-1b7c4e16aa63-2.png)*

如果想进一步了解,查看附录部分的代码。

文件名解析答案

  • Mixtral-8x7B-v0.1-KQ2.gguf

    • BaseName:Mixtral
    • SizeLabel
      • Expert Count: 8
      • Parameter Count: 7B
    • Version:v0.1
    • Encoding:KQ2
  • Hermes-2-Pro-Llama-3-8B-F16.gguf

    • BaseName:Hermes 2 Pro Llama 3
    • SizeLabel
      • Expert Count: 0
      • Parameter Count: 8B
    • Version:v1.0
    • Encoding:F16
  • Grok-100B-v1.0-Q4_0-00003-of-00009.gguf

    • BaseName:Grok
    • SizeLabel
      • Expert Count: 0
      • Parameter Count: 100B
    • Version:v1.0
    • Encoding:Q4_0
    • Shard:第 3 个分片,共 9 个分片

附录

GGUF 文件命名

Quantization Types

类型来源描述
F64Wikipedia64 位标准 IEEE 754 双精度浮点数。
I64GH64 位定宽整数。
F32Wikipedia32 位标准 IEEE 754 单精度浮点数。
I32GH32 位定宽整数。
F16Wikipedia16 位标准 IEEE 754 半精度浮点数。
BF16Wikipedia32 位 IEEE 754 单精度浮点数的 16 位简化版本。
I16GH16 位定宽整数。
Q8_0GH8 位四舍五入量化(q)。每个块有 32 个权重。权重公式:w = q * block_scale。目前已不广泛使用的过时量化方法。
Q8_1GH8 位四舍五入量化(q)。每个块有 32 个权重。权重公式:w = q * block_scale + block_minimum。目前已不广泛使用的过时量化方法。
Q8_KGH8 位量化(q)。每个块有 256 个权重。仅用于量化中间结果。此量化类型支持所有 2-6 位点积。权重公式:w = q * block_scale
I8GH8 位定宽整数。
Q6_KGH6 位量化(q)。超块包含 16 个块,每个块有 16 个权重。权重公式:w = q * block_scale(8-bit),每个权重占用 6.5625 位。
Q5_0GH5 位四舍五入量化(q)。每个块有 32 个权重。权重公式:w = q * block_scale。目前已不广泛使用的过时量化方法。
Q5_1GH5 位四舍五入量化(q)。每个块有 32 个权重。权重公式:w = q * block_scale + block_minimum。目前已不广泛使用的过时量化方法。
Q5_KGH5 位量化(q)。超块包含 8 个块,每个块有 32 个权重。权重公式:w = q * block_scale(6-bit) + block_min(6-bit),每个权重占用 5.5 位。
Q4_0GH4 位四舍五入量化(q)。每个块有 32 个权重。权重公式:w = q * block_scale。目前已不广泛使用的过时量化方法。
Q4_1GH4 位四舍五入量化(q)。每个块有 32 个权重。权重公式:w = q * block_scale + block_minimum。目前已不广泛使用的过时量化方法。
Q4_KGH4 位量化(q)。超块包含 8 个块,每个块有 32 个权重。权重公式:w = q * block_scale(6-bit) + block_min(6-bit),每个权重占用 4.5 位。
Q3_KGH3 位量化(q)。超块包含 16 个块,每个块有 16 个权重。权重公式:w = q * block_scale(6-bit),每个权重占用 3.4375 位。
Q2_KGH2 位量化(q)。超块包含 16 个块,每个块有 16 个权重。权重公式:w = q * block_scale(4-bit) + block_min(4-bit),每个权重占用 2.5625 位。
IQ4_NLGH4 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到。
IQ4_XSHF4 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 4.25 位。
IQ3_SHF3 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 3.44 位。
IQ3_XXSHF3 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 3.06 位。
IQ2_XXSHF2 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 2.06 位。
IQ2_SHF2 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 2.5 位。
IQ2_XSHF2 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 2.31 位。
IQ1_SHF1 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 1.56 位。
IQ1_MGH1 位量化(q)。超块包含 256 个权重。权重 w 通过 super_block_scaleimportance matrix 计算得到,每个权重占用 1.75 位。

GGUF 文件结构

GGUF - docs

enum ggml_type: uint32_t {GGML_TYPE_F32     = 0,GGML_TYPE_F16     = 1,GGML_TYPE_Q4_0    = 2,GGML_TYPE_Q4_1    = 3,// GGML_TYPE_Q4_2 = 4, support has been removed// GGML_TYPE_Q4_3 = 5, support has been removedGGML_TYPE_Q5_0    = 6,GGML_TYPE_Q5_1    = 7,GGML_TYPE_Q8_0    = 8,GGML_TYPE_Q8_1    = 9,GGML_TYPE_Q2_K    = 10,GGML_TYPE_Q3_K    = 11,GGML_TYPE_Q4_K    = 12,GGML_TYPE_Q5_K    = 13,GGML_TYPE_Q6_K    = 14,GGML_TYPE_Q8_K    = 15,GGML_TYPE_IQ2_XXS = 16,GGML_TYPE_IQ2_XS  = 17,GGML_TYPE_IQ3_XXS = 18,GGML_TYPE_IQ1_S   = 19,GGML_TYPE_IQ4_NL  = 20,GGML_TYPE_IQ3_S   = 21,GGML_TYPE_IQ2_S   = 22,GGML_TYPE_IQ4_XS  = 23,GGML_TYPE_I8      = 24,GGML_TYPE_I16     = 25,GGML_TYPE_I32     = 26,GGML_TYPE_I64     = 27,GGML_TYPE_F64     = 28,GGML_TYPE_IQ1_M   = 29,GGML_TYPE_COUNT,
};enum gguf_metadata_value_type: uint32_t {// The value is a 8-bit unsigned integer.GGUF_METADATA_VALUE_TYPE_UINT8 = 0,// The value is a 8-bit signed integer.GGUF_METADATA_VALUE_TYPE_INT8 = 1,// The value is a 16-bit unsigned little-endian integer.GGUF_METADATA_VALUE_TYPE_UINT16 = 2,// The value is a 16-bit signed little-endian integer.GGUF_METADATA_VALUE_TYPE_INT16 = 3,// The value is a 32-bit unsigned little-endian integer.GGUF_METADATA_VALUE_TYPE_UINT32 = 4,// The value is a 32-bit signed little-endian integer.GGUF_METADATA_VALUE_TYPE_INT32 = 5,// The value is a 32-bit IEEE754 floating point number.GGUF_METADATA_VALUE_TYPE_FLOAT32 = 6,// The value is a boolean.// 1-byte value where 0 is false and 1 is true.// Anything else is invalid, and should be treated as either the model being invalid or the reader being buggy.GGUF_METADATA_VALUE_TYPE_BOOL = 7,// The value is a UTF-8 non-null-terminated string, with length prepended.GGUF_METADATA_VALUE_TYPE_STRING = 8,// The value is an array of other values, with the length and type prepended.///// Arrays can be nested, and the length of the array is the number of elements in the array, not the number of bytes.GGUF_METADATA_VALUE_TYPE_ARRAY = 9,// The value is a 64-bit unsigned little-endian integer.GGUF_METADATA_VALUE_TYPE_UINT64 = 10,// The value is a 64-bit signed little-endian integer.GGUF_METADATA_VALUE_TYPE_INT64 = 11,// The value is a 64-bit IEEE754 floating point number.GGUF_METADATA_VALUE_TYPE_FLOAT64 = 12,
};// A string in GGUF.
struct gguf_string_t {// The length of the string, in bytes.uint64_t len;// The string as a UTF-8 non-null-terminated string.char string[len];
};union gguf_metadata_value_t {uint8_t uint8;int8_t int8;uint16_t uint16;int16_t int16;uint32_t uint32;int32_t int32;float float32;uint64_t uint64;int64_t int64;double float64;bool bool_;gguf_string_t string;struct {// Any value type is valid, including arrays.gguf_metadata_value_type type;// Number of elements, not bytesuint64_t len;// The array of values.gguf_metadata_value_t array[len];} array;
};struct gguf_metadata_kv_t {// The key of the metadata. It is a standard GGUF string, with the following caveats:// - It must be a valid ASCII string.// - It must be a hierarchical key, where each segment is `lower_snake_case` and separated by a `.`.// - It must be at most 2^16-1/65535 bytes long.// Any keys that do not follow these rules are invalid.gguf_string_t key;// The type of the value.// Must be one of the `gguf_metadata_value_type` values.gguf_metadata_value_type value_type;// The value.gguf_metadata_value_t value;
};struct gguf_header_t {// Magic number to announce that this is a GGUF file.// Must be `GGUF` at the byte level: `0x47` `0x47` `0x55` `0x46`.// Your executor might do little-endian byte order, so it might be// check for 0x46554747 and letting the endianness cancel out.// Consider being *very* explicit about the byte order here.uint32_t magic;// The version of the format implemented.// Must be `3` for version described in this spec, which introduces big-endian support.//// This version should only be increased for structural changes to the format.// Changes that do not affect the structure of the file should instead update the metadata// to signify the change.uint32_t version;// The number of tensors in the file.// This is explicit, instead of being included in the metadata, to ensure it is always present// for loading the tensors.uint64_t tensor_count;// The number of metadata key-value pairs.uint64_t metadata_kv_count;// The metadata key-value pairs.gguf_metadata_kv_t metadata_kv[metadata_kv_count];
};uint64_t align_offset(uint64_t offset) {return offset + (ALIGNMENT - (offset % ALIGNMENT)) % ALIGNMENT;
}struct gguf_tensor_info_t {// The name of the tensor. It is a standard GGUF string, with the caveat that// it must be at most 64 bytes long.gguf_string_t name;// The number of dimensions in the tensor.// Currently at most 4, but this may change in the future.uint32_t n_dimensions;// The dimensions of the tensor.uint64_t dimensions[n_dimensions];// The type of the tensor.ggml_type type;// The offset of the tensor's data in this file in bytes.//// This offset is relative to `tensor_data`, not to the start// of the file, to make it easier for writers to write the file.// Readers should consider exposing this offset relative to the// file to make it easier to read the data.//// Must be a multiple of `ALIGNMENT`. That is, `align_offset(offset) == offset`.uint64_t offset;
};struct gguf_file_t {// The header of the file.gguf_header_t header;// Tensor infos, which can be used to locate the tensor data.gguf_tensor_info_t tensor_infos[header.tensor_count];// Padding to the nearest multiple of `ALIGNMENT`.//// That is, if `sizeof(header) + sizeof(tensor_infos)` is not a multiple of `ALIGNMENT`,// this padding is added to make it so.//// This can be calculated as `align_offset(position) - position`, where `position` is// the position of the end of `tensor_infos` (i.e. `sizeof(header) + sizeof(tensor_infos)`).uint8_t _padding[];// Tensor data.//// This is arbitrary binary data corresponding to the weights of the model. This data should be close// or identical to the data in the original model file, but may be different due to quantization or// other optimizations for inference. Any such deviations should be recorded in the metadata or as// part of the architecture definition.//// Each tensor's data must be stored within this array, and located through its `tensor_infos` entry.// The offset of each tensor's data must be a multiple of `ALIGNMENT`, and the space between tensors// should be padded to `ALIGNMENT` bytes.uint8_t tensor_data[];
};

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

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

相关文章

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作&#xff0c;从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…

JAVA并发编程系列(13)Future、FutureTask异步小王子

美团本地生活面试&#xff1a;模拟外卖订单处理&#xff0c;客户支付提交订单后&#xff0c;查询订单详情&#xff0c;后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快&#xff0c;一转眼不到一个月时间&#xff0c;已经完成分享synchronized、volatile、…

【VUE】案例:商场会员管理系统

编写vuedfr实现对会员进行基本增删改查 1. drf项目初始化 请求&#xff1a; POST http://127/0.0.0.1:8000/api/auth/ {"username":"cqn", "password":"123"}返回&#xff1a; {"username":"cqn", "token&q…

读论文、学习时 零碎知识点记录01

1.入侵检测技术 2.深度学习、机器学习相关的概念 ❶注意力机制 ❷池化 ❸全连接层 ❹Dropout层 ❺全局平均池化 3.神经网络中常见的层

.NET Core 集成 MiniProfiler性能分析工具

前言&#xff1a; 在日常开发中&#xff0c;应用程序的性能是我们需要关注的一个重点问题。当然我们有很多工具来分析程序性能&#xff1a;如&#xff1a;Zipkin等&#xff1b;但这些过于复杂&#xff0c;需要单独搭建。 MiniProfiler就是一款简单&#xff0c;但功能强大的应用…

Unraid的cache使用btrfs或zfs?

Unraid的cache使用btrfs或zfs&#xff1f; 背景&#xff1a;由于在unraid中添加了多个docker和虚拟机&#xff0c;因此会一直访问硬盘。然而&#xff0c;单个硬盘实在难以让人放心。在阵列盘中&#xff0c;可以通过添加校验盘进行数据保护&#xff0c;在cache中无法使用xfs格式…

深入挖掘C++中的特性之一 — 继承

目录 1.继承的概念 2.举个继承的例子 3.继承基类成员访问方式的变化 1.父类成员的访问限定符对在子类中访问父类成员的影响 2.父类成员的访问限定符子类的继承方式对在两个类外访问子类中父类成员的影响 4.继承类模版&#xff08;注意事项&#xff09; 5.父类与子类间的转…

数据结构——计数、桶、基数排序

目录 引言 计数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 桶排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 基数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 排序算法的稳定性 1.稳定性的概念 2.各个排序算法的稳定性 结束语 引…

C++(string类的实现)

1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针&#xff0c;所以我们可以直接使用一个指针来实现迭代器&#xff0c;但如下图可见迭代器有两个&#xff0c;一个是指向的内容可以被修改&#xff0c;另一个则是指…

Pytorch最最适合研究生的入门教程,Q3 开始训练

文章目录 Pytorch最最适合研究生的入门教程Q3 开始训练3.1 训练的见解3.2 Pytorch基本训练框架work Pytorch最最适合研究生的入门教程 Q3 开始训练 3.1 训练的见解 如何理解深度学习能够完成任务&#xff1f; 考虑如下回归问题 由函数 y f ( x ) yf(x) yf(x)采样得到的100个…

【安当产品应用案例100集】018-Vmware Horizon如何通过安当ASP身份认证系统增强登录安全性

启用Radius认证是提高VMware Horizon环境安全性的有效方法&#xff0c;特别是在需要满足复杂安全要求的场景中。 启用Radius认证对于VMware Horizon具有以下几个关键优势&#xff1a; 增强安全性&#xff1a;Radius认证支持多种认证方法&#xff0c;包括PAP、CHAP、MS-CHAPv1…

web前端面试中拍摄的真实js面试题(真图)

web前端面试中拍摄的真实js面试题&#xff08;真图&#xff09; WechatIMG258.jpeg WechatIMG406.jpeg WechatIMG407.jpeg WechatIMG922.jpeg WechatIMG1063.jpeg © 著作权归作者所有,转载或内容合作请联系作者 喜欢的朋友记得点赞、收藏、关注哦&#xff01;&#xff01;…

TypeScript 算法手册 - 【冒泡排序】

文章目录 TypeScript 算法手册 - 冒泡排序1. 冒泡排序简介1.1 冒泡排序定义1.2 冒泡排序特点 2. 冒泡排序步骤过程拆解2.1 比较相邻元素2.2 交换元素2.3 重复过程 3. 冒泡排序的优化3.1 提前退出3.2 记录最后交换位置案例代码和动态图 4. 冒泡排序的优点5. 冒泡排序的缺点总结 …

【SpringBoot详细教程】-09-Redis详细教程以及SpringBoot整合Redis【持续更新】

🌲 Redis 简介 🌾 什么是Redis Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库 Redis是互联网技术领域使用最为广泛的存储中间件,它是「Remote DictionaryServic…

TARA分析方法论——威胁分析和风险评估方法

一、什么是TARA分析方法论 威胁分析和风险评估&#xff08;Threat Analysis and Risk Assessment&#xff09; 通过识别整车/项目的网络安全资产&#xff0c;分析其中的潜在的安全威胁&#xff0c;综合考虑威胁攻击可行性、危害影响等因素&#xff0c;识别出整车/项目可能存在…

Python并发编程(2)——初始Python多线程

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取python编程资料 前言 什么是多线程&#xff1f; 为什么需要多线程&#xff1f; 多线程的优点和缺点&#xff1f…

前端规范工程-5:Git提交信息规范(commitlint + czg)

前面讲的都是在git提交之前的一些检查流程&#xff0c;然而我们git提交信息的时候&#xff0c;也应该是需要规范的。直接进入主题&#xff1a; 目录 需安装插件清单commitlint 介绍安装配置配置commit-msg钩子提交填写commit信息czg后续方式一&#xff1a;push触动build并上传…

Windows UAC权限详解以及因为权限不对等引发软件工具无法正常使用的实例分析

目录 ​1、什么是UAC&#xff1f; 2、微软为什么要设计UAC&#xff1f; 3、标准用户权限与管理员权限 4、程序到底以哪种权限运行&#xff1f;与哪些因素有关&#xff1f; 4.1、给程序设置以管理员权限运行的属性 4.2、当前登录用户的类型 4.3、如何通过代码判断某个进程…

2.1MyBatis——ORM对象关系映射

2.1MyBatis——ORM对象关系映射 1. 验证映射配置2.ResultType和ResultMap2.1ResultMap是最终的ORM依据2.2ResultType和ResultMap的使用区别 3.具体的转换逻辑3.1 TypeHandle类型转换 5.总结 概括的说&#xff0c;MyBatis中&#xff0c;对于映射关系的声明是由开发者在xml文件手…

手机USB连接不显示内部设备,设备管理器显示“MTP”感叹号,解决方案

进入小米驱动下载界面&#xff0c;等小米驱动下载完成后&#xff0c;解压此驱动文件压缩包。 5、小米USB驱动安装方法&#xff1a;右击“计算机”&#xff0c;从弹出的右键菜单中选择“管理”项进入。 6、在打开的“计算机管理”界面中&#xff0c;展开“设备管理器”项&…