Last Updated on 2023-12-02 by Clay
問題描述
今天我在讀取已經被 torch.compile()
之後儲存起來的模型權重,發現模型權重是使用 OrderedDict 資料結構儲存著,而這種結構本身是有序序列,換言之它的資料內容是需要嚴格遵守排序的。
而 RuntimeError: OrderedDict mutated during iteration
這個錯誤,正是因為我試圖在使用 for 迴圈迭代時,一邊又試圖改變它的內容,所以這才造成實際物件與迭代器不一致,進而導致這個錯誤發生。
解決方法
要修正這個錯誤很單純:
- 固定迭代的內容:如果我們要固定迭代 OrderedDict 的 key 值,則可以事先把 key 都儲存為 List
- 不進行 OrderedDict 內容的修改,或至少不要在迭代期間做
比方說,如果我們使用可以在 Dict 修改 key 值名稱的程式碼:
for key in ordered_dict:
ordered_dict[key.replace("name1", "name2")] = ordered_dict.pop(key)
這個方法可以在一般的 Dict 中奏效,一邊將原先的 key 彈出,一邊將其放入重新命名的 key 中。但是,一但在 OrderedDict 中使用,就會因為違反嚴格有序物件迭代的規定而被禁止操作。
所以我們可以將其修正為不使用迭代方式,而是只迭代原先 key 值所有的名稱。
for key in list(ordered_dict.keys()):
ordered_dict[key.replace("name1", "name2")] = ordered_dict.pop(key)
如此一來就可以正常成功修改。