Skip to content

[已解決] RuntimeError: OrderedDict mutated during iteration - OrderedDict 不能在迭代時發生變化

Last Updated on 2023-12-02 by Clay

問題描述

今天我在讀取已經被 torch.compile() 之後儲存起來的模型權重,發現模型權重是使用 OrderedDict 資料結構儲存著,而這種結構本身是有序序列,換言之它的資料內容是需要嚴格遵守排序的。

RuntimeError: OrderedDict mutated during iteration 這個錯誤,正是因為我試圖在使用 for 迴圈迭代時,一邊又試圖改變它的內容,所以這才造成實際物件與迭代器不一致,進而導致這個錯誤發生。


解決方法

要修正這個錯誤很單純:

  1. 固定迭代的內容:如果我們要固定迭代 OrderedDict 的 key 值,則可以事先把 key 都儲存為 List
  2. 不進行 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)


如此一來就可以正常成功修改。


References


Read More

Tags:

Leave a Reply