-
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_mapdevice_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