解决 RuntimeError: “LayerNormKernelImpl“ not implemented for ‘Half‘

解决 RuntimeError: “LayerNormKernelImpl” not implemented for ‘Half’。

在这里插入图片描述

错误类似如下:

Traceback (most recent call last):
File “cli_demo.py”, line 21, in
for results in webglm.stream_query(question):
File “/root/WebGLM/model/modeling_webglm.py”, line 49, in stream_query
outputs = self.model.generate(**inputs, max_length=1024, eos_token_id = self.tokenizer.eop_token_id, pad_token_id=self.tokenizer.eop_token_id)
File “/usr/local/python3/lib/python3.8/site-packages/torch/autograd/grad_mode.py”, line 27, in decorate_context
return func(*args, **kwargs)
File “/usr/local/python3/lib/python3.8/site-packages/transformers/generation/utils.py”, line 1515, in generate
return self.greedy_search(
File “/usr/local/python3/lib/python3.8/site-packages/transformers/generation/utils.py”, line 2332, in greedy_search
outputs = self(
File “/usr/local/python3/lib/python3.8/site-packages/torch/nn/modules/module.py”, line 1130, in _call_impl
return forward_call(*input, **kwargs)
File “/root/.cache/huggingface/modules/transformers_modules/WebGLM-2B/modeling_glm.py”, line 902, in forward
model_output = self.glm(input_ids, position_ids, attention_mask, mems=mems, **kwargs)
File “/usr/local/python3/lib/python3.8/site-packages/torch/nn/modules/module.py”, line 1130, in _call_impl
return forward_call(*input, **kwargs)
File “/root/.cache/huggingface/modules/transformers_modules/WebGLM-2B/modeling_glm.py”, line 783, in forward
transformer_output = self.transformer(embeddings, position_ids, attention_mask, mems)
File “/usr/local/python3/lib/python3.8/site-packages/torch/nn/modules/module.py”, line 1130, in _call_impl
return forward_call(*input, **kwargs)
File “/root/.cache/huggingface/modules/transformers_modules/WebGLM-2B/modeling_glm.py”, line 595, in forward
hidden_states = layer(*args, mem=mem_i)
File “/usr/local/python3/lib/python3.8/site-packages/torch/nn/modules/module.py”, line 1130, in _call_impl
return forward_call(*input, **kwargs)
File “/root/.cache/huggingface/modules/transformers_modules/WebGLM-2B/modeling_glm.py”, line 417, in forward
layernorm_output = self.input_layernorm(hidden_states)
File “/usr/local/python3/lib/python3.8/site-packages/torch/nn/modules/module.py”, line 1130, in _call_impl
return forward_call(*input, **kwargs)
File “/usr/local/python3/lib/python3.8/site-packages/torch/nn/modules/normalization.py”, line 189, in forward
return F.layer_norm(
File “/usr/local/python3/lib/python3.8/site-packages/torch/nn/functional.py”, line 2503, in layer_norm
return torch.layer_norm(input, normalized_shape, weight, bias, eps, torch.backends.cudnn.enabled)
RuntimeError: “LayerNormKernelImpl” not implemented for ‘Half’


在深度学习中,Layer Normalization(层标准化)是一种常用的技术,用于加速训练和提高模型稳定性。然而,在某些情况下,您可能会遇到RuntimeError: “LayerNormKernelImpl“ not implemented for ‘Half‘错误。这个错误通常意味着在半精度(即float16)模式下,Layer Normalization的实现存在问题。
问题原因:

硬件和软件不兼容:某些深度学习框架(如PyTorch)在某些硬件上可能不支持半精度Layer Normalization。
模型和层配置问题:在模型定义或配置中,可能存在与半精度不兼容的设置。
版本问题:使用的深度学习框架或库的版本可能存在已知的bug或不兼容性。
解决方案:
检查硬件和软件支持:确保您的硬件和软件支持半精度运算。某些GPU可能不完全支持半精度运算,此时可以考虑使用其他GPU或升级驱动程序和框架版本。
使用全精度运算:作为一种临时解决方案,您可以尝试将模型和训练切换到全精度(即float32)模式。这可以通过修改模型配置或设置训练参数来实现。
更新框架和库:检查是否有可用的更新,并确保您使用的是最新版本的深度学习框架和相关库。新版本可能修复了与半精度运算相关的问题。
自定义实现:如果框架本身不支持半精度Layer Normalization,您可以考虑自己实现该层。这需要一定的深度学习和编程知识,但可以提供更大的灵活性和控制力。
查找相关社区和论坛:参与相关的开发者社区和论坛,查找类似问题的解决方案和讨论。这些社区通常由经验丰富的开发者组成,可以提供宝贵的建议和解决方案。
预防措施:
文档阅读:在开始项目之前,仔细阅读您所使用的深度学习框架的文档。了解半精度运算的支持情况和最佳实践。
测试不同设置:在进行模型训练之前,尝试在不同的设置(如不同的硬件、软件版本等)下进行测试,以识别潜在的问题区域。
持续关注更新:保持对深度学习框架和相关库的关注,以便及时了解任何与半精度运算相关的改进和新特性。
代码审查:定期进行代码审查,确保代码中没有与半精度运算不兼容的配置或设置。
备份和记录:在进行任何更改之前,始终备份您的项目代码和配置。这样,如果出现问题,您可以轻松回滚到之前的状态并进行调试。

解决方法:

export COMMANDLINE_ARGS="--use-cpu all --precision full --no-half --skip-torch-cuda-test"
export COMMANDLINE_ARGS="--skip-torch-cuda-test --precision full --no-half"
export COMMANDLINE_ARGS="--skip-torch-cuda-test --no-half --use-cpu all"
export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --use-cpu interrogate --precision full --no-half"
export COMMANDLINE_ARGS="--autolaunch --skip-torch-cuda-test --disable-nan-check --no-half --use-cpu all"

-–skip-torch-cuda-test:这个参数是用来跳过检测 torch 是否能使用 GPU 的,如果您的 CUDA 和 torch 版本不匹配,或者您的电脑没有 CUDA GPU ,可以使用这个参数来绕过这个检测。

-–precision full:这个参数是用来指定 torch使用全精度(32位)的浮点数来运算的,相比于半精度(16位)或混合精度(16位和32位),全精度可以提高运算的准确性,但也会增加运算的时间和内存消耗。

-–no-half:这个参数是用来禁止 torch 使用半精度的数据类型的,如果您的显卡不支持半精度,或者您遇到了 “LayerNormKernelImpl” not implemented for ‘Half’ 的错误,可以使用这个参数来解决。


如果还是不行,可以考虑修改代码解决:

这个错误通常发生在尝试以半精度(Half)模式运行包含层归一化(Layer Norm)操作的代码时。具体来说,该错误表示图形处理器(GPU)上不支持半精度数据的层归一化操作。

要解决这个问题,可以尝试以下方法:

  1. 确保你使用的是最新版本的 PyTorch。更新到最新版本可能会修复此问题。你可以使用以下命令检查和更新 PyTorch:

    pip install --upgrade torch
    
  2. 在运行层归一化操作之前,将数据类型转换为全精度(Float)模式:

    # 将输入数据转换为全精度(Float)类型
    inputs = inputs.float()# 执行模型操作
    outputs = self.model.generate(**inputs, max_length=1024, eos_token_id=self.tokenizer.eop_token_id, pad_token_id=self.tokenizer.eop_token_id)# 如果需要,将数据类型转回半精度(Half)
    inputs = inputs.half()
    
  3. 如果你的系统支持,可以尝试禁用 GPU 加速,将代码切换到 CPU 运行:

    # 在初始化模型之前禁用 GPU 加速
    torch.backends.cudnn.enabled = False# 初始化模型和其他相关操作
    # ...# 执行模型操作
    # ...
    

例如:

Benchmark模式会提升计算速度,但是由于计算中有随机性,每次网络前馈结果略有差异。如果想要避免这种结果波动,设置:

torch.backends.cudnn.deterministic = True

设置为True,说明设置为使用使用非确定性算法:

torch.backends.cudnn.enabled = True

整体使用:
在模型的开始之前添加:

import torch.backends.cudnn as cudnn
cudnn.deterministic = True
cudnn.benchmark = True
cudnn.enabled = True

CPU运行的报错似乎与pytorch有关,CPU推理目前仍只支持fp32。
最后如果代码里面 模型 初始化的时候,调用了半精度,例如:

self.model = self.model.half()

修改为:

if device != "cpu":self.model = self.model.half()

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

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

相关文章

(关键点检测)YOLOv8实现多类人体姿态估计的输出格式分析

(关键点检测)YOLOv8实现多类人体姿态估计的输出格式分析 任务分析 所使用的数据配置文件 网络结构 导出模型 用 netron 可视化 输出格式分析 参考链接 1. 任务分析 判断人体关键点时一并给出关键点所属的类别,比如男人,女…

二维码样式修改如何在线处理?在电脑上改二维码图案的方法

随着网络的不断发展,二维码的应用场景不断增多,很多人都会将内容放到二维码中,通过扫码的方式将储存在云端的数据调取显示。而面对不同的用途时,对二维码的样式也会有单独的要求,比如需要改变颜色、加入文字、logo、尺…

vue3中el-input输入无效的原因之一

表单的model用的是:reactive let updateForm reactive({ id: 0, className: "" }); reactive的数据不能这么赋值,会破坏响应性 错误方法(){ updateForm { id: 0, className: "asdasdas" }; } 解决方法&…

Python与FPGA——局部二值化

文章目录 前言一、局部二值化二、Python局部二值化三、FPGA局部二值化总结 前言 局部二值化较全局二值化难,我们将在此实现Python与FPGA的局部二值化处理。 一、局部二值化 局部二值化就是使用一个窗口,在图像上进行扫描,每扫出9个像素求平均…

Keepalived 高可用集群

目录 一、Keepalived工具介绍 1、用户空间核心组件: 2、Watch Dog:监控进程(来监控整个架构是否有问题) 二、vrrp协议(虚拟路由冗余协议) 1、vrrp是什么? 2、vrrp工作过程 3、keepalived…

文件二维码怎么加访问权限?加密、限时、限次的二维码制作技巧

扫码查看或者下载文件已经是现在经常被使用的一种方式,当我们通过这种方式来展现文件内容时,是否能够加入一些权限设置来保障文件的安全性,是很多小伙伴非常关心的一个问题。 想要制作文件二维码,大多情况下会通过在线二维码生成…

腾讯云和阿里云哪个好?云服务器价格表对比

2024年阿里云服务器和腾讯云服务器价格战已经打响,阿里云服务器优惠61元一年起,腾讯云服务器62元一年,2核2G3M、2核4G、4核8G、8核16G、16核32G、16核64G等配置价格对比,阿腾云atengyun.com整理阿里云和腾讯云服务器详细配置价格表…

Java agent技术的注入利用与避坑点

什么是Java agent技术? Java代理(Java agent)是一种Java技术,它允许开发人员在运行时以某种方式修改或增强Java应用程序的行为。Java代理通过在Java虚拟机(JVM)启动时以"代理"(agent…

文生视频Sora模型发布,是否引爆AI芯片热潮

文生视频Sora模型发布,是否引爆AI芯片热潮 1. 引言 在人工智能的历史长河中,每一次技术的飞跃都伴随着社会生产力的巨大变革。自2015年以来,深度学习技术的突破性进展,尤其是在自然语言处理、图像识别和机器学习等领域的成功应…

17-Java解释器模式 ( Interpreter Pattern )

Java解释器模式 摘要实现范例 解释器模式(Interpreter Pattern)实现了一个表达式接口,该接口解释一个特定的上下文 这种模式被用在 SQL 解析、符号处理引擎等 解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式 …

外汇天眼:伦敦金属交易所宣布新的高级领导任命

伦敦金属交易所(LME)今日宣布了多项高级领导职务任命和组织设计变更。 LME的任命将于2024年4月1日生效。 苏珊斯莫尔被任命为总法律顾问,负责监督LME及LME Clear的法律职能。斯莫尔女士将于6月加入,并将向LME及LME Clear的首席执…

销售管理之反向与正向目标控制

在销售活动中,控制力是关键。但控制力其实分为两种:反向控制和正向控制。本文将深入探讨这两种控制方式,并阐述如何在销售活动中加以应用,以提升销售效果。 一、反向控制:以客户为中心,引导客户需求 反向控…