CUDA-MODE课程笔记 第7课: Quantization Cuda vs Triton

我的课程笔记,欢迎关注:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode

CUDA-MODE课程笔记 第7课: Quantization Cuda vs Triton

适配课件详细解读

作者课件可以在这里找到:https://github.com/cuda-mode/lectures 。我也下载里一份放在 https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode/ppt 这里。

PyTorch最近一年发布了一些生成式AI模型的案例研究,这些模型运行速度极快,且代码及其精简。这些模型比如GPT-FAST,SAM-FAST都应用了量化技术,Charles很大程度上是这些量化Kernel的主要开发者。因此,这节课由Charles来分享量化技术。

这张Slides介绍了演讲者的背景和最近的研究重点,内容如下:

  • Pytorch Core
    • AO (Architecture Optimization) 团队
      • 量化 (Quantization)
      • 剪枝 (Pruning)
  • 最近的研究重点
    • GPU 量化
      • Segment-anything-fast, gpt-fast, sdxl-fast 等项目
      • TorchAO - 提供了一个 GitHub 链接 (https://github.com/pytorch-labs/ao)
      • Int8 动态量化
        • i8i8->i32 vs i8i8bf16->bf16
      • Int8 仅权重量化
        • bf16i8->bf16
      • Int4 仅权重量化
        • bf16i4->bf16

这张Slides介绍了三种不同的量化技术:

  • 动态量化流程 (Dynamic Quantization Flow):
    • 权重和激活都从浮点开始
    • 权重在预处理阶段量化
    • 激活在运行时量化
    • 使用Int8进行乘法运算
    • 使用Int32进行累加
    • 最后rescale回浮点数
  • 未量化 (Not Quantized):
    • 权重和激活都保持浮点格式
    • 所有运算(乘法和累加)都使用浮点数进行
  • 仅权重量化 (Weight Only Quantization):
    • 权重在预处理阶段量化
    • 随后立即反量化回浮点数
    • 激活保持浮点格式
    • 乘法和累加都使用浮点数进行
    • 最后有一个rescale步骤

总的来说,这张Slides展示了这三种技术在处理神经网络计算时的不同流程。动态量化通过在计算过程中使用整数运算来提高效率,而仅权重量化则只对权重进行压缩,在实际计算时仍使用浮点数。未量化的方法则完全使用浮点数,可能提供最高的精度但计算效率较低。

这张Slides进一步说明了动态量化(Dynamic Quantization)的概念和流程:

  • 数学表达:
    • 原始公式:Y = X.W
    • 量化后的公式:Y = (Sx*Xint).(Wint * Sw)
    • 重排后的公式:Y = Sx * (Xint.Wint) * Sw
      这里,Sx 和 Sw 是缩放因子,Xint 和 Wint 是量化后的整数值。
  • 动态量化流程图:
    • 开始于浮点权重(Float Weight)和浮点激活值(Float Activation)
    • 权重在预处理阶段进行量化(Quantize (preprocess))
    • 激活值在运行时进行量化(Quantize)
    • 使用 Int8 进行乘法运算(Multiplication (Int8))
    • 使用 Int32 进行累加运算(Accumulation (Int32))
    • 最后将结果重新缩放(Rescale (Float))回浮点数
    • 输出浮点激活值(Float Activation)

这张Slides展示了逐张量量化(per-tensor quantization)和逐token量化 + 逐通道量化(per-token + per-channel quantization)两种动态量化方式。
性能比较(以SAM模型为例,vit_h, bsz=16):

  • 无量化:运行时间 785.313 ms,峰值内存 15.279(单位未指明,可能是GB)
  • 动态量化:运行时间 731.649 ms,峰值内存 18.631
    另外,这里的链接是Triton的矩阵乘法教程。

结论:动态量化可以提高计算效率,在这个例子中,运行时间减少了约7%。不同的量化策略(逐张量、逐token、逐通道)可以应用于不同的张量,以优化性能和精度。虽然动态量化提高了计算速度,但它的显存占用却更多了大概是15%-20%。

这张Slides指出,显存增加的原因是要把int8的结果累加到int32类型中,因此相比于BFloat1增加了额外的显存。

这张Slides进一步详细介绍了动态量化(Dynamic Quantization)的概念、方法和性能比较:

  • 动态量化的数学表达:
    • 原始公式:Y = X.W
    • 量化公式:Y = (Sx*Xint).(Wint * Sw)
    • 重排公式:Y = Sx * (Xint.Wint) * Sw
    • 进一步优化:Sx * (XWrescaled)

其中使用了不同的数据类型:
- int8:用于Xint和Wint
- bf16:用于Sx和Sw
- int32:用于中间计算结果XWint

  • 性能比较(以SAM模型为例,vit_h, bsz=16):
    • 无量化:运行时间 785.313 ms,峰值内存 15.279 GB
    • 动态量化:运行时间 731.649 ms,峰值内存 18.631 GB
    • 动态量化with fusion:运行时间 695.115 ms,峰值内存 14.941 GB
      结论:动态量化可以显著提高计算效率,运行时间减少约7%。动态量化with fusion进一步优化了性能,运行时间比无量化减少约11.5%,同时还略微降低了内存使用。

这里展示的是要在Torch Compile中实现动态量化with fusion需要做出的努力,因为Torch Compile并不愿意融合乘法操作,所以作者不得不在Torch Compile的矩阵乘法kernel后强制添加一个乘法的epilogue(实际上这是一个编译器的PASS,需要匹配到矩阵乘法+乘法才能生效)。图片比较难看代码,这里贴一下:

# This op is a special case of the int_mm op which we use based on the pattern
# _int_mm -> mul (defined in ../fx_passes/post_grad.py) in order to prevent
# realization of the int32 _int_mm output by forcing fusion with the mul op.
# This is only used when config.force_fuse_int_mm_with_mul = True
def tuned_fused_int_mm_mul(mat1, mat2, mat3, out_dtype, *, layout=None):
    out_dtype = (
        torch.promote_types(mat3.get_dtype(), torch.int32)
        if out_dtype is None
        else out_dtype
    )
    m, n, k, layout, mat1, mat2, mat3 = mm_args(
        mat1, mat2, mat3, layout=layout, out_dtype=out_dtype
    )
    choices: List[Dict[Any, Any]] = []
   
这是我的报错,请问它反映了哪些问题?你又是如何锁定问题的重点并考虑出解决方案的: 025-03-04 11:39:26,407 - INFO - download models from model hub: ms Downloading Model to directory: C:\Users\QwQ\.cache\modelscope\hub\models\damo\speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch 2025-03-04 11:39:27,033 - modelscope - WARNING - Model revision not specified, use revision: v2.0.9 2025-03-04 11:39:29,017 - WARNING - enable bias encoder sampling and contextual training 2025-03-04 11:39:29,738 - INFO - Loading pretrained params from C:\Users\QwQ\.cache\modelscope\hub\models\damo\speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch\model.pt Downloading Model to directory: C:\Users\QwQ\.cache\modelscope\hub\models\damo\speech_fsmn_vad_zh-cn-16k-common-pytorch 2025-03-04 11:39:31,712 - INFO - Building VAD model. 2025-03-04 11:39:31,713 - INFO - download models from model hub: ms 2025-03-04 11:39:33,038 - modelscope - WARNING - Model revision not specified, use revision: v2.0.4 2025-03-04 11:39:33,662 - INFO - Loading pretrained params from C:\Users\QwQ\.cache\modelscope\hub\models\damo\speech_fsmn_vad_zh-cn-16k-common-pytorch\model.pt Downloading Model to directory: C:\Users\QwQ\.cache\modelscope\hub\models\damo\punc_ct-transformer_cn-en-common-vocab471067-large 2025-03-04 11:39:33,681 - INFO - Building punc model. 2025-03-04 11:39:33,681 - INFO - download models from model hub: ms 2025-03-04 11:39:34,053 - modelscope - WARNING - Model revision not specified, use revision: v2.0.4 2025-03-04 11:39:37,655 - INFO - Loading pretrained params from C:\Users\QwQ\.cache\modelscope\hub\models\damo\punc_ct-transformer_cn-en-common-vocab471067-large\model.pt 2025-03-04 11:39:40,014 - INFO - Loading LLM model... The `load_in_4bit` and `load_in_8bit` arguments are deprecated and will be removed in the future versions. Please, pass a `BitsAndBytesConfig` object in `quantization_config` argument instead. Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results
03-08
<think>嗯,用户遇到了模型加载相关的报错,需要分析日志找出问题。首先,看看日志中的时间戳都是2025年,这明显有问题,可能是系统时间设置错误导致缓存或版本校验出错。然后注意到多个WARNING,比如Model revision not specified,说明没有指定模型版本,可能后续版本不兼容。还有关于load_in_4bit和load_in_8bit参数弃用的警告,这会影响模型加载方式。还有Sliding Window Attention未实现的提示,可能影响功能。 接下来要分步骤解决。首先检查系统时间是否正确,避免缓存混乱。然后确认模型版本,显式指定revision参数。更新transformers库,替换旧的量化参数为BitsAndBytesConfig。检查sdpa的实现,可能需要更换注意力机制或等待库更新。最后处理VAD和Punctuation模型的兼容性问题,确保所有依赖项版本匹配。 需要确保用户的环境配置正确,包括时间设置、库版本和模型参数,这样才能解决加载错误和警告问题。</think>从日志分析,这个错误主要反映了以下几个关键问题: **一、时间戳异常(最优先级问题)** ```log 2025-03-04 11:39:26,407 - INFO - ... # 所有日志时间均为2025年 ``` - **问题定位**:系统时间设置错误(未来时间) - **影响**:可能导致缓存文件过期验证失败、模型版本校验异常 - **解决方案**:立即修正操作系统时间(以管理员身份运行): ```powershell w32tm /resync # Windows时间同步 ``` **二、模型加载问题** ```log WARNING - Model revision not specified, use revision: v2.0.9 WARNING - enable bias encoder sampling and contextual training ``` - **问题定位**:模型版本未显式指定 - **影响**:可能导致模型行为不一致 - **解决方案**:在代码中显式指定模型版本 ```python from modelscope import snapshot_download model_dir = snapshot_download('damo/speech_seaco_paraformer', revision='v2.0.9') ``` **三、量化参数弃用警告** ```log The `load_in_4bit` and `load_in_8bit` arguments are deprecated... ``` - **问题定位**:使用过时的量化加载方式 - **数学表达**:新方法使用量化配置对象: $$ \text{quantization\_config} = \text{BitsAndBytesConfig}(load\_in_4bit=True) $$ - **解决方案**: ```python from transformers import BitsAndBytesConfig quant_config = BitsAndBytesConfig(load_in_4bit=True) model = AutoModelForCausalLM.from_pretrained(..., quantization_config=quant_config) ``` **四、注意力机制实现问题** ```log Sliding Window Attention is enabled but not implemented for `sdpa` ``` - **问题定位**:注意力机制实现不匹配 - **影响分析**:可能影响长序列处理效果 - **解决方案**: 1. 更换注意力后端: ```python torch.backends.memory_efficient_attention.enabled = True ``` 2. 或等待库更新实现 **五、模型兼容性风险** ```log Loading pretrained params from ...\speech_fsmn_vad_zh-cn-16k-common-pytorch\model.pt Loading pretrained params from ...punc_ct-transformer...\model.pt ``` - **潜在问题**:VAD模型与Punctuation模型版本兼容性 - **验证方法**:检查requirements.txt中版本匹配: ```text modelscope>=1.11.0 transformers>=4.35.0 torch>=2.1.0 ``` **解决方案实施步骤**: 1. 修正系统时间(首要任务) 2. 升级依赖库: ```bash pip install -U modelscope transformers torch ``` 3. 重构模型加载代码: ```python # 显式指定所有模型版本 vad_model = Model.from_pretrained( 'damo/speech_fsmn_vad', revision='v2.0.4', device='cuda', quantization_config=BitsAndBytesConfig(load_in_4bit=True) ) ``` 建议使用以下命令验证环境完整性: ```bash python -c "from modelscope import __version__; print(f'ModelScope-Lib版本: {__version__}')" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值