一直以來都有這樣的感覺,想要編譯任何大專案,最好還是乖乖在 Linux,否則即使該專案有提供在 Windows 編譯的方法,根據我的經驗都沒有那麼順風順水。
底下是我在 Windows 7 成功編譯的方法以及遇到坑的處理方式,記錄一下避免忘記。
官方指南
https://www.tensorflow.org/install/source_windows
TensorFlow:r1.15 (CPU-Only)
Install Python 以及相關 modules
這部份直接照官方網站即可。
Install Bazel
這個要配合 TensorFlow 的版本,我是下載 0.26.1,並放在 C:\Windows\System32 下。
Install MSYS2
這部份直接照官方網站即可。
Install VS2017
安裝完需要更新到最新,即執行 cl 時版本要為 19.16,也就是 "_MSC_VER" 這個值要是 1916。
開啟 cmd prompt
適用於 VS 2017 的 x64 Native Tools 命令提示字元。
設定環境變數
set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC
set Path=C:\msys64\usr\bin;%Path%
切換工作目錄
切到 TenosorFlow code root。
開始編譯
bazel --connect_timeout_secs=120 build --config=opt //tensorflow/tools/pip_package:build_pip_package --test_timeout=120 --http_timeout_scaling=3.0
編譯過程中遇到的問題
1. 一開始沒多久就遇到網路問題,即使如上面放寬相關 timeout 也沒用,後來靈機一動判斷是公司網路問題,改用自己的網路即可。
2. "_MSC_VER" 版本太舊,這個問題花了我 2 天才搞定,底下是個人猜測,原來是我的 VS2017 環境一直有更新,故我的 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC" 裡面會有各種不同的版本,而 bazel 在一開始會去此路徑下找到第一個擁有相關 bin 檔的路徑,並將其寫到 "C:\Users\XXX\_bazel_XXX\mfg32ytw\external\local_config_cc\cc_toolchain_config.bzl" 等相關檔案的區塊,例如 cpp_link_nodeps_dynamic_library_action 此區塊,故即使你開的 cmd prompt 是對的,但此處的 cl 版本如果是在錯的資料夾, "_MSC_VER" 這個變數便會是錯的。
解決方式也很簡單,去控制台針對 VS2017 做修改,把較舊版本的 tool 移除,印象中我原本有多達 6 ~ 7 個之多,後來就只剩 "14.16.27023" 這個資料夾,而這個就是 1916 的版本。
其實我也有安裝 VS2019 Build Tools,但一樣會有 "_MSC_VER" 版本太舊的問題,但因為我那時還不知道問題在哪,故並未更新 VS2019 到新版本。
在我解決了上面 2 個問題後,我就順利的編譯出 "bazel-bin\tensorflow\tools\pip_package\build_pip_package" 這個執行檔,而我們需要它來產生 pip 的安裝檔,這部份就參考官網即可。
一些小秘訣
1. bazel 可以使用 --jobs=2 --local_cpu_resources=2 參數去限制 CPU 資源,一開始沒限制每個 Core 都跑到 100%,此時電腦做什麼事都很慢。
2. 成功編譯過一次後,如果都沒改檔案並用上上面的參數,再檢查一次大概要花 3 分鐘多。
3. 檢查需不要需要重新編譯的程式應該是用 java 寫的。
4. C:\Users\XXX\_bazel_XXX\mfg32ytw 裡面會有編譯過程的 log 及 java 的 log。
VS2019相關(未嘗試,僅猜測)
1. 如果是安裝 VS2019 Build Tools,VC 路徑是在 "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC"。
2. 相對 VS2017,VS2019 多個版本是在 "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC",用一樣的方式留下最新的即可。
沒有留言:
張貼留言