Posted on

Optimization loop failed: Cancelled: Operation was cancelled

遇到的錯誤訊息

2023-06-14 16:32:39.652288: W tensorflow/core/data/root_dataset.cc:167] Optimization loop failed: Cancelled: Operation was cancelled

這個錯誤訊息代表TensorFlow 在優化過程中遇到了問題,並且操作被取消了。當操作被取消時,TensorFlow 無法完成所需的計算任務,因此無法產生期望的結果。具體來說,如果你在使用 TensorFlow 的 CPU 模式下運行一個優化循環,並且該循環被取消,以下情況可能發生:

  • 訓練過程中斷:如果你正在訓練一個模型,操作取消將導致訓練過程中止。你將無法完成整個訓練過程,無法獲得最終訓練好的模型。
  • 中斷的結果:在某些情況下,如果操作被取消,TensorFlow 可能會嘗試返回已經計算出的部分結果。這取決於具體的操作和中斷發生的時間點。然而,這些部分結果通常不是完整或不可用的。
  • 推斷錯誤:如果你正在使用模型進行推斷(如輸入一條文本獲取其分類),而操作被取消,你將無法獲得模型對輸入的預測結果。這可能導致你無法得知模型的輸出,或者輸出結果不完整、不准確。

為什麼會出現此錯誤

大部分的狀況是因為資源不足,導致運算被中斷

  • 計算資源不足:TensorFlow 在 CPU 模式下運行時,對於大型、複雜的模型或數據集,可能需要較長的時間來完成計算。如果計算資源有限,操作可能會被取消。
  • 內存不足:TensorFlow 在處理大型模型或數據時需要大量內存。如果內存不足,操作可能會被取消。
  • 配置錯誤:有時,TensorFlow 的配置可能不正確,導致操作無法成功完成。這可能包括錯誤的版本或依賴問題。

觀察電腦CPU與MEMORY使用狀況

要解決此問題,首先要先觀察是哪一部分出了問題,就需要在程式內去監控資源的使用。請參考此篇教學: How to get current CPU and RAM usage in Python

    # Importing the library
    import psutil


    # Getting % usage of virtual_memory ( 3rd field)
    if psutil.virtual_memory()[2] > 80:
        print(time.strftime("%Y-%m-%d_%H-%M-%S") + ' RAM memory % used:', psutil.virtual_memory()[2])
        # Getting usage of virtual_memory in GB ( 4th field)
        print('RAM Used (GB):', psutil.virtual_memory()[3]/1000000000)
    
    cpu_usage = psutil.cpu_percent()
    if cpu_usage > 80:
        print(time.strftime("%Y-%m-%d_%H-%M-%S") + ' The CPU usage is: ', cpu_usage)

解決 – 若是使用太多記憶體

在Tensorflow裡面有一篇討論串,滿多人都會遇到此問題,其中一位大大建議在GPU上提高可使用的內存,可解決此問題

gpus = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(gpu, True)

討論串: Optimization loop failed: Cancelled: Operation was cancelled

另外也可以考慮設置合適的 batch_size、限制模型大小或減少數據集規模是一種在沒有 GPU 或內存受限的情況下控制內存使用的方法。下面是一些方法可以考慮:

  • 調整 batch_size:batch_size 是每次模型訓練時用於處理的樣本數量。較大的 batch_size 可能會導致內存不足。你可以嘗試降低 batch_size 的值,以減少內存需求。但要注意,較小的 batch_size 可能會影響訓練過程的穩定性和收斂速度。
  • 限制模型的大小:模型的大小直接影響內存使用。你可以嘗試以下方法來限制模型的大小:
    • 減少模型的層數或參數數量。
    • 使用輕量級模型架構,例如 MobileNet、SqueezeNet 等。
    • 使用模型剪枝技術,減少模型中冗餘參數的數量。
    • 使用低精度(如 16 位浮點數)表示模型的參數,以減少內存佔用。
  • 減少數據集規模:如果數據集過大而導致內存不足,你可以考慮以下方法來減少數據集的規模:
    • 隨機採樣:從原始數據集中隨機選擇一部分樣本作為子集進行訓練。確保採樣後的數據集仍具有代表性。
    • 數據集切片:將大型數據集切割成多個較小的部分,逐個部分進行訓練。可以使用交叉驗證等技術來利用所有數據並評估模型性能。

解決 – 若是使用太多CPU

可嘗試以下方法來減少 CPU 的消耗:

  • 減少數據的處理量:優化輸入數據的大小和復雜度,可以減少 CPU 的負載。例如,可以嘗試縮小圖像尺寸、減少輸入序列的長度或降低數據的維度。
  • 使用批處理預測:通過將多個樣本組成一個批次進行預測,可以減少每個樣本的計算和內存佔用。 Model.predict() 方法默認可以處理批量輸入,你可以將多個樣本一起傳遞給該方法進行預測。
  • 並行處理:如果你的系統支持多線程或多進程,並且你的模型和數據可以進行並行處理,可以使用並行化方法來提高 CPU 的利用率。例如,使用 Python 的 multiprocessing 模塊或 TensorFlow 的 tf.data.Dataset 的並行化功能。
  • 優化模型:檢查你的模型結構和計算圖,看是否有可以優化的部分。可能存在一些冗餘計算或可以簡化的操作。你可以嘗試使用 TensorFlow 的圖優化工具,如 tf.function 和 tf.autograph,來加速模型的計算過程。
  • 使用更高效的庫或算法:某些情況下,使用其他庫或算法可能比 TensorFlow 更高效。你可以嘗試使用其他機器學習庫,如 PyTorch 或 Scikit-learn,並根據你的需求選擇更適合的庫和算法。
  • 升級硬件:如果你的計算機配置允許,可以考慮升級到更強大的 CPU 或添加更多的 CPU 核心。這樣可以提高系統的並行處理能力和整體性能。