Pyinstaller打包Pytorch框架所遇到的問題

Continue_i發表於2022-03-24

前言

  第一次嘗試用Pyinstaller打包Pytorch,碰見了很多問題,耗費了許多時間!想把這個過程中碰到的問題與解決方法記錄一下,方便後來者。

基本流程

  使用Pyinstaller打包流程可分為以下三步:

  • 安裝Pyinstaller,寫個Hello world打包測試
  • 打包整個專案,在本機上除錯生成exe
  • 將exe拷貝到新電腦上,測試和除錯

一、安裝Pyinstaller 和 測試Hello World

  使用Pycharm開啟專案,點選Terminal,輸入以下命令:

pip install pyinstaller

  請確保Terminal所在路徑為專案根目錄,以免在後續打包過程中找不到一些模組。圖中紅框內(pytorch)是我的專案所需要的虛擬環境。

  編寫Hello World測試,新建test.py:

if __name__ == '__main__':
  print("Hello World!")
  while True:
    pass

  在Terminal輸入以下命令,打包test.py:

pyinstaller -F test.py

  回車執行,開始打包!在資料夾dist中找到test.exe程式,執行測試,沒報錯說明Pyinstaller安裝成功。

二、打包整個專案,在本機上除錯生成exe

  實際的專案一般是多檔案,打包過程遠比Hello World複雜多了。打包專案的核心要點有兩個:

  • 配置好.spec檔案
  • 補齊依賴項

  關於.spec檔案配置詳見參考連結一,這裡不再贅述。需要注意的是,在測試階段,打包時應設定為-D模式,方便補齊dll。本文重點講dll及其依賴項的補齊。先安裝必備工具Dependens,通過這個工具,我們可以得到.dll檔案所需要的依賴項。在執行打包後的exe常常遇到以下的問題:

  這提示我們系統缺少caffe2_nvrtc.dll或其對應的依賴項。

  • 先到對應路徑檢視caffe2_nvrtc.dll是否存在
  • 若不存在,直接在Anaconda配置環境的資料夾搜尋,一般都可以找到。將找到的caffe2_nvrtc.dll複製貼上到根目錄
  • 若存在,說明是缺少caffe2_nvrtc.dll的依賴項,使用Dependencies工具檢視所需要的依賴項,後補齊到根目錄

  Dependencies的使用非常簡單,直接將.dll拖進去即可。這裡以torch_python.dll舉例

  可以發現,缺少若干個dll檔案,補齊便可。通過上述方法,依樣畫葫蘆,基本可以解決關於dll報錯的問題。
  但每次重新打包後,需要手動複製貼上dll檔案,很是麻煩,通過配置.spec檔案可簡化操作。以記事本方式開啟.spec,找到datas:

  小括號內有兩個路徑,第一個路徑'kernel32.dll'表示原始資料路徑,存放kernel32.dll的路徑;第二路徑為'.'表示目標路徑,打包後原始資料存放的路徑。意思就是將第一路徑的東西在打包後,放在第二路徑上。需要注意的是,這邊我設定的是相對路徑,相對於.spec中的pathex

三、在新電腦上測試

  我使用的是pytorch的GPU版本,在新電腦上執行發現會報如下錯誤,應該是缺少cuda庫的緣故。

  我的解決辦法簡單粗暴,直接拷貝cuda包到行動硬碟

  每次到新的電腦,新增cuda到環境變數


  建議在程式額外設定一個選項,可將網路切換成CPU推理,以便在其他電腦測試時,即使環境未配置成功,也可通過CPU推理驗證打包成功與否。最後,祝大家好運,打包成功那一刻是蠻喜悅的!

參考資料

相關文章