huggingface 笔记:device_map

  • 1 基本映射方法 

  • 设计设备映射时,可以让Accelerate库来处理设备映射的计算
  • 通过设置device_map为支持的选项之一("auto"、 "balanced"、 "balanced_low_0"、 "sequential");或者如果想更精确地控制每一层应该去哪里,也可以自己创建一个设备映射
"auto" 和 "balanced"在所有可用的GPU上均匀分配模型
"balanced_low_0"

在除了第一个GPU之外的所有GPU上均匀分配模型,并且只有在其他GPU放不下时,才在GPU 0上放置内容

当你需要在生成 Transformers 模型的输出时使用GPU 0进行一些处理时,这个选项非常有用

"sequential"尽可能在GPU 0上放置内容,然后移动到GPU 1,依此类推(如果不需要,就不会使用最后的GPU)

2  max_memory

  • 在infer_auto_device_map中,通过使用max_memory参数来限制每个GPU上使用的内存
  • 设置max_memory时,你应该传递一个包含GPU标识符(例如0、1等)和“cpu”键的字典
    • 值可以是一个整数(以字节为单位)或一个带单位的数字字符串,如"10GiB"或"10GB"
from accelerate import infer_auto_device_map

device_map = infer_auto_device_map(my_model, 
        max_memory={0: "10GiB", 1: "10GiB", "cpu": "30GiB"})

3 完全自行设计设备映射

  • 如果选择完全自行设计设备映射,它应该是一个字典,键是模型的模块名称,值是一个有效的设备标识符(例如GPU的一个整数)或“cpu”用于CPU卸载,“disk”用于磁盘卸载
  • 键需要覆盖整个模型

  • 例如,如果你的模型有两个块(block1和block2),每个块包含三个线性层(linear1、linear2和linear3),一个有效的设备映射可以是:
device_map = {"block1": 0, "block2": 1}
device_map = {"block1": 0,
              "block2.linear1": 0, 
              "block2.linear2": 1, 
              "block2.linear3": 1}

下面这种映射不是有效的,因为它没有覆盖模型的每个参数

device_map = {"block1": 0, "block2.linear1": 1, "block2.linear2": 1}
  • 为了最有效率,确保设备映射以顺序方式将参数放在GPU上,以避免在GPU之间进行多次数据传输。
    • 例如,不要将第一个权重放在GPU 0上,然后将权重放在GPU 1上,最后的权重再放回GPU 0
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
std::shared_ptr是C++标准库中的一个智能指针类,用于管理动态分配的资源。它具有引用计数机制,可以实现多个指针共享同一个对象的所有权。 在给std::shared_ptr赋值时,有三种方式可以使用: 1) 拷贝赋值:使用一个std::shared_ptr初始化另一个std::shared_ptr,这将导致引用计数加1。 2) 移动赋值:使用std::make_shared或者直接赋值一个临时创建的std::shared_ptr,这将导致原来的std::shared_ptr失去对资源的所有权,引用计数转移。 3) 使用std::move:将一个std::unique_ptr移动给std::shared_ptr,这将导致原来的std::unique_ptr失去对资源的所有权,引用计数转移。 对于std::shared_ptr的成员函数功能,具体可以参考STL的文档或笔记。 关于std::shared_ptr的初始化,当使用裸指针初始化std::shared_ptr时,如果指针为nullptr,则std::shared_ptr的_M_ptr和_M_refcount都将为nullptr;否则,将分配内存并初始化控制块。 所以,std::shared_ptr可以用于管理动态分配的资源,并且可以共享资源的所有权。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [std::shared_ptr 详解](https://blog.csdn.net/baidu_31541363/article/details/95802210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[STL] std::shared_ptr笔记](https://blog.csdn.net/weixin_38734472/article/details/126486549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值