--- title: 安裝 TensorFlow 以及相關套件 tags: Deep Learning --- :::info 這篇用來記錄 Debug 的過程,給未來的自己以及看見這篇的人用 ::: # 打開 TensorFlow 官網 看了看官網指示,似乎說明最新版本的 TensorFlow 「支持 GPU」 所以就直接 pip install 了 TensorFlow 然後照著書上的 Code 打,發現有些函式跟物件都沒有,才意識到式版本的問題 現在已經是 2.X 版本,但是書上的是 1.X 版本 後來想說順便看我的 GPU 有沒有被偵測到,所以去查詢如何檢測 GPU 結果發現,我載的沒有偵測到我的 GPU 然後想說不然重裝好了,所以我就照著[上面的指示](https://www.tensorflow.org/install/pip#step-by-step_instructions)下載 MiniConda 和後續的步驟 :::warning 注意,中文版跟英文版內容不一樣,英文版才有安裝教學 ::: 但是看到下面這行,我就矇了,完蛋,看不懂這行的意思 ``` export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/ ``` 還有這行 ``` mkdir -p $CONDA_PREFIX/etc/conda/activate.d echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/' > $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh ``` :::warning 但是那時我沒有意識到這兩行的重要性,之後會讓我陷入一個 Debug 循環 不過在搜尋這兩行的的意義時,讓我建構了一些基本意識,還有找到影響後面很重要的網站 [設置 Anaconda 的虛擬環境的特定環境變數](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#macos-and-linux) ::: 我想說那不然先不管這兩行,所以就一樣,載好後打開 VS Code 結果一樣, GPU 列表傳回的是空陣列... # 開始 Google 如何下載 Tensoflow 於是我就在網路上找到了[救命的教學](https://medium.com/@johnnyliao/%E5%9C%A8win10%E4%B8%8A%E5%AE%89%E8%A3%9Dcuda-toolkit-cudnn-tensorflow-gpu-1-12%E4%BB%A5%E4%B8%8B%E5%8F%8A1-13%E4%BB%A5%E4%B8%8A-%E7%9A%84%E5%AE%89%E8%A3%9D%E7%B6%93%E9%A9%97%E5%88%86%E4%BA%AB-c792953b316f)還有他的[影片](https://www.youtube.com/watch?v=qLjw_EtqmCs) 於是我照著他的步驟,成功下載了 tensorflow-gpu,並且所需的 cudatoolkit 和 cudnn 也都一併載好了,通常這兩個是需要額外載的 :::success 也因此學會了 Python 虛擬環境的重要性,還有 Conda 提供虛擬環境的方便性 以及熟悉了 Conda 的語法 ::: :::warning 要注意的是, Conda 只支援到 tnesorflow-gpu=2.6 可以使用 conda search "site package 名稱" 去看支援的版本,或者到[官網](https://anaconda.org/anaconda/tensorflow-gpu)查詢也可以 直接用 conda install 的好處是不用額外去載 cudatoolkit 跟 cudnn 不過如果想要弄最新的就要改用 pip install 這三個東西,詳細內容都在救命恩人的網站 那個真的搞了我很多時間,不過就是這樣才能在那過程中去學會了之前沒去理解的東西 ::: 我下載了三個版本的 TF ,2.10.0、2.6.0 跟 1.15.0 我很開心地打開 VS Code ,迫不及待想要看我的 GPU 被偵測到,結果,VS Code 卻跑出了警告,在 import tensorflow 的時候就出問題,問我 python 跟 numpy 的版本有沒有符合要求 但是回到 conda 的終端機去看,版本都對;後來發現 VS Code 終端機底下有寫一個訊息 --- UserWarning: mkl-service package failed to import, therefore Intel(R) MKL initialization ensuring its correct out-of-the box operation under condition when Gnu OpenMP had already been loaded by Python process is not assured. Please install mkl-service package, see http://github.com/IntelPython/mkl-service --- 所以又 google 這到底是甚麼問題,因此找到了[這篇](https://www.jianshu.com/p/8ae21207c3dc)照裡面的指示所提供的網址,警告就可以消除了 # 1.15.0 的問題 但是其實 1.15.0 根本連執行都不能執行,按下 F5 甚麼事也沒發生,不過我有注意到右下角的警告 ``` The isort server crashed 5 times in the last 3 minutes. .... ``` 但此時我就沒有要先管 1.15.0 的事,我跑去處理 dll 的問題 # 找不到 dll 我的終端機底下顯示像[這個人發生的問題](https://blog.csdn.net/a1456123a/article/details/115098630) 那時候我以為是 Vs Code 沒有抓到 Conda 的環境還是怎麼的,所以又研究了一些時間 但是都找不出所以然,然後看了很久,就看到原本裝 cudatoolkit 的方式 可是因為我是用 conda 裝的,所以根本沒有像上面網址所說的 ``` ... 將這兩個文件放到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin ... ``` 後來回想起官網有叫我輸入的 command line ``` export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/ ``` 然後跑去學了 command line 的語法,才知道原來上面的是 Linux 的 command line 語法 所以我從 [conda 的官網](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#macos-and-linux) 找到了對應的 windows command line 語法,並且真的在各個環境的 Lib 的 bin 裡面找到 cuda 等等需要的 dll,只要把那個 bin 放進系統環境變數... VS Code 就真找的到那些 dll 了 但是如果一次放多個環境的 bin,我怕會有衝突,所以就去研究 anaconda 官網詳細在講甚麼 並且也去 google 一些資訊,了解到原來啟動(activate)不同環境時,使用 set 指令額外設置的環境變數不會影響到原先的系統變數,只有在那個 Session 才會起作用 最終就是在啟動時會叫的 bat 檔新增該 bin 檔作為 PATH 的變數 :::success 過程中補齊了 command line 的知識,真香 ::: 當我以為就要成功時, VS Code 再次給賞了大大的耳光 # VS Code 終端機 由於我有在 bat 裡面寫一些指令,檢測有無正確的使用這個 bat 檔 ``` echo "Activate tf_2.10.0" ``` 但是按下 F5 的時候,該文字並沒有顯示,所以,又開始了我的 Google 之旅 當時有在猜是預設終端機的問題,因為當我在 conda 的 prompt 執行 activate 指令時 該文字是有顯示的,所以問題出在 VS Code 上 然後我忘記最後怎麼查到的,總之查到說 Power shell 跟 Conda 好像有很多額外的設定要弄 而 VS Code 的預設終端機是 Power shell,如果沒有額外去弄會有很多問題 不過如果把 VS Code 預設終端機改為 cmd 一切都沒問題了 連 conda 環境的 bat 指令執行也沒問題 到這裡,總算是解決 9 成的問題了 :::warning 順便練習了 VS Code 的快捷鍵 Ctrl+Shift+P ::: # 面對 TensorFlow 1.15.0 由於 VS Code 怎麼執行都沒有反應,所以跑去 comda 的 prompt 測試,結果是可以的 還順便解決了一個問題... --- ## 問題:Adding visible gpu devices: 0 在執行的時候這個步驟都會卡很久;在前面的問題還沒解決前有嘗試用 prompt 執行,還以為是沒裝好遇到 Bug 所以我就 Google 到了[這個](https://blog.csdn.net/zmh1250329863/article/details/116225385?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-116225385-blog-122105432.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-116225385-blog-122105432.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=1),照著他的步驟,也看看裡面提及的 stackoverflow,就結論來說是改變一個環境變數就好 --- ...回到 VS Code,此時我終於注意到那個 isort 掛掉的警告,所以我就又 trial and error,有找到其他人也有該情況,但是都跟我的不符合,所以我就恰巧,真的恰巧,看到他在 VS Code 商店的敘述 - This extension is supported for all actively supported versions of the python language (i.e., python >= 3.7). 我看了看我那時候裝 TF 對應的 Python:3.6 該死,原來原因在這 所以我就重新裝好了,然後也可以偵測到 GPU 了,真是太感動了 # 補充 其實最上面講的 Import module error ,我不太確定到底是怎麼解決的 那時候 conda 終端機恰巧,又是恰巧給我一個警告 ![](https://drive.google.com/uc?id=1VPstMJO65EwkhFrafOzU3Ak6ccc6K2Fl&export=download) 沒錯,預設用 conda 裝 Tensorflow 會有這個問題 tensorboard 跟 tensorflow-estimator 版本會過高,圖中我已經把 tensorboard 卸載後重裝了 所以其實我有點忘記到底是上面這個,還是重新載 numpy 的那個解決 import module error :::info 這是我唯一截的一張圖;一開始就打算記錄整個 Debug 過程,但是那時候才意識到應該要連圖一起紀錄比較好,所以只有記錄到這張圖 ::: # P.S. 其實在一開始看到官方說 Configure the system paths. You can do it with following command everytime your start a new terminal after activating your conda environment ``` export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/ ``` 我就在想: 「意思是每次我重新開終端機就要打一次該指令嗎?(是的) 但是官方有說可以用下面的指令去自動執行這件事 這樣每次打開該虛擬環境的時候就會自動執行該指令」 ``` mkdir -p $CONDA_PREFIX/etc/conda/activate.d echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/' > $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh ``` 但是那時的我甚麼都不會,也不知道這是 Linux 的語法 # Refference 1. [先前糾結的 cudatoolkit 跟 cudnn](https://www.gushiciku.cn/pl/ab1K/zh-tw) 2. [設置 conda 的虛擬環境的新環境變數](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#macos-and-linux) 3. [Linux 跟 Windows 的 Command Line 語法比較](https://blog.csdn.net/xzwspy/article/details/80183849) 4. [救命恩人](https://medium.com/@johnnyliao/%E5%9C%A8win10%E4%B8%8A%E5%AE%89%E8%A3%9Dcuda-toolkit-cudnn-tensorflow-gpu-1-12%E4%BB%A5%E4%B8%8B%E5%8F%8A1-13%E4%BB%A5%E4%B8%8A-%E7%9A%84%E5%AE%89%E8%A3%9D%E7%B6%93%E9%A9%97%E5%88%86%E4%BA%AB-c792953b316f) 5. [救命恩人的影片](https://www.youtube.com/watch?v=qLjw_EtqmCs) 6. [TensorFlow 跟 Python 版本對照表](https://www.tensorflow.org/install/source_windows) 7. [Anaconda 官網的各個 sit package 庫](https://anaconda.org/anaconda/tensorflow-gpu) 8. [mkl-service package failed to import](https://www.jianshu.com/p/8ae21207c3dc) 9. [環境變數](https://shaochien.gitbooks.io/command-line-and-environment-variable-tutorial/content/environment-variable.html) 10. [環境變數STACK OVERFLOW](https://stackoverflow.com/questions/9546324/adding-a-directory-to-the-path-environment-variable-in-windows) 11. [Adding GPU](https://blog.csdn.net/zmh1250329863/article/details/116225385?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-116225385-blog-122105432.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-116225385-blog-122105432.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=1)