解决 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.mzph.cn/news/726803.shtml

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

相关文章

<C++>【继承篇】

​ ✨前言✨ 🎓作者:【 教主 】 📜文章推荐: ☕博主水平有限,如有错误,恳请斧正。 📌机会总是留给有准备的人,越努力,越幸运! 💦导航助手&#x1…

Vue+SpringBoot打造校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

入门版式设计:设计小白的必备知识!

你曾经被一本华丽的杂志、一张引人注目的海报或一个优雅的网站设计所吸引吗?这些都是版式设计的魅力所在。作为一个设计小白,我们可能不熟悉版式设计,但事实上,它无处不在,深深影响着我们的生活。那么,什么…

Spring 整合mybatis

目录 1、梳理整合思路 2、整合实现 2.1 环境搭建 2.2 案例 1、梳理整合思路 将MyBatis的DataSource交给Spring IoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数据库连接池将MyBatis的SqlSessionFactory交给Spring IoC容…

大型网站架构演化总结

本文图解大型网站架构演化。 目录 1、单一应用服务阶段 2、应用与数据服务分离阶段 3、利用缓存提高性能阶段 4、应用服务集群阶段 5、数据库读写分离阶段 6、反向代理与CDN加速阶段 7、分布式数据库阶段 8、 NoSQL与搜索引擎阶段 9、业务拆分阶段 10、分布式服务阶…

Leetcode刷题(三十八)

旋转矩阵(Medium) 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:mat…

openGauss数据库实战分享

一:openGauss 数据库简介 想必大家都了解华为这个企业,华为在手机、通信、汽车研发、操作系统研发等方面都有很大的成就,如果不是受到了制裁,估计华为现在能取得更好的成绩。华为这一品牌大家都知道,但是华为的 openGa…

PaddleOCR识别框架解读[06] DBNet 阈值图与概率图标签的生成

文章目录 概率图 probability map 标签阈值图 threshold map 标签DB: Real-time Scene Text Detection with Differentiable Binarization网络整体流程一. Label generationprobability map生成threshold map 生成二. Differentiable Binarization可微二值化2.1 传统二值化和DB…

前端面试练习24.3.7

目录 1.类型转换练习 2.数据之间运算 算术运算 比较运算 逻辑运算 3.动态执行JS(类似eval方法) 1.eval()方法 2.setTimeout 3.创建DOM节点进行添加 4.Function的最后一个参数当作函数体直接运行 4.promise工具函数练习 5.统计字符频率写法的发…

js的类等于什么操作产生的?

class 类定义提升 class如和产生的对象? 类定义 实际上,类是“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类语法有两个组成部分:类表达式和类声明。 提升 函数声明和类声明之间的一个重要区别在于&am…

基于springboot+vue的医疗挂号管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

vcruntime140.dll丢失的修复办法详细介绍以及详细步骤

当电脑丢失vcruntime140.dll文件时,电脑会出现关于vcruntime140.dll丢失的错误提示,vcruntime140.dll文件包含许多重要的函数和资源,若缺少或丢失该文件,可能会导致电脑出现异常状况。今天就来和大家说说如果电脑出现关于vcruntim…

获取别人店铺的所有商品API接口

使用淘宝淘口令接口的步骤通常包括: 注册成为淘宝开放平台的开发者:在淘宝开放平台网站上注册账号并完成认证。 创建应用以获取API密钥:在您的开发者控制台中创建一个应用,并获取用于API调用的密钥,如Client ID和Clie…

【JavaEE初阶 -- 计算机核心工作机制】

这里写目录标题 1.冯诺依曼体系2.CPU是怎么构成的3.指令表4.CPU执行代码的方式5.CPU小结:6.编程语言和操作系统7. 进程/任务(Process/Task)8.进程在系统中是如何管理的9. CPU分配 -- 进程调度10.内存分配 -- 内存管理11.进程间通信 1.冯诺依曼…

javaweb学习(day07-手动实现tomcat)

一、引入案例 1 小案例 引出对 Tomcat 底层实现思考 1.1 完成小案例 1.1.1 运行效果 1.2 maven简要介绍 我们准备使用 Maven 来 创建一个 WEB 项目 , 先 简单给小伙伴介绍一下 Maven 是 什 么 , 更加详细的使用,我们还会细讲 , 现在先使用一把 1.3 创…

vue中常用的指令和自定义指令

在Vue中&#xff0c;常用的指令有v-bind、v-on、v-for、v-if、v-show等。自定义指令可以通过Vue.directive()方法来创建。 下面是常用指令和自定义指令的代码示例&#xff1a; v-bind&#xff1a;用于动态绑定HTML属性 <div v-bind:class"{active: isActive}"&…

多个变量指向同一个数组

多个变量中的内存地址是一样的&#xff0c;都是指向当前的数组&#xff0c;存储当前数组对象的地址&#xff0c;因此修改是对当前数组的值进行修改 数组中存储的是null&#xff0c;那么他将不会指向任何数组对象 System.out.println(arr) 输出结果为null&#xff0c;里面没有…

Vue+OpenLayers7入门到实战:webgl图层叠加大量Icon图片到地图,解决叠加超大数据量图片导致浏览器卡住变慢的问题

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 之前已经讲了如何地图中如何添加大量点到webgl图层优化大量点浏览器页面卡顿的问题。本章介绍补充一下叠加大量图片图标要素到地图的情况下的问题。 二、依赖和使用 "ol": "7.5.2"使用npm安装依…

Vue+OpenLayers7入门到实战:OpenLayers7如何使用gifler库来实现gif动态图图片叠加到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 OpenLayers7本身不支持gif图片作为图标要素显示到地图上,所以需要通过其他办法来实现支持gif图片。 本章介绍如何使用OpenLayers7在地图上使用gifler库先生成canvas画板,然后通过canvas画板的重绘事件来重新渲染地图…

leetcode 热题 100_最大子数组和

题解一&#xff1a; 动态规划&#xff1a;这是一道经典的动态规划题。维护一个dp数组&#xff0c;dp[i]表示0~i组成的数组的最大子数组和。当数组长度为1时&#xff0c;最大和连续子数组是它本身&#xff0c;也就是dp[i]nums[i]。当数组长度每增加1时&#xff0c;最大和连续子数…