星辰儿啊 2024-05-23 09:55 采纳率: 43.1%
浏览 8

关于python加载模型的问题

这是我们的模型加载,以及调用的代码

def early_reply_model():
    """
    function:得到的是加载后的模型,这里是一个生存器
    """
    chat_model = ChatModel(dict(
        model_name_or_path=model_name_or_path,
        adapter_name_or_path=adapter_name_or_path,
        finetuning_type="lora",
        template="Testing",
    ))

    return chat_model


```  #下面是调用模型的代码,通过遍历生存器获取回复
        messages = []
        messages.append({"role": "user", "content": issue})
        response = ""
        for new_text in chat_model.stream_chat(messages):
            response += new_text

问题:
我们的模型加载和调用,都是通过这种方式,
现在当我同时加载两个模型时,会报错gpu显存不足,请问怎么解决这个问题呢
支持同时加载,同时调用

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-23 09:55
    关注

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

    为了解决在单个GPU上加载多个模型导致的显存不足问题,可以采取以下几种策略:

    1. 模型融合(如果有条件):如果两个模型的任务相似,可以尝试将它们融合成一个模型,以减少内存占用。

    2. 动态加载:仅在需要时加载模型,用完后立即卸载。这可以通过使用Python的垃圾回收机制或者自定义上下文管理器来实现。

    3. 模型量化与剪枝:对模型进行量化(从浮点数到整数转换)和剪枝(删除不重要的权重),可以降低模型大小。

    4. 数据并行性:如果您的GPU支持,可以考虑使用DataParallel进行多进程处理。然而,这通常只适用于训练,且对推理阶段帮助有限。

    5. 使用CPU:如果可能的话,在CPU上运行部分或全部模型。

    6. 增加硬件资源:购买具有更多GPU的服务器,或者使用GPU云服务。

    对于Python代码,我们可以尝试采用动态加载的方法。首先确保每个模型都在独立的函数中加载,然后在需要的时候再调用这些函数。下面是一个例子,展示了如何使用上下文管理器来自动加载和卸载模型:

    import torch
    from torch.cuda import max_memory_allocated, memory_allocated
    
    class ModelLoader:
        def __init__(self, model_func):
            self.model_func = model_func
            self.model = None
    
        def __enter__(self):
            if torch.cuda.is_available():
                print("Loading model onto GPU")
                self.model = self.model_func()
                self.model.to('cuda')
            else:
                print("No CUDA available, loading on CPU")
                self.model = self.model_func()
    
            return self.model
    
        def __exit__(self, exc_type, exc_value, traceback):
            if torch.cuda.is_available():
                print("Unloading model from GPU")
                del self.model
                torch.cuda.empty_cache()
            else:
                print("Unloading model from CPU")
                del self.model
    
    # 假设我们有两个模型加载函数
    def load_model_1():
        return torch.nn.Linear(10, 10)
    
    def load_model_2():
        return torch.nn.Conv2d(1, 1, kernel_size=3)
    
    # 使用示例
    with ModelLoader(load_model_1) as model1:
        # 在这里使用model1
        pass
    
    print(f"Memory used after model1: {memory_allocated()}")
    
    with ModelLoader(load_model_2) as model2:
        # 在这里使用model2
        pass
    
    print(f"Memory used after model2: {memory_allocated()}")
    

    这种方法有助于在不同时间点加载不同的模型,并在使用完毕后释放内存。但是,需要注意的是,这并不保证绝对的内存释放,因为Python的垃圾回收机制可能会延迟释放内存。在实际应用中,你可能需要根据具体情况进行调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算