題圖:攝於武大凌波門
作為一名每天對著各種裸板的系統工程師,對Jetson Nano會踩到各種坑是做好了充分準備的,本著踩坑填坑的精神,在這裡記錄一下踩坑經歷,供大家一樂。如何避開這些坑?想多了,因為以後你們即使繞開了這些坑,也會有其它的坑等著你:) 重要的是要做到人擋殺人、佛擋殺佛,遇到坑直接趟過去。
安裝軟體遇到鎖
使用apt-get install命令安裝軟體包,遇到如下提示:
alex@alex-jetson-nano:~$ sudo apt-get install xrdp
[sudo] password for alex:
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
複製程式碼
重啟後什麼操作也不做,安裝軟體包,提示依舊。
填坑指南:
首先檢視一下是否有apt程式在工作:
alex@alex-jetson-nano:~$ ps aux | grep -i apt
root 6569 0.0 0.0 1912 496 ? Ss 10:37 0:00 /bin/sh /usr/lib/apt/apt.systemd.daily update
root 6582 0.0 0.0 1912 1272 ? S 10:37 0:00 /bin/sh /usr/lib/apt/apt.systemd.daily lock_is_held update
_apt 7736 5.4 0.1 19552 8036 ? S 10:41 0:20 /usr/lib/apt/methods/http
alex 7883 0.0 0.0 7416 640 pts/0 R+ 10:47 0:00 grep --color=auto -i apt
複製程式碼
可以看到系統在做每日檢查更新,解決的方法很簡單,關閉每日更新檢查:
System Settings | Software & Updates,在Updates頁,Automatically check for updates,選擇Never
遠端連線
沒有為Jetson Nano單獨配顯示器,和開發機共用,但兩者都是用的HDMI介面,這樣每次切換顯示都必須插拔HDMI線,很是麻煩,這個時候就需要遠端連線。
有兩種使用遠端登入Jetson Nano的方法,一種是通過SSH協議登入,這種方法時延小,佔用資源少,但只支援命令列。另一種就是通過RDP(Remote Desktop Protocol)協議,支援GUI,熟悉Windows的朋友可能知道Windows支援遠端登入,在Ubuntu系統上,也能達到同樣的效果。
Jetson Nano採用的是Ubuntu桌面系統,要支援遠端桌面協議很簡單:
sudo apt-get update
sudo apt-get install xrdp
複製程式碼
然而在我的開發機上使用Remmina Remote Desktop Client軟體,配置好各種引數進行連線,總是一閃而過,退出應用。開始懷疑是Remmina Remote Desktop Client相容性存在問題,後來換Windows下的遠端登入,依然如此。檢視$HOME/.xorgxrdp.10.log日誌,可以看到Server端主動退出。
填坑指南:
和普通Ubuntu桌面系統不同的是,Jetson Nano並不支援兩個客戶端同時登入。安裝時為了省事,選擇了自動登入系統,這樣每次Jetson Nano每次啟動,就會有一個使用者登入進去,這個時候我再遠端登入就會被拒絕。解決方法是,編輯 /etc/gdm3/custom.conf 檔案,找到AutomaticLoginEnable和Automatic Login行,註釋掉:
sudo vi /etc/gdm3/custom.conf
# AutomaticLoginEnable=true
# Automatic Login=[user1]
複製程式碼
無法匯入cv2模組
Jetson Nano系統預設python為2.7版本,然而安裝tensorflow-gpu卻需要Python3,在Python3下匯入opencv模組,出現如下錯誤:
(tensorflow-gpu) alex@alex-jetson-nano:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'cv2'
>>>
複製程式碼
使用預設的2.7版本python,則無此問題。
填坑指南:
系統預設為python 2.7安裝了opencv模組,但python3沒有,需要自己安裝:
sudo apt-get install python3-opencv
複製程式碼
這樣安裝到系統python3的環境中,如果你使用了python虛擬環境,而建立虛擬環境時沒有新增 --system-site-package 引數,在虛擬環境中依然會有問題,解決方法,刪除掉虛擬環境中的no-global-site-packages.txt檔案。假如虛擬環境名為tensorflow-gpu,命令如下:
rm ~/.virtualenvs/tensorflow-gpu/lib/python3.6/no-global-site-packages.txt
複製程式碼
python虛擬環境
要說到python的版本問題,python程式設計師絕對一把鼻涕一把淚。python 2和python 3之間不相容的問題由來已久,到目前,python 3也沒有把python 2幹掉,兩者尷尬的共存著。除了python本身,python第三方軟體包的版本問題也是讓人頭大。好在我們可以藉助python虛擬環境來解決這一問題。python虛擬環境和虛擬機器不同,僅僅是做一個環境隔離,完全不存在效能損失,非常適用於python 程式。在開發機上,我使用的是anaconda包,然而,anaconda的linux版本只出了x86 32位和64位架構的包,並沒有arm64的包。無奈之下,我只能選擇python的virtualenv工具。
填坑指南:
virtualenv本身就已經夠用,不過為了方便管理,我還是使用了一個wrapper,這實際上就是用指令碼在virtualenv上封裝了一層,方便使用:
sudo apt-get install virtualenvwrapper
複製程式碼
為了方便使用這些指令碼,我在 $HOME/.profile 檔案中新增了一行:
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
複製程式碼
建立虛擬名為tensorflow-gpu的虛擬環境:
mkvirtualenv -p /usr/bin/python3 --system-site-package tensorflow-gpu
複製程式碼
啟用虛擬環境
workon tensorflow-gpu
複製程式碼
退出虛擬環境
deactivate
複製程式碼
安裝tensorflow
Jetson Nano出廠系統並沒有自帶TensorFlow環境,早先甚至連官方支援都沒有,所以網上有很多安裝Tensorflow的指南,及其複雜,好在Nvidia意識到了這個問題,給出了官方支援。
填坑指南:
安裝依賴包:
sudo apt-get install libhdf5-serial-dev hdf5-tools
sudo apt-get install python3-pip
pip3 install -U pip
sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev
sudo pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast h5py astor termcolor
複製程式碼
注意有些步驟特別慢,以至於我以為安裝包被牆了,重試了幾次仍然這樣,後來才弄清楚有些包是需要即時編譯的,所以會比較慢,需要耐心等待。
然後安裝最新的tensorflow-gpu:
pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu
複製程式碼
如果要安裝指定版本:
pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==$TF_VERSION+nv$NV_VERSION
複製程式碼
其中,TF_VERSION是TensorFlow的釋出版本,比如1.12.0。NV_VERSION為Tensorflow的NVIDIA容器版本,比如19.01。
小結
在使用Jetson Nano中,還碰到很多稀奇古怪的問題,這裡沒法一一寫出,解決問題主要靠Google,當然Nvidia開發者論壇的Nano版塊也值得去看一看,其地址為:devtalk.nvidia.com/default/boa… 在上面我試著用蹩腳的英文向其他開發者提問,收到了不少回應。
生命不息,折騰不止,其實Jetson nano最大的樂趣就是折騰,可以預料以後還會踩各種坑,不過相比軟體的坑,硬體的坑更大,畢竟那還要投入真金白銀,下一篇我將寫寫硬體上的坑,敬請關注。