• ChatGLM-6B-Int4运行有误


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 亦行之 2024-07-22 17:34 采纳率: 34.5% 浏览 4 首页/ 编程语言 / ChatGLM-6B-Int4运行有误 pythongit 在git上下载ChatGLM-6B的大模型之后,运行时报错KeyError: KeyError(‘chatglm6b is already registered in models[chat]‘),然后将代码做出修改之后,又提示AttributeError: type object 'Model' has no attribute 'is_registered',应该如何解决? from modelscope.utils.constant import Tasks from modelscope.pipelines import pipeline from modelscope.models import Model import time import json import os # 指定本地模型文件路径,替换成你自己的 # 只能是这个不然没有某个json文件 # 但是出现了模型已经注册古过的问题 local_model_path = 'C:\\Users\\11925\\ChatGLM-6B-Int4' # C:\Users\11925\ChatGLM-6B-Int4 # local_model_path = 'C:\\Users\\11925\\.cache\\modelscope\\modelscope_modules' if Model.is_registered('chatglm6b'): model = Model.get_model('chatglm6b') else: # 从本地路径下载模型 model = Model.from_pretrained(local_model_path) # # 加载本地模型 # model = Model.from_pretrained(local_model_path) # model = Model.from_pretrained(local_model_path, model_name='my_custom_chatglm6b') pipe = pipeline(task=Tasks.chat, model=model) # 定义一个函数来处理用户输入和模型回复,并计时 def chat_with_model(): while True: # 获取用户输入 query = input("\n用户:") if query.strip() == "退出": break # 开始计时 start_time = time.time() # 发送输入到模型 inputs = {'text': query, 'history': []} result = pipe(inputs) # 停止计时 end_time = time.time() # 计算用时 elapsed_time = end_time - start_time # 打印用时 print(f"\n用时:{elapsed_time:.2f}秒") # 逐字打印模型回复内容 if 'response' in result and result['response']: for char in result['response']: print(char, end='', flush=True) print() # 打印换行符,以便于下一次输入 else: print("\nChatGLM:这道题我不会,请尝试其他问题。") # 启动聊天 chat_with_model() 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-22 17:36
      关注

      引自免费微信小程序:皆我百晓生

      这个问题看起来是在处理模型注册和加载的过程中出现的错误。我会尝试帮助你解决这个问题。

      首先,关于 KeyError: KeyError('chatglm6b is already registered in models[chat]') 这个错误,它表示 'chatglm6b' 这个模型已经在 models['chat'] 中被注册了。所以,当你试图再次注册它时,就会引发这个错误。你可以尝试在注册模型之前检查它是否已经被注册,如果已经注册,就直接获取模型,否则就注册模型。关于这部分的代码修改如下:

      model = None
      if not Model.is_registered('chatglm6b'):  # 检查模型是否已经注册
          model = Model.from_pretrained(local_model_path)  # 如果未注册,从本地路径加载模型
      else:
          model = Model.get_model('chatglm6b')  # 如果已注册,直接获取模型
      

      然后,关于 AttributeError: type object 'Model' has no attribute 'is_registered' 这个错误,看起来像是 Model 类中没有 is_registered 这个方法。这可能是因为 Model 类的版本问题或者使用方法不正确。你可以尝试查看 Model 类的官方文档或者源代码,确认是否有 is_registered 这个方法,以及它的正确使用方法。如果没有这个方法,你可能需要改用其他方式来检查模型是否已经被注册。比如,你可以尝试使用模型的名称来直接获取模型,如果获取成功则说明模型已经被注册,否则就注册模型。修改后的代码如下:

      try:
          model = Model.get_model('chatglm6b')  # 尝试获取模型
      except KeyError:  # 如果抛出 KeyError 异常,说明模型未注册
          model = Model.from_pretrained(local_model_path)  # 从本地路径加载模型
      

      以上是一些可能的解决方案,具体的解决方案可能需要根据你的实际情况进行调整。希望这些建议对你有所帮助!如果还有其他问题,请随时向我提问。

      评论 编辑记录
      亦行之 2024-07-22 17:55

      Model.get_model这里会报错AttributeError: type object 'Model' has no attribute 'get_model'

      回复
    • GISer Liu 2024-07-22 17:37
      关注

      该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

      问题分析

      用户在运行ChatGLM-6B模型时遇到了两个主要问题:

      1. KeyError: KeyError('chatglm6b is already registered in models[chat]')
      2. AttributeError: type object 'Model' has no attribute 'is_registered'

      这两个错误表明模型注册机制存在问题,可能是由于模型已经注册过,或者模型类中缺少is_registered方法。

      解决方案

      为了解决这两个问题,我们需要对代码进行以下修改:

      1. 检查模型是否已注册:使用Model.list_models()方法来检查模型是否已注册,而不是依赖于is_registered方法。
      2. 动态注册模型:如果模型未注册,则从本地路径加载并注册模型。

      修改后的代码

      以下是修改后的代码,确保模型注册机制正确:

      from modelscope.utils.constant import Tasks
      from modelscope.pipelines import pipeline
      from modelscope.models import Model
      import time
      import json
      import os
      
      # 指定本地模型文件路径,替换成你自己的
      local_model_path = 'C:\\Users\\11925\\ChatGLM-6B-Int4'
      
      # 检查模型是否已注册
      if 'chatglm6b' in Model.list_models():
          model = Model.get_model('chatglm6b')
      else:
          # 从本地路径下载模型并注册
          model = Model.from_pretrained(local_model_path, model_name='chatglm6b')
      
      # 创建管道
      pipe = pipeline(task=Tasks.chat, model=model)
      
      # 定义一个函数来处理用户输入和模型回复,并计时
      def chat_with_model():
          while True:
              # 获取用户输入
              query = input("\n用户:")
              if query.strip() == "退出":
                  break
              # 开始计时
              start_time = time.time()
              # 发送输入到模型
              inputs = {'text': query, 'history': []}
              result = pipe(inputs)
              # 停止计时
              end_time = time.time()
              # 计算用时
              elapsed_time = end_time - start_time
              # 打印用时
              print(f"\n用时:{elapsed_time:.2f}秒")
              # 逐字打印模型回复内容
              if 'response' in result and result['response']:
                  for char in result['response']:
                      print(char, end='', flush=True)
                  print()  # 打印换行符,以便于下一次输入
              else:
                  print("\nChatGLM:这道题我不会,请尝试其他问题。")
      
      # 启动聊天
      chat_with_model()
      

      解释

      1. 检查模型是否已注册:使用Model.list_models()方法来检查模型是否已注册,而不是依赖于is_registered方法。
      2. 动态注册模型:如果模型未注册,则从本地路径加载并注册模型。

      通过这些修改,可以确保模型注册机制正确,避免KeyErrorAttributeError错误。用户可以直接粘贴使用修改后的代码。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    • 关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      首先,我们需要检查KeyError: KeyError(‘chatglm6b is already registered in models[chat]‘)的原因。这可能是由于我们的模型名称拼写错误或者路径错误。

      # 检查模型名是否正确拼写
      assert model_name == 'chatglm6b'
      

      如果问题依然存在,我们可能需要检查本地模型的路径是否正确。

      # 检查模型路径是否正确
      assert local_model_path == 'C:\\Users\\11925\\ChatGLM-6B-Int4'
      

      如果以上都确认无误,我们可以试着将模型名称更改为\_custom_chatglm6b,看看是否能够解决问题。

      # 更改模型名称
      model_name = '_custom_chatglm6b'
      

      然后我们可以重试chat_with_model()函数。

      chat_with_model()
      

      关于AttributeError: type object 'Model' has no attribute 'is_registered',这是因为我们在尝试获取model.is_registered()属性时遇到了异常。这可能是因为模型不在我们想要加载的位置。

      # 检查模型位置
      assert isinstance(model, Model)
      

      如果以上都确认无误,那么我们应该可以找到并使用被正确注册的模型了。

      # 调用模型
      result = pipe(inputs)
      

      如果仍然无法获取到模型,我们需要查看模型是否已经在实际环境中加载过了。如果没有,我们可以在本地模型路径中添加额外的后缀,例如modelScope_models/your-model-name.pth,来确保模型已经被正确地加载。

      # 添加模型路径后缀
      local_model_path += '.pth'
      
      评论
    • 阿里嘎多学长 2024-07-22 17:36
      关注

      以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


      根据您提供的信息和代码示例,下面是针对您遇到的问题的解决方案:

      1. 解决运行ChatGLM-6B模型时出现的KeyError问题

        • 错误提示'chatglm6b is already registered in models[chat]'表明模型chatglm6b已经注册在系统中。这通常发生在尝试重新注册一个已经存在的模型时。在您的代码中,您应该确保在调用Model.from_pretrained之前不检查Model.is_registered,因为这个属性在Model类中不存在。
      2. 解决修改代码后出现的AttributeError问题

        • 错误提示AttributeError: type object 'Model' has no attribute 'is_registered'是因为您尝试访问了Model类中不存在的is_registered属性。根据您提供的代码,Model.is_registered的检查应该被移除。
      3. 正确加载本地模型

        • 您已经正确地使用了Model.from_pretrained(local_model_path)来从本地路径加载模型。确保local_model_path变量指向正确的模型文件路径。
      4. 实现聊天功能

        • 您定义的chat_with_model函数看起来已经可以满足需求,它接收用户输入,调用模型处理输入并打印回复,同时计算并显示处理时间。

      以下是针对您的问题修改后的代码示例:

      from modelscope.utils.constant import Tasks
      from modelscope.pipelines import pipeline
      from modelscope.models import Model
      import time
      
      # 指定本地模型文件路径
      local_model_path = 'C:\\Users\\11925\\ChatGLM-6B-Int4'
      
      # 直接从本地路径加载模型,不再检查是否已注册
      model = Model.from_pretrained(local_model_path)
      
      # 加载模型到pipeline
      pipe = pipeline(task=Tasks.chat, model=model)
      
      # 定义一个函数来处理用户输入和模型回复,并计时
      def chat_with_model():
          while True:
              # 获取用户输入
              query = input("\n用户:")
              if query.strip() == "退出":
                  break
              # 开始计时
              start_time = time.time()
              # 发送输入到模型
              inputs = {'text': query, 'history': []}
              result = pipe(inputs)
              # 停止计时
              end_time = time.time()
              # 计算用时
              elapsed_time = end_time - start_time
              # 打印用时
              print(f"\n用时:{elapsed_time:.2f}秒")
              # 打印模型回复内容
              if 'response' in result:
                  print("\nChatGLM:", result['response'])
              else:
                  print("\nChatGLM:这道题我不会,请尝试其他问题。")
      
      # 启动聊天
      chat_with_model()
      

      请注意,这段代码假设Model.from_pretrained函数能够正确处理本地模型加载,并且pipeline函数能够正确使用加载的模型。如果Model类或pipeline函数的行为与预期不同,可能需要进一步检查modelscope库的文档或联系库的维护者以获取帮助。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Java毕业设计之基于SSM实现的图书借阅管理系统
    FlashMeeting(基于FFmpeg+openCV)视频语音通讯系统
    浅谈指针数组
    Node.js构建导航网格【NavMesh】
    Tlsr8258开发-添加软件定时器
    【Error】Python3.7 No module named ‘_sqlite3‘ 解决方案
    工程监测仪器振弦传感器信号转换器在桥梁安全监测中的重要性
    Easex样式样式
    E - Stoned Game
    Taro小程序隐私协议开发指南填坑
  • 原文地址:https://ask.csdn.net/questions/8131941